From 62b6c333d5f33f8957558c8678d383121d2139ab Mon Sep 17 00:00:00 2001 From: Strangerke Date: Sat, 10 Aug 2013 13:41:50 +0200 Subject: MORTEVIELLE: Play ambiant sounds --- engines/mortevielle/mortevielle.cpp | 2 + engines/mortevielle/mortevielle.h | 1 + engines/mortevielle/sound.cpp | 103 ++++++++++++++++++++++++++++++++++-- engines/mortevielle/sound.h | 4 +- engines/mortevielle/speech.cpp | 23 +++++++- engines/mortevielle/speech.h | 5 +- 6 files changed, 127 insertions(+), 11 deletions(-) (limited to 'engines/mortevielle') diff --git a/engines/mortevielle/mortevielle.cpp b/engines/mortevielle/mortevielle.cpp index 7126df933f..4e2582ceb1 100644 --- a/engines/mortevielle/mortevielle.cpp +++ b/engines/mortevielle/mortevielle.cpp @@ -105,6 +105,7 @@ MortevielleEngine::MortevielleEngine(OSystem *system, const ADGameDescription *g _curAnim = nullptr; _rightFramePict = nullptr; _compMusicBuf1 = nullptr; + _noiseBuf = nullptr; } MortevielleEngine::~MortevielleEngine() { @@ -112,6 +113,7 @@ MortevielleEngine::~MortevielleEngine() { free(_curAnim); free(_rightFramePict); free(_compMusicBuf1); + free(_noiseBuf); } /** diff --git a/engines/mortevielle/mortevielle.h b/engines/mortevielle/mortevielle.h index 8c7da8cc97..0201d8f70d 100644 --- a/engines/mortevielle/mortevielle.h +++ b/engines/mortevielle/mortevielle.h @@ -440,6 +440,7 @@ public: byte *_curAnim; byte *_rightFramePict; byte *_compMusicBuf1; + byte *_noiseBuf; Debugger _debugger; ScreenSurface _screenSurface; diff --git a/engines/mortevielle/sound.cpp b/engines/mortevielle/sound.cpp index 717236546c..9d451dadd3 100644 --- a/engines/mortevielle/sound.cpp +++ b/engines/mortevielle/sound.cpp @@ -137,12 +137,14 @@ SoundManager::SoundManager(Audio::Mixer *mixer) { _speakerStream = new PCSpeaker(mixer->getOutputRate()); _mixer->playStream(Audio::Mixer::kSFXSoundType, &_speakerHandle, _speakerStream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); + _audioStream = nullptr; } SoundManager::~SoundManager() { + if (_audioStream) + _audioStream->finish(); _mixer->stopHandle(_speakerHandle); - delete _speakerStream; - + delete _speakerStream; } /** @@ -177,7 +179,100 @@ int SoundManager::decodeMusic(const byte *PSrc, byte *PDest, int size) { } void SoundManager::litph(tablint &t, int typ, int tempo) { - return; + if (_vm->_speechManager._typlec == 2) { + warning("--->"); + for (int i = 0; i < _vm->_speechManager._ptr_oct; i++) + warning("%d", _vm->_mem[(kAdrTroct * 16) + i]); + warning("---<"); + } else + return; + + int i = 0; + while (i < _vm->_speechManager._ptr_oct) { + int idx = _vm->_mem[(kAdrTroct * 16) + i]; + i++; + switch(idx) { + case 0: { + warning("IPCX"); +/* adbrui + dw 5CB0h, 0, 17224 + dw 6000h, 3656, 20108 + dw 6000h, 20108, 37446 + dw 6924h, 6, 8388 + dw 6B30h, 4, 1893 + dw 6BA6h, 6, 8595 +*/ + int val = _vm->_mem[(kAdrTroct * 16) + i]; + i++; + warning("idx %d", val); + if (_vm->_speechManager._typlec == 0) + warning("vclas"); + else if (!_vm->_speechManager._typlec == 1) + warning("duson"); + else { // 2 + warning("vadson"); + const static int ambiantNoiseAdr[] = {0, 14020, + 14020, 18994, + 18994, 19630, + 19630, 22258, + 22258, 37322, + 37322, 44472, + 44472, 52324, + 52324, 59598, + 59598, 69748}; + if (val > 8) { + warning("unhandled index %d", val); + } else { + if (!_audioStream) + _audioStream = Audio::makeQueuingAudioStream(22428, false); + _audioStream->queueBuffer(&_vm->_noiseBuf[ambiantNoiseAdr[val * 2]], ambiantNoiseAdr[(val * 2) + 1] - ambiantNoiseAdr[(val * 2)], DisposeAfterUse::NO, Audio::FLAG_UNSIGNED); +// Audio::SeekableAudioStream *raw = nullptr; +// raw = Audio::makeRawStream(&_vm->_mem[(kAdrNoise * 16)] + ambiantNoiseAdr[val * 2], ambiantNoiseAdr[(val * 2) + 1], 22428, Audio::FLAG_UNSIGNED, DisposeAfterUse::NO); +// Audio::SoundHandle soundHandle; +// _mixer->playStream(Audio::Mixer::kSFXSoundType, &songHandle, raw, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::YES); +// while (_mixer->isSoundHandleActive(songHandle) && !_vm->keyPressed() && !_vm->_mouseClick && !_vm->shouldQuit()) +// ; + + } + } + break; + } + case 2: { + warning("parc"); + int val = _vm->_mem[(kAdrTroct * 16) + i]; + i++; + int tmpidx = (val * 12) + 268; + val = _vm->_mem[(kAdrTroct * 16) + i]; + i++; + warning("%d %d", tmpidx, val); + warning("reech"); + } + break; + case 4: + if (_vm->_speechManager._typlec) { + warning("Skip interphoneme: %d %d", _vm->_mem[(kAdrTroct * 16) + i], _vm->_mem[(kAdrTroct * 16) + i + 1]); + i += 2; + } else { + // Speech + warning("Interphoneme: consonne:%d voyelle:%d", _vm->_mem[(kAdrTroct * 16) + i], _vm->_mem[(kAdrTroct * 16) + i + 1]); + i += 2; + } + break; + case 6: + warning("pari2"); + break; + default: + if (idx == 62) + warning("blab"); + else if (idx == 35) { + if (i < _vm->_speechManager._ptr_oct) + warning("unexpected 35"); + i = _vm->_speechManager._ptr_oct; + } else + warning("Other code: %d", idx); + break; + } + } } void SoundManager::playNote(int frequency, int32 length) { @@ -186,9 +281,7 @@ void SoundManager::playNote(int frequency, int32 length) { void SoundManager::playSong(const byte* buf, uint size, uint loops) { - int freq = kTempoMusic * 10 * 25.2; - warning("%d", freq); Audio::SeekableAudioStream *raw = Audio::makeRawStream(buf, size, freq, Audio::FLAG_UNSIGNED, DisposeAfterUse::NO); Audio::AudioStream *stream = Audio::makeLoopingAudioStream(raw, loops); Audio::SoundHandle songHandle; diff --git a/engines/mortevielle/sound.h b/engines/mortevielle/sound.h index 1f9e0d9c4d..a2459acee5 100644 --- a/engines/mortevielle/sound.h +++ b/engines/mortevielle/sound.h @@ -95,10 +95,12 @@ public: class SoundManager { private: MortevielleEngine *_vm; - Audio::Mixer *_mixer; PCSpeaker *_speakerStream; Audio::SoundHandle _speakerHandle; public: + Audio::Mixer *_mixer; + Audio::QueuingAudioStream *_audioStream; + SoundManager(Audio::Mixer *mixer); ~SoundManager(); diff --git a/engines/mortevielle/speech.cpp b/engines/mortevielle/speech.cpp index 35eefc898f..2bf2e2c286 100644 --- a/engines/mortevielle/speech.cpp +++ b/engines/mortevielle/speech.cpp @@ -30,6 +30,7 @@ #include "mortevielle/speech.h" #include "mortevielle/sound.h" +#include "audio/decoders/raw.h" #include "common/endian.h" #include "common/file.h" @@ -98,7 +99,7 @@ void SpeechManager::charg_car(int &currWordNumb) { _queue[2]._val = int_; _queue[2]._code = 6; } else if ((int_ >= 22) && (int_ <= 47)) { - int_ = int_ - 22; + int_ -= 22; _queue[2]._val = int_; _queue[2]._code = _typcon[int_]; } else if ((int_ >= 48) && (int_ <= 56)) { @@ -166,11 +167,13 @@ void SpeechManager::loadMusicSound() { error("Missing file - sonmus.mor"); free(_vm->_compMusicBuf1); + free(_vm->_noiseBuf); int size = f.size(); _vm->_compMusicBuf1 = (byte *)malloc(sizeof(byte) * size); + _vm->_noiseBuf = (byte *)malloc(sizeof(byte) * size * 2); f.read(_vm->_compMusicBuf1, size); - _vm->_soundManager.decodeMusic(_vm->_compMusicBuf1, &_vm->_mem[kAdrNoise * 16], size); + _vm->_soundManager.decodeMusic(_vm->_compMusicBuf1, _vm->_noiseBuf, size); f.close(); } @@ -274,6 +277,7 @@ void SpeechManager::trait_car() { entroct(_queue[1]._val); entroct(3); } + break; case 7: case 8: @@ -321,6 +325,7 @@ void SpeechManager::trait_car() { entroct(0); else entroct(1); + break; default: break; @@ -551,6 +556,9 @@ void SpeechManager::handlePhoneme() { do { moveQueue(); charg_car(currWord); + if (_typlec == 2) + warning("%d %d %d %d %d", _queue[2]._acc, _queue[2]._code, _queue[2]._freq, _queue[2]._rep, _queue[2]._val); + trait_car(); } while (currWord < wordCount); @@ -597,6 +605,17 @@ void SpeechManager::startSpeech(int rep, int ht, int typ) { } handlePhoneme(); _vm->_soundManager.litph(_tbi, typ, tempo); + + if (typ == 2) { + Audio::SoundHandle soundHandle; + _vm->_soundManager._mixer->playStream(Audio::Mixer::kSFXSoundType, &soundHandle, _vm->_soundManager._audioStream); + while (_vm->_soundManager._mixer->isSoundHandleActive(soundHandle) && !_vm->keyPressed() && !_vm->_mouseClick && !_vm->shouldQuit()) + ; + _vm->_soundManager._audioStream->finish(); + _vm->_soundManager._mixer->stopHandle(soundHandle); + _vm->_soundManager._audioStream = nullptr; + } + if (_typlec != 0) for (int i = 0; i <= 500; ++i) { _cfiphBuffer[i] = savph[i]; diff --git a/engines/mortevielle/speech.h b/engines/mortevielle/speech.h index c3c4c32942..57f0116827 100644 --- a/engines/mortevielle/speech.h +++ b/engines/mortevielle/speech.h @@ -68,13 +68,12 @@ class SpeechManager { private: MortevielleEngine *_vm; - int _typlec; int _phonemeNumb; - SpeechQueue _queue[3]; - int _ptr_oct; public: + int _typlec; + int _ptr_oct; uint16 *_cfiphBuffer; int _tbi[256]; int _mlec; -- cgit v1.2.3