diff options
-rw-r--r-- | audio/mixer.cpp | 42 | ||||
-rw-r--r-- | audio/mixer.h | 14 | ||||
-rw-r--r-- | audio/mixer_intern.h | 4 |
3 files changed, 50 insertions, 10 deletions
diff --git a/audio/mixer.cpp b/audio/mixer.cpp index dc0287e3fb..547d2d5f55 100644 --- a/audio/mixer.cpp +++ b/audio/mixer.cpp @@ -168,6 +168,9 @@ MixerImpl::MixerImpl(OSystem *system, uint sampleRate) int i; + for (i = 0; i < ARRAYSIZE(_mute); ++i) + _mute[i] = false; + for (i = 0; i < ARRAYSIZE(_volumeForSoundType); i++) _volumeForSoundType[i] = kMaxMixerVolume; @@ -322,6 +325,21 @@ void MixerImpl::stopHandle(SoundHandle handle) { _channels[index] = 0; } +void MixerImpl::setMuteForSoundType(SoundType type, bool mute) { + assert(0 <= type && type < ARRAYSIZE(_mute)); + _mute[type] = mute; + + for (int i = 0; i != NUM_CHANNELS; ++i) { + if (_channels[i] && _channels[i]->getType() == type) + _channels[i]->notifyGlobalVolChange(); + } +} + +bool MixerImpl::getMuteForSoundType(SoundType type) const { + assert(0 <= type && type < ARRAYSIZE(_mute)); + return _mute[type]; +} + void MixerImpl::setChannelVolume(SoundHandle handle, byte volume) { Common::StackLock lock(_mutex); @@ -486,17 +504,21 @@ void Channel::updateChannelVolumes() { // volume is in the range 0 - kMaxMixerVolume. // Hence, the vol_l/vol_r values will be in that range, too - int vol = _mixer->getVolumeForSoundType(_type) * _volume; - - if (_balance == 0) { - _volL = vol / Mixer::kMaxChannelVolume; - _volR = vol / Mixer::kMaxChannelVolume; - } else if (_balance < 0) { - _volL = vol / Mixer::kMaxChannelVolume; - _volR = ((127 + _balance) * vol) / (Mixer::kMaxChannelVolume * 127); + if (!_mixer->getMuteForSoundType(_type)) { + int vol = _mixer->getVolumeForSoundType(_type) * _volume; + + if (_balance == 0) { + _volL = vol / Mixer::kMaxChannelVolume; + _volR = vol / Mixer::kMaxChannelVolume; + } else if (_balance < 0) { + _volL = vol / Mixer::kMaxChannelVolume; + _volR = ((127 + _balance) * vol) / (Mixer::kMaxChannelVolume * 127); + } else { + _volL = ((127 - _balance) * vol) / (Mixer::kMaxChannelVolume * 127); + _volR = vol / Mixer::kMaxChannelVolume; + } } else { - _volL = ((127 - _balance) * vol) / (Mixer::kMaxChannelVolume * 127); - _volR = vol / Mixer::kMaxChannelVolume; + _volL = _volR = 0; } } diff --git a/audio/mixer.h b/audio/mixer.h index a048124ca3..fe24b85613 100644 --- a/audio/mixer.h +++ b/audio/mixer.h @@ -197,6 +197,20 @@ public: virtual bool isSoundHandleActive(SoundHandle handle) = 0; + /** + * Set the mute state for a given sound type. + * + * @param mute Whether to mute (= true) or not (= false). + * @param type the sound type + */ + virtual void setMuteForSoundType(SoundType type, bool mute) = 0; + + /** + * Query the mute state for a given sound type. + * + * @param type the sound type + */ + virtual bool getMuteForSoundType(SoundType type) const = 0; /** * Set the channel volume for the given handle. diff --git a/audio/mixer_intern.h b/audio/mixer_intern.h index dd2746e9ea..c42436b9a4 100644 --- a/audio/mixer_intern.h +++ b/audio/mixer_intern.h @@ -64,6 +64,7 @@ private: bool _mixerReady; uint32 _handleSeed; + bool _mute[4]; int _volumeForSoundType[4]; Channel *_channels[NUM_CHANNELS]; @@ -97,6 +98,9 @@ public: virtual bool isSoundHandleActive(SoundHandle handle); + virtual void setMuteForSoundType(SoundType type, bool mute); + virtual bool getMuteForSoundType(SoundType type) const; + virtual void setChannelVolume(SoundHandle handle, byte volume); virtual void setChannelBalance(SoundHandle handle, int8 balance); |