[Scummvm-cvs-logs] SF.net SVN: scummvm:[39716] scummvm/trunk/engines/parallaction

Kirben at users.sourceforge.net Kirben at users.sourceforge.net
Sat Mar 28 10:56:39 CET 2009


Revision: 39716
          http://scummvm.svn.sourceforge.net/scummvm/?rev=39716&view=rev
Author:   Kirben
Date:     2009-03-28 09:56:39 +0000 (Sat, 28 Mar 2009)

Log Message:
-----------
Add sound effects support for PC version of BRA.

Modified Paths:
--------------
    scummvm/trunk/engines/parallaction/disk_br.cpp
    scummvm/trunk/engines/parallaction/parallaction.cpp
    scummvm/trunk/engines/parallaction/sound.h
    scummvm/trunk/engines/parallaction/sound_br.cpp
    scummvm/trunk/engines/parallaction/sound_ns.cpp

Modified: scummvm/trunk/engines/parallaction/disk_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk_br.cpp	2009-03-28 06:45:22 UTC (rev 39715)
+++ scummvm/trunk/engines/parallaction/disk_br.cpp	2009-03-28 09:56:39 UTC (rev 39716)
@@ -404,7 +404,7 @@
 
 Common::SeekableReadStream* DosDisk_br::loadSound(const char* name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadSound");
-	return 0;
+	return openFile("sfx/" + Common::String(name), ".sfx");
 }
 
 
@@ -720,7 +720,7 @@
 
 Common::SeekableReadStream* AmigaDisk_br::loadSound(const char* name) {
 	debugC(5, kDebugDisk, "AmigaDisk_br::loadSound");
-	return tryOpenFile("sfx/" + Common::String(name), ".sfx");
+	return openFile("sfx/" + Common::String(name), ".sfx");
 }
 
 static const uint16 objectsMax[5] = {

Modified: scummvm/trunk/engines/parallaction/parallaction.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction.cpp	2009-03-28 06:45:22 UTC (rev 39715)
+++ scummvm/trunk/engines/parallaction/parallaction.cpp	2009-03-28 09:56:39 UTC (rev 39716)
@@ -960,10 +960,12 @@
 }
 
 void Parallaction::beep() {
-	_soundMan->execute(SC_SETSFXCHANNEL, 3);
-	_soundMan->execute(SC_SETSFXVOLUME, 127);
-	_soundMan->execute(SC_SETSFXLOOPING, (int32)0);
-	_soundMan->execute(SC_PLAYSFX, "beep");
+	if (getGameType() == GType_Nippon) {
+		_soundMan->execute(SC_SETSFXCHANNEL, 3);
+		_soundMan->execute(SC_SETSFXVOLUME, 127);
+		_soundMan->execute(SC_SETSFXLOOPING, (int32)0);
+		_soundMan->execute(SC_PLAYSFX, "beep");
+	}
 }
 
 void Parallaction::scheduleLocationSwitch(const char *location) {

Modified: scummvm/trunk/engines/parallaction/sound.h
===================================================================
--- scummvm/trunk/engines/parallaction/sound.h	2009-03-28 06:45:22 UTC (rev 39715)
+++ scummvm/trunk/engines/parallaction/sound.h	2009-03-28 09:56:39 UTC (rev 39716)
@@ -141,7 +141,7 @@
 	void pause(bool p);
 };
 
-#define NUM_AMIGA_CHANNELS 4
+#define NUM_SFX_CHANNELS 4
 
 class AmigaSoundMan_ns : public SoundMan_ns {
 
@@ -155,7 +155,7 @@
 		bool				dispose;
 		Audio::SoundHandle	handle;
 		uint32				flags;
-	} _channels[NUM_AMIGA_CHANNELS];
+	} _channels[NUM_SFX_CHANNELS];
 
 	void loadChannelData(const char *filename, Channel *ch);
 
@@ -193,11 +193,23 @@
 	virtual void stopMusic() = 0;
 	virtual void pause(bool p) = 0;
 
+	struct Channel {
+		Audio::Voice8Header	header;
+		int8				*data;
+		uint32				dataSize;
+		bool				dispose;
+		Audio::SoundHandle	handle;
+		uint32				flags;
+	} _channels[NUM_SFX_CHANNELS];
+
+	virtual void loadChannelData(const char *filename, Channel *ch) = 0;
+
 public:
 	SoundMan_br(Parallaction_br *vm);
+	~SoundMan_br();
 
 	virtual void playSfx(const char *filename, uint channel, bool looping, int volume = -1) { }
-	virtual void stopSfx(uint channel) { }
+	void stopSfx(uint channel);
 
 	virtual void execute(int command, const char *parm);
 	void setMusicFile(const char *parm);
