diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/mortevielle/mortevielle.cpp | 2 | ||||
-rw-r--r-- | engines/mortevielle/mortevielle.h | 4 | ||||
-rw-r--r-- | engines/mortevielle/sound.cpp | 115 | ||||
-rw-r--r-- | engines/mortevielle/sound.h | 7 | ||||
-rw-r--r-- | engines/mortevielle/speech.cpp | 37 | ||||
-rw-r--r-- | engines/mortevielle/speech.h | 6 |
6 files changed, 137 insertions, 34 deletions
diff --git a/engines/mortevielle/mortevielle.cpp b/engines/mortevielle/mortevielle.cpp index 7126df933f..c117e36636 100644 --- a/engines/mortevielle/mortevielle.cpp +++ b/engines/mortevielle/mortevielle.cpp @@ -104,14 +104,12 @@ MortevielleEngine::MortevielleEngine(OSystem *system, const ADGameDescription *g _curPict = nullptr; _curAnim = nullptr; _rightFramePict = nullptr; - _compMusicBuf1 = nullptr; } MortevielleEngine::~MortevielleEngine() { free(_curPict); free(_curAnim); free(_rightFramePict); - free(_compMusicBuf1); } /** diff --git a/engines/mortevielle/mortevielle.h b/engines/mortevielle/mortevielle.h index 8c7da8cc97..19e580816d 100644 --- a/engines/mortevielle/mortevielle.h +++ b/engines/mortevielle/mortevielle.h @@ -52,7 +52,8 @@ namespace Mortevielle { // Debug channels enum { kMortevielleCore = 1 << 0, - kMortevielleGraphics = 1 << 1 + kMortevielleGraphics = 1 << 1, + kMortevielleSounds = 1 << 2 }; // Game languages @@ -439,7 +440,6 @@ public: byte *_curPict; byte *_curAnim; byte *_rightFramePict; - byte *_compMusicBuf1; Debugger _debugger; ScreenSurface _screenSurface; diff --git a/engines/mortevielle/sound.cpp b/engines/mortevielle/sound.cpp index 717236546c..01d7176ab2 100644 --- a/engines/mortevielle/sound.cpp +++ b/engines/mortevielle/sound.cpp @@ -137,12 +137,16 @@ 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; + _ambiantNoiseBuf = nullptr; } SoundManager::~SoundManager() { + if (_audioStream) + _audioStream->finish(); _mixer->stopHandle(_speakerHandle); - delete _speakerStream; - + delete _speakerStream; + free(_ambiantNoiseBuf); } /** @@ -176,8 +180,111 @@ int SoundManager::decodeMusic(const byte *PSrc, byte *PDest, int size) { return decompSize; } +/** + * Load sonmus.mor file + * @remarks Originally called 'charge_son' + */ +void SoundManager::loadAmbiantSounds() { + Common::File f; + if (!f.open("sonmus.mor")) + error("Missing file - sonmus.mor"); + + free(_ambiantNoiseBuf); + int size = f.size(); + byte *compMusicBuf1 = (byte *)malloc(sizeof(byte) * size); + _ambiantNoiseBuf = (byte *)malloc(sizeof(byte) * size * 2); + f.read(compMusicBuf1, size); + f.close(); + + decodeMusic(compMusicBuf1, _ambiantNoiseBuf, size); + free(compMusicBuf1); +} + void SoundManager::litph(tablint &t, int typ, int tempo) { - return; + // Skip speech + if (_vm->_speechManager._typlec == 0) + return; + + int freq = tempo * 10 * 25.2; + int i = 0; + while (i < _vm->_speechManager._ptr_oct) { + int idx = _vm->_mem[(kAdrTroct * 16) + i]; + i++; + switch(idx) { + case 0: { + int val = _vm->_mem[(kAdrTroct * 16) + i]; + i++; + if (_vm->_speechManager._typlec == 0) + warning("vclas"); + else if (_vm->_speechManager._typlec == 1) { + debugC(5, kMortevielleSounds, "litph - duson"); + const static int noiseAdr[] = {0, 17224, + 17224, 33676, + 33676, 51014, + 51014, 59396, + 59396, 61286, + 61286, 69875}; + if (val > 5) { + warning("unhandled index %d", val); + } else { + if (!_audioStream) + _audioStream = Audio::makeQueuingAudioStream(freq, false); + _audioStream->queueBuffer(&_vm->_mem[(kAdrNoise * 16) + noiseAdr[val * 2]], noiseAdr[(val * 2) + 1] - noiseAdr[(val * 2)], DisposeAfterUse::NO, Audio::FLAG_UNSIGNED); + } + } else { // 2 + debugC(5, kMortevielleSounds, "litph - 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(freq, false); + _audioStream->queueBuffer(&_ambiantNoiseBuf[ambiantNoiseAdr[val * 2]], ambiantNoiseAdr[(val * 2) + 1] - ambiantNoiseAdr[(val * 2)], DisposeAfterUse::NO, Audio::FLAG_UNSIGNED); + } + } + break; + } + case 2: { + int val = _vm->_mem[(kAdrTroct * 16) + i]; + i++; + int tmpidx = (val * 12) + 268; + val = _vm->_mem[(kAdrTroct * 16) + i]; + i++; + warning("TODO: reech %d %d", tmpidx, val); + } + break; + case 4: + if (_vm->_speechManager._typlec) { + i += 2; + } else { + // Speech + warning("TODO: 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 +293,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..763e18a622 100644 --- a/engines/mortevielle/sound.h +++ b/engines/mortevielle/sound.h @@ -95,10 +95,14 @@ public: class SoundManager { private: MortevielleEngine *_vm; - Audio::Mixer *_mixer; PCSpeaker *_speakerStream; Audio::SoundHandle _speakerHandle; + byte *_ambiantNoiseBuf; + public: + Audio::Mixer *_mixer; + Audio::QueuingAudioStream *_audioStream; + SoundManager(Audio::Mixer *mixer); ~SoundManager(); @@ -107,6 +111,7 @@ public: int decodeMusic(const byte *PSrc, byte *PDest, int size); void playSong(const byte *buf, uint usize, uint loops); + void loadAmbiantSounds(); void litph(tablint &t, int typ, int tempo); }; diff --git a/engines/mortevielle/speech.cpp b/engines/mortevielle/speech.cpp index 35eefc898f..aaa2c6a906 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)) { @@ -157,24 +158,6 @@ void SpeechManager::regenbruit() { } /** - * Load sonmus.mor file - * @remarks Originally called 'charge_son' - */ -void SpeechManager::loadMusicSound() { - Common::File f; - if (!f.open("sonmus.mor")) - error("Missing file - sonmus.mor"); - - free(_vm->_compMusicBuf1); - int size = f.size(); - _vm->_compMusicBuf1 = (byte *)malloc(sizeof(byte) * size); - f.read(_vm->_compMusicBuf1, size); - - _vm->_soundManager.decodeMusic(_vm->_compMusicBuf1, &_vm->_mem[kAdrNoise * 16], size); - f.close(); -} - -/** * Load phoneme sound file * @remarks Originally called 'charge_phbruit' */ @@ -274,6 +257,7 @@ void SpeechManager::trait_car() { entroct(_queue[1]._val); entroct(3); } + break; case 7: case 8: @@ -321,6 +305,7 @@ void SpeechManager::trait_car() { entroct(0); else entroct(1); + break; default: break; @@ -589,7 +574,8 @@ void SpeechManager::startSpeech(int rep, int ht, int typ) { regenbruit(); break; case 2: - loadMusicSound(); + //TODO: Only call it once + _vm->_soundManager.loadAmbiantSounds(); loadPhonemeSounds(); break; default: @@ -597,6 +583,17 @@ void SpeechManager::startSpeech(int rep, int ht, int typ) { } handlePhoneme(); _vm->_soundManager.litph(_tbi, typ, tempo); + + if (typ != 0) { + 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..4fe9a34dca 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; @@ -90,7 +89,6 @@ public: void veracf(byte b); void cctable(tablint &t); void regenbruit(); - void loadMusicSound(); void loadPhonemeSounds(); void loadNoise(); void trait_car(); |