diff options
-rw-r--r-- | sound/mixer.cpp | 18 | ||||
-rw-r--r-- | sound/mixer.h | 8 |
2 files changed, 19 insertions, 7 deletions
diff --git a/sound/mixer.cpp b/sound/mixer.cpp index 176a5222a0..d4433f0045 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -107,8 +107,14 @@ int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, } int SoundMixer::playStream(PlayingSoundHandle * handle, int idx, void * sound, uint32 size, - uint rate, byte flags) { - return insertAt(handle, idx, new ChannelStream(this, sound, size, rate, flags)); + uint rate, byte flags, int32 timeout) { + return insertAt(handle, idx, new ChannelStream(this, sound, size, rate, flags, timeout)); +} + +void SoundMixer::stopChannel(int index) { + if (_channels[index] == NULL) { + _channels[index]->_toBeDestroyed = true; + } } #ifdef COMPRESSED_SOUND_FILE @@ -613,7 +619,7 @@ void SoundMixer::ChannelRaw::realDestroy() { } SoundMixer::ChannelStream::ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, - byte flags) { + byte flags, int32 timeout) { _mixer = mixer; _flags = flags; _bufferSize = 2000000; @@ -627,6 +633,7 @@ SoundMixer::ChannelStream::ChannelStream(SoundMixer * mixer, void * sound, uint3 _fpPos = 0; _fpSpeed = (1 << 16) * rate / mixer->_outputRate; _toBeDestroyed = false; + _setTimeOut = timeout; /* adjust the magnitute to prevent division error */ while (size & 0xFFFF0000) @@ -671,6 +678,9 @@ void SoundMixer::ChannelStream::mix(int16 * data, uint len) { } if (_pos == end_of_data) { + if (_timeOut == -1) { + return; + } if (--_timeOut == 0) { realDestroy(); } @@ -690,7 +700,7 @@ void SoundMixer::ChannelStream::mix(int16 * data, uint len) { mixer_helper_table[_flags & 0x07] (data, &len, &_pos, &fp_pos, fp_speed, vol_tab, end_of_data, (_flags & FLAG_REVERSE_STEREO) ? true : false); } } - _timeOut = 3; + _timeOut = _setTimeOut; _fpPos = fp_pos; } diff --git a/sound/mixer.h b/sound/mixer.h index 8182430582..e5d7b4aeaa 100644 --- a/sound/mixer.h +++ b/sound/mixer.h @@ -80,11 +80,12 @@ private: uint32 _fpPos; uint32 _bufferSize; uint32 _rate; - uint32 _timeOut; + int32 _timeOut; + int32 _setTimeOut; byte _flags; public: - ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, byte flags); + ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, byte flags, int32 timout); void append(void * sound, uint32 size); void mix(int16 * data, uint len); @@ -182,7 +183,8 @@ public: int playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags); int playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags, int id); int playStream(PlayingSoundHandle * handle, int index, void * sound, uint32 size, uint rate, - byte flags); + byte flags, int32 timeout = 3); + void stopChannel(int index); #ifdef COMPRESSED_SOUND_FILE int playMP3(PlayingSoundHandle * handle, void * sound, uint32 size, byte flags); int playMP3CDTrack(PlayingSoundHandle * handle, File * file, mad_timer_t duration); |