Add support for sound offsets in HE games.
svn-id: r14209
This commit is contained in:
parent
63003a1cca
commit
d68d9a4e1d
4 changed files with 47 additions and 38 deletions
|
@ -1024,19 +1024,19 @@ void ScummEngine_v6::o6_getOwner() {
|
|||
}
|
||||
|
||||
void ScummEngine_v6::o6_startSound() {
|
||||
if (_features & GF_DIGI_IMUSE)
|
||||
_imuseDigital->startSfx(pop(), 64);
|
||||
else {
|
||||
if ((_features & GF_HUMONGOUS) && (_gameId != GID_PUTTDEMO)) {
|
||||
// Seems to range between 952 - 9000
|
||||
int offset = 0;
|
||||
int snd = pop();
|
||||
|
||||
// In Fatty Bear's Birthday Surprise the piano uses offsets 1 - 23 to
|
||||
// indicate which note to play, but only when using the standard piano
|
||||
// sound. See also o6_soundOps().
|
||||
int offset = pop();
|
||||
debug(2, "o6_startSound: offset %d", offset);
|
||||
}
|
||||
_sound->addSoundToQueue(pop());
|
||||
}
|
||||
// sound. See also o6_soundOps()
|
||||
if ((_features & GF_HUMONGOUS) && (_gameId != GID_PUTTDEMO))
|
||||
offset = pop();
|
||||
|
||||
if (_features & GF_DIGI_IMUSE)
|
||||
_imuseDigital->startSfx(snd, 64);
|
||||
else
|
||||
_sound->addSoundToQueue(snd, offset);
|
||||
}
|
||||
|
||||
void ScummEngine_v6::o6_stopSound() {
|
||||
|
@ -1046,7 +1046,7 @@ void ScummEngine_v6::o6_stopSound() {
|
|||
void ScummEngine_v6::o6_startMusic() {
|
||||
if (_features & GF_DIGI_IMUSE)
|
||||
error("o6_startMusic() It shouldn't be called here for imuse digital");
|
||||
else
|
||||
|
||||
_sound->addSoundToQueue(pop());
|
||||
}
|
||||
|
||||
|
|
|
@ -686,7 +686,7 @@ void ScummEngine_v7he::o7_startSound() {
|
|||
|
||||
case 255:
|
||||
// _sound->addSoundToQueue(_heSndSoundId, _heSndOffset, _heSndTimer, _heSndLoop);
|
||||
_sound->addSoundToQueue(_heSndSoundId);
|
||||
_sound->addSoundToQueue(_heSndSoundId, _heSndOffset);
|
||||
debug(2, "o7_startSound stub (%d, %d, %d, %d)", _heSndSoundId, _heSndOffset, _heSndTimer, _heSndLoop);
|
||||
_heSndLoop = 0;
|
||||
break;
|
||||
|
|
|
@ -75,7 +75,8 @@ Sound::Sound(ScummEngine *parent)
|
|||
_sfxMode(0) {
|
||||
|
||||
memset(_soundQue, 0, sizeof(_soundQue));
|
||||
memset(_soundQue2, 0, sizeof(_soundQue2));
|
||||
memset(_soundQue2Sound, 0, sizeof(_soundQue2Sound));
|
||||
memset(_soundQue2Offset, 0, sizeof(_soundQue2Offset));
|
||||
memset(_mouthSyncTimes, 0, sizeof(_mouthSyncTimes));
|
||||
}
|
||||
|
||||
|
@ -84,29 +85,31 @@ Sound::~Sound() {
|
|||
delete _sfxFile;
|
||||
}
|
||||
|
||||
void Sound::addSoundToQueue(int sound) {
|
||||
void Sound::addSoundToQueue(int sound, int offset) {
|
||||
_vm->VAR(_vm->VAR_LAST_SOUND) = sound;
|
||||
// Music resources are in separate file
|
||||
if (!((_vm->_heversion >= 70) && sound >= 4000))
|
||||
_vm->ensureResourceLoaded(rtSound, sound);
|
||||
addSoundToQueue2(sound);
|
||||
addSoundToQueue2(sound, offset);
|
||||
}
|
||||
|
||||
void Sound::addSoundToQueue2(int sound) {
|
||||
void Sound::addSoundToQueue2(int sound, int offset) {
|
||||
if ((_vm->_features & GF_HUMONGOUS) && _soundQue2Pos) {
|
||||
int i = _soundQue2Pos;
|
||||
while (i--) {
|
||||
if (_soundQue2[i] == sound)
|
||||
if (_soundQue2Sound[i] == sound)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
assert(_soundQue2Pos < ARRAYSIZE(_soundQue2));
|
||||
_soundQue2[_soundQue2Pos++] = sound;
|
||||
assert(_soundQue2Pos < ARRAYSIZE(_soundQue2Sound));
|
||||
_soundQue2Sound[_soundQue2Pos] = sound;
|
||||
_soundQue2Offset[_soundQue2Pos] = offset;
|
||||
_soundQue2Pos++;
|
||||
}
|
||||
|
||||
void Sound::processSoundQues() {
|
||||
int i = 0, d, num;
|
||||
int i = 0, num, offset, snd;
|
||||
int data[16];
|
||||
|
||||
processSfxQueues();
|
||||
|
@ -115,9 +118,11 @@ void Sound::processSoundQues() {
|
|||
return;
|
||||
|
||||
while (_soundQue2Pos) {
|
||||
d = _soundQue2[--_soundQue2Pos];
|
||||
if (d)
|
||||
playSound(d);
|
||||
_soundQue2Pos--;
|
||||
snd = _soundQue2Sound[_soundQue2Pos];
|
||||
offset = _soundQue2Offset[_soundQue2Pos];
|
||||
if (snd)
|
||||
playSound(snd, offset);
|
||||
}
|
||||
|
||||
while (i < _soundQuePos) {
|
||||
|
@ -148,7 +153,7 @@ void Sound::setOverrideFreq(int freq) {
|
|||
_overrideFreq = freq;
|
||||
}
|
||||
|
||||
void Sound::playSound(int soundID) {
|
||||
void Sound::playSound(int soundID, int offset) {
|
||||
byte *ptr;
|
||||
char *sound;
|
||||
int size = -1;
|
||||
|
@ -235,7 +240,7 @@ void Sound::playSound(int soundID) {
|
|||
if (READ_UINT32(ptr) != MKID('SDAT'))
|
||||
return; // abort
|
||||
|
||||
size = READ_BE_UINT32(ptr+4) - 8;
|
||||
size = READ_BE_UINT32(ptr+4) - offset - 8;
|
||||
if (_overrideFreq) {
|
||||
// Used by the piano in Fatty Bear's Birthday Surprise
|
||||
rate = _overrideFreq;
|
||||
|
@ -244,7 +249,7 @@ void Sound::playSound(int soundID) {
|
|||
|
||||
// Allocate a sound buffer, copy the data into it, and play
|
||||
sound = (char *)malloc(size);
|
||||
memcpy(sound, ptr + 8, size);
|
||||
memcpy(sound, ptr + offset + 8, size);
|
||||
_vm->_mixer->playRaw(NULL, sound, size, rate, flags, soundID);
|
||||
}
|
||||
else if (READ_UINT32(ptr) == MKID('MRAW')) {
|
||||
|
@ -769,7 +774,7 @@ bool Sound::isSoundInQueue(int sound) const {
|
|||
|
||||
i = _soundQue2Pos;
|
||||
while (i--) {
|
||||
if (_soundQue2[i] == sound)
|
||||
if (_soundQue2Sound[i] == sound)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -813,9 +818,12 @@ void Sound::stopSound(int a) {
|
|||
if (_vm->_musicEngine)
|
||||
_vm->_musicEngine->stopSound(a);
|
||||
|
||||
for (i = 0; i < ARRAYSIZE(_soundQue2); i++)
|
||||
if (_soundQue2[i] == a)
|
||||
_soundQue2[i] = 0;
|
||||
for (i = 0; i < ARRAYSIZE(_soundQue2Sound); i++) {
|
||||
if (_soundQue2Sound[i] == a) {
|
||||
_soundQue2Sound[i] = 0;
|
||||
_soundQue2Offset[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Sound::stopAllSounds() {
|
||||
|
@ -827,7 +835,8 @@ void Sound::stopAllSounds() {
|
|||
|
||||
// Clear the (secondary) sound queue
|
||||
_soundQue2Pos = 0;
|
||||
memset(_soundQue2, 0, sizeof(_soundQue2));
|
||||
memset(_soundQue2Sound, 0, sizeof(_soundQue2Sound));
|
||||
memset(_soundQue2Offset, 0, sizeof(_soundQue2Offset));
|
||||
|
||||
if (_vm->_musicEngine) {
|
||||
_vm->_musicEngine->stopAllSounds();
|
||||
|
|
|
@ -55,7 +55,7 @@ protected:
|
|||
ScummEngine *_vm;
|
||||
|
||||
int16 _soundQuePos, _soundQue[0x100];
|
||||
int16 _soundQue2Pos, _soundQue2[10];
|
||||
int16 _soundQue2Pos, _soundQue2Sound[10], _soundQue2Offset[10];
|
||||
|
||||
File *_sfxFile;
|
||||
SoundMode _soundMode;
|
||||
|
@ -84,11 +84,11 @@ public:
|
|||
public:
|
||||
Sound(ScummEngine *parent);
|
||||
~Sound();
|
||||
void addSoundToQueue(int sound);
|
||||
void addSoundToQueue2(int sound);
|
||||
void addSoundToQueue(int sound, int offset = 0);
|
||||
void addSoundToQueue2(int sound, int offset = 0);
|
||||
void processSoundQues();
|
||||
void setOverrideFreq(int freq);
|
||||
void playSound(int sound);
|
||||
void playSound(int sound, int offset = 0);
|
||||
void startTalkSound(uint32 offset, uint32 b, int mode, PlayingSoundHandle *handle = NULL);
|
||||
void stopTalkSound();
|
||||
bool isMouthSyncOff(uint pos);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue