diff options
Diffstat (limited to 'engines/fullpipe/sound.cpp')
| -rw-r--r-- | engines/fullpipe/sound.cpp | 105 | 
1 files changed, 67 insertions, 38 deletions
| diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp index 230d6c39a9..be539bc10e 100644 --- a/engines/fullpipe/sound.cpp +++ b/engines/fullpipe/sound.cpp @@ -29,7 +29,9 @@  #include "fullpipe/messages.h"  #include "fullpipe/statics.h" +#include "common/config-manager.h"  #include "common/memstream.h" +#include "audio/mixer.h"  #include "audio/audiostream.h"  #include "audio/decoders/vorbis.h"  #include "audio/decoders/wave.h" @@ -42,8 +44,14 @@ SoundList::SoundList() {  	_libHandle = 0;  } +SoundList::~SoundList() { +	for (int i = 0; i < _soundItemsCount; i++) +		delete _soundItems[i]; +	free(_soundItems); +} +  bool SoundList::load(MfcArchive &file, char *fname) { -	debug(5, "SoundList::load()"); +	debugC(5, kDebugLoading, "SoundList::load()");  	_soundItemsCount = file.readUint32LE();  	_soundItems = (Sound **)calloc(_soundItemsCount, sizeof(Sound *)); @@ -96,16 +104,17 @@ Sound::Sound() {  	memset(_directSoundBuffers, 0, sizeof(_directSoundBuffers));  	_description = 0;  	_volume = 100; +	_handle = new Audio::SoundHandle();  }  Sound::~Sound() {  	freeSound(); -  	free(_description); +	delete _handle;  }  bool Sound::load(MfcArchive &file, NGIArchive *archive) { -	debug(5, "Sound::load()"); +	debugC(5, kDebugLoading, "Sound::load()");  	MemoryObject::load(file); @@ -130,7 +139,7 @@ bool Sound::load(MfcArchive &file, NGIArchive *archive) {  }  void Sound::updateVolume() { -	debug(3, "STUB Sound::updateVolume()"); +	// not needed in our implementation  }  void Sound::setPanAndVolumeByStaticAni() { @@ -160,7 +169,7 @@ void Sound::setPanAndVolumeByStaticAni() {  				dx = ani->_oy - g_fp->_sceneRect.bottom;  			} -		    par = 0; +			par = 0;  			if (dx > 800) {  				setPanAndVolume(-3500, 0); @@ -206,22 +215,23 @@ void Sound::setPanAndVolumeByStaticAni() {  }  void Sound::setPanAndVolume(int vol, int pan) { -	g_fp->_mixer->setChannelVolume(_handle, vol / 39); // 0..10000 -	g_fp->_mixer->setChannelBalance(_handle, pan / 78); // -10000..10000 +	g_fp->_mixer->setChannelVolume(*_handle, MIN((vol + 10000) / 39, 255)); // -10000..0 +	g_fp->_mixer->setChannelBalance(*_handle, CLIP(pan / 78, -127, 127)); // -10000..10000  }  void Sound::play(int flag) { -	Audio::SoundHandle handle = getHandle(); +	Audio::SoundHandle *handle = getHandle(); -	if (g_fp->_mixer->isSoundHandleActive(handle)) -		return; +	if (g_fp->_mixer->isSoundHandleActive(*handle)) { // We need to restart the music +		g_fp->_mixer->stopHandle(*handle); +	}  	byte *soundData = loadData();  	Common::MemoryReadStream *dataStream = new Common::MemoryReadStream(soundData, getDataSize());  	Audio::RewindableAudioStream *wav = Audio::makeWAVStream(dataStream, DisposeAfterUse::YES);  	Audio::AudioStream *audioStream = new Audio::LoopingAudioStream(wav, (flag == 1) ? 0 : 1); -	g_fp->_mixer->playStream(Audio::Mixer::kSFXSoundType, &handle, audioStream); +	g_fp->_mixer->playStream(Audio::Mixer::kSFXSoundType, handle, audioStream);  }  void Sound::freeSound() { @@ -231,21 +241,18 @@ void Sound::freeSound() {  }  int Sound::getVolume() { -	return g_fp->_mixer->getChannelVolume(_handle) * 39;  // 0..10000 +	return g_fp->_mixer->getChannelVolume(*_handle) * 39;  // 0..10000  }  void Sound::stop() { -	g_fp->_mixer->stopHandle(_handle); +	g_fp->_mixer->stopHandle(*_handle);  }  void FullpipeEngine::setSceneMusicParameters(GameVar *gvar) { -	warning("STUB: FullpipeEngine::setSceneMusicParameters()"); -#if 0  	stopSoundStream2(); -	if (soundStream3) -		FSOUND_Stream_Stop(soundStream4); -#endif +	if (_mixer->isSoundHandleActive(*_soundStream3)) +		_mixer->stopHandle(*_soundStream4);  	if (_musicLocal)  		stopAllSoundStreams(); @@ -296,7 +303,18 @@ void FullpipeEngine::setSceneMusicParameters(GameVar *gvar) {  		_trackStartDelay = var->getSubVarAsInt("STARTDELAY");  } +void FullpipeEngine::updateTrackDelay() { +	_sceneTrackIsPlaying = false; +	_trackStartDelay = _musicMinDelay + (_musicMaxDelay - _musicMinDelay) * (_updateTicks % 10) / 9; +} +  void FullpipeEngine::startSceneTrack() { +	if (_sceneTrackIsPlaying) { +		if (!_mixer->isSoundHandleActive(*_soundStream1)) { // Simulate end of sound callback +			updateTrackDelay(); +		} +	} +  	if (!_sceneTrackIsPlaying && _numSceneTracks > 0) {  		if (_trackStartDelay > 0) {  			_trackStartDelay--; @@ -347,13 +365,15 @@ int FullpipeEngine::getSceneTrack() {  	return res;  } -void FullpipeEngine::startSoundStream1(char *trackName) { -	warning("STUB: FullpipeEngine::startSoundStream1(%s)", trackName); - +void FullpipeEngine::startSoundStream1(const char *trackName) {  	stopAllSoundStreams(); +	playOggSound(trackName, _soundStream1); +} + +void FullpipeEngine::playOggSound(const char *trackName, Audio::SoundHandle *stream) {  #ifdef USE_VORBIS -	if (_mixer->isSoundHandleActive(_sceneTrackHandle)) +	if (_mixer->isSoundHandleActive(*stream))  		return;  	Common::File *track = new Common::File(); @@ -363,13 +383,11 @@ void FullpipeEngine::startSoundStream1(char *trackName) {  		return;  	}  	Audio::RewindableAudioStream *ogg = Audio::makeVorbisStream(track, DisposeAfterUse::YES); -	_mixer->playStream(Audio::Mixer::kMusicSoundType, &_sceneTrackHandle, ogg); +	_mixer->playStream(Audio::Mixer::kMusicSoundType, stream, ogg);  #endif  }  void FullpipeEngine::stopAllSounds() { -	// _mixer->stopAll(); -  	for (int i = 0; i < _currSoundListCount; i++)  		for (int j = 0; j < _currSoundList1[i]->getCount(); j++) {  			_currSoundList1[i]->getSoundByIndex(j)->stop(); @@ -403,13 +421,10 @@ void FullpipeEngine::playSound(int id, int flag) {  }  void FullpipeEngine::playTrack(GameVar *sceneVar, const char *name, bool delayed) { -	warning("STUB: FullpipeEngine::playTrack(var, %s, %d)", name, delayed); -#if 0 -	stopSoundStream2(); +	if (_mixer->isSoundHandleActive(*_soundStream3)) +		_mixer->stopHandle(*_soundStream4); -	if (soundStream3) -		FSOUND_Stream_Stop(soundStream4); -#endif +	stopSoundStream2();  	if (_musicLocal)  		stopAllSoundStreams(); @@ -470,7 +485,8 @@ void global_messageHandler_handleSound(ExCommand *cmd) {  	Sound *snd = 0;  	for (int i = 0; i < g_fp->_currSoundListCount; i++) -		snd = g_fp->_currSoundList1[i]->getSoundItemById(cmd->_messageNum); +		if ((snd = g_fp->_currSoundList1[i]->getSoundItemById(cmd->_messageNum)) != NULL) +			break;  	if (!snd)  		return; @@ -487,19 +503,28 @@ void global_messageHandler_handleSound(ExCommand *cmd) {  			snd->setPanAndVolume(g_fp->_sfxVolume, 0);  		if (snd->getVolume() > -3500) -			snd->play(cmd->_keyCode); +			snd->play(cmd->_param);  	} else if (cmd->_field_14 & 2) {  		snd->stop();  	}  }  void FullpipeEngine::stopSoundStream2() { -	warning("STUB: FullpipeEngine::stopSoundStream2()"); +	_stream2playing = false; + +	if (_mixer->isSoundHandleActive(*_soundStream3)) { +		_mixer->stopHandle(*_soundStream2); +		_mixer->stopHandle(*_soundStream3); +	}  }  void FullpipeEngine::stopAllSoundStreams() { -	// TODO: Differences from stopAllSounds() -	_mixer->stopAll(); +	_mixer->stopHandle(*_soundStream1); +	_mixer->stopHandle(*_soundStream2); +	_mixer->stopHandle(*_soundStream3); +	_mixer->stopHandle(*_soundStream4); + +	_stream2playing = false;  }  void FullpipeEngine::stopAllSoundInstances(int id) { @@ -512,8 +537,11 @@ void FullpipeEngine::stopAllSoundInstances(int id) {  }  void FullpipeEngine::updateSoundVolume() { +	ConfMan.setInt("sfx_volume", MAX((_sfxVolume + 10000) / 39, 255)); +	syncSoundSettings(); +  	for (int i = 0; i < _currSoundListCount; i++) -		for (int j = 0; i < _currSoundList1[i]->getCount(); j++) { +		for (int j = 0; j < _currSoundList1[i]->getCount(); j++) {  			_currSoundList1[i]->getSoundByIndex(j)->setPanAndVolume(_sfxVolume, 0);  		}  } @@ -521,7 +549,8 @@ void FullpipeEngine::updateSoundVolume() {  void FullpipeEngine::setMusicVolume(int vol) {  	_musicVolume = vol; -	g_fp->_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, vol); +	ConfMan.setInt("music_volume", _musicVolume); +	syncSoundSettings();  }  } // End of namespace Fullpipe | 
