[Scummvm-cvs-logs] SF.net SVN: scummvm:[40912] scummvm/trunk/engines/sci

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Tue May 26 13:49:11 CEST 2009


Revision: 40912
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40912&view=rev
Author:   fingolfin
Date:     2009-05-26 11:49:10 +0000 (Tue, 26 May 2009)

Log Message:
-----------
SCI: Turned sfx_player_t into a class SfxPlayer, and converted the existing players to subclasses of that

Modified Paths:
--------------
    scummvm/trunk/engines/sci/module.mk
    scummvm/trunk/engines/sci/sfx/core.cpp
    scummvm/trunk/engines/sci/sfx/iterator.cpp
    scummvm/trunk/engines/sci/sfx/player/new_player.cpp
    scummvm/trunk/engines/sci/sfx/player/new_player.h
    scummvm/trunk/engines/sci/sfx/player/polled.cpp
    scummvm/trunk/engines/sci/sfx/player/polled.h
    scummvm/trunk/engines/sci/sfx/player/realtime.cpp
    scummvm/trunk/engines/sci/sfx/player/realtime.h
    scummvm/trunk/engines/sci/sfx/player.h

Modified: scummvm/trunk/engines/sci/module.mk
===================================================================
--- scummvm/trunk/engines/sci/module.mk	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/module.mk	2009-05-26 11:49:10 UTC (rev 40912)
@@ -64,7 +64,6 @@
 	sfx/songlib.o \
 	sfx/device/devices.o \
 	sfx/player/new_player.o \
-	sfx/player/players.o \
 	sfx/player/polled.o \
 	sfx/player/realtime.o \
 	sfx/seq/gm.o \

Modified: scummvm/trunk/engines/sci/sfx/core.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/core.cpp	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/core.cpp	2009-05-26 11:49:10 UTC (rev 40912)
@@ -27,7 +27,9 @@
 
 #include "sci/tools.h"
 #include "sci/sfx/core.h"
-#include "sci/sfx/player.h"
+#include "sci/sfx/player/new_player.h"
+#include "sci/sfx/player/polled.h"
+#include "sci/sfx/player/realtime.h"
 #include "sci/sfx/sci_midi.h"
 
 #include "common/system.h"
@@ -44,7 +46,7 @@
 int sciprintf(char *msg, ...);
 #endif
 
-static sfx_player_t *player = NULL;
+SfxPlayer *player = NULL;		// FIXME: Avoid static vars
 
 
 int sfx_pcm_available() {
@@ -56,13 +58,6 @@
 		player->stop();
 }
 
-tell_synth_func *sfx_get_player_tell_func() {
-	if (player)
-		return player->tell_synth;
-	else
-		return NULL;
-}
-
 int sfx_get_player_polyphony() {
 	if (player)
 		return player->polyphony;
@@ -306,8 +301,7 @@
 				sciprintf("[SFX] Stopping song %lx\n", oldseeker->handle);
 			}
 			if (player && oldseeker->it)
-				player->iterator_message
-				(SongIterator::Message(oldseeker->it->ID, SIMSG_STOP));
+				player->iterator_message(SongIterator::Message(oldseeker->it->ID, SIMSG_STOP));
 			oldseeker->next_playing = NULL; /* Clear this pointer; we don't need the tag anymore */
 		}
 
@@ -352,7 +346,6 @@
 
 #define DELAY (1000000 / SFX_TICKS_PER_SEC)
 
-
 static void _sfx_timer_callback(void *data) {
 	/* First run the player, to give it a chance to fill
 	** the audio buffer  */
@@ -375,7 +368,10 @@
 		return;
 	}
 
-	player = sfx_find_player(NULL);
+	// TODO: Implement platform policy here?
+	player = new NewPlayer();
+	//player = new PolledPlayer();
+	//player = new RealtimePlayer();
 
 
 #ifdef DEBUG_SONG_API
@@ -391,6 +387,7 @@
 		player = NULL;
 	} else if (player->init(resmgr, DELAY / 1000)) {
 		sciprintf("[SFX] Song player '%s' reported error, disabled\n", player->name);
+		delete player;
 		player = NULL;
 	}
 