@@ -207,6 +219,8 @@
 
 	MidiPlayer_MSC	*_midiPlayer;
 
+	void loadChannelData(const char *filename, Channel *ch);
+
 public:
 	DosSoundMan_br(Parallaction_br *vm, MidiDriver *midiDriver);
 	~DosSoundMan_br();
@@ -216,7 +230,6 @@
 	void pause(bool p);
 
 	void playSfx(const char *filename, uint channel, bool looping, int volume);
-	void stopSfx(uint channel);
 };
 
 class AmigaSoundMan_br : public SoundMan_br {
@@ -224,17 +237,8 @@
 	Audio::AudioStream *_musicStream;
 	Audio::SoundHandle	_musicHandle;
 
-	struct Channel {
-		Audio::Voice8Header	header;
-		int8				*data;
-		uint32				dataSize;
-		bool				dispose;
-		Audio::SoundHandle	handle;
-		uint32				flags;
-	} _channels[NUM_AMIGA_CHANNELS];
+	void loadChannelData(const char *filename, Channel *ch);
 
-	bool loadChannelData(const char *filename, Channel *ch);
-
 public:
 	AmigaSoundMan_br(Parallaction_br *vm);
 	~AmigaSoundMan_br();
@@ -244,7 +248,6 @@
 	void pause(bool p);
 
 	void playSfx(const char *filename, uint channel, bool looping, int volume);
-	void stopSfx(uint channel);
 };
 
 } // namespace Parallaction

Modified: scummvm/trunk/engines/parallaction/sound_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/sound_br.cpp	2009-03-28 06:45:22 UTC (rev 39715)
+++ scummvm/trunk/engines/parallaction/sound_br.cpp	2009-03-28 09:56:39 UTC (rev 39716)
@@ -401,12 +401,37 @@
 	delete _midiPlayer;
 }
 
