From 6abc10c6eafd888db6c3da124155dd1c939c8e97 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 7 Jan 2010 14:23:42 +0000 Subject: Add a playInputStreamLooping for RewindableAudioStream to Mixer. svn-id: r47113 --- sound/mixer.cpp | 35 ++++++++++++++++++++++------------- sound/mixer.h | 42 +++++++++++++++++++++++++++++++++++++----- sound/mixer_intern.h | 11 ----------- 3 files changed, 59 insertions(+), 29 deletions(-) (limited to 'sound') diff --git a/sound/mixer.cpp b/sound/mixer.cpp index cc1bfe036a..a59768b189 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -264,33 +264,42 @@ void MixerImpl::playInputStream( insertChannel(handle, chan); } -void MixerImpl::playInputStreamLooping( +void Mixer::playInputStreamLooping( SoundType type, SoundHandle *handle, - SeekableAudioStream *input, + RewindableAudioStream *input, uint loopCount, - Timestamp loopStart, Timestamp loopEnd, int id, byte volume, int8 balance, bool autofreeStream, bool permanent, bool reverseStereo) { - if (loopStart.msecs() != 0 || loopEnd.msecs() != 0) { - if (loopEnd.msecs() == 0) - loopEnd = input->getLength(); - - input = new SubSeekableAudioStream(input, loopStart, loopEnd, autofreeStream); - assert(input); - - autofreeStream = true; - } - LoopingAudioStream *loopingStream = new LoopingAudioStream(input, loopCount, autofreeStream); assert(loopingStream); playInputStream(type, handle, loopingStream, id, volume, balance, true, permanent, reverseStereo); } +void Mixer::playInputStreamLooping( + SoundType type, + SoundHandle *handle, + SeekableAudioStream *input, + uint loopCount, + Timestamp loopStart, Timestamp loopEnd, + int id, byte volume, int8 balance, + bool autofreeStream, + bool permanent, + bool reverseStereo) { + + if (loopStart >= loopEnd) + return; + + input = new SubSeekableAudioStream(input, loopStart, loopEnd, autofreeStream); + assert(input); + + playInputStreamLooping(type, handle, input, loopCount, id, volume, balance, true, permanent, reverseStereo); +} + void MixerImpl::mixCallback(byte *samples, uint len) { assert(samples); diff --git a/sound/mixer.h b/sound/mixer.h index 528a17c6c3..500a35e4c7 100644 --- a/sound/mixer.h +++ b/sound/mixer.h @@ -37,6 +37,7 @@ class OSystem; namespace Audio { class AudioStream; +class RewindableAudioStream; class SeekableAudioStream; class Channel; class Mixer; @@ -169,6 +170,37 @@ public: bool permanent = false, bool reverseStereo = false) = 0; + /** + * Start playing the given audio input stream with looping. + * + * Note that the sound id assigned below is unique. At most one stream + * with a given id can play at any given time. Trying to play a sound + * with an id that is already in use causes the new sound to be not played. + * + * @param type the type (voice/sfx/music) of the stream + * @param handle a SoundHandle which can be used to reference and control + * the stream via suitable mixer methods + * @param input the actual RewindableAudioStream to be played + * @param loopCount how often the data shall be looped (0 = infinite) + * @param id a unique id assigned to this stream + * @param volume the volume with which to play the sound, ranging from 0 to 255 + * @param balance the balance with which to play the sound, ranging from -128 to 127 + * @param autofreeStream a flag indicating whether the stream should be + * freed after playback finished + * @param permanent a flag indicating whether a plain stopAll call should + * not stop this particular stream + * @param reverseStereo a flag indicating whether left and right channels shall be swapped + */ + void playInputStreamLooping( + SoundType type, + SoundHandle *handle, + RewindableAudioStream *input, + uint loopCount, + int id = -1, byte volume = kMaxChannelVolume, int8 balance = 0, + bool autofreeStream = true, + bool permanent = false, + bool reverseStereo = false); + /** * Start playing the given audio input stream with looping. * @@ -181,8 +213,8 @@ public: * the stream via suitable mixer methods * @param input the actual SeekableAudioStream to be played * @param loopCount how often the data shall be looped (0 = infinite) - * @param loopStart the (optional) time offset from which to start playback - * @param loopEnd the (optional) time offset where the loop should end + * @param loopStart the time offset from which to start playback + * @param loopEnd the time offset where the loop should end * @param id a unique id assigned to this stream * @param volume the volume with which to play the sound, ranging from 0 to 255 * @param balance the balance with which to play the sound, ranging from -128 to 127 @@ -192,16 +224,16 @@ public: * not stop this particular stream * @param reverseStereo a flag indicating whether left and right channels shall be swapped */ - virtual void playInputStreamLooping( + void playInputStreamLooping( SoundType type, SoundHandle *handle, SeekableAudioStream *input, uint loopCount, - Timestamp loopStart = Timestamp(0, 1000), Timestamp loopEnd = Timestamp(0, 1000), + Timestamp loopStart, Timestamp loopEnd, int id = -1, byte volume = kMaxChannelVolume, int8 balance = 0, bool autofreeStream = true, bool permanent = false, - bool reverseStereo = false) = 0; + bool reverseStereo = false); /** * Stop all currently playing sounds. diff --git a/sound/mixer_intern.h b/sound/mixer_intern.h index ad162dd162..abae5adc69 100644 --- a/sound/mixer_intern.h +++ b/sound/mixer_intern.h @@ -90,17 +90,6 @@ public: bool permanent, bool reverseStereo); - virtual void playInputStreamLooping( - SoundType type, - SoundHandle *handle, - SeekableAudioStream *input, - uint loopCount, - Timestamp loopStart, Timestamp loopEnd, - int id, byte volume, int8 balance, - bool autofreeStream, - bool permanent, - bool reverseStereo); - virtual void stopAll(); virtual void stopID(int id); virtual void stopHandle(SoundHandle handle); -- cgit v1.2.3