aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/mortevielle/mortevielle.cpp2
-rw-r--r--engines/mortevielle/mortevielle.h4
-rw-r--r--engines/mortevielle/sound.cpp115
-rw-r--r--engines/mortevielle/sound.h7
-rw-r--r--engines/mortevielle/speech.cpp37
-rw-r--r--engines/mortevielle/speech.h6
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();