aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2006-01-15 08:37:01 +0000
committerTravis Howell2006-01-15 08:37:01 +0000
commit5db5e59701892923df2175e2473de641794c431e (patch)
tree59d629113b1d29aa8a3d2f9b5441991c224a685b
parent0e88d466ec9d06e85818597cf49f72db31a61d95 (diff)
downloadscummvm-rg350-5db5e59701892923df2175e2473de641794c431e.tar.gz
scummvm-rg350-5db5e59701892923df2175e2473de641794c431e.tar.bz2
scummvm-rg350-5db5e59701892923df2175e2473de641794c431e.zip
Fix sound channel selection in HE95+ games.
svn-id: r20040
-rw-r--r--scumm/script_v100he.cpp2
-rw-r--r--scumm/script_v7he.cpp2
-rw-r--r--scumm/scumm.cpp4
-rw-r--r--scumm/scumm.h4
-rw-r--r--scumm/sound.h3
-rw-r--r--scumm/sound_he.cpp58
-rw-r--r--scumm/vars.cpp14
7 files changed, 55 insertions, 32 deletions
diff --git a/scumm/script_v100he.cpp b/scumm/script_v100he.cpp
index 3a1d64f49e..5c521da9f5 100644
--- a/scumm/script_v100he.cpp
+++ b/scumm/script_v100he.cpp
@@ -1702,7 +1702,7 @@ void ScummEngine_v100he::o100_startSound() {
_heSndSoundId = pop();
_heSndOffset = 0;
_heSndSoundFreq = 11025;
- _heSndChannel = VAR(VAR_MUSIC_CHANNEL);
+ _heSndChannel = VAR(VAR_SOUND_CHANNEL);
_heSndFlags = 0;
break;
case 133:
diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp
index d9bf89a9ad..1ee92ea325 100644
--- a/scumm/script_v7he.cpp
+++ b/scumm/script_v7he.cpp
@@ -463,7 +463,7 @@ void ScummEngine_v70he::o70_startSound() {
_heSndSoundId = pop();
_heSndOffset = 0;
_heSndSoundFreq = 11025;
- _heSndChannel = VAR(VAR_MUSIC_CHANNEL);
+ _heSndChannel = VAR(VAR_SOUND_CHANNEL);
break;
case 245:
_heSndFlags |= 1;
diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp
index 6bf5394c72..5a26f447c1 100644
--- a/scumm/scumm.cpp
+++ b/scumm/scumm.cpp
@@ -1357,10 +1357,10 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS
VAR_REDRAW_ALL_ACTORS = 0xFF;
VAR_SKIP_RESET_TALK_ACTOR = 0xFF;
- VAR_MUSIC_CHANNEL = 0xFF;
VAR_SOUND_CHANNEL = 0xFF;
+ VAR_TALK_CHANNEL = 0xFF;
VAR_SOUNDCODE_TMR = 0xFF;
- VAR_DEFAULT_SOUND_CHANNEL = 0xFF;
+ VAR_RESERVED_SOUND_CHANNELS = 0xFF;
VAR_MAIN_SCRIPT = 0xFF;
diff --git a/scumm/scumm.h b/scumm/scumm.h
index c5e781ed05..b44bb82d90 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -1332,10 +1332,10 @@ public:
byte VAR_REDRAW_ALL_ACTORS;
byte VAR_SKIP_RESET_TALK_ACTOR;
- byte VAR_MUSIC_CHANNEL;
byte VAR_SOUND_CHANNEL;
+ byte VAR_TALK_CHANNEL;
byte VAR_SOUNDCODE_TMR;
- byte VAR_DEFAULT_SOUND_CHANNEL;
+ byte VAR_RESERVED_SOUND_CHANNELS;
byte VAR_MAIN_SCRIPT;
diff --git a/scumm/sound.h b/scumm/sound.h
index 7d5a313131..7f366e83dd 100644
--- a/scumm/sound.h
+++ b/scumm/sound.h
@@ -102,7 +102,7 @@ public: // Used by createSound()
int priority;
int sbngBlock;
int soundVars[27];
- } _heChannel[9];
+ } _heChannel[8];
public:
Audio::SoundHandle _talkChannelHandle; // Handle of mixer channel actor is talking on
@@ -143,6 +143,7 @@ public:
// HE specific
bool getHEMusicDetails(int id, int &musicOffs, int &musicSize);
+ int findFreeSoundChannel();
int isSoundCodeUsed(int sound);
int getSoundPos(int sound);
int getSoundVar(int sound, int var);
diff --git a/scumm/sound_he.cpp b/scumm/sound_he.cpp
index 9accd826c9..0c029b2713 100644
--- a/scumm/sound_he.cpp
+++ b/scumm/sound_he.cpp
@@ -43,6 +43,27 @@
namespace Scumm {
+int Sound::findFreeSoundChannel() {
+ int chan, min;
+
+ min = _vm->VAR(_vm->VAR_RESERVED_SOUND_CHANNELS);
+ if (min == 0) {
+ _vm->VAR(_vm->VAR_RESERVED_SOUND_CHANNELS) = 8;
+ return 1;
+ }
+
+ if (min < 8) {
+ for (chan = min; min < ARRAYSIZE(_heChannel); chan++) {
+ if (_vm->_mixer->isSoundHandleActive(_heSoundChannels[chan]) == 0)
+ return chan;
+ }
+ } else {
+ return 1;
+ }
+
+ return min;
+}
+
int Sound::isSoundCodeUsed(int sound) {
int chan = -1;
for (int i = 0; i < ARRAYSIZE(_heChannel); i ++) {
@@ -290,20 +311,16 @@ void Sound::processSoundOpcodes(int sound, byte *codePtr, int *soundVars) {
}
void Sound::playHESound(int soundID, int heOffset, int heChannel, int heFlags) {
- debug(0,"playHESound: soundID %d heOffset %d heChannel %d heFlags %d", soundID, heOffset, heChannel, heFlags);
byte *ptr, *spoolPtr;
char *sound;
int size = -1;
int priority, rate;
byte flags = Audio::Mixer::FLAG_UNSIGNED | Audio::Mixer::FLAG_AUTOFREE;
- if (heChannel == -1) {
- if (_vm->_heversion >= 95 && _vm->VAR(_vm->VAR_DEFAULT_SOUND_CHANNEL) != 0) {
- heChannel = _vm->VAR(_vm->VAR_DEFAULT_SOUND_CHANNEL);
- } else {
- heChannel = 1;
- }
- }
+ if (heChannel == -1)
+ heChannel = (_vm->VAR_RESERVED_SOUND_CHANNELS != 0xFF) ? findFreeSoundChannel() : 1;
+
+ debug(0,"playHESound: soundID %d heOffset %d heChannel %d heFlags %d", soundID, heOffset, heChannel, heFlags);
if (soundID > _vm->_numSounds) {
if (soundID >= 10000) {
@@ -360,10 +377,19 @@ void Sound::playHESound(int soundID, int heOffset, int heChannel, int heFlags) {
return;
}
+ // TODO: Extra sound flags
+ if (heFlags & 1) {
+ //flags |= Audio::Mixer::FLAG_LOOP;
+ }
+
// Support for sound in later Backyard sports games
- if (READ_UINT32(ptr) == MKID('RIFF')) {
+ if (READ_UINT32(ptr) == MKID('RIFF') || READ_UINT32(ptr) == MKID('WSOU')) {
uint16 type;
int blockAlign;
+
+ if (READ_UINT32(ptr) == MKID('WSOU'))
+ ptr += 8;
+
size = READ_LE_UINT32(ptr + 4);
Common::MemoryReadStream stream(ptr, size);
@@ -382,6 +408,7 @@ void Sound::playHESound(int soundID, int heOffset, int heChannel, int heFlags) {
sound = (char *)malloc(size);
memcpy(sound, ptr + stream.pos(), size);
}
+ _vm->_mixer->stopHandle(_heSoundChannels[heChannel]);
_vm->_mixer->playRaw(&_heSoundChannels[heChannel], sound, size, rate, flags, soundID);
}
// Support for sound in Humongous Entertainment games
@@ -392,12 +419,11 @@ void Sound::playHESound(int soundID, int heOffset, int heChannel, int heFlags) {
rate = READ_LE_UINT16(ptr + 22);
ptr += 8 + READ_BE_UINT32(ptr + 12);
- // TODO
- /* if (_vm->_mixer->isSoundHandleActive(_heSoundChannels[heChannel])) {
+ if (_vm->_mixer->isSoundHandleActive(_heSoundChannels[heChannel])) {
int curSnd = _heChannel[heChannel].sound;
if (curSnd != 0 && curSnd != 1 && soundID != 1 && _heChannel[heChannel].priority > priority)
return;
- } */
+ }
int codeOffs = -1;
if (READ_UINT32(ptr) == MKID('SBNG')) {
@@ -420,14 +446,10 @@ void Sound::playHESound(int soundID, int heOffset, int heChannel, int heFlags) {
_overrideFreq = 0;
}
- // TODO
- if (heFlags & 1) {
- //flags |= Audio::Mixer::FLAG_LOOP;
- }
-
// Allocate a sound buffer, copy the data into it, and play
sound = (char *)malloc(size);
memcpy(sound, ptr + heOffset + 8, size);
+ _vm->_mixer->stopHandle(_heSoundChannels[heChannel]);
_vm->_mixer->playRaw(&_heSoundChannels[heChannel], sound, size, rate, flags, soundID);
_vm->setHETimer(heChannel + 4);
@@ -485,7 +507,7 @@ void Sound::startHETalkSound(uint32 offset) {
ptr = _vm->getResourceAddress(rtSound, 1);
_sfxFile->read(ptr, size);
- int channel = (_vm->VAR_SOUND_CHANNEL != 0xFF) ? _vm->VAR(_vm->VAR_SOUND_CHANNEL) : 0;
+ int channel = (_vm->VAR_TALK_CHANNEL != 0xFF) ? _vm->VAR(_vm->VAR_TALK_CHANNEL) : 0;
addSoundToQueue2(1, 0, channel, 0);
}
diff --git a/scumm/vars.cpp b/scumm/vars.cpp
index 0333f2f5d3..91d9c652be 100644
--- a/scumm/vars.cpp
+++ b/scumm/vars.cpp
@@ -214,8 +214,8 @@ void ScummEngine_v70he::setupScummVars() {
VAR_MUSIC_TIMER = 0xFF;
VAR_NUM_SOUND_CHANNELS = 9;
- VAR_SOUND_CHANNEL = 10;
- VAR_MUSIC_CHANNEL = 14;
+ VAR_TALK_CHANNEL = 10;
+ VAR_SOUND_CHANNEL = 14;
}
void ScummEngine_v72he::setupScummVars() {
@@ -266,8 +266,8 @@ void ScummEngine_v72he::setupScummVars() {
VAR_CHARINC = 48;
VAR_TALK_ACTOR = 49;
VAR_LAST_SOUND = 50;
- VAR_SOUND_CHANNEL = 51;
- VAR_MUSIC_CHANNEL = 52;
+ VAR_TALK_CHANNEL = 51;
+ VAR_SOUND_CHANNEL = 52;
VAR_MEMORY_PERFORMANCE = 57;
VAR_VIDEO_PERFORMANCE = 58;
@@ -312,7 +312,7 @@ void ScummEngine_v72he::setupScummVars() {
VAR_U32_VERSION = 107;
VAR_U32_ARRAY_UNK = 116;
VAR_WIZ_TCOLOR = 117;
- VAR_DEFAULT_SOUND_CHANNEL = 120;
+ VAR_RESERVED_SOUND_CHANNELS = 120;
}
if (_heversion >= 98) {
VAR_SKIP_RESET_TALK_ACTOR = 125;
@@ -581,8 +581,8 @@ void ScummEngine_v70he::initScummVars() {
VAR(VAR_MACHINE_SPEED) = 13;
VAR(VAR_NUM_SOUND_CHANNELS) = 8;
- VAR(VAR_MUSIC_CHANNEL) = 1;
- VAR(VAR_SOUND_CHANNEL) = 2;
+ VAR(VAR_SOUND_CHANNEL) = 1;
+ VAR(VAR_TALK_CHANNEL) = 2;
}
void ScummEngine_v72he::initScummVars() {