diff options
author | Max Horn | 2003-12-17 01:50:50 +0000 |
---|---|---|
committer | Max Horn | 2003-12-17 01:50:50 +0000 |
commit | 4343567458cefe5de8f3493040c79af9f4cdd50a (patch) | |
tree | 9f7e4575e8e97e2b23613336a3298feee609788d | |
parent | 34d1751fe402936455fc8b57b28cb6c3eda11285 (diff) | |
download | scummvm-rg350-4343567458cefe5de8f3493040c79af9f4cdd50a.tar.gz scummvm-rg350-4343567458cefe5de8f3493040c79af9f4cdd50a.tar.bz2 scummvm-rg350-4343567458cefe5de8f3493040c79af9f4cdd50a.zip |
changed the way 'streams' are handled: the finalization logic is now in the WrappedAudioInputStream; this allows further streamlining of the channel/mixer code (can you already guess what I am working towards? :-)
svn-id: r11696
-rw-r--r-- | sound/audiostream.cpp | 9 | ||||
-rw-r--r-- | sound/audiostream.h | 1 | ||||
-rw-r--r-- | sound/mixer.cpp | 36 |
3 files changed, 18 insertions, 28 deletions
diff --git a/sound/audiostream.cpp b/sound/audiostream.cpp index 4bfafab0b1..6a74cbc42c 100644 --- a/sound/audiostream.cpp +++ b/sound/audiostream.cpp @@ -118,6 +118,7 @@ protected: byte *_bufferEnd; byte *_pos; byte *_end; + bool _finalized; inline bool eosIntern() const { return _end == _pos; }; public: @@ -126,10 +127,11 @@ public: int readBuffer(int16 *buffer, const int numSamples); int16 read(); - bool eos() const { return eosIntern(); } + bool eos() const { return _finalized; } bool isStereo() const { return stereo; } void append(const byte *data, uint32 len); + void finish() { _finalized = true; } }; @@ -145,6 +147,8 @@ WrappedMemoryStream<stereo, is16Bit, isUnsigned>::WrappedMemoryStream(uint buffe _bufferStart = (byte *)malloc(bufferSize); _pos = _end = _bufferStart; _bufferEnd = _bufferStart + bufferSize; + + _finalized = false; } template<bool stereo, bool is16Bit, bool isUnsigned> @@ -189,6 +193,9 @@ void WrappedMemoryStream<stereo, is16Bit, isUnsigned>::append(const byte *data, assert((len & 3) == 0); else if (is16Bit || stereo) assert((len & 1) == 0); + + // Verify the stream has not been finalized (by a call to finish()) yet + assert(!_finalized); if (_end + len > _bufferEnd) { // Wrap-around case diff --git a/sound/audiostream.h b/sound/audiostream.h index ca51e047e8..5e8455cc5a 100644 --- a/sound/audiostream.h +++ b/sound/audiostream.h @@ -83,6 +83,7 @@ public: class WrappedAudioInputStream : public AudioInputStream { public: virtual void append(const byte *data, uint32 len) = 0; + virtual void finish() = 0; }; class ZeroInputStream : public AudioInputStream { diff --git a/sound/mixer.cpp b/sound/mixer.cpp index b47c598bad..76c7d19cf0 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -88,13 +88,12 @@ public: }; class ChannelStream : public Channel { - bool _finished; public: ChannelStream(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, uint32 buffer_size, byte volume, int8 pan); - void mix(int16 *data, uint len); void append(void *sound, uint32 size); bool isMusicChannel() const { return true; } - void finish() { _finished = true; } + + void finish(); }; #ifdef USE_MAD @@ -523,11 +522,11 @@ ChannelRaw::ChannelRaw(SoundMixer *mixer, PlayingSoundHandle *handle, void *soun _input = makeLinearInputStream(flags, _ptr, size, 0, 0); } - // Get a rate converter instance - _converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo(), (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0); - if (!(flags & SoundMixer::FLAG_AUTOFREE)) _ptr = 0; + + // Get a rate converter instance + _converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo(), (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0); } ChannelRaw::~ChannelRaw() { @@ -544,37 +543,20 @@ ChannelStream::ChannelStream(SoundMixer *mixer, PlayingSoundHandle *handle, _input = makeWrappedInputStream(flags, buffer_size); // Append the initial data - ((WrappedAudioInputStream *)_input)->append((const byte *)sound, size); + append(sound, size); // Get a rate converter instance _converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo(), (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0); +} - _finished = false; +void ChannelStream::finish() { + ((WrappedAudioInputStream *)_input)->finish(); } void ChannelStream::append(void *data, uint32 len) { ((WrappedAudioInputStream *)_input)->append((const byte *)data, len); } -void ChannelStream::mix(int16 *data, uint len) { - assert(_input); - if (_input->eos()) { - // TODO: call drain method - - // Normally, the stream stays around even if all its data is used up. - // This is in case more data is streamed into it. To make the stream - // go away, one can either stop() it (which takes effect immediately, - // ignoring any remaining sound data), or finish() it, which means - // it will finish playing before it terminates itself. - if (_finished) { - destroy(); - } - } else { - // Invoke the parent implementation. - Channel::mix(data, len); - } -} - #ifdef USE_MAD ChannelMP3::ChannelMP3(SoundMixer *mixer, PlayingSoundHandle *handle, File *file, uint size, byte volume, int8 pan) : Channel(mixer, handle, volume, pan), _isMusic(false) { |