aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorJohannes Schickel2010-01-07 14:23:42 +0000
committerJohannes Schickel2010-01-07 14:23:42 +0000
commit6abc10c6eafd888db6c3da124155dd1c939c8e97 (patch)
tree2895a1096a7d738e3b4a0162e121b5502c810cbf /sound
parente00f36f9c72a9b3264476e700c3f280204654264 (diff)
downloadscummvm-rg350-6abc10c6eafd888db6c3da124155dd1c939c8e97.tar.gz
scummvm-rg350-6abc10c6eafd888db6c3da124155dd1c939c8e97.tar.bz2
scummvm-rg350-6abc10c6eafd888db6c3da124155dd1c939c8e97.zip
Add a playInputStreamLooping for RewindableAudioStream to Mixer.
svn-id: r47113
Diffstat (limited to 'sound')
-rw-r--r--sound/mixer.cpp35
-rw-r--r--sound/mixer.h42
-rw-r--r--sound/mixer_intern.h11
3 files changed, 59 insertions, 29 deletions
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;
@@ -179,10 +180,41 @@ public:
* @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.
+ *
+ * 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 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);