mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
HOPKINS: Beginnings of implementation of sound code
This commit is contained in:
+245
-4
@@ -21,8 +21,11 @@
|
||||
*/
|
||||
|
||||
#include "common/system.h"
|
||||
#include "common/file.h"
|
||||
#include "common/textconsole.h"
|
||||
#include "hopkins/sound.h"
|
||||
#include "hopkins/globals.h"
|
||||
#include "hopkins/hopkins.h"
|
||||
|
||||
namespace Hopkins {
|
||||
|
||||
@@ -39,6 +42,15 @@ SoundManager::SoundManager() {
|
||||
VOICEOFF = true;
|
||||
TEXTOFF = false;
|
||||
SOUND_FLAG = false;
|
||||
VBL_MERDE = false;
|
||||
CARD_SB = false;
|
||||
|
||||
for (int i = 0; i < VOICE_COUNT; ++i)
|
||||
Common::fill((byte *)&Voice[i], (byte *)&Voice[i] + sizeof(VoiceItem), 0);
|
||||
for (int i = 0; i < SWAV_COUNT; ++i)
|
||||
Common::fill((byte *)&Swav[i], (byte *)&Swav[i] + sizeof(SwavItem), 0);
|
||||
for (int i = 0; i < 2; ++i)
|
||||
Common::fill((byte *)&Music[i], (byte *)&Music[i] + sizeof(MusicItem), 0);
|
||||
}
|
||||
|
||||
void SoundManager::setParent(HopkinsEngine *vm) {
|
||||
@@ -63,16 +75,174 @@ void SoundManager::LOAD_WAV(const Common::String &file, int a2) {
|
||||
}
|
||||
|
||||
void SoundManager::PLAY_ANM_SOUND(int soundNumber) {
|
||||
warning("TODO: PLAAY_ANIM_SOUND");
|
||||
if (!_vm->_globals.CENSURE && SPECIAL_SOUND == 2) {
|
||||
if (soundNumber == 20)
|
||||
PLAY_SAMPLE2(5);
|
||||
if (soundNumber == 57)
|
||||
PLAY_SAMPLE2(1);
|
||||
if (soundNumber == 63)
|
||||
PLAY_SAMPLE2(1);
|
||||
if (soundNumber == 69)
|
||||
PLAY_SAMPLE2(1);
|
||||
if (soundNumber == 75)
|
||||
PLAY_SAMPLE2(2);
|
||||
if (soundNumber == 109)
|
||||
PLAY_SAMPLE2(3);
|
||||
if (soundNumber == 122)
|
||||
PLAY_SAMPLE2(4);
|
||||
}
|
||||
if (SPECIAL_SOUND == 1 && soundNumber == 17)
|
||||
PLAY_SOUND("SOUND42.WAV");
|
||||
if (SPECIAL_SOUND == 199 && soundNumber == 72)
|
||||
PLAY_WAV(1);
|
||||
if (SPECIAL_SOUND == 198 && soundNumber == 15)
|
||||
PLAY_WAV(1);
|
||||
if (SPECIAL_SOUND == 16 && soundNumber == 25)
|
||||
PLAY_WAV(1);
|
||||
if (SPECIAL_SOUND == 14 && soundNumber == 625)
|
||||
PLAY_WAV(1);
|
||||
if (SPECIAL_SOUND == 208 && soundNumber == 40)
|
||||
PLAY_WAV(1);
|
||||
if (SPECIAL_SOUND == 210 && soundNumber == 2)
|
||||
PLAY_WAV(1);
|
||||
if (SPECIAL_SOUND == 211 && soundNumber == 22)
|
||||
PLAY_WAV(1);
|
||||
if (SPECIAL_SOUND == 5 && soundNumber == 19)
|
||||
PLAY_WAV(1);
|
||||
if (SPECIAL_SOUND == 17) {
|
||||
if (soundNumber == 6)
|
||||
PLAY_SAMPLE2(1);
|
||||
if (soundNumber == 14)
|
||||
PLAY_SAMPLE2(2);
|
||||
if (soundNumber == 67)
|
||||
PLAY_SAMPLE2(3);
|
||||
}
|
||||
if (SPECIAL_SOUND == 229) {
|
||||
if (soundNumber == 15)
|
||||
PLAY_WAV(1);
|
||||
if (soundNumber == 91)
|
||||
PLAY_WAV(2);
|
||||
}
|
||||
}
|
||||
|
||||
void SoundManager::WSOUND(int soundNumber) {
|
||||
warning("TODO: WSOUND");
|
||||
}
|
||||
|
||||
bool SoundManager::VOICE_MIX(int a1, int a2) {
|
||||
warning("TODO: VOICE_MIX");
|
||||
return false;
|
||||
bool SoundManager::VOICE_MIX(int voiceId, int voiceMode) {
|
||||
int fileNumber;
|
||||
int oldMusicVol;
|
||||
bool breakFlag;
|
||||
Common::String prefix;
|
||||
Common::String filename;
|
||||
Common::File f;
|
||||
int catPos;
|
||||
|
||||
fileNumber = voiceId;
|
||||
if (!CARD_SB || VOICEOFF == 1)
|
||||
return false;
|
||||
|
||||
if ((unsigned int)(voiceMode - 1) <= 1
|
||||
&& (voiceId == 4
|
||||
|| voiceId == 16
|
||||
|| voiceId == 121
|
||||
|| voiceId == 142
|
||||
|| voiceId == 182
|
||||
|| voiceId == 191
|
||||
|| voiceId == 212
|
||||
|| voiceId == 225
|
||||
|| voiceId == 239
|
||||
|| voiceId == 245
|
||||
|| voiceId == 297
|
||||
|| voiceId == 308
|
||||
|| voiceId == 333
|
||||
|| voiceId == 348
|
||||
|| voiceId == 352
|
||||
|| voiceId == 358
|
||||
|| voiceId == 364
|
||||
|| voiceId == 371
|
||||
|| voiceId == 394
|
||||
|| voiceId == 414
|
||||
|| voiceId == 429
|
||||
|| voiceId == 442
|
||||
|| voiceId == 446
|
||||
|| voiceId == 461
|
||||
|| voiceId == 468
|
||||
|| voiceId == 476
|
||||
|| voiceId == 484
|
||||
|| voiceId == 491
|
||||
|| voiceId == 497
|
||||
|| voiceId == 501
|
||||
|| voiceId == 511
|
||||
|| voiceId == 520
|
||||
|| voiceId == 536
|
||||
|| voiceId == 554
|
||||
|| voiceId == 566
|
||||
|| voiceId == 573
|
||||
|| voiceId == 632
|
||||
|| voiceId == 645))
|
||||
fileNumber = 684;
|
||||
|
||||
if ((unsigned int)(voiceMode - 1) <= 1) {
|
||||
prefix = "DF";
|
||||
}
|
||||
if (voiceMode == 3) {
|
||||
prefix = "IF";
|
||||
}
|
||||
if (voiceMode == 4) {
|
||||
prefix = "TF";
|
||||
}
|
||||
if (voiceMode == 5) {
|
||||
prefix = "OF";
|
||||
}
|
||||
|
||||
filename = Common::String::format("%s%d.WAV", prefix.c_str(), fileNumber);
|
||||
|
||||
if (!_vm->_fileManager.RECHERCHE_CAT(filename, 9)) {
|
||||
if (_vm->_globals.FR == 1)
|
||||
_vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPVOICE, "RES_VFR.RES");
|
||||
if (!_vm->_globals.FR)
|
||||
_vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPVOICE, "RES_VAN.RES");
|
||||
if (_vm->_globals.FR == 2)
|
||||
_vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPVOICE, "RES_VES.RES");
|
||||
|
||||
catPos = _vm->_globals.CAT_POSI;
|
||||
} else {
|
||||
_vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPVOICE, filename);
|
||||
|
||||
if (!f.exists(_vm->_globals.NFICHIER))
|
||||
return false;
|
||||
|
||||
catPos = 0;
|
||||
}
|
||||
|
||||
SDL_LVOICE(catPos);
|
||||
oldMusicVol = MUSICVOL;
|
||||
if (!MUSICOFF && MUSICVOL > 2)
|
||||
MUSICVOL = (signed int)((long double)MUSICVOL - (long double)MUSICVOL / 100.0 * 45.0);
|
||||
|
||||
PLAY_VOICE_SDL();
|
||||
|
||||
breakFlag = 0;
|
||||
do {
|
||||
if (SPECIAL_SOUND != 4 && !VBL_MERDE)
|
||||
_vm->_eventsManager.VBL();
|
||||
if (_vm->_eventsManager.BMOUSE())
|
||||
break;
|
||||
_vm->_eventsManager.CONTROLE_MES();
|
||||
if (_vm->_eventsManager.ESC_KEY)
|
||||
break;
|
||||
if (!VOICE_STAT(2))
|
||||
breakFlag = true;
|
||||
} while (!_vm->shouldQuit() && !breakFlag);
|
||||
|
||||
|
||||
STOP_VOICE(2);
|
||||
DEL_SAMPLE_SDL(20);
|
||||
MUSICVOL = oldMusicVol;
|
||||
_vm->_eventsManager.ESC_KEY = false;
|
||||
VBL_MERDE = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
void SoundManager::DEL_SAMPLE(int soundNumber) {
|
||||
@@ -111,4 +281,75 @@ void SoundManager::PLAY_WAV(int a1) {
|
||||
warning("PLAY_WAV");
|
||||
}
|
||||
|
||||
bool SoundManager::VOICE_STAT(int voiceIndex) {
|
||||
return Voice[voiceIndex].active;
|
||||
}
|
||||
|
||||
void SoundManager::STOP_VOICE(int voiceIndex) {
|
||||
int wavIndex;
|
||||
|
||||
if (Voice[voiceIndex].active) {
|
||||
Voice[voiceIndex].active = false;
|
||||
wavIndex = Voice[voiceIndex].wavIndex;
|
||||
if (Swav[wavIndex].active) {
|
||||
if (Swav[wavIndex].field24 == 1)
|
||||
DEL_SAMPLE_SDL(wavIndex);
|
||||
}
|
||||
}
|
||||
Voice[voiceIndex].audioLen = 0;
|
||||
Voice[voiceIndex].fieldC = 0;
|
||||
Voice[voiceIndex].audioBuf = NULL;
|
||||
Voice[voiceIndex].active = false;
|
||||
Voice[voiceIndex].field14 = 0;
|
||||
Voice[voiceIndex].audioStream = NULL;
|
||||
}
|
||||
|
||||
void SoundManager::SDL_LVOICE(int catPos) {
|
||||
if (!SDL_LoadVoice(_vm->_globals.NFICHIER, catPos, Swav[20]))
|
||||
error("Couldn't load the sample %s", _vm->_globals.NFICHIER.c_str());
|
||||
|
||||
Swav[20].active = true;
|
||||
}
|
||||
|
||||
void SoundManager::PLAY_VOICE_SDL() {
|
||||
if (!Swav[20].active)
|
||||
error("Bad handle");
|
||||
|
||||
if (!Voice[2].active) {
|
||||
int wavIndex = Voice[2].wavIndex;
|
||||
if (Swav[wavIndex].active && Swav[wavIndex].field24 == 1)
|
||||
DEL_SAMPLE_SDL(wavIndex);
|
||||
}
|
||||
|
||||
Voice[2].audioLen = Swav[20].audioLen;
|
||||
Voice[2].fieldC = 0;
|
||||
Voice[2].audioBuf = Swav[20].audioBuf;
|
||||
Voice[2].active = true;
|
||||
Voice[2].field14 = 4;
|
||||
Voice[2].audioStream = Swav[20].audioStream;
|
||||
}
|
||||
|
||||
bool SoundManager::DEL_SAMPLE_SDL(int wavIndex) {
|
||||
if (Swav[wavIndex].active) {
|
||||
Swav[wavIndex].active = false;
|
||||
free(Swav[wavIndex].audioBuf);
|
||||
delete Swav[wavIndex].audioStream;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool SoundManager::SDL_LoadVoice(const Common::String &filename, size_t fileOffset, SwavItem &item) {
|
||||
Common::File f;
|
||||
if (!f.open(filename))
|
||||
error("Could not open %s for reading", filename.c_str());
|
||||
|
||||
f.seek(fileOffset);
|
||||
item.audioStream = Audio::makeWAVStream(&f, DisposeAfterUse::NO);
|
||||
f.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} // End of namespace Hopkins
|
||||
|
||||
+53
-1
@@ -25,14 +25,61 @@
|
||||
|
||||
#include "common/scummsys.h"
|
||||
#include "common/str.h"
|
||||
#include "audio/audiostream.h"
|
||||
#include "audio/decoders/wave.h"
|
||||
|
||||
namespace Hopkins {
|
||||
|
||||
class VoiceItem {
|
||||
public:
|
||||
bool active;
|
||||
int wavIndex;
|
||||
Audio::RewindableAudioStream *audioStream;
|
||||
|
||||
// Decprecated fields
|
||||
int audioLen;
|
||||
int fieldC;
|
||||
byte *audioBuf;
|
||||
|
||||
int field14;
|
||||
};
|
||||
|
||||
class SwavItem {
|
||||
public:
|
||||
bool active;
|
||||
Audio::RewindableAudioStream *audioStream;
|
||||
|
||||
// Deprecated fields
|
||||
int audioSpec;
|
||||
byte *audioBuf;
|
||||
int audioLen;
|
||||
|
||||
int field24;
|
||||
};
|
||||
|
||||
class MusicItem {
|
||||
public:
|
||||
byte field0;
|
||||
byte field1;
|
||||
int field16[50];
|
||||
};
|
||||
|
||||
#define VOICE_COUNT 3
|
||||
#define SWAV_COUNT 50
|
||||
|
||||
class HopkinsEngine;
|
||||
|
||||
class SoundManager {
|
||||
private:
|
||||
HopkinsEngine *_vm;
|
||||
|
||||
bool VOICE_STAT(int voiceIndex);
|
||||
void STOP_VOICE(int voiceIndex);
|
||||
void SDL_LVOICE(int catPos);
|
||||
void PLAY_VOICE_SDL();
|
||||
bool DEL_SAMPLE_SDL(int wavIndex);
|
||||
bool SDL_LoadVoice(const Common::String &filename, size_t fileOffset, SwavItem &item);
|
||||
|
||||
public:
|
||||
int SPECIAL_SOUND;
|
||||
int SOUNDVOL;
|
||||
@@ -46,6 +93,11 @@ public:
|
||||
bool VOICEOFF;
|
||||
bool TEXTOFF;
|
||||
bool SOUND_FLAG;
|
||||
bool VBL_MERDE;
|
||||
bool CARD_SB;
|
||||
VoiceItem Voice[VOICE_COUNT];
|
||||
SwavItem Swav[SWAV_COUNT];
|
||||
MusicItem Music[2];
|
||||
public:
|
||||
SoundManager();
|
||||
void setParent(HopkinsEngine *vm);
|
||||
@@ -56,7 +108,7 @@ public:
|
||||
void LOAD_WAV(const Common::String &file, int a2);
|
||||
void PLAY_ANM_SOUND(int soundNumber);
|
||||
void WSOUND(int soundNumber);
|
||||
bool VOICE_MIX(int a1, int a2);
|
||||
bool VOICE_MIX(int voiceId, int voiceMode);
|
||||
void DEL_SAMPLE(int soundNumber);
|
||||
void PLAY_SOUND(const Common::String &file);
|
||||
void PLAY_SOUND2(const Common::String &file2);
|
||||
|
||||
Reference in New Issue
Block a user