diff options
| -rw-r--r-- | scumm/script_v6.cpp | 28 | ||||
| -rw-r--r-- | scumm/script_v7he.cpp | 2 | ||||
| -rw-r--r-- | scumm/sound.cpp | 47 | ||||
| -rw-r--r-- | scumm/sound.h | 8 | 
4 files changed, 47 insertions, 38 deletions
diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index f71083d565..19adb9013c 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -1024,19 +1024,19 @@ void ScummEngine_v6::o6_getOwner() {  }  void ScummEngine_v6::o6_startSound() { +	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() +	if ((_features & GF_HUMONGOUS) && (_gameId != GID_PUTTDEMO)) +		offset = pop(); +		  	if (_features & GF_DIGI_IMUSE) -		_imuseDigital->startSfx(pop(), 64); -	else { -		if ((_features & GF_HUMONGOUS) && (_gameId != GID_PUTTDEMO)) { -			// Seems to range between 952 - 9000 -			// 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()); -	} +		_imuseDigital->startSfx(snd, 64); +	else  +		_sound->addSoundToQueue(snd, offset);  }  void ScummEngine_v6::o6_stopSound() { @@ -1046,8 +1046,8 @@ 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()); + +	_sound->addSoundToQueue(pop());  }  void ScummEngine_v6::o6_stopObjectScript() { diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index 549291b587..ec9fb043e9 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -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; diff --git a/scumm/sound.cpp b/scumm/sound.cpp index 8a4f58d511..2be3532c37 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -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(); diff --git a/scumm/sound.h b/scumm/sound.h index f2d1cde327..71bd62c4a2 100644 --- a/scumm/sound.h +++ b/scumm/sound.h @@ -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);  | 