-void DosSoundMan_br::playSfx(const char *filename, uint channel, bool looping, int volume) {
-	warning("SC_PLAYSFX not yet supported!");
+void DosSoundMan_br::loadChannelData(const char *filename, Channel *ch) {
+	Common::SeekableReadStream *stream = _vm->_disk->loadSound(filename);
+
+	ch->dataSize = stream->size();
+	ch->data = (int8*)malloc(ch->dataSize);
+	if (stream->read(ch->data, ch->dataSize) != ch->dataSize)
+		error("DosSoundMan_br::loadChannelData: Read failed");
+
+	ch->dispose = true;
+	delete stream;
+
+	// TODO: Confirm sound rate
+	ch->header.samplesPerSec = 11025;
 }
 
-void DosSoundMan_br::stopSfx(uint channel) {
-	warning("SC_STOPSFX not yet supported!");
+void DosSoundMan_br::playSfx(const char *filename, uint channel, bool looping, int volume) {
+	stopSfx(channel);
+
+	debugC(1, kDebugAudio, "DosSoundMan_br::playSfx(%s, %u, %i, %i)", filename, channel, looping, volume);
+
+	Channel *ch = &_channels[channel];
+	loadChannelData(filename, ch);
+
+	uint32 loopStart = 0, loopEnd = 0, flags = Audio::Mixer::FLAG_UNSIGNED;
+	if (looping) {
+		loopEnd = ch->dataSize;
+		flags |= Audio::Mixer::FLAG_LOOP;
+	}
+
+	_mixer->playRaw(Audio::Mixer::kSFXSoundType, &ch->handle, ch->data, ch->dataSize,
+		ch->header.samplesPerSec, flags, -1, volume, 0, loopStart, loopEnd);
 }
 
 void DosSoundMan_br::playMusic() {
@@ -429,40 +454,22 @@
 
 AmigaSoundMan_br::AmigaSoundMan_br(Parallaction_br *vm) : SoundMan_br(vm)  {
 	_musicStream = 0;
-	_channels[0].data = 0;
-	_channels[0].dispose = false;
-	_channels[1].data = 0;
-	_channels[1].dispose = false;
-	_channels[2].data = 0;
-	_channels[2].dispose = false;
-	_channels[3].data = 0;
-	_channels[3].dispose = false;
 }
 
 AmigaSoundMan_br::~AmigaSoundMan_br() {
 	stopMusic();
-	stopSfx(0);
-	stopSfx(1);
-	stopSfx(2);
-	stopSfx(3);
 }
 
-bool AmigaSoundMan_br::loadChannelData(const char *filename, Channel *ch) {
+void AmigaSoundMan_br::loadChannelData(const char *filename, Channel *ch) {
 	Common::SeekableReadStream *stream = _vm->_disk->loadSound(filename);
-	// NOTE: Sound files don't always exist
-	if (!stream)
-		return false;
-
 	Audio::A8SVXDecoder decoder(*stream, ch->header, ch->data, ch->dataSize);
 	decoder.decode();
 	ch->dispose = true;
 	delete stream;
-
-	return true;
 }
 
 void AmigaSoundMan_br::playSfx(const char *filename, uint channel, bool looping, int volume) {
-	if (channel >= NUM_AMIGA_CHANNELS) {
+	if (channel >= NUM_SFX_CHANNELS) {
 		warning("unknown sfx channel");
 		return;
 	}
@@ -472,10 +479,9 @@
 	debugC(1, kDebugAudio, "AmigaSoundMan_ns::playSfx(%s, %i)", filename, channel);
 
 	Channel *ch = &_channels[channel];
-	if (!loadChannelData(filename, ch))
-		return;
+	loadChannelData(filename, ch);
 
-	uint32 loopStart, loopEnd, flags;
+	uint32 loopStart = 0, loopEnd = 0, flags = 0;
 	if (looping) {
 		// the standard way to loop 8SVX audio implies use of the oneShotHiSamples and
 		// repeatHiSamples fields, but Nippon Safes handles loops according to flags
@@ -483,9 +489,6 @@
 		loopStart = 0;
 		loopEnd = ch->header.oneShotHiSamples + ch->header.repeatHiSamples;
 		flags = Audio::Mixer::FLAG_LOOP;
-	} else {
-		loopStart = loopEnd = 0;
-		flags = 0;
 	}
 
 	if (volume == -1) {
@@ -496,20 +499,6 @@
 		ch->header.samplesPerSec, flags, -1, volume, 0, loopStart, loopEnd);
 }
 
-void AmigaSoundMan_br::stopSfx(uint channel) {
-	if (channel >= NUM_AMIGA_CHANNELS) {
-		warning("unknown sfx channel");
-		return;
-	}
-
-	if (_channels[channel].dispose) {
-		debugC(1, kDebugAudio, "AmigaSoundMan_ns::stopSfx(%i)", channel);
-		_mixer->stopHandle(_channels[channel].handle);
-		free(_channels[channel].data);
-		_channels[channel].data = 0;
-	}
-}
-
 void AmigaSoundMan_br::playMusic() {
 	stopMusic();
 
@@ -544,12 +533,42 @@
 
 SoundMan_br::SoundMan_br(Parallaction_br *vm) : _vm(vm) {
 	_mixer = _vm->_mixer;
+
+	_channels[0].data = 0;
+	_channels[0].dispose = false;
+	_channels[1].data = 0;
+	_channels[1].dispose = false;
+	_channels[2].data = 0;
+	_channels[2].dispose = false;
+	_channels[3].data = 0;
+	_channels[3].dispose = false;
 }
 
+SoundMan_br::~SoundMan_br() {
+	stopSfx(0);
+	stopSfx(1);
+	stopSfx(2);
+	stopSfx(3);
+}
+
 void SoundMan_br::setMusicFile(const char *name) {
 	_musicFile = name;
 }
 
+void SoundMan_br::stopSfx(uint channel) {
+	if (channel >= NUM_SFX_CHANNELS) {
+		warning("unknown sfx channel");
+		return;
+	}
+
+	if (_channels[channel].dispose) {
+		debugC(1, kDebugAudio, "SoundMan_br::stopSfx(%i)", channel);
+		_mixer->stopHandle(_channels[channel].handle);
+		free(_channels[channel].data);
+		_channels[channel].data = 0;
+	}
+}
+
 void SoundMan_br::execute(int command, const char *parm) {
 	uint32 n = parm ? strtoul(parm, 0, 10) : 0;
 	bool b = (n == 1) ? true : false;

Modified: scummvm/trunk/engines/parallaction/sound_ns.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/sound_ns.cpp	2009-03-28 06:45:22 UTC (rev 39715)
+++ scummvm/trunk/engines/parallaction/sound_ns.cpp	2009-03-28 09:56:39 UTC (rev 39716)
@@ -387,7 +387,7 @@
 }
 
 void AmigaSoundMan_ns::playSfx(const char *filename, uint channel, bool looping, int volume) {
-	if (channel >= NUM_AMIGA_CHANNELS) {
+	if (channel >= NUM_SFX_CHANNELS) {
 		warning("unknown sfx channel");
 		return;
 	}
@@ -421,7 +421,7 @@
 }
 
 void AmigaSoundMan_ns::stopSfx(uint channel) {
-	if (channel >= NUM_AMIGA_CHANNELS) {
+	if (channel >= NUM_SFX_CHANNELS) {
 		warning("unknown sfx channel");
 		return;
 	}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list