@@ -406,16 +403,15 @@
 	// We initialise the timer last, so there is no possibility of the
 	// timer callback being triggered while the mixer or player are
 	// still being initialized.
-
-	if (g_system->getMixer()->isReady() || (player && player->maintenance)) {
+	if (strcmp(player->name, "realtime") == 0) {
+		// FIXME: Merge this timer code into RealtimePlayer itself
 		if (!g_system->getTimerManager()->installTimerProc(&_sfx_timer_callback, DELAY, NULL)) {
 			warning("[SFX] " __FILE__": Timer failed to initialize");
 			warning("[SFX] Disabled sound support");
+			delete player;
 			player = NULL;
-			return;
 		}
-	} /* With no PCM device and no player, we don't need a timer */
-
+	}
 }
 
 void sfx_exit(sfx_state_t *self) {
@@ -429,8 +425,6 @@
 	fprintf(stderr, "[sfx-core] Uninitialising\n");
 #endif
 
-	song_lib_free(self->songlib);
-
 	// WARNING: The mixer may hold feeds from the player, so we must
 	// stop the mixer BEFORE stopping the player.
 	// FIXME Player "new" frees its own feeds, so we only need to stop any
@@ -438,13 +432,19 @@
 	if (strcmp(player->name, "new") != 0)
 		g_system->getMixer()->stopAll();
 
-	if (player)
+	// FIXME: change players to stop their own audio streams
+	if (player) {
 		// See above: This must happen AFTER stopping the mixer
 		player->exit();
+		delete player;
+		player = 0;
+	}
 
 	if (strcmp(player->name, "new") == 0)
 		g_system->getMixer()->stopAll();
 
+	song_lib_free(self->songlib);
+
 	// Delete audio resources for CD talkie games
 	if (self->audioResource) {
 		delete self->audioResource;
@@ -715,7 +715,6 @@
 Common::Error sfx_send_midi(sfx_state_t *self, song_handle_t handle, int channel,
 	int command, int arg1, int arg2) {
 	byte buffer[5];
-	tell_synth_func *tell = sfx_get_player_tell_func();
 
 	/* Yes, in that order. SCI channel mutes are actually done via
 	   a counting semaphore. 0 means to decrement the counter, 1
@@ -753,8 +752,8 @@
 		return Common::kUnknownError;
 	}
 
-	if (tell)
-		tell(MIDI_cmdlen[command >> 4], buffer);
+	if (player)
+		player->tell_synth(MIDI_cmdlen[command >> 4], buffer);
 	return Common::kNoError;
 }
 

Modified: scummvm/trunk/engines/sci/sfx/iterator.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/iterator.cpp	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/iterator.cpp	2009-05-26 11:49:10 UTC (rev 40912)
@@ -127,22 +127,22 @@
 }
 
 void SongIteratorChannel::resetSynthChannels() {
+	extern SfxPlayer *player;	// FIXME
 	byte buf[5];
-	tell_synth_func *tell = sfx_get_player_tell_func();
 
 	for (int i = 0; i < MIDI_CHANNELS; i++) {
 		if (playmask & (1 << i)) {
 			buf[0] = 0xe0 | i; /* Pitch bend */
 			buf[1] = 0x80; /* Wheel center */
 			buf[2] = 0x40;
-			if (tell)
-				tell(3, buf);
+			if (player)
+				player->tell_synth(3, buf);
 
 			buf[0] = 0xb0 | i; // Set control
 			buf[1] = 0x40; // Hold pedal
 			buf[2] = 0x00; // Off
-			if (tell)
-				tell(3, buf);
+			if (player)
+				player->tell_synth(3, buf);
 			/* TODO: Reset other controls? */
 		}
 	}

Modified: scummvm/trunk/engines/sci/sfx/player/new_player.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/player/new_player.cpp	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/player/new_player.cpp	2009-05-26 11:49:10 UTC (rev 40912)
@@ -36,6 +36,7 @@
 
 namespace Sci {
 
+// TODO: Turn the following static vars into member vars
 static MidiPlayer *mididrv;
 
 static SongIterator *play_it = NULL;
@@ -89,7 +90,7 @@
 	}
 }
 
-static void player_tell_synth(int buf_nr, byte *buf) {
+void NewPlayer::tell_synth(int buf_nr, byte *buf) {
 	byte op1 = (buf_nr < 2 ? 0 : buf[1]);
 	byte op2 = (buf_nr < 3 ? 0 : buf[2]);
 
@@ -97,25 +98,18 @@
 }
 
 static void player_timer_callback(void *refCon) {
-	mutex->lock();
+	Common::StackLock lock(*mutex);
+
 	if (play_it && !play_it_done && !play_paused) {
 		play_song(play_it);
 	}
 
 	current_time = current_time.addFrames(1);
-	mutex->unlock();
 }
 
-static void player_void_callback(void) {
-}
-
 /* API implementation */
 
-static Common::Error player_set_option(char *name, char *value) {
-	return Common::kUnknownError;
-}
-
-static Common::Error player_init(ResourceManager *resmgr, int expected_latency) {
+Common::Error NewPlayer::init(ResourceManager *resmgr, int expected_latency) {
 	MidiDriverType musicDriver = MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_ADLIB);
 
 	switch(musicDriver) {
@@ -134,7 +128,7 @@
 
 	assert(mididrv);
 
-	sfx_new_player.polyphony = mididrv->getPolyphony();
+	this->polyphony = mididrv->getPolyphony();
 
 	tempo = mididrv->getBaseTempo();
     uint32 time = g_system->getMillis();
@@ -150,7 +144,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error player_add_iterator(SongIterator *it, uint32 start_time) {
+Common::Error NewPlayer::add_iterator(SongIterator *it, uint32 start_time) {
 	mutex->lock();
 	SIMSG_SEND(it, SIMSG_SET_PLAYMASK(mididrv->getPlayMask()));
 	SIMSG_SEND(it, SIMSG_SET_RHYTHM(mididrv->hasRhythmChannel()));
@@ -168,12 +162,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error player_fade_out(void) {
-	warning("Attempt to fade out - not implemented yet");
-	return Common::kUnknownError;
-}
-
-static Common::Error player_stop(void) {
+Common::Error NewPlayer::stop(void) {
 	debug(3, "Player: Stopping song iterator %p", (void *)play_it);
 	mutex->lock();
 	delete play_it;
@@ -185,41 +174,39 @@
 	return Common::kNoError;
 }
 
-static Common::Error player_send_iterator_message(const SongIterator::Message &msg) {
-	mutex->lock();
+Common::Error NewPlayer::iterator_message(const SongIterator::Message &msg) {
+	Common::StackLock lock(*mutex);
 	if (!play_it) {
-		mutex->unlock();
 		return Common::kUnknownError;
 	}
 
 	songit_handle_message(&play_it, msg);
-	mutex->unlock();
 
 	return Common::kNoError;
 }
 
-static Common::Error player_pause(void) {
-	mutex->lock();
+Common::Error NewPlayer::pause(void) {
+	Common::StackLock lock(*mutex);
+
 	play_paused = 1;
 	play_pause_diff = wakeup_time.msecsDiff(current_time);
 
 	mididrv->playSwitch(false);
-	mutex->unlock();
 
 	return Common::kNoError;
 }
 
-static Common::Error player_resume(void) {
-	mutex->lock();
+Common::Error NewPlayer::resume(void) {
+	Common::StackLock lock(*mutex);
+
 	wakeup_time = Audio::Timestamp(current_time.msecs() + play_pause_diff, SFX_TICKS_PER_SEC);
 	mididrv->playSwitch(true);
 	play_paused = 0;
-	mutex->unlock();
 
 	return Common::kNoError;
 }
 
-static Common::Error player_exit(void) {
+Common::Error NewPlayer::exit(void) {
 	mididrv->close();
 	delete mididrv;
 	delete mutex;
@@ -229,22 +216,9 @@
 	return Common::kNoError;
 }
 
-sfx_player_t sfx_new_player = {
-	"new",
-	"0.1",
-	&player_set_option,
-	&player_init,
-	&player_add_iterator,
-	&player_fade_out,
-	&player_stop,
-	&player_send_iterator_message,
-	&player_pause,
-	&player_resume,
-	&player_exit,
-	&player_void_callback,
-	&player_tell_synth,
-	0 /* polyphony */
-};
+NewPlayer::NewPlayer() {
+	name = "new";
+	version = "0.1";
+}
 
 } // End of namespace Sci
-

Modified: scummvm/trunk/engines/sci/sfx/player/new_player.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/player/new_player.h	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/player/new_player.h	2009-05-26 11:49:10 UTC (rev 40912)
@@ -30,8 +30,20 @@
 
 namespace Sci {
 
-extern sfx_player_t sfx_new_player;
+class NewPlayer : public SfxPlayer {
+public:
+	NewPlayer();
 
+	virtual Common::Error init(ResourceManager *resmgr, int expected_latency);
+	virtual Common::Error add_iterator(SongIterator *it, uint32 start_time);
+	virtual Common::Error stop();
+	virtual Common::Error iterator_message(const SongIterator::Message &msg);
+	virtual Common::Error pause();
+	virtual Common::Error resume();
+	virtual Common::Error exit();
+	virtual void tell_synth(int buf_nr, byte *buf);
+};
+
 } // End of namespace Sci
 
 #endif

Modified: scummvm/trunk/engines/sci/sfx/player/polled.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/player/polled.cpp	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/player/polled.cpp	2009-05-26 11:49:10 UTC (rev 40912)
@@ -36,6 +36,7 @@
 
 namespace Sci {
 
+// TODO: Turn the following static vars into member vars
 static SongIterator *play_it;
 static int play_paused = 0;
 static sfx_softseq_t *seq;
@@ -48,7 +49,7 @@
 #define TIME_INC 60
 static int time_counter = 0;
 
-static void pp_tell_synth(int buf_nr, byte *buf) {
+void PolledPlayer::tell_synth(int buf_nr, byte *buf) {
 	seq->handle_command(seq, buf[0], buf_nr - 1, buf + 1);
 }
 
@@ -262,15 +263,7 @@
 /* API implementation */
 /*--------------------*/
 
-static void pp_timer_callback() {
-	/* Hey, we're polled anyway ;-) */
-}
-
-static Common::Error pp_set_option(char *name, char *value) {
-	return Common::kUnknownError;
-}
-
-static Common::Error pp_init(ResourceManager *resmgr, int expected_latency) {
+Common::Error PolledPlayer::init(ResourceManager *resmgr, int expected_latency) {
 	if (!g_system->getMixer()->isReady())
 		return Common::kUnknownError;
 
@@ -307,15 +300,16 @@
 
 	seq->set_volume(seq, volume);
 
+	// FIXME: Keep a SoundHandle and use that to stop the feed in the exit method
 	PolledPlayerAudioStream *newStream = new PolledPlayerAudioStream(seq->pcm_conf);
 	// FIXME: Is this sound type appropriate?
 	g_system->getMixer()->playInputStream(Audio::Mixer::kSFXSoundType, 0, newStream);
 
-	sfx_player_polled.polyphony = seq->polyphony;
+	this->polyphony = seq->polyphony;
 	return Common::kNoError;
 }
 
-static Common::Error pp_add_iterator(SongIterator *it, uint32 start_time) {
+Common::Error PolledPlayer::add_iterator(SongIterator *it, uint32 start_time) {
 	SongIterator *old = play_it;
 
 	SIMSG_SEND(it, SIMSG_SET_PLAYMASK(seq->playmask));
@@ -340,12 +334,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error pp_fade_out() {
-	warning(__FILE__": Attempt to fade out- not implemented yet");
-	return Common::kUnknownError;
-}
-
-static Common::Error pp_stop() {
+Common::Error PolledPlayer::stop() {
 	SongIterator *it = play_it;
 
 	play_it = NULL;
@@ -357,7 +346,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error pp_send_iterator_message(const SongIterator::Message &msg) {
+Common::Error PolledPlayer::iterator_message(const SongIterator::Message &msg) {
 	if (!play_it)
 		return Common::kUnknownError;
 
@@ -365,14 +354,14 @@
 	return Common::kNoError;
 }
 
-static Common::Error pp_pause() {
+Common::Error PolledPlayer::pause() {
 	play_paused = 1;
 	seq->set_volume(seq, 0);
 
 	return Common::kNoError;
 }
 
-static Common::Error pp_resume() {
+Common::Error PolledPlayer::resume() {
 	if (!play_it) {
 		play_paused = 0;
 		return Common::kNoError; /* Nothing to resume */
@@ -388,7 +377,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error pp_exit() {
+Common::Error PolledPlayer::exit() {
 	seq->exit(seq);
 	delete play_it;
 	play_it = NULL;
@@ -396,21 +385,9 @@
 	return Common::kNoError;
 }
 
-sfx_player_t sfx_player_polled = {
-	"polled",
-	"0.1",
-	&pp_set_option,
-	&pp_init,
-	&pp_add_iterator,
-	&pp_fade_out,
-	&pp_stop,
-	&pp_send_iterator_message,
-	&pp_pause,
-	&pp_resume,
-	&pp_exit,
-	&pp_timer_callback,
-	&pp_tell_synth,
-	0 /* polyphony */
-};
+PolledPlayer::PolledPlayer() {
+	name = "polled";
+	version = "0.1";
+}
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/sfx/player/polled.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/player/polled.h	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/player/polled.h	2009-05-26 11:49:10 UTC (rev 40912)
@@ -30,8 +30,20 @@
 
 namespace Sci {
 
-extern sfx_player_t sfx_player_polled;
+class PolledPlayer : public SfxPlayer {
+public:
+	PolledPlayer();
 
+	virtual Common::Error init(ResourceManager *resmgr, int expected_latency);
+	virtual Common::Error add_iterator(SongIterator *it, uint32 start_time);
+	virtual Common::Error stop();
+	virtual Common::Error iterator_message(const SongIterator::Message &msg);
+	virtual Common::Error pause();
+	virtual Common::Error resume();
+	virtual Common::Error exit();
+	virtual void tell_synth(int buf_nr, byte *buf);
+};
+
 } // End of namespace Sci
 
 #endif

Modified: scummvm/trunk/engines/sci/sfx/player/realtime.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/player/realtime.cpp	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/player/realtime.cpp	2009-05-26 11:49:10 UTC (rev 40912)
@@ -37,14 +37,15 @@
 
 namespace Sci {
 
-static sfx_sequencer_t *seq;
-
 /* Playing mechanism */
 
 static inline int delta_time(const uint32 comp, const uint32 base) {
 	return long(comp) - long(base);
 }
 
+// TODO: Turn the following static vars into member vars
+static sfx_sequencer_t *seq;
+
 static SongIterator *play_it = NULL;
 static uint32 play_last_time;
 static uint32 play_pause_started; /* Beginning of the last pause */
@@ -105,11 +106,11 @@
 		}
 }
 
-static void rt_tell_synth(int buf_nr, byte *buf) {
+void RealtimePlayer::tell_synth(int buf_nr, byte *buf) {
 	seq->event(buf[0], buf_nr - 1, buf + 1);
 }
 
-static void rt_timer_callback(void) {
+void RealtimePlayer::maintenance() {
 	if (play_it && !play_it_done) {
 		if (!play_moredelay) {
 			int delta = delta_time(play_last_time, g_system->getMillis());
@@ -145,11 +146,7 @@
 
 /* API implementation */
 
-static Common::Error rt_set_option(char *name, char *value) {
-	return Common::kUnknownError;
-}
-
-static Common::Error rt_init(ResourceManager *resmgr, int expected_latency) {
+Common::Error RealtimePlayer::init(ResourceManager *resmgr, int expected_latency) {
 	Resource *res = NULL, *res2 = NULL;
 	void *seq_dev = NULL;
 
@@ -160,7 +157,7 @@
 		return Common::kUnknownError;
 	}
 
-	sfx_player_realtime.polyphony = seq->polyphony;
+	this->polyphony = seq->polyphony;
 
 	res = find_patch(resmgr, seq->name, seq->patchfile);
 	res2 = find_patch(resmgr, seq->name, seq->patchfile2);
@@ -189,7 +186,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error rt_add_iterator(SongIterator *it, uint32 start_time) {
+Common::Error RealtimePlayer::add_iterator(SongIterator *it, uint32 start_time) {
 	if (seq->reset_timer) /* Restart timer counting if possible */
 		seq->reset_timer(start_time);
 
@@ -204,12 +201,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error rt_fade_out(void) {
-	warning(__FILE__": Attempt to fade out- not implemented yet");
-	return Common::kUnknownError;
-}
-
-static Common::Error rt_stop(void) {
+Common::Error RealtimePlayer::stop(void) {
 	SongIterator *it = play_it;
 
 	play_it = NULL;
@@ -221,7 +213,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error rt_send_iterator_message(const SongIterator::Message &msg) {
+Common::Error RealtimePlayer::iterator_message(const SongIterator::Message &msg) {
 	if (!play_it)
 		return Common::kUnknownError;
 
@@ -229,7 +221,7 @@
 	return Common::kNoError;
 }
 
-static Common::Error rt_pause(void) {
+Common::Error RealtimePlayer::pause(void) {
 	play_pause_started = g_system->getMillis();
 	// Also, indicate that we haven't modified the time counter yet
 	play_pause_counter = play_pause_started;
@@ -242,12 +234,12 @@
 		return seq->allstop();
 }
 
-static Common::Error rt_resume(void) {
+Common::Error RealtimePlayer::resume(void) {
 	play_paused = 0;
 	return Common::kNoError;
 }
 
-static Common::Error rt_exit(void) {
+Common::Error RealtimePlayer::exit(void) {
 	if (seq->close()) {
 		warning("[SFX] Sequencer reported error on close");
 		return Common::kUnknownError;
@@ -256,21 +248,9 @@
 	return Common::kNoError;
 }
 
-sfx_player_t sfx_player_realtime = {
-	"realtime",
-	"0.1",
-	&rt_set_option,
-	&rt_init,
-	&rt_add_iterator,
-	&rt_fade_out,
-	&rt_stop,
-	&rt_send_iterator_message,
-	&rt_pause,
-	&rt_resume,
-	&rt_exit,
-	&rt_timer_callback,
-	&rt_tell_synth,
-	0 /* polyphony */
-};
+RealtimePlayer::RealtimePlayer() {
+	name = "realtime";
+	version = "0.1";
+}
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/sfx/player/realtime.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/player/realtime.h	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/player/realtime.h	2009-05-26 11:49:10 UTC (rev 40912)
@@ -30,8 +30,21 @@
 
 namespace Sci {
 
-extern sfx_player_t sfx_player_realtime;
+class RealtimePlayer : public SfxPlayer {
+public:
+	RealtimePlayer();
 
+	virtual Common::Error init(ResourceManager *resmgr, int expected_latency);
+	virtual Common::Error add_iterator(SongIterator *it, uint32 start_time);
+	virtual Common::Error stop();
+	virtual Common::Error iterator_message(const SongIterator::Message &msg);
+	virtual Common::Error pause();
+	virtual Common::Error resume();
+	virtual Common::Error exit();
+	virtual void maintenance();
+	virtual void tell_synth(int buf_nr, byte *buf);
+};
+
 } // End of namespace Sci
 
 #endif

Modified: scummvm/trunk/engines/sci/sfx/player.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/player.h	2009-05-26 11:35:35 UTC (rev 40911)
+++ scummvm/trunk/engines/sci/sfx/player.h	2009-05-26 11:49:10 UTC (rev 40912)
@@ -35,20 +35,19 @@
 
 namespace Sci {
 
-typedef void tell_synth_func(int buf_nr, byte *buf);
-
-struct sfx_player_t {
+class SfxPlayer {
+public:
 	const char *name;
 	const char *version;
 
-	Common::Error (*set_option)(char *name, char *value);
-	/* Sets an option for player timing mechanism
-	** Parameters: (char *) name: The name describing what to set
-	**             (char *) value: The value to set
-	** Returns   : (int) Common::kNoError, or Common::kUnknownError if the name wasn't understood
-	*/
+	/** Number of voices that can play simultaneously */
+	int polyphony;
 
-	Common::Error (*init)(ResourceManager *resmgr, int expected_latency);
+public:
+	SfxPlayer() : name(0), version(0), polyphony(0) {}
+	virtual ~SfxPlayer() {}
+
+	virtual Common::Error init(ResourceManager *resmgr, int expected_latency) = 0;
 	/* Initializes the player
 	** Parameters: (ResourceManager *) resmgr: A resource manager for driver initialization
 	**             (int) expected_latency: Expected delay in between calls to 'maintenance'
@@ -56,7 +55,7 @@
 	** Returns   : (int) Common::kNoError on success, Common::kUnknownError on failure
 	*/
 
-	Common::Error (*add_iterator)(SongIterator *it, uint32 start_time);
+	virtual Common::Error add_iterator(SongIterator *it, uint32 start_time) = 0;
 	/* Adds an iterator to the song player
 	** Parameters: (songx_iterator_t *) it: The iterator to play
 	**             (uint32) start_time: The time to assume as the
@@ -68,17 +67,12 @@
 	** to add iterators onto their already existing iterators
 	*/
 
-	Common::Error (*fade_out)();
-	/* Fades out the currently playing song (within two seconds
-	** Returns   : (int) Common::kNoError on success, Common::kUnknownError on failure
-	*/
-
-	Common::Error (*stop)();
+	virtual Common::Error stop() = 0;
 	/* Stops the currently playing song and deletes the associated iterator
 	** Returns   : (int) Common::kNoError on success, Common::kUnknownError on failure
 	*/
 
-	Common::Error (*iterator_message)(const SongIterator::Message &msg);
+	virtual Common::Error iterator_message(const SongIterator::Message &msg) = 0;
 	/* Transmits a song iterator message to the active song
 	** Parameters: (SongIterator::Message) msg: The message to transmit
 	** Returns   : (int) Common::kNoError on success, Common::kUnknownError on failure
@@ -87,48 +81,34 @@
 	** and re-start playing, so it is preferred that it is present
 	*/
 
-	Common::Error (*pause)(); /* OPTIONAL -- may be NULL */
+	virtual Common::Error pause() = 0;
 	/* Pauses song playing
 	** Returns   : (int) Common::kNoError on success, Common::kUnknownError on failure
 	*/
 
-	Common::Error (*resume)(); /* OPTIONAL -- may be NULL */
+	virtual Common::Error resume() = 0;
 	/* Resumes song playing after a pause
 	** Returns   : (int) Common::kNoError on success, Common::kUnknownError on failure
 	*/
 
-	Common::Error (*exit)();
+	virtual Common::Error exit() = 0;
 	/* Stops the player
 	** Returns   : (int) Common::kNoError on success, Common::kUnknownError on failure
 	*/
 
-	void (*maintenance)(); /* OPTIONAL -- may be NULL */
+	virtual void maintenance() {}
 	/* Regularly called maintenance function
 	** This function is called frequently and regularly (if present), it can be
 	** used to emit sound.
 	*/
 
-	tell_synth_func *tell_synth;
+	virtual void tell_synth(int buf_nr, byte *buf) = 0;
 	/* Pass a raw MIDI event to the synth
 	Parameters: (int) argc: Length of buffer holding the midi event
 	           (byte *) argv: The buffer itself
 	*/
-
-	int polyphony; /* Number of voices that can play simultaneously */
-
 };
 
-sfx_player_t *sfx_find_player(char *name);
-/* Looks up a player by name or finds the default player
-** Parameters: (char *) name: Name of the player to look up, or NULL for dedault
-** Returns   : (sfx_player_t *) The player requested, or NULL if none was found
-*/
-
-tell_synth_func *sfx_get_player_tell_func();
-/* Gets the callback function of the player in use.
-** Returns:   (tell_synth_func *) The callback function.
-*/
-
 int sfx_get_player_polyphony();
 /* Determines the polyphony of the player in use
 ** Returns   : (int) Number of voices the active player can emit


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