aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2005-03-12 20:26:49 +0000
committerMax Horn2005-03-12 20:26:49 +0000
commit0e784d41d749934f89298990de92bee02e85ef67 (patch)
tree29fa83175378f65dd23c6f134855d7112a73ffef
parent7cd2cb2b1700b85d48aed8898b08b49b9b46ebf8 (diff)
downloadscummvm-rg350-0e784d41d749934f89298990de92bee02e85ef67.tar.gz
scummvm-rg350-0e784d41d749934f89298990de92bee02e85ef67.tar.bz2
scummvm-rg350-0e784d41d749934f89298990de92bee02e85ef67.zip
Simplified SoundHandle implementation
svn-id: r17107
-rw-r--r--sound/mixer.cpp107
-rw-r--r--sound/mixer.h17
2 files changed, 41 insertions, 83 deletions
diff --git a/sound/mixer.cpp b/sound/mixer.cpp
index 0ea88373a1..6a6881d8a1 100644
--- a/sound/mixer.cpp
+++ b/sound/mixer.cpp
@@ -45,9 +45,9 @@
class Channel {
public:
const SoundMixer::SoundType _type;
+ SoundHandle _handle;
private:
SoundMixer *_mixer;
- SoundHandle *_handle;
bool _autofreeStream;
bool _permanent;
byte _volume;
@@ -64,8 +64,8 @@ protected:
public:
- Channel(SoundMixer *mixer, SoundHandle *handle, SoundMixer::SoundType type, int id = -1);
- Channel(SoundMixer *mixer, SoundHandle *handle, SoundMixer::SoundType type, AudioStream *input, bool autofreeStream, bool reverseStereo = false, int id = -1, bool permanent = false);
+ Channel(SoundMixer *mixer, SoundMixer::SoundType type, int id = -1);
+ Channel(SoundMixer *mixer, SoundMixer::SoundType type, AudioStream *input, bool autofreeStream, bool reverseStereo = false, int id = -1, bool permanent = false);
virtual ~Channel();
void mix(int16 *data, uint len);
@@ -103,6 +103,8 @@ public:
SoundMixer::SoundMixer() {
_syst = &OSystem::instance();
+ _handleSeed = 0;
+
_premixChannel = 0;
int i = 0;
@@ -145,7 +147,7 @@ void SoundMixer::setupPremix(AudioStream *stream, SoundType type) {
return;
// Create the channel
- _premixChannel = new Channel(this, 0, type, stream, false);
+ _premixChannel = new Channel(this, type, stream, false);
}
void SoundMixer::insertChannel(SoundHandle *handle, Channel *chan) {
@@ -164,8 +166,11 @@ void SoundMixer::insertChannel(SoundHandle *handle, Channel *chan) {
}
_channels[index] = chan;
- if (handle)
- handle->setIndex(index);
+ chan->_handle = index + (_handleSeed * NUM_CHANNELS);
+ _handleSeed++;
+ if (handle) {
+ *handle = chan->_handle;
+ }
}
void SoundMixer::playRaw(SoundHandle *handle, void *sound, uint32 size, uint rate, byte flags,
@@ -196,7 +201,7 @@ void SoundMixer::playRaw(SoundHandle *handle, void *sound, uint32 size, uint rat
}
// Create the channel
- Channel *chan = new Channel(this, handle, type, input, true, (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0, id);
+ Channel *chan = new Channel(this, type, input, true, (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0, id);
chan->setVolume(volume);
chan->setBalance(balance);
insertChannel(handle, chan);
@@ -222,7 +227,7 @@ void SoundMixer::playInputStream(SoundType type, SoundHandle *handle, AudioStrea
}
// Create the channel
- Channel *chan = new Channel(this, handle, type, input, autofreeStream, false, id, permanent);
+ Channel *chan = new Channel(this, type, input, autofreeStream, false, id, permanent);
chan->setVolume(volume);
chan->setBalance(balance);
insertChannel(handle, chan);
@@ -283,54 +288,32 @@ void SoundMixer::stopHandle(SoundHandle handle) {
Common::StackLock lock(_mutex);
// Simply ignore stop requests for handles of sounds that already terminated
- if (!handle.isActive())
+ const int index = handle % NUM_CHANNELS;
+ if (!_channels[index] || _channels[index]->_handle != handle)
return;
- int index = handle.getIndex();
-
- if ((index < 0) || (index >= NUM_CHANNELS)) {
- warning("soundMixer::stopHandle has invalid index %d", index);
- return;
- }
-
- if (_channels[index]) {
- delete _channels[index];
- _channels[index] = 0;
- }
+ delete _channels[index];
+ _channels[index] = 0;
}
void SoundMixer::setChannelVolume(SoundHandle handle, byte volume) {
Common::StackLock lock(_mutex);
- if (!handle.isActive())
+ const int index = handle % NUM_CHANNELS;
+ if (!_channels[index] || _channels[index]->_handle != handle)
return;
- int index = handle.getIndex();
-
- if ((index < 0) || (index >= NUM_CHANNELS)) {
- warning("soundMixer::setChannelVolume has invalid index %d", index);
- return;
- }
-
- if (_channels[index])
- _channels[index]->setVolume(volume);
+ _channels[index]->setVolume(volume);
}
void SoundMixer::setChannelBalance(SoundHandle handle, int8 balance) {
Common::StackLock lock(_mutex);
- if (!handle.isActive())
+ const int index = handle % NUM_CHANNELS;
+ if (!_channels[index] || _channels[index]->_handle != handle)
return;
- int index = handle.getIndex();
-
- if ((index < 0) || (index >= NUM_CHANNELS)) {
- warning("soundMixer::setChannelBalance has invalid index %d", index);
- return;
- }
-
- if (_channels[index])
- _channels[index]->setBalance(balance);
+ _channels[index]->setBalance(balance);
}
uint32 SoundMixer::getSoundElapsedTimeOfSoundID(int id) {
@@ -344,21 +327,11 @@ uint32 SoundMixer::getSoundElapsedTimeOfSoundID(int id) {
uint32 SoundMixer::getSoundElapsedTime(SoundHandle handle) {
Common::StackLock lock(_mutex);
- if (!handle.isActive())
+ const int index = handle % NUM_CHANNELS;
+ if (!_channels[index] || _channels[index]->_handle != handle)
return 0;
- int index = handle.getIndex();
-
- if ((index < 0) || (index >= NUM_CHANNELS)) {
- warning("soundMixer::getSoundElapsedTime has invalid index %d", index);
- return 0;
- }
-
- if (_channels[index])
- return _channels[index]->getElapsedTime();
-
- warning("soundMixer::getSoundElapsedTime has no channel object for index %d", index);
- return 0;
+ return _channels[index]->getElapsedTime();
}
void SoundMixer::pauseAll(bool paused) {
@@ -379,18 +352,11 @@ void SoundMixer::pauseHandle(SoundHandle handle, bool paused) {
Common::StackLock lock(_mutex);
// Simply ignore pause/unpause requests for handles of sound that alreayd terminated
- if (!handle.isActive())
+ const int index = handle % NUM_CHANNELS;
+ if (!_channels[index] || _channels[index]->_handle != handle)
return;
- int index = handle.getIndex();
-
- if ((index < 0) || (index >= NUM_CHANNELS)) {
- warning("soundMixer::pauseHandle has invalid index %d", index);
- return;
- }
-
- if (_channels[index])
- _channels[index]->pause(paused);
+ _channels[index]->pause(paused);
}
bool SoundMixer::isSoundIDActive(int id) {
@@ -401,6 +367,11 @@ bool SoundMixer::isSoundIDActive(int id) {
return false;
}
+bool SoundMixer::isSoundHandleActive(SoundHandle handle) {
+ const int index = handle % NUM_CHANNELS;
+ return _channels[index] && _channels[index]->_handle == handle;
+}
+
bool SoundMixer::hasActiveChannelOfType(SoundType type) {
Common::StackLock lock(_mutex);
for (int i = 0; i != NUM_CHANNELS; i++)
@@ -436,16 +407,16 @@ int SoundMixer::getVolumeForSoundType(SoundType type) const {
#pragma mark -
-Channel::Channel(SoundMixer *mixer, SoundHandle *handle, SoundMixer::SoundType type, int id)
- : _type(type), _mixer(mixer), _handle(handle), _autofreeStream(true),
+Channel::Channel(SoundMixer *mixer, SoundMixer::SoundType type, int id)
+ : _type(type), _mixer(mixer), _autofreeStream(true),
_volume(SoundMixer::kMaxChannelVolume), _balance(0), _paused(false), _id(id), _samplesConsumed(0),
_samplesDecoded(0), _mixerTimeStamp(0), _converter(0), _input(0) {
assert(mixer);
}
-Channel::Channel(SoundMixer *mixer, SoundHandle *handle, SoundMixer::SoundType type, AudioStream *input,
+Channel::Channel(SoundMixer *mixer, SoundMixer::SoundType type, AudioStream *input,
bool autofreeStream, bool reverseStereo, int id, bool permanent)
- : _type(type), _mixer(mixer), _handle(handle), _autofreeStream(autofreeStream),
+ : _type(type), _mixer(mixer), _autofreeStream(autofreeStream),
_volume(SoundMixer::kMaxChannelVolume), _balance(0), _paused(false), _id(id), _samplesConsumed(0),
_samplesDecoded(0), _mixerTimeStamp(0), _converter(0), _input(input), _permanent(permanent) {
assert(mixer);
@@ -459,8 +430,6 @@ Channel::~Channel() {
delete _converter;
if (_autofreeStream)
delete _input;
- if (_handle)
- _handle->resetIndex();
}
/* len indicates the number of sample *pairs*. So a value of
diff --git a/sound/mixer.h b/sound/mixer.h
index 8121cee08c..31ed62181a 100644
--- a/sound/mixer.h
+++ b/sound/mixer.h
@@ -33,17 +33,7 @@ class Channel;
class File;
class OSystem;
-class SoundHandle {
- friend class Channel;
- friend class SoundMixer;
- int val;
- int getIndex() const { return val - 1; }
- void setIndex(int i) { val = i + 1; }
- void resetIndex() { val = 0; }
- bool isActive() const { return val > 0; }
-public:
- SoundHandle() { resetIndex(); }
-};
+typedef uint32 SoundHandle;
class SoundMixer {
public:
@@ -99,6 +89,7 @@ private:
bool _paused;
+ uint32 _handleSeed;
Channel *_channels[NUM_CHANNELS];
bool _mixerReady;
@@ -212,9 +203,7 @@ public:
* @param handle the sound to query
* @return true if the sound is active
*/
- bool isSoundHandleActive(SoundHandle handle) {
- return handle.isActive();
- }
+ bool isSoundHandleActive(SoundHandle handle);
/**
* Check if the mixer is paused (using pauseAll).