aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorMax Horn2003-07-06 16:52:09 +0000
committerMax Horn2003-07-06 16:52:09 +0000
commitb6c3d440b57aa792c5464babe0bb7ad4eb9b5f2c (patch)
treefc4921ad0bc51e36fe8698648bd2ae2f97c2468b /sound
parent2e0235d898db494a2e3a06a08322302b2c5f4711 (diff)
downloadscummvm-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.cpp82
-rw-r--r--sound/mixer.h2
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;