mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-04 01:46:42 +00:00
Cleanup Sound constructor; change search order of SFX files
svn-id: r13527
This commit is contained in:
parent
95c17148ae
commit
3b7af85adf
120
scumm/sound.cpp
120
scumm/sound.cpp
@ -50,13 +50,31 @@ struct MP3OffsetTable { /* Compressed Sound (.SO3) */
|
||||
};
|
||||
|
||||
|
||||
Sound::Sound(ScummEngine *parent) {
|
||||
memset(this,0,sizeof(Sound)); // palmos
|
||||
Sound::Sound(ScummEngine *parent)
|
||||
:
|
||||
_vm(parent),
|
||||
_soundQuePos(0),
|
||||
_soundQue2Pos(0),
|
||||
_sfxFile(0),
|
||||
_offsetTable(0),
|
||||
_numSoundEffects(0),
|
||||
_soundMode(kVOCMode),
|
||||
_talk_sound_a1(0),
|
||||
_talk_sound_a2(0),
|
||||
_talk_sound_b1(0),
|
||||
_talk_sound_b2(0),
|
||||
_talk_sound_mode(0),
|
||||
_talk_sound_frame(0),
|
||||
_mouthSyncMode(false),
|
||||
_endOfMouthSync(false),
|
||||
_curSoundPos(0),
|
||||
_currentCDSound(0),
|
||||
_soundsPaused(false),
|
||||
_sfxMode(0) {
|
||||
|
||||
_vm = parent;
|
||||
_currentCDSound = 0;
|
||||
|
||||
_sfxFile = 0;
|
||||
memset(_soundQue, 0, sizeof(_soundQue));
|
||||
memset(_soundQue2, 0, sizeof(_soundQue2));
|
||||
memset(_mouthSyncTimes, 0, sizeof(_mouthSyncTimes));
|
||||
}
|
||||
|
||||
Sound::~Sound() {
|
||||
@ -553,11 +571,11 @@ void Sound::startTalkSound(uint32 offset, uint32 b, int mode, PlayingSoundHandle
|
||||
num = (b - 8) >> 1;
|
||||
}
|
||||
|
||||
if (offset_table != NULL) {
|
||||
if (_offsetTable != NULL) {
|
||||
MP3OffsetTable *result = NULL, key;
|
||||
|
||||
key.org_offset = offset;
|
||||
result = (MP3OffsetTable *)bsearch(&key, offset_table, num_sound_effects,
|
||||
result = (MP3OffsetTable *)bsearch(&key, _offsetTable, _numSoundEffects,
|
||||
sizeof(MP3OffsetTable), compareMP3OffsetTable);
|
||||
|
||||
if (result == NULL) {
|
||||
@ -834,8 +852,7 @@ void Sound::startSfxSound(File *file, int file_size, PlayingSoundHandle *handle,
|
||||
|
||||
AudioStream *input = NULL;
|
||||
|
||||
if (file_size > 0) {
|
||||
switch (_sound_mode) {
|
||||
switch (_soundMode) {
|
||||
case kMP3Mode:
|
||||
#ifdef USE_MAD
|
||||
input = makeMP3Stream(file, file_size);
|
||||
@ -851,8 +868,7 @@ void Sound::startSfxSound(File *file, int file_size, PlayingSoundHandle *handle,
|
||||
input = makeFlacStream(file, file_size);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
default:
|
||||
input = makeVOCStream(_sfxFile);
|
||||
}
|
||||
|
||||
@ -872,43 +888,51 @@ void Sound::startSfxSound(File *file, int file_size, PlayingSoundHandle *handle,
|
||||
File *Sound::openSfxFile() {
|
||||
char buf[256];
|
||||
File *file = new File();
|
||||
_offsetTable = NULL;
|
||||
|
||||
struct SoundFileExtensions {
|
||||
const char *ext;
|
||||
SoundMode mode;
|
||||
};
|
||||
|
||||
const SoundFileExtensions extensions[] = {
|
||||
#ifdef USE_FLAC
|
||||
{ "sof", kFlacMode },
|
||||
#endif
|
||||
#ifdef USE_MAD
|
||||
{ "so3", kMP3Mode },
|
||||
#endif
|
||||
#ifdef USE_VORBIS
|
||||
{ "sog", kVorbisMode },
|
||||
#endif
|
||||
{ "sou", kVOCMode },
|
||||
{ 0, kVOCMode }
|
||||
};
|
||||
|
||||
/* Try opening the file <_gameName>.sou first, eg tentacle.sou.
|
||||
* That way, you can keep .sou files for multiple games in the
|
||||
* same directory */
|
||||
offset_table = NULL;
|
||||
|
||||
#ifdef USE_FLAC
|
||||
if (!file->isOpen()) {
|
||||
sprintf(buf, "%s.sof", _vm->getGameName());
|
||||
if (!file->open(buf))
|
||||
file->open("monster.sof");
|
||||
if (file->isOpen())
|
||||
_sound_mode = kFlacMode;
|
||||
int i, j;
|
||||
const char *basename[3] = { 0, 0, 0 };
|
||||
basename[0] = _vm->getGameName();
|
||||
basename[1] = "monster";
|
||||
|
||||
for (j = 0; basename[j] && !file->isOpen(); ++j) {
|
||||
for (i = 0; extensions[i].ext; ++i) {
|
||||
sprintf(buf, "%s.%s", basename[j], extensions[i].ext);
|
||||
if (file->open(buf)) {
|
||||
_soundMode = extensions[i].mode;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_MAD
|
||||
if (!file->isOpen()) {
|
||||
sprintf(buf, "%s.so3", _vm->getGameName());
|
||||
if (!file->open(buf))
|
||||
file->open("monster.so3");
|
||||
if (file->isOpen())
|
||||
_sound_mode = kMP3Mode;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_VORBIS
|
||||
if (!file->isOpen()) {
|
||||
sprintf(buf, "%s.sog", _vm->getGameName());
|
||||
if (!file->open(buf))
|
||||
file->open("monster.sog");
|
||||
if (file->isOpen())
|
||||
_sound_mode = kVorbisMode;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (file->isOpen()) {
|
||||
if (!file->isOpen()) {
|
||||
sprintf(buf, "%s.tlk", _vm->getGameName());
|
||||
file->open(buf, _vm->getGameDataPath(), File::kFileReadMode, 0x69);
|
||||
_soundMode = kVOCMode;
|
||||
} else if (_soundMode != kVOCMode) {
|
||||
/* Now load the 'offset' index in memory to be able to find the MP3 data
|
||||
|
||||
The format of the .SO3 file is easy :
|
||||
@ -926,11 +950,11 @@ File *Sound::openSfxFile() {
|
||||
int size, compressed_offset;
|
||||
MP3OffsetTable *cur;
|
||||
compressed_offset = file->readUint32BE();
|
||||
offset_table = (MP3OffsetTable *) malloc(compressed_offset);
|
||||
num_sound_effects = compressed_offset / 16;
|
||||
_offsetTable = (MP3OffsetTable *) malloc(compressed_offset);
|
||||
_numSoundEffects = compressed_offset / 16;
|
||||
|
||||
size = compressed_offset;
|
||||
cur = offset_table;
|
||||
cur = _offsetTable;
|
||||
while (size > 0) {
|
||||
cur[0].org_offset = file->readUint32BE();
|
||||
cur[0].new_offset = file->readUint32BE() + compressed_offset + 4; /* The + 4 is to take into accound the 'size' field */
|
||||
@ -939,18 +963,8 @@ File *Sound::openSfxFile() {
|
||||
size -= 4 * 4;
|
||||
cur++;
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
sprintf(buf, "%s.sou", _vm->getGameName());
|
||||
if (!file->open(buf)) {
|
||||
file->open("monster.sou");
|
||||
}
|
||||
|
||||
if (!file->isOpen()) {
|
||||
sprintf(buf, "%s.tlk", _vm->getGameName());
|
||||
file->open(buf, _vm->getGameDataPath(), File::kFileReadMode, 0x69);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
|
@ -38,10 +38,23 @@ enum {
|
||||
|
||||
class Sound {
|
||||
protected:
|
||||
enum SoundMode {
|
||||
kVOCMode,
|
||||
kMP3Mode,
|
||||
kVorbisMode,
|
||||
kFlacMode
|
||||
};
|
||||
|
||||
ScummEngine *_vm;
|
||||
|
||||
int16 _soundQuePos, _soundQue[0x100];
|
||||
int16 _soundQue2Pos, _soundQue2[10];
|
||||
|
||||
File *_sfxFile;
|
||||
SoundMode _soundMode;
|
||||
MP3OffsetTable *_offsetTable; // For compressed audio
|
||||
int _numSoundEffects; // For compressed audio
|
||||
|
||||
uint32 _talk_sound_a1, _talk_sound_a2, _talk_sound_b1, _talk_sound_b2;
|
||||
byte _talk_sound_mode;
|
||||
int _talk_sound_frame;
|
||||
@ -50,14 +63,7 @@ protected:
|
||||
uint16 _mouthSyncTimes[64];
|
||||
uint _curSoundPos;
|
||||
|
||||
MP3OffsetTable *offset_table; // SO3 MP3 compressed audio
|
||||
int num_sound_effects; // SO3 MP3 compressed audio
|
||||
enum { kMP3Mode, kVorbisMode, kFlacMode } _sound_mode;
|
||||
|
||||
int _currentCDSound;
|
||||
|
||||
ScummEngine *_vm;
|
||||
|
||||
public:
|
||||
PlayingSoundHandle _talkChannelHandle; // Handle of mixer channel actor is talking on
|
||||
bool _soundsPaused;
|
||||
|
Loading…
x
Reference in New Issue
Block a user