diff options
Diffstat (limited to 'engines/fullpipe/sound.cpp')
-rw-r--r-- | engines/fullpipe/sound.cpp | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp index 6da848a621..fd25e2c903 100644 --- a/engines/fullpipe/sound.cpp +++ b/engines/fullpipe/sound.cpp @@ -23,8 +23,13 @@ #include "fullpipe/fullpipe.h" #include "fullpipe/objects.h" +#include "fullpipe/scene.h" #include "fullpipe/sound.h" #include "fullpipe/ngiarchive.h" +#include "common/memstream.h" +#include "audio/audiostream.h" +#include "audio/decoders/vorbis.h" +#include "audio/decoders/wave.h" namespace Fullpipe { @@ -77,6 +82,9 @@ Sound::Sound() { _description = 0; } +Sound::~Sound() { + warning("STUB: Sound::~Sound()"); +} bool Sound::load(MfcArchive &file, NGIArchive *archive) { debug(5, "Sound::load()"); @@ -86,7 +94,7 @@ bool Sound::load(MfcArchive &file, NGIArchive *archive) { _id = file.readUint32LE(); _description = file.readPascalString(); - assert(g_fullpipe->_gameProjectVersion >= 6); + assert(g_fp->_gameProjectVersion >= 6); _objectId = file.readUint16LE(); @@ -113,14 +121,36 @@ void Sound::setPanAndVolumeByStaticAni() { void FullpipeEngine::setSceneMusicParameters(GameVar *var) { warning("STUB: FullpipeEngine::setSceneMusicParameters()"); + // TODO: Finish this (MINDELAY, MAXDELAY, LOCAL, SEQUENCE, STARTDELAY etc) + stopAllSoundStreams(); + _musicGameVar = var; } void FullpipeEngine::startSceneTrack() { - debug(3, "STUB: FullpipeEngine::startSceneTrack()"); + // TODO: Finish this +#ifdef USE_VORBIS + if (g_fp->_mixer->isSoundHandleActive(_sceneTrackHandle)) + return; + + GameVar *musicTrackVar = _musicGameVar->getSubVarByName("MUSIC")->getSubVarByName("TRACKS")->_subVars; + if (!musicTrackVar) + return; + + char *trackName = musicTrackVar->_varName; + Common::File *track = new Common::File(); + if (!track->open(trackName)) { + warning("Could not open %s", trackName); + delete track; + return; + } + Audio::RewindableAudioStream *ogg = Audio::makeVorbisStream(track, DisposeAfterUse::YES); + g_fp->_mixer->playStream(Audio::Mixer::kMusicSoundType, &_sceneTrackHandle, ogg); +#endif } void FullpipeEngine::stopAllSounds() { - warning("STUB: FullpipeEngine::stopAllSounds()"); + // TODO: Differences from stopAllSoundStreams() + g_fp->_mixer->stopAll(); } void FullpipeEngine::toggleMute() { @@ -128,13 +158,49 @@ void FullpipeEngine::toggleMute() { } void FullpipeEngine::playSound(int id, int flag) { - warning("STUB: FullpipeEngine::playSounds(%d, %d)", id, flag); + SoundList *soundList = g_fp->_currentScene->_soundList; + Sound *sound = soundList->getSoundById(id); + if (!sound) { + warning("playSound: Can't find sound with ID %d", id); + return; + } + byte *soundData = sound->loadData(); + Common::MemoryReadStream *dataStream = new Common::MemoryReadStream(soundData, sound->getDataSize()); + Audio::RewindableAudioStream *wav = Audio::makeWAVStream(dataStream, DisposeAfterUse::YES); + Audio::AudioStream *audioStream = new Audio::LoopingAudioStream(wav, (flag == 1) ? 0 : 1); + Audio::SoundHandle handle = sound->getHandle(); + g_fp->_mixer->playStream(Audio::Mixer::kSFXSoundType, &handle, audioStream); +} + +void FullpipeEngine::playTrack(GameVar *sceneVar, const char *name, bool delayed) { + warning("STUB: FullpipeEngine::playTrack(var, %s, %d)", name, delayed); } void global_messageHandler_handleSound(ExCommand *cmd) { debug(0, "STUB: global_messageHandler_handleSound()"); } +void FullpipeEngine::stopSoundStream2() { + warning("STUB: FullpipeEngine::stopSoundStream2()"); +} + +void FullpipeEngine::stopAllSoundStreams() { + // TODO: Differences from stopAllSounds() + g_fp->_mixer->stopAll(); +} + +void FullpipeEngine::stopAllSoundInstances(int id) { + SoundList *soundList = g_fp->_currentScene->_soundList; + for (int i = 0; i < soundList->getCount(); i++) { + Sound *sound = soundList->getSoundByIndex(i); + if (sound->getId() == id) { + g_fp->_mixer->stopHandle(sound->getHandle()); + } + } +} +void FullpipeEngine::updateSoundVolume() { + debug(3, "STUB FullpipeEngine::updateSoundVolume()"); +} } // End of namespace Fullpipe |