aboutsummaryrefslogtreecommitdiff
path: root/audio/decoders/3do.h
diff options
context:
space:
mode:
Diffstat (limited to 'audio/decoders/3do.h')
-rw-r--r--audio/decoders/3do.h96
1 files changed, 79 insertions, 17 deletions
diff --git a/audio/decoders/3do.h b/audio/decoders/3do.h
index 4d8412a4cb..7524358543 100644
--- a/audio/decoders/3do.h
+++ b/audio/decoders/3do.h
@@ -31,6 +31,10 @@
#include "common/scummsys.h"
#include "common/types.h"
+#include "common/substream.h"
+
+#include "audio/audiostream.h"
+#include "audio/decoders/raw.h"
namespace Common {
class SeekableReadStream;
@@ -40,6 +44,10 @@ namespace Audio {
class SeekableAudioStream;
+// amount of bytes to be used within the decoder classes as buffers
+#define AUDIO_3DO_CACHE_SIZE 1024
+
+// persistent spaces
struct audio_3DO_ADP4_PersistentSpace {
int16 lastSample;
int16 stepIndex;
@@ -50,25 +58,78 @@ struct audio_3DO_SDX2_PersistentSpace {
int16 lastSample2;
};
+class Audio3DO_ADP4_Stream : public RewindableAudioStream {
+public:
+ Audio3DO_ADP4_Stream(Common::SeekableReadStream *stream, uint16 sampleRate, bool stereo, DisposeAfterUse::Flag disposeAfterUse, audio_3DO_ADP4_PersistentSpace *persistentSpace);
+
+protected:
+ const uint16 _sampleRate;
+ const bool _stereo;
+
+ Common::DisposablePtr<Common::SeekableReadStream> _stream;
+ int32 _streamBytesLeft;
+
+ void reset();
+ bool rewind();
+ bool endOfData() const { return (_stream->pos() >= _stream->size()); }
+ bool isStereo() const { return _stereo; }
+ int getRate() const { return _sampleRate; }
+
+ int readBuffer(int16 *buffer, const int numSamples);
+
+ bool _initialRead;
+ audio_3DO_ADP4_PersistentSpace *_callerDecoderData;
+ audio_3DO_ADP4_PersistentSpace _initialDecoderData;
+ audio_3DO_ADP4_PersistentSpace _curDecoderData;
+
+private:
+ int16 decodeSample(byte compressedNibble);
+};
+
+class Audio3DO_SDX2_Stream : public RewindableAudioStream {
+public:
+ Audio3DO_SDX2_Stream(Common::SeekableReadStream *stream, uint16 sampleRate, bool stereo, DisposeAfterUse::Flag disposeAfterUse, audio_3DO_SDX2_PersistentSpace *persistentSpacePtr);
+
+protected:
+ const uint16 _sampleRate;
+ const bool _stereo;
+
+ Common::DisposablePtr<Common::SeekableReadStream> _stream;
+ int32 _streamBytesLeft;
+
+ void reset();
+ bool rewind();
+ bool endOfData() const { return (_stream->pos() >= _stream->size()); }
+ bool isStereo() const { return _stereo; }
+ int getRate() const { return _sampleRate; }
+
+ int readBuffer(int16 *buffer, const int numSamples);
+
+ bool _initialRead;
+ audio_3DO_SDX2_PersistentSpace *_callerDecoderData;
+ audio_3DO_SDX2_PersistentSpace _initialDecoderData;
+ audio_3DO_SDX2_PersistentSpace _curDecoderData;
+};
/**
* Try to decode 3DO ADP4 data from the given seekable stream and create a SeekableAudioStream
* from that data.
*
- * @param stream the SeekableReadStream from which to read the 3DO ADP4 data
- * @size how many bytes to read from stream
+ * @param stream the SeekableReadStream from which to read the 3DO SDX2 data
* @sampleRate sample rate
- * @audioFlags flags, that specify the type of output
- * @param disposeAfterUse whether to delete the stream after use
+ * @stereo if it's stereo or mono
+ * @audioLengthMSecsPtr pointer to a uint32 variable, that is supposed to get the length of the audio in milliseconds
+ * @disposeAfterUse disposeAfterUse whether to delete the stream after use
+ * @persistentSpacePtr pointer to the persistent space structure
* @return a new SeekableAudioStream, or NULL, if an error occurred
*/
-SeekableAudioStream *make3DO_ADP4Stream(
+RewindableAudioStream *make3DO_ADP4AudioStream(
Common::SeekableReadStream *stream,
- uint32 size,
uint16 sampleRate,
- byte audioFlags,
- DisposeAfterUse::Flag disposeAfterUse,
- audio_3DO_ADP4_PersistentSpace *persistentSpace = NULL
+ bool stereo,
+ uint32 *audioLengthMSecsPtr = NULL, // returns the audio length in milliseconds
+ DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES,
+ audio_3DO_ADP4_PersistentSpace *persistentSpacePtr = NULL
);
/**
@@ -76,19 +137,20 @@ SeekableAudioStream *make3DO_ADP4Stream(
* from that data.
*
* @param stream the SeekableReadStream from which to read the 3DO SDX2 data
- * @size how many bytes to read from stream
* @sampleRate sample rate
- * @audioFlags flags, that specify the type of output
- * @param disposeAfterUse whether to delete the stream after use
+ * @stereo if it's stereo or mono
+ * @audioLengthMSecsPtr pointer to a uint32 variable, that is supposed to get the length of the audio in milliseconds
+ * @disposeAfterUse disposeAfterUse whether to delete the stream after use
+ * @persistentSpacePtr pointer to the persistent space structure
* @return a new SeekableAudioStream, or NULL, if an error occurred
*/
-SeekableAudioStream *make3DO_SDX2Stream(
+RewindableAudioStream *make3DO_SDX2AudioStream(
Common::SeekableReadStream *stream,
- uint32 size,
uint16 sampleRate,
- byte audioFlags,
- DisposeAfterUse::Flag disposeAfterUse,
- audio_3DO_SDX2_PersistentSpace *persistentSpace = NULL
+ bool stereo,
+ uint32 *audioLengthMSecsPtr = NULL, // returns the audio length in milliseconds
+ DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES,
+ audio_3DO_SDX2_PersistentSpace *persistentSpacePtr = NULL
);
} // End of namespace Audio