aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorMax Horn2003-12-17 01:50:50 +0000
committerMax Horn2003-12-17 01:50:50 +0000
commit4343567458cefe5de8f3493040c79af9f4cdd50a (patch)
tree9f7e4575e8e97e2b23613336a3298feee609788d /sound
parent34d1751fe402936455fc8b57b28cb6c3eda11285 (diff)
downloadscummvm-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
Diffstat (limited to 'sound')
-rw-r--r--sound/audiostream.cpp9
-rw-r--r--sound/audiostream.h1
-rw-r--r--sound/mixer.cpp36
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) {