diff options
Diffstat (limited to 'audio/decoders/3do.h')
-rw-r--r-- | audio/decoders/3do.h | 96 |
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 |