diff options
author | Max Horn | 2003-07-06 16:52:09 +0000 |
---|---|---|
committer | Max Horn | 2003-07-06 16:52:09 +0000 |
commit | b6c3d440b57aa792c5464babe0bb7ad4eb9b5f2c (patch) | |
tree | fc4921ad0bc51e36fe8698648bd2ae2f97c2468b /sound | |
parent | 2e0235d898db494a2e3a06a08322302b2c5f4711 (diff) | |
download | scummvm-rg350-b6c3d440b57aa792c5464babe0bb7ad4eb9b5f2c.tar.gz scummvm-rg350-b6c3d440b57aa792c5464babe0bb7ad4eb9b5f2c.tar.bz2 scummvm-rg350-b6c3d440b57aa792c5464babe0bb7ad4eb9b5f2c.zip |
now that we mutex-protect everything properly, we can get rid of _toBeDestroyed; also, instead of keeping a global _handles array in the mixer, let each Channel manage its own handle
svn-id: r8808
Diffstat (limited to 'sound')
-rw-r--r-- | sound/mixer.cpp | 82 | ||||
-rw-r--r-- | sound/mixer.h | 2 |
2 files changed, 39 insertions, 45 deletions
diff --git a/sound/mixer.cpp b/sound/mixer.cpp index f5e7d4d850..666f31e1a7 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -30,14 +30,23 @@ class Channel { protected: SoundMixer *_mixer; + PlayingSoundHandle *_handle; public: - bool _toBeDestroyed; int _id; - Channel(SoundMixer *mixer) : _mixer(mixer), _toBeDestroyed(false), _id(-1) {} - virtual ~Channel() {} + Channel(SoundMixer *mixer, PlayingSoundHandle *handle) + : _mixer(mixer), _handle(handle), _id(-1) { + assert(mixer); + } + virtual ~Channel() { + if (_handle) + *_handle = 0; + } virtual void mix(int16 *data, uint len) = 0; void destroy() { - _toBeDestroyed = true; + for (int i = 0; i != SoundMixer::NUM_CHANNELS; i++) + if (_mixer->_channels[i] == this) + _mixer->_channels[i] = 0; + delete this; } virtual bool isActive(); virtual bool isMusicChannel() = 0; @@ -55,12 +64,12 @@ class ChannelRaw : public Channel { uint32 _loop_size; public: - ChannelRaw(SoundMixer *mixer, void *sound, uint32 size, uint rate, byte flags, int id); + ChannelRaw(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, int id); ~ChannelRaw(); void mix(int16 *data, uint len); bool isMusicChannel() { - return false; // TODO: IS this correct? Or does any Scumm game us this for music? + return false; // TODO: Is this correct? Or does anything use ChannelRaw for music? } }; @@ -77,7 +86,7 @@ class ChannelStream : public Channel { bool _finished; public: - ChannelStream(SoundMixer *mixer, void *sound, uint32 size, uint rate, byte flags, uint32 buffer_size); + ChannelStream(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, uint32 buffer_size); ~ChannelStream(); void mix(int16 *data, uint len); @@ -101,7 +110,7 @@ protected: uint32 _size; public: - ChannelMP3Common(SoundMixer *mixer); + ChannelMP3Common(SoundMixer *mixer, PlayingSoundHandle *handle); ~ChannelMP3Common(); }; @@ -110,7 +119,7 @@ class ChannelMP3 : public ChannelMP3Common { uint32 _position; public: - ChannelMP3(SoundMixer *mixer, void *sound, uint size, byte flags); + ChannelMP3(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint size, byte flags); void mix(int16 *data, uint len); bool isMusicChannel() { return false; } @@ -124,7 +133,7 @@ class ChannelMP3CDMusic : public ChannelMP3Common { public: - ChannelMP3CDMusic(SoundMixer *mixer, File *file, mad_timer_t duration); + ChannelMP3CDMusic(SoundMixer *mixer, PlayingSoundHandle *handle, File *file, mad_timer_t duration); void mix(int16 *data, uint len); bool isActive(); @@ -140,7 +149,7 @@ class ChannelVorbis : public Channel { bool _eof_flag, _is_cd_track; public: - ChannelVorbis(SoundMixer *mixer, OggVorbis_File *ov_file, int duration, bool is_cd_track); + ChannelVorbis(SoundMixer *mixer, PlayingSoundHandle *handle, OggVorbis_File *ov_file, int duration, bool is_cd_track); void mix(int16 *data, uint len); bool isActive(); @@ -159,9 +168,6 @@ SoundMixer::SoundMixer() { _premixProc = 0; int i = 0; - for (i = 0; i != NUM_CHANNELS; i++) - _handles[i] = NULL; - _outputRate = 0; _volumeTable = (int16 *)calloc(256 * sizeof(int16), 1); @@ -219,7 +225,6 @@ int SoundMixer::insertChannel(PlayingSoundHandle *handle, Channel *chan) { } _channels[index] = chan; - _handles[index] = handle; if (handle) *handle = index + 1; return index; @@ -235,29 +240,29 @@ int SoundMixer::playRaw(PlayingSoundHandle *handle, void *sound, uint32 size, ui return -1; } - return insertChannel(handle, new ChannelRaw(this, sound, size, rate, flags, id)); + return insertChannel(handle, new ChannelRaw(this, handle, sound, size, rate, flags, id)); } int SoundMixer::newStream(void *sound, uint32 size, uint rate, byte flags, uint32 buffer_size) { StackLock lock(_mutex); - return insertChannel(NULL, new ChannelStream(this, sound, size, rate, flags, buffer_size)); + return insertChannel(NULL, new ChannelStream(this, 0, sound, size, rate, flags, buffer_size)); } #ifdef USE_MAD int SoundMixer::playMP3(PlayingSoundHandle *handle, void *sound, uint32 size, byte flags) { StackLock lock(_mutex); - return insertChannel(handle, new ChannelMP3(this, sound, size, flags)); + return insertChannel(handle, new ChannelMP3(this, handle, sound, size, flags)); } int SoundMixer::playMP3CDTrack(PlayingSoundHandle *handle, File *file, mad_timer_t duration) { StackLock lock(_mutex); - return insertChannel(handle, new ChannelMP3CDMusic(this, file, duration)); + return insertChannel(handle, new ChannelMP3CDMusic(this, handle, file, duration)); } #endif #ifdef USE_VORBIS int SoundMixer::playVorbis(PlayingSoundHandle *handle, OggVorbis_File *ov_file, int duration, bool is_cd_track) { StackLock lock(_mutex); - return insertChannel(handle, new ChannelVorbis(this, ov_file, duration, is_cd_track)); + return insertChannel(handle, new ChannelVorbis(this, handle, ov_file, duration, is_cd_track)); } #endif @@ -278,17 +283,8 @@ void SoundMixer::mix(int16 *buf, uint len) { if (!_paused) { // now mix all channels for (int i = 0; i != NUM_CHANNELS; i++) - if (_channels[i]) { - if (_channels[i]->_toBeDestroyed) { - if (_handles[i]) { - *_handles[i] = 0; - _handles[i] = NULL; - } - delete _channels[i]; - _channels[i] = NULL; - } else - _channels[i]->mix(buf, len); - } + if (_channels[i]) + _channels[i]->mix(buf, len); } } @@ -627,8 +623,8 @@ bool Channel::isActive() { } /* RAW mixer */ -ChannelRaw::ChannelRaw(SoundMixer *mixer, void *sound, uint32 size, uint rate, byte flags, int id) - : Channel(mixer) { +ChannelRaw::ChannelRaw(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, int id) + : Channel(mixer, handle) { _id = id; _flags = flags; _ptr = (byte *)sound; @@ -689,9 +685,9 @@ void ChannelRaw::mix(int16 *data, uint len) { #define WARP_WORKAROUND 50000 -ChannelStream::ChannelStream(SoundMixer *mixer, void *sound, uint32 size, uint rate, +ChannelStream::ChannelStream(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, uint32 buffer_size) - : Channel(mixer) { + : Channel(mixer, handle) { assert(size <= buffer_size); _flags = flags; _bufferSize = buffer_size; @@ -792,8 +788,8 @@ void ChannelStream::mix(int16 *data, uint len) { #ifdef USE_MAD -ChannelMP3Common::ChannelMP3Common(SoundMixer *mixer) - : Channel(mixer) { +ChannelMP3Common::ChannelMP3Common(SoundMixer *mixer, PlayingSoundHandle *handle) + : Channel(mixer, handle) { mad_stream_init(&_stream); #ifdef _WIN32_WCE // 11 kHz on WinCE if necessary @@ -812,8 +808,8 @@ ChannelMP3Common::~ChannelMP3Common() { mad_stream_finish(&_stream); } -ChannelMP3::ChannelMP3(SoundMixer *mixer, void *sound, uint size, byte flags) - : ChannelMP3Common(mixer) { +ChannelMP3::ChannelMP3(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint size, byte flags) + : ChannelMP3Common(mixer, handle) { _posInFrame = 0xFFFFFFFF; _position = 0; _size = size; @@ -905,8 +901,8 @@ void ChannelMP3::mix(int16 *data, uint len) { #define MP3CD_BUFFERING_SIZE 131072 -ChannelMP3CDMusic::ChannelMP3CDMusic(SoundMixer *mixer, File *file, mad_timer_t duration) - : ChannelMP3Common(mixer) { +ChannelMP3CDMusic::ChannelMP3CDMusic(SoundMixer *mixer, PlayingSoundHandle *handle, File *file, mad_timer_t duration) + : ChannelMP3Common(mixer, handle) { _file = file; _duration = duration; _initialized = false; @@ -1017,8 +1013,8 @@ bool ChannelMP3CDMusic::isActive() { #endif #ifdef USE_VORBIS -ChannelVorbis::ChannelVorbis(SoundMixer *mixer, OggVorbis_File *ov_file, int duration, bool is_cd_track) - : Channel(mixer) { +ChannelVorbis::ChannelVorbis(SoundMixer *mixer, PlayingSoundHandle *handle, OggVorbis_File *ov_file, int duration, bool is_cd_track) + : Channel(mixer, handle) { _ov_file = ov_file; if (duration) diff --git a/sound/mixer.h b/sound/mixer.h index 7f77b456f3..5cea147749 100644 --- a/sound/mixer.h +++ b/sound/mixer.h @@ -59,8 +59,6 @@ private: void *_premixParam; PremixProc *_premixProc; - PlayingSoundHandle *_handles[NUM_CHANNELS]; - public: uint _outputRate; |