[Scummvm-cvs-logs] CVS: scummvm/saga sound.cpp,1.33,1.34 sound.h,1.25,1.26

Eugene Sandulenko sev at users.sourceforge.net
Mon Aug 15 16:27:27 CEST 2005


Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11357

Modified Files:
	sound.cpp sound.h 
Log Message:
Fix prince room sound inconsistencies mentioned in bugreport #1258501


Index: sound.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sound.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- sound.cpp	13 Aug 2005 01:35:52 -0000	1.33
+++ sound.cpp	15 Aug 2005 23:26:50 -0000	1.34
@@ -32,12 +32,31 @@
 
 Sound::Sound(SagaEngine *vm, Audio::Mixer *mixer, int enabled) :
 	_vm(vm), _mixer(mixer), _enabled(enabled), _voxStream(0) {
+
+	for (int i = 0; i < SOUND_HANDLES; i++)
+		_handles[i].type = kFreeHandle;
 }
 
 Sound::~Sound() {
 	delete _voxStream;
 }
 
+SndHandle *Sound::getHandle() {
+	for (int i = 0; i < SOUND_HANDLES; i++) {
+		if (_handles[i].type == kFreeHandle)
+			return &_handles[i];
+
+		if (!_mixer->isSoundHandleActive(_handles[i].handle)) {
+			_handles[i].type = kFreeHandle;
+			return &_handles[i];
+		}
+	}
+
+	error("Sound::getHandle(): Too many sound handles");
+
+	return NULL;
+}
+
 void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume, bool loop) {
 	byte flags;
 
@@ -61,39 +80,62 @@
 }
 
 void Sound::playSound(SoundBuffer &buffer, int volume, bool loop) {
-	playSoundBuffer(&_effectHandle, buffer, 2 * volume, loop);
+	SndHandle *handle = getHandle();
+
+	handle->type = kEffectHandle;
+	playSoundBuffer(&handle->handle, buffer, 2 * volume, loop);
 }
 
 void Sound::pauseSound() {
-	_mixer->pauseHandle(_effectHandle, true);
+	for (int i = 0; i < SOUND_HANDLES; i++)
+		if (_handles[i].type == kEffectHandle)
+			_mixer->pauseHandle(_handles[i].handle, true);
 }
 
 void Sound::resumeSound() {
-	_mixer->pauseHandle(_effectHandle, false);
+	for (int i = 0; i < SOUND_HANDLES; i++)
+		if (_handles[i].type == kEffectHandle)
+			_mixer->pauseHandle(_handles[i].handle, false);
 }
 
 void Sound::stopSound() {
-	_mixer->stopHandle(_effectHandle);
+	for (int i = 0; i < SOUND_HANDLES; i++)
+		if (_handles[i].type == kEffectHandle) {
+			_mixer->stopHandle(_handles[i].handle);
+			_handles[i].type = kFreeHandle;
+		}
 }
 
 void Sound::playVoice(SoundBuffer &buffer) {
-	playSoundBuffer(&_voiceHandle, buffer, 255, false);
+	SndHandle *handle = getHandle();
+
+	handle->type = kVoiceHandle;
+	playSoundBuffer(&handle->handle, buffer, 255, false);
 }
 
 void Sound::pauseVoice() {
-	_mixer->pauseHandle(_voiceHandle, true);
+	for (int i = 0; i < SOUND_HANDLES; i++)
+		if (_handles[i].type == kVoiceHandle)
+			_mixer->pauseHandle(_handles[i].handle, true);
 }
 
 void Sound::resumeVoice() {
-	_mixer->pauseHandle(_voiceHandle, false);
+	for (int i = 0; i < SOUND_HANDLES; i++)
+		if (_handles[i].type == kVoiceHandle)
+			_mixer->pauseHandle(_handles[i].handle, false);
 }
 
 void Sound::stopVoice() {
-	_mixer->stopHandle(_voiceHandle);
+	for (int i = 0; i < SOUND_HANDLES; i++)
+		if (_handles[i].type == kVoiceHandle) {
+			_mixer->stopHandle(_handles[i].handle);
+			_handles[i].type = kFreeHandle;
+		}
 }
 
 void Sound::stopAll() {
-	_mixer->stopAll();
+	stopVoice();
+	stopSound();
 }
 
 } // End of namespace Saga

Index: sound.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sound.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- sound.h	13 Aug 2005 01:35:52 -0000	1.25
+++ sound.h	15 Aug 2005 23:26:50 -0000	1.26
@@ -30,6 +30,8 @@
 
 namespace Saga {
 
+#define SOUND_HANDLES 10
+
 enum SOUND_FLAGS {
 	SOUND_LOOP = 1
 };
@@ -45,6 +47,17 @@
 	bool isBigEndian;
 };
 
+enum sndHandleType {
+	kFreeHandle,
+	kEffectHandle,
+	kVoiceHandle
+};
+
+struct SndHandle {
+	Audio::SoundHandle handle;
+	sndHandleType type;
+};
+
 class Sound {
 public:
 
@@ -66,15 +79,15 @@
  private:
 
 	void playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume, bool loop);
+
+	SndHandle *getHandle();
 	int _enabled;
 
 	SagaEngine *_vm;
 	Audio::Mixer *_mixer;
 	Common::MemoryReadStream *_voxStream;
 
-	Audio::SoundHandle _effectHandle;
-	Audio::SoundHandle _voiceHandle;
-
+	SndHandle _handles[SOUND_HANDLES];
 };
 
 } // End of namespace Saga





More information about the Scummvm-git-logs mailing list