aboutsummaryrefslogtreecommitdiff
path: root/engines/neverhood/sound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/neverhood/sound.cpp')
-rw-r--r--engines/neverhood/sound.cpp61
1 files changed, 39 insertions, 22 deletions
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index b15bea4a64..db22b72289 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -21,10 +21,17 @@
*/
#include "common/memstream.h"
-#include "graphics/palette.h"
+#include "audio/mixer.h"
#include "neverhood/sound.h"
+#include "neverhood/resource.h"
#include "neverhood/resourceman.h"
+// Convert volume from percent to 0..255
+#define VOLUME(volume) (Audio::Mixer::kMaxChannelVolume / 100 * (volume))
+
+// Convert panning from percent (50% equals center) to -127..0..+127
+#define PANNING(panning) (254 / 100 * (panning) - 127)
+
namespace Neverhood {
SoundResource::SoundResource(NeverhoodEngine *vm)
@@ -583,6 +590,11 @@ AudioResourceManSoundItem::AudioResourceManSoundItem(NeverhoodEngine *vm, uint32
_volume(100), _panning(50) {
_vm->_res->queryResource(_fileHash, _resourceHandle);
+ _soundHandle = new Audio::SoundHandle();
+}
+
+AudioResourceManSoundItem::~AudioResourceManSoundItem() {
+ delete _soundHandle;
}
void AudioResourceManSoundItem::loadSound() {
@@ -594,22 +606,22 @@ void AudioResourceManSoundItem::loadSound() {
}
void AudioResourceManSoundItem::unloadSound() {
- if (_vm->_mixer->isSoundHandleActive(_soundHandle))
- _vm->_mixer->stopHandle(_soundHandle);
+ if (_vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->stopHandle(*_soundHandle);
_vm->_res->unloadResource(_resourceHandle);
_data = NULL;
}
void AudioResourceManSoundItem::setVolume(int16 volume) {
_volume = MIN<int16>(volume, 100);
- if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle))
- _vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_volume));
+ if (_isPlaying && _vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->setChannelVolume(*_soundHandle, VOLUME(_volume));
}
void AudioResourceManSoundItem::setPan(int16 pan) {
_panning = MIN<int16>(pan, 100);
- if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle))
- _vm->_mixer->setChannelVolume(_soundHandle, PANNING(_panning));
+ if (_isPlaying && _vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->setChannelVolume(*_soundHandle, PANNING(_panning));
}
void AudioResourceManSoundItem::playSound(bool looping) {
@@ -619,7 +631,7 @@ void AudioResourceManSoundItem::playSound(bool looping) {
const byte *shiftValue = _resourceHandle.extData();
Common::MemoryReadStream *stream = new Common::MemoryReadStream(_data, _resourceHandle.size(), DisposeAfterUse::NO);
NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, looping, DisposeAfterUse::YES, stream);
- _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle,
+ _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, _soundHandle,
audioStream, -1, VOLUME(_volume), PANNING(_panning));
debug(1, "playing sound %08X", _fileHash);
_isPlaying = true;
@@ -627,13 +639,13 @@ void AudioResourceManSoundItem::playSound(bool looping) {
}
void AudioResourceManSoundItem::stopSound() {
- if (_vm->_mixer->isSoundHandleActive(_soundHandle))
- _vm->_mixer->stopHandle(_soundHandle);
+ if (_vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->stopHandle(*_soundHandle);
_isPlaying = false;
}
bool AudioResourceManSoundItem::isPlaying() {
- return _vm->_mixer->isSoundHandleActive(_soundHandle);
+ return _vm->_mixer->isSoundHandleActive(*_soundHandle);
}
AudioResourceManMusicItem::AudioResourceManMusicItem(NeverhoodEngine *vm, uint32 fileHash)
@@ -641,6 +653,11 @@ AudioResourceManMusicItem::AudioResourceManMusicItem(NeverhoodEngine *vm, uint32
_volume(100), _panning(50), _start(false), _isFadingIn(false), _isFadingOut(false), _isPlaying(false),
_fadeVolume(0), _fadeVolumeStep(0) {
+ _soundHandle = new Audio::SoundHandle();
+}
+
+AudioResourceManMusicItem::~AudioResourceManMusicItem() {
+ delete _soundHandle;
}
void AudioResourceManMusicItem::playMusic(int16 fadeVolumeStep) {
@@ -658,7 +675,7 @@ void AudioResourceManMusicItem::playMusic(int16 fadeVolumeStep) {
}
void AudioResourceManMusicItem::stopMusic(int16 fadeVolumeStep) {
- if (_vm->_mixer->isSoundHandleActive(_soundHandle)) {
+ if (_vm->_mixer->isSoundHandleActive(*_soundHandle)) {
if (fadeVolumeStep != 0) {
if (_isFadingIn)
_isFadingIn = false;
@@ -667,7 +684,7 @@ void AudioResourceManMusicItem::stopMusic(int16 fadeVolumeStep) {
_isFadingOut = true;
_fadeVolumeStep = fadeVolumeStep;
} else {
- _vm->_mixer->stopHandle(_soundHandle);
+ _vm->_mixer->stopHandle(*_soundHandle);
}
_isPlaying = false;
}
@@ -677,8 +694,8 @@ void AudioResourceManMusicItem::unloadMusic() {
if (_isFadingOut) {
_canRestart = true;
} else {
- if (_vm->_mixer->isSoundHandleActive(_soundHandle))
- _vm->_mixer->stopHandle(_soundHandle);
+ if (_vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->stopHandle(*_soundHandle);
_isPlaying = false;
_terminate = true;
}
@@ -686,8 +703,8 @@ void AudioResourceManMusicItem::unloadMusic() {
void AudioResourceManMusicItem::setVolume(int16 volume) {
_volume = MIN<int16>(volume, 100);
- if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle))
- _vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_volume));
+ if (_isPlaying && _vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->setChannelVolume(*_soundHandle, VOLUME(_volume));
}
void AudioResourceManMusicItem::restart() {
@@ -698,33 +715,33 @@ void AudioResourceManMusicItem::restart() {
void AudioResourceManMusicItem::update() {
- if (_start && !_vm->_mixer->isSoundHandleActive(_soundHandle)) {
+ if (_start && !_vm->_mixer->isSoundHandleActive(*_soundHandle)) {
ResourceHandle resourceHandle;
_vm->_res->queryResource(_fileHash, resourceHandle);
Common::SeekableReadStream *stream = _vm->_res->createStream(_fileHash);
const byte *shiftValue = resourceHandle.extData();
NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream);
- _vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle,
+ _vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, _soundHandle,
audioStream, -1, VOLUME(_isFadingIn ? _fadeVolume : _volume),
PANNING(_panning));
_start = false;
_isPlaying = true;
}
- if (_vm->_mixer->isSoundHandleActive(_soundHandle)) {
+ if (_vm->_mixer->isSoundHandleActive(*_soundHandle)) {
if (_isFadingIn) {
_fadeVolume += _fadeVolumeStep;
if (_fadeVolume >= _volume) {
_fadeVolume = _volume;
_isFadingIn = false;
}
- _vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_fadeVolume));
+ _vm->_mixer->setChannelVolume(*_soundHandle, VOLUME(_fadeVolume));
}
if (_isFadingOut) {
_fadeVolume -= _fadeVolumeStep;
if (_fadeVolume < 0)
_fadeVolume = 0;
- _vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_fadeVolume));
+ _vm->_mixer->setChannelVolume(*_soundHandle, VOLUME(_fadeVolume));
if (_fadeVolume == 0) {
_isFadingOut = false;
stopMusic(0);