mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-13 21:31:53 +00:00
TOON: Music attenuation when someone talks
svn-id: r53130
This commit is contained in:
parent
23aa94ec02
commit
aa89bbbcbd
@ -203,6 +203,8 @@ AudioStreamInstance::AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer,
|
||||
_currentReadSize = 8;
|
||||
_man = man;
|
||||
_looping = looping;
|
||||
_musicAttenuation = 1000;
|
||||
|
||||
// preload one packet
|
||||
if (_totalSize > 0) {
|
||||
_file->skip(8);
|
||||
@ -341,6 +343,8 @@ void AudioStreamInstance::play(bool fade, Audio::Mixer::SoundType soundType) {
|
||||
_stopped = false;
|
||||
_fadingIn = fade;
|
||||
_fadeTime = 0;
|
||||
_soundType = soundType;
|
||||
_musicAttenuation = 1000; // max volume
|
||||
_mixer->playStream(soundType, &_handle, this);
|
||||
handleFade(0);
|
||||
}
|
||||
@ -348,6 +352,12 @@ void AudioStreamInstance::play(bool fade, Audio::Mixer::SoundType soundType) {
|
||||
void AudioStreamInstance::handleFade(int numSamples) {
|
||||
debugC(5, kDebugAudio, "handleFade(%d)", numSamples);
|
||||
|
||||
// Fading enabled only for music
|
||||
if (_soundType != Audio::Mixer::kMusicSoundType)
|
||||
return;
|
||||
|
||||
int32 finalVolume = _volume;
|
||||
|
||||
if (_fadingOut) {
|
||||
_fadeTime += numSamples;
|
||||
|
||||
@ -356,8 +366,7 @@ void AudioStreamInstance::handleFade(int numSamples) {
|
||||
stopNow();
|
||||
_fadingOut = false;
|
||||
}
|
||||
|
||||
_mixer->setChannelVolume(_handle, _volume - _fadeTime * _volume / 40960);
|
||||
finalVolume = _volume - _fadeTime * _volume / 40960;
|
||||
} else {
|
||||
if (_fadingIn) {
|
||||
_fadeTime += numSamples;
|
||||
@ -366,9 +375,25 @@ void AudioStreamInstance::handleFade(int numSamples) {
|
||||
_fadingIn = false;
|
||||
}
|
||||
|
||||
_mixer->setChannelVolume(_handle, _volume * _fadeTime / 40960);
|
||||
finalVolume = _volume * _fadeTime / 40960;
|
||||
}
|
||||
}
|
||||
|
||||
// the music is too loud when someone is talking
|
||||
// smoothing to avoid big volume changes
|
||||
if (_man->voiceStillPlaying()) {
|
||||
_musicAttenuation -= numSamples >> 4;
|
||||
if (_musicAttenuation < 250)
|
||||
_musicAttenuation = 250;
|
||||
} else {
|
||||
_musicAttenuation += numSamples >> 5;
|
||||
if (_musicAttenuation > 1000)
|
||||
_musicAttenuation = 1000;
|
||||
}
|
||||
|
||||
|
||||
_mixer->setChannelVolume(_handle, finalVolume * _musicAttenuation / 1000);
|
||||
|
||||
}
|
||||
|
||||
void AudioStreamInstance::stop(bool fade /*= false*/) {
|
||||
@ -400,6 +425,10 @@ AudioStreamPackage::AudioStreamPackage(ToonEngine *vm) : _vm(vm) {
|
||||
_indexBuffer = 0;
|
||||
}
|
||||
|
||||
AudioStreamPackage::~AudioStreamPackage() {
|
||||
delete [] _indexBuffer;
|
||||
}
|
||||
|
||||
bool AudioStreamPackage::loadAudioPackage(Common::String indexFile, Common::String streamFile) {
|
||||
debugC(4, kDebugAudio, "loadAudioPackage(%s, %s)", indexFile.c_str(), streamFile.c_str());
|
||||
|
||||
@ -408,6 +437,8 @@ bool AudioStreamPackage::loadAudioPackage(Common::String indexFile, Common::Stri
|
||||
if (!fileData)
|
||||
return false;
|
||||
|
||||
delete[] _indexBuffer;
|
||||
|
||||
_indexBuffer = new uint32[size / 4];
|
||||
memcpy(_indexBuffer, fileData, size);
|
||||
|
||||
|
@ -81,6 +81,7 @@ protected:
|
||||
int32 _bufferOffset;
|
||||
int32 _compBufferSize;
|
||||
Audio::SoundHandle _handle;
|
||||
Audio::Mixer::SoundType _soundType;
|
||||
Audio::Mixer *_mixer;
|
||||
int32 _lastADPCMval1;
|
||||
int32 _lastADPCMval2;
|
||||
@ -90,12 +91,15 @@ protected:
|
||||
int32 _currentReadSize;
|
||||
bool _looping;
|
||||
int32 _volume;
|
||||
int32 _musicAttenuation;
|
||||
};
|
||||
|
||||
class AudioStreamPackage {
|
||||
|
||||
public:
|
||||
AudioStreamPackage(ToonEngine *vm);
|
||||
~AudioStreamPackage();
|
||||
|
||||
bool loadAudioPackage(Common::String indexFile, Common::String streamFile);
|
||||
void getInfo(int32 id, int32 *offset, int32 *size);
|
||||
Common::SeekableReadStream *getStream(int32 id, bool ownMemory = false);
|
||||
|
Loading…
Reference in New Issue
Block a user