diff options
Diffstat (limited to 'engines/chewy/sound.cpp')
-rw-r--r-- | engines/chewy/sound.cpp | 113 |
1 files changed, 104 insertions, 9 deletions
diff --git a/engines/chewy/sound.cpp b/engines/chewy/sound.cpp index e0e84e2101..5e519f47f9 100644 --- a/engines/chewy/sound.cpp +++ b/engines/chewy/sound.cpp @@ -41,41 +41,112 @@ Sound::~Sound() { delete _speechRes; } -void Sound::playSound(int num, bool loop) { +void Sound::playSound(int num, bool loop, uint channel) { SoundChunk *sound = _soundRes->getSound(num); byte *data = (byte *)malloc(sound->size); memcpy(data, sound->data, sound->size); + playSound(data, sound->size, loop, channel); + + delete[] sound->data; + delete sound; +} + +void Sound::playSound(byte *data, uint32 size, bool loop, uint channel, DisposeAfterUse::Flag dispose) { Audio::AudioStream *stream = Audio::makeLoopingAudioStream( Audio::makeRawStream(data, - sound->size, 22050, Audio::FLAG_UNSIGNED, - DisposeAfterUse::YES), + size, 22050, Audio::FLAG_UNSIGNED, + dispose), loop ? 0 : 1); - _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, stream); + _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle[channel], stream); +} - delete[] sound->data; - delete sound; +void Sound::pauseSound(uint channel) { + assert(channel < MAX_SOUND_EFFECTS); + _mixer->pauseHandle(_soundHandle[channel], true); +} + +void Sound::resumeSound(uint channel) { + assert(channel < MAX_SOUND_EFFECTS); + _mixer->pauseHandle(_soundHandle[channel], false); +} + +void Sound::stopSound(uint channel) { + assert(channel < MAX_SOUND_EFFECTS); + _mixer->stopHandle(_soundHandle[channel]); +} + +bool Sound::isSoundActive(uint channel) { + assert(channel < MAX_SOUND_EFFECTS); + return _mixer->isSoundHandleActive(_soundHandle[channel]); +} + +void Sound::setSoundVolume(uint volume) { + _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, volume); +} + +void Sound::setSoundChannelVolume(uint channel, uint volume) { + assert(channel < MAX_SOUND_EFFECTS); + _mixer->setChannelVolume(_soundHandle[channel], volume); +} + +void Sound::setSoundChannelBalance(uint channel, uint balance) { + assert(channel < MAX_SOUND_EFFECTS); + _mixer->setChannelBalance(_soundHandle[channel], balance); } void Sound::playMusic(int num, bool loop) { uint32 musicNum = _soundRes->getChunkCount() - 1 - num; Chunk *chunk = _soundRes->getChunk(musicNum); byte *data = _soundRes->getChunkData(musicNum); + + playMusic(data, chunk->size, loop); + + delete[] data; + delete chunk; +} + +void Sound::playMusic(byte *data, uint32 size, bool loop, DisposeAfterUse::Flag dispose) { + byte *modData = nullptr; + uint32 modSize; // TODO: TMF music files are similar to MOD files. With the following // incorrect implementation, the PCM parts of these files can be played warning("The current music playing implementation is wrong"); + modSize = size; + modData = (byte *)malloc(modSize); + memcpy(modData, data, size); Audio::AudioStream *stream = Audio::makeLoopingAudioStream( - Audio::makeRawStream(data, - chunk->size, 22050, Audio::FLAG_UNSIGNED, - DisposeAfterUse::YES), + Audio::makeRawStream(modData, + modSize, 22050, Audio::FLAG_UNSIGNED, + dispose), loop ? 0 : 1); _mixer->playStream(Audio::Mixer::kMusicSoundType, &_musicHandle, stream); } +void Sound::pauseMusic() { + _mixer->pauseHandle(_musicHandle, true); +} + +void Sound::resumeMusic() { + _mixer->pauseHandle(_musicHandle, false); +} + +void Sound::stopMusic() { + _mixer->stopHandle(_musicHandle); +} + +bool Sound::isMusicActive() { + return _mixer->isSoundHandleActive(_musicHandle); +} + +void Sound::setMusicVolume(uint volume) { + _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, volume); +} + void Sound::playSpeech(int num) { SoundChunk *sound = _speechRes->getSound(num); byte *data = (byte *)malloc(sound->size); @@ -93,4 +164,28 @@ void Sound::playSpeech(int num) { delete sound; } +void Sound::pauseSpeech() { + _mixer->pauseHandle(_speechHandle, true); +} + +void Sound::resumeSpeech() { + _mixer->pauseHandle(_speechHandle, false); +} + +void Sound::stopSpeech() { + _mixer->stopHandle(_speechHandle); +} + +bool Sound::isSpeechActive() { + return _mixer->isSoundHandleActive(_speechHandle); +} + +void Sound::setSpeechVolume(uint volume) { + _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume); +} + +void Sound::stopAll() { + _mixer->stopAll(); +} + } // End of namespace Chewy |