diff options
author | Martin Kiewitz | 2015-06-06 22:50:36 +0200 |
---|---|---|
committer | Martin Kiewitz | 2015-06-06 22:50:36 +0200 |
commit | 97813f89ecd2a06c74f776708a3d1852c96811a7 (patch) | |
tree | 8a9d4bc96dcad8b2cc87bb116199cbdd1465f337 /audio/decoders/3do.h | |
parent | 2ac05321aab74a4fced53f402f1b0cd16a33cc23 (diff) | |
download | scummvm-rg350-97813f89ecd2a06c74f776708a3d1852c96811a7.tar.gz scummvm-rg350-97813f89ecd2a06c74f776708a3d1852c96811a7.tar.bz2 scummvm-rg350-97813f89ecd2a06c74f776708a3d1852c96811a7.zip |
SHERLOCK: rework 3DO audio, add AIFC file support
- rework 3DO audio decoders to decode into buffer only
- 3DO audio decoders also use streams without separate size arg now
- add support for ADP4 + SDX2 inside AIFC files
- add debug command "3do_playaudio" to play AIFC files
- remove audio flags and replace with stereo bool
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 |