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

dhewg at users.sourceforge.net dhewg at users.sourceforge.net
Tue Feb 24 19:31:05 CET 2009


Revision: 38845
          http://scummvm.svn.sourceforge.net/scummvm/?rev=38845&view=rev
Author:   dhewg
Date:     2009-02-24 18:31:05 +0000 (Tue, 24 Feb 2009)

Log Message:
-----------
substitute all time related functions, removing sci_gettime sci_get_current_time altogether.

Modified Paths:
--------------
    scummvm/trunk/engines/sci/gfx/operations.cpp
    scummvm/trunk/engines/sci/sfx/core.cpp
    scummvm/trunk/engines/sci/sfx/mixer/soft.cpp
    scummvm/trunk/engines/sci/sfx/player/polled.cpp
    scummvm/trunk/engines/sci/sfx/player/realtime.cpp
    scummvm/trunk/engines/sci/sfx/seq/gm.cpp
    scummvm/trunk/engines/sci/sfx/sequencer.h
    scummvm/trunk/engines/sci/sfx/sfx_engine.h
    scummvm/trunk/engines/sci/sfx/sfx_player.h
    scummvm/trunk/engines/sci/sfx/sfx_songlib.h
    scummvm/trunk/engines/sci/sfx/sfx_time.h
    scummvm/trunk/engines/sci/sfx/songlib.cpp
    scummvm/trunk/engines/sci/sfx/time.cpp
    scummvm/trunk/engines/sci/tools.cpp
    scummvm/trunk/engines/sci/tools.h

Modified: scummvm/trunk/engines/sci/gfx/operations.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/operations.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/gfx/operations.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -1335,10 +1335,6 @@
 
 // Pointer and IO ops
 
-#define SECONDS_OF_DAY (24*60*60)
-#define MILLION 1000000
-// Sure, this may seem silly, but it's too easy to miss a zero...)
-
 #define GFXOP_FULL_POINTER_REFRESH if (_gfxop_full_pointer_refresh(state)) { GFXERROR("Failed to do full pointer refresh!\n"); return GFX_ERROR; }
 
 static int _gfxop_full_pointer_refresh(gfx_state_t *state) {

Modified: scummvm/trunk/engines/sci/sfx/core.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/core.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/core.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -26,12 +26,16 @@
 /* Sound subsystem core: Event handler, sound player dispatching */
 
 #include <stdio.h>
+
+#include "sci/tools.h"
 #include "sci/sfx/sfx_timer.h"
 #include "sci/sfx/sfx_iterator_internal.h"
 #include "sci/sfx/sfx_player.h"
 #include "sci/sfx/mixer.h"
 #include "sci/include/sci_midi.h"
+
 #include "common/mutex.h"
+#include "common/system.h"
 
 namespace Sci {
 
@@ -50,9 +54,6 @@
 
 Common::Mutex* callbackMutex;
 
-
-#define MILLION 1000000
-
 int sfx_pcm_available() {
 	return (pcm_device != NULL);
 }
@@ -76,42 +77,17 @@
 		return 0;
 }
 
-static long time_minus(GTimeVal t1, GTimeVal t2) {
-	return (t1.tv_sec - t2.tv_sec) * MILLION + (t1.tv_usec - t2.tv_usec);
-}
-
-static GTimeVal time_plus(GTimeVal t1, long delta) {
-	if (delta > 0)
-		t1.tv_usec += delta % MILLION;
-	else
-		t1.tv_usec -= (-delta) % MILLION;
-
-	t1.tv_sec += delta / MILLION;
-
-	if (t1.tv_usec > MILLION) {
-		t1.tv_sec++;
-		t1.tv_usec -= MILLION;
-	}
-
-	return t1;
-}
-
-
 static void _freeze_time(sfx_state_t *self) {
 	/* Freezes the top song delay time */
-	GTimeVal ctime;
-	long delta;
-
+	uint32 ctime = g_system->getMillis();
 	song_t *song = self->song;
-	sci_get_current_time(&ctime);
 
 	while (song) {
-		delta = time_minus(song->wakeup_time, ctime);
-		if (delta < 0)
-			delta = 0;
+		if (ctime > song->wakeup_time)
+			song->delay = 0;
+		else
+			song->delay = song->wakeup_time - ctime;
 
-		song->delay = delta;
-
 		song = song->next_playing;
 	}
 }
@@ -162,13 +138,11 @@
 
 static void _thaw_time(sfx_state_t *self) {
 	/* inverse of _freeze_time() */
-	GTimeVal ctime;
+	uint32 ctime = g_system->getMillis();
 	song_t *song = self->song;
 
-	sci_get_current_time(&ctime);
-
 	while (song) {
-		song->wakeup_time = time_plus(ctime, song->delay);
+		song->wakeup_time = ctime + song->delay;
 
 		song = song->next_playing;
 	}
@@ -198,15 +172,11 @@
 
 	case SOUND_STATUS_SUSPENDED:
 	case SOUND_STATUS_WAITING:
-
 		if (song->status == SOUND_STATUS_PLAYING) {
 			/* Update delay, set wakeup_time */
-			GTimeVal time;
-			long delta;
-			sci_get_current_time(&time);
-			delta = time_minus(time, song->wakeup_time);
+			uint32 time = g_system->getMillis();
 
-			song->delay -= delta;
+			song->delay -= long(time) - long(song->wakeup_time);
 			song->wakeup_time = time;
 		}
 		if (status == SOUND_STATUS_SUSPENDED)
@@ -217,7 +187,7 @@
 	case SOUND_STATUS_PLAYING:
 		if (song->status == SOUND_STATUS_STOPPED)
 			/* Starting anew */
-			sci_get_current_time(&song->wakeup_time);
+			song->wakeup_time = g_system->getMillis();
 
 		if (is_playing(self, song))
 			status = SOUND_STATUS_PLAYING;
@@ -239,7 +209,6 @@
 	song_t *newsong = song_lib_find_active(self->songlib);
 
 	if (newsong != self->song) {
-
 		_freeze_time(self); /* Store song delay time */
 
 		if (player)
@@ -286,8 +255,7 @@
 			song_iterator_t *clonesong
 			= songit_clone(newsong->it, newsong->delay);
 
-			player->add_iterator(clonesong,
-			                     newsong->wakeup_time);
+			player->add_iterator(clonesong, newsong->wakeup_time);
 		}
 	}
 }
@@ -301,8 +269,7 @@
 	song_t not_playing_anymore; /* Dummy object, referenced by
 				    ** songs which are no longer
 				    ** active.  */
-	GTimeVal tv;
-	sci_get_current_time(&tv);
+
 	/*	_dump_playing_list(self, "before");*/
 	_freeze_time(self); /* Store song delay time */
 
@@ -359,7 +326,7 @@
 
 			player->add_iterator(songit_clone(newseeker->it,
 			                                  newseeker->delay),
-			                     tv);
+			                     g_system->getMillis());
 		}
 		_sfx_set_song_status(self, newseeker,
 		                     SOUND_STATUS_PLAYING);
@@ -535,10 +502,6 @@
 	callbackMutex = 0;
 }
 
-static inline int time_le(GTimeVal a, GTimeVal b) {
-	return time_minus(a, b) <= 0;
-}
-
 void sfx_suspend(sfx_state_t *self, int suspend) {
 #ifdef DEBUG_SONG_API
 	fprintf(stderr, "[sfx-core] Suspending? = %d\n", suspend);
@@ -582,11 +545,9 @@
 }
 
 int sfx_poll_specific(sfx_state_t *self, song_handle_t handle, int *cue) {
-	GTimeVal ctime;
+	uint32 ctime = g_system->getMillis();
 	song_t *song = self->song;
 
-	sci_get_current_time(&ctime);
-
 	while (song && song->handle != handle)
 		song = song->next_playing;
 
@@ -601,16 +562,15 @@
 		unsigned char buf[8];
 		int result;
 
-		if (!time_le(song->wakeup_time, ctime))
+		if (song->wakeup_time > ctime)
 			return 0; /* Patience, young hacker! */
-		result = songit_next(&(song->it), buf, cue,
-		                     IT_READER_MASK_ALL);
 
+		result = songit_next(&(song->it), buf, cue, IT_READER_MASK_ALL);
+
 		switch (result) {
 
 		case SI_FINISHED:
-			_sfx_set_song_status(self, song,
-			                     SOUND_STATUS_STOPPED);
+			_sfx_set_song_status(self, song, SOUND_STATUS_STOPPED);
 			_update(self);
 			/* ...fall through... */
 		case SI_LOOP:
@@ -634,9 +594,8 @@
 
 		default:
 			if (result > 0)
-				song->wakeup_time =
-				    time_plus(song->wakeup_time,
-				              result * SOUND_TICK);
+				song->wakeup_time += result * SOUND_TICK;
+
 			/* Delay */
 			break;
 		}
@@ -690,7 +649,7 @@
 	song->resource_num = number;
 	song->hold = 0;
 	song->loops = 0;
-	sci_get_current_time(&song->wakeup_time); /* No need to delay */
+	song->wakeup_time = g_system->getMillis(); /* No need to delay */
 	song_lib_add(self->songlib, song);
 	self->song = NULL; /* As above */
 	_update(self);

Modified: scummvm/trunk/engines/sci/sfx/mixer/soft.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/mixer/soft.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/mixer/soft.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -24,6 +24,7 @@
  */
 
 #include "common/mutex.h"
+#include "common/system.h"
 
 #include "sci/tools.h"
 #include "sci/sfx/mixer.h"
@@ -31,8 +32,8 @@
 
 namespace Sci {
 
-/* Max. number of microseconds in difference allowed between independent audio streams */
-#define TIMESTAMP_MAX_ALLOWED_DELTA 2000
+/* Max. number of milliseconds in difference allowed between independent audio streams */
+#define TIMESTAMP_MAX_ALLOWED_DELTA 2
 
 /*#define DEBUG 3*/
 /* Set DEBUG to one of the following:
@@ -42,7 +43,7 @@
 **     >= 3 -- fully detailed input and output analysis (once per frame and feed)
 */
 
-/*#define DEBUG 0*/
+//#define DEBUG 1
 
 #define MIN_DELTA_OBSERVATIONS 100 /* Number of times the mixer is called before it starts trying to improve latency */
 #define MAX_DELTA_OBSERVATIONS 1000000 /* Number of times the mixer is called before we assume we truly understand timing */
@@ -61,9 +62,9 @@
 	int32 *compbuf_l, *compbuf_r; /* Intermediate buffers for computation */
 	int lastbuf_len; /* Number of frames stored in the last buffer */
 
-	long skew; /* Millisecond relative to which we compute time. This is the millisecond
+	uint32 skew; /* Millisecond relative to which we compute time. This is the millisecond
 		   ** part of the first time we emitted sound, to simplify some computations.  */
-	long lsec; /* Last point in time we updated buffers, if any (seconds since the epoch) */
+	uint32 lsec; /* Last point in time we updated buffers, if any (seconds since the epoch) */
 	int played_this_second; /* Number of frames emitted so far in second lsec */
 
 	int max_delta; /* maximum observed time delta (using 'frames' as a metric unit) */
@@ -85,11 +86,7 @@
 	P->compbuf_r = (int32*)sci_malloc(sizeof(int32) * device->buf_size);
 	P->played_this_second = 0;
 	P->paused = 0;
-#ifdef DEBUG
-	sciprintf("[soft-mixer] Initialised device %s v%s (%d Hz, %d/%x)\n",
-	          device->name, device->version,
-	          device->conf.rate, device->conf.stereo, device->conf.format);
-#endif
+
 	return SFX_OK;
 }
 
@@ -355,12 +352,6 @@
 	P->writebuf = tmp;
 }
 
-
-#define FRAME_OFFSET(usecs) \
-			((usecs >> 7) /* approximate, since uint32 is too small */ \
-			 * ((long) self->dev->conf.rate)) \
-			/ (1000000L >> 7)
-
 static inline int mix_compute_buf_len(sfx_pcm_mixer_t *self, int *skip_frames)
 /* Computes the number of frames we ought to write. It tries to minimise the number,
 ** in order to reduce latency. */
@@ -369,35 +360,32 @@
 {
 	int free_frames;
 	int played_frames = 0; /* since the last call */
-	long secs, usecs;
+	uint32 msecs;
 	int frame_pos;
 	int result_frames;
 
-	sci_gettime(&secs, &usecs);
+	msecs = g_system->getMillis();
 
 	if (!P->outbuf) {
 		/* Called for the first time ever? */
-		P->skew = usecs;
-		P->lsec = secs;
+		P->skew = msecs % 1000;
+		P->lsec = msecs / 1000;
 		P->max_delta = 0;
 		P->delta_observations = 0;
 		P->played_this_second = 0;
 		*skip_frames = 0;
+
 		return self->dev->buf_size;
 	}
 
 	/*	fprintf(stderr, "[%d:%d]S%d ", secs, usecs, P->skew);*/
 
-	if (P->skew > usecs) {
-		secs--;
-		usecs += (1000000 - P->skew);
-	} else
-		usecs -= P->skew;
+	msecs -= P->skew;
 
-	frame_pos = FRAME_OFFSET(usecs);
+	frame_pos = (msecs % 1000) * self->dev->conf.rate / 1000;
 
 	played_frames = frame_pos - P->played_this_second
-	                + ((secs - P->lsec) * self->dev->conf.rate);
+	                + ((msecs / 1000 - P->lsec) * self->dev->conf.rate);
 	/*
 	fprintf(stderr, "%d:%d - %d:%d  => %d\n", secs, frame_pos,
 		P->lsec, P->played_this_second, played_frames);
@@ -446,8 +434,8 @@
 	/*		recommended_frames = self->dev->buf_size; /\* Initially, keep the buffer full *\/ */
 
 #if (DEBUG >= 1)
-	sciprintf("[soft-mixer] played since last time: %d, recommended: %d, free: %d\n",
-	          played_frames, recommended_frames, free_frames);
+	sciprintf("[soft-mixer] played since last time: %d, free: %d\n",
+	          played_frames, free_frames);
 #endif
 
 	result_frames = free_frames;
@@ -553,7 +541,7 @@
 	             )
 	             / fs->spd.den;
 
-	ts->secs = -1;
+	ts->msecs = 0;
 
 	if (frames_nr > fs->buf_size) {
 		fprintf(stderr, "%d (%d*%d + somethign) bytes, but only %d allowed!!!!!\n",
@@ -791,16 +779,13 @@
 		int have_timestamp = 0;
 		sfx_timestamp_t start_timestamp; /* The timestamp at which the first frame will be played */
 		sfx_timestamp_t min_timestamp;
-		min_timestamp.secs = 0;
+		min_timestamp.msecs = 0;
 		sfx_timestamp_t timestamp;
 
 		if (self->dev->get_output_timestamp)
 			start_timestamp = self->dev->get_output_timestamp(self->dev);
-		else {
-			long sec, usec;
-			sci_gettime(&sec, &usec);
-			start_timestamp = sfx_new_timestamp(sec, usec, self->dev->conf.rate);
-		}
+		else
+			start_timestamp = sfx_new_timestamp(g_system->getMillis(), self->dev->conf.rate);
 
 		if ((P->outbuf) && (P->lastbuf_len)) {
 			sfx_timestamp_t ts;
@@ -846,9 +831,9 @@
 					                         fake_buflen, &timestamp,
 					                         start_timestamp);
 
-					if (timestamp.secs >= 0) {
+					if (timestamp.msecs > 0) {
 						if (have_timestamp) {
-							int diff = sfx_timestamp_usecs_diff(min_timestamp, timestamp);
+							int diff = sfx_timestamp_msecs_diff(min_timestamp, timestamp);
 							if (diff > 0) {
 								/* New earlier timestamp */
 								timestamp = min_timestamp;
@@ -890,7 +875,7 @@
 #endif
 
 		if (timestamp_max_delta > TIMESTAMP_MAX_ALLOWED_DELTA)
-			sciprintf("[soft-mixer] Warning: Difference in timestamps between audio feeds is %d us\n", timestamp_max_delta);
+			sciprintf("[soft-mixer] Warning: Difference in timestamps between audio feeds is %d ms\n", timestamp_max_delta);
 
 		mix_compute_output(self, buflen);
 		P->lastbuf_len = buflen;
@@ -899,7 +884,7 @@
 		mix_swap_buffers(self);
 		if (have_timestamp)
 			P->outbuf_timestamp = sfx_timestamp_add(min_timestamp,
-			                                        timestamp_max_delta >> 1);
+			                                        timestamp_max_delta * 500);
 		P->have_outbuf_timestamp = have_timestamp;
 
 	}

Modified: scummvm/trunk/engines/sci/sfx/player/polled.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/player/polled.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/player/polled.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -202,7 +202,7 @@
 	return SFX_OK;
 }
 
-static int pp_add_iterator(song_iterator_t *it, GTimeVal start_time) {
+static int pp_add_iterator(song_iterator_t *it, uint32 start_time) {
 	song_iterator_t *old = play_it;
 
 	SIMSG_SEND(it, SIMSG_SET_PLAYMASK(seq->playmask));
@@ -218,9 +218,7 @@
 	/* The check must happen HERE, and not at the beginning of the
 	   function, to avoid a race condition with the mixer. */
 	if (old == NULL) {
-		new_timestamp = sfx_new_timestamp(start_time.tv_sec,
-		                                  start_time.tv_usec,
-		                                  seq->pcm_conf.rate);
+		new_timestamp = sfx_new_timestamp(start_time, seq->pcm_conf.rate);
 		/* ASAP otherwise */
 		time_counter = 0;
 		new_song = 1;

Modified: scummvm/trunk/engines/sci/sfx/player/realtime.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/player/realtime.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/player/realtime.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -27,9 +27,12 @@
 ** prays for some reasonable amount of soft real-time, but it's close
 ** enough, I guess.  */
 
+#include "sci/tools.h"
 #include "sci/sfx/sfx_player.h"
 #include "sci/sfx/sequencer.h"
 
+#include "common/system.h"
+
 namespace Sci {
 
 static sfx_sequencer_t *seq;
@@ -38,38 +41,14 @@
 
 /* Playing mechanism */
 
-static inline GTimeVal
-current_time(void) {
-	GTimeVal tv;
-	sci_get_current_time(&tv);
-	return tv;
+static inline int delta_time(const uint32 comp, const uint32 base) {
+	return long(comp) - long(base);
 }
 
-static inline GTimeVal
-add_time_delta(GTimeVal tv, long delta) {
-	int sec_d;
-
-	tv.tv_usec += delta;
-	sec_d = tv.tv_usec / 1000000;
-	tv.tv_usec -= sec_d * 1000000;
-
-	tv.tv_sec += sec_d;
-
-	return tv;
-}
-
-static inline long
-delta_time(GTimeVal comp_tv, GTimeVal base) {
-	GTimeVal tv;
-	sci_get_current_time(&tv);
-	return (comp_tv.tv_sec - tv.tv_sec) * 1000000
-	       + (comp_tv.tv_usec - tv.tv_usec);
-}
-
 static song_iterator_t *play_it = NULL;
-static GTimeVal play_last_time;
-static GTimeVal play_pause_started; /* Beginning of the last pause */
-static GTimeVal play_pause_counter; /* Last point in time to mark a
+static uint32 play_last_time;
+static uint32 play_pause_started; /* Beginning of the last pause */
+static uint32 play_pause_counter; /* Last point in time to mark a
 				    ** play position augmentation  */
 static int play_paused = 0;
 static int play_it_done = 0;
@@ -77,20 +56,19 @@
 static int play_moredelay = 0;
 
 static void
-play_song(song_iterator_t *it, GTimeVal *wakeup_time, int writeahead_time) {
+play_song(song_iterator_t *it, uint32 *wakeup_time, int writeahead_time) {
 	unsigned char buf[8];
 	int result;
 
 	if (play_paused) {
-		GTimeVal ct;
-		sci_get_current_time(&ct);
+		uint32 ct = g_system->getMillis();
 
-		*wakeup_time =
-		    add_time_delta(*wakeup_time, delta_time(play_pause_counter, ct));
+		*wakeup_time += delta_time(play_pause_counter, ct);
+
 		play_pause_counter = ct;
 	} else
 		/* Not paused: */
-		while (play_it && delta_time(*wakeup_time, current_time())
+		while (play_it && delta_time(*wakeup_time, g_system->getMillis())
 		        < writeahead_time) {
 			int delay;
 
@@ -121,7 +99,7 @@
 
 			default:
 				play_moredelay = delay - 1;
-				*wakeup_time = song_next_wakeup_time(wakeup_time, delay);
+				*wakeup_time += delay * SOUND_TICK;
 				if (seq->delay)
 					seq->delay(delay);
 			}
@@ -137,12 +115,12 @@
 rt_timer_callback(void) {
 	if (play_it && !play_it_done) {
 		if (!play_moredelay) {
-			long delta = delta_time(play_last_time, current_time());
+			int delta = delta_time(play_last_time, g_system->getMillis());
 
 			if (delta < 0) {
 				play_writeahead -= (int)((double)delta * 1.2); /* Adjust upwards */
-			} else if (delta > 15000) {
-				play_writeahead -= 2500; /* Adjust downwards */
+			} else if (delta > 15) {
+				play_writeahead -= 3; /* Adjust downwards */
 			}
 		} else --play_moredelay;
 
@@ -179,7 +157,6 @@
 rt_init(ResourceManager *resmgr, int expected_latency) {
 	resource_t *res = NULL, *res2 = NULL;
 	void *seq_dev = NULL;
-	GTimeVal foo = {0, 0};
 
 	seq = sfx_find_sequencer(NULL);
 
@@ -209,16 +186,16 @@
 	if (play_writeahead < seq->min_write_ahead_ms)
 		play_writeahead = seq->min_write_ahead_ms;
 
-	play_writeahead *= 1000; /* microseconds */
+	play_writeahead *= 1; /* milliseconds */
 
 	if (seq->reset_timer)
-		seq->reset_timer(foo);
+		seq->reset_timer(0);
 
 	return SFX_OK;
 }
 
 static int
-rt_add_iterator(song_iterator_t *it, GTimeVal start_time) {
+rt_add_iterator(song_iterator_t *it, uint32 start_time) {
 	if (seq->reset_timer) /* Restart timer counting if possible */
 		seq->reset_timer(start_time);
 
@@ -264,7 +241,7 @@
 
 static int
 rt_pause(void) {
-	sci_get_current_time(&play_pause_started);
+	play_pause_started = g_system->getMillis();
 	/* Also, indicate that we haven't modified the time counter
 	** yet  */
 	play_pause_counter = play_pause_started;

Modified: scummvm/trunk/engines/sci/sfx/seq/gm.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/seq/gm.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/seq/gm.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -78,7 +78,7 @@
 }
 
 static int
-midi_gm_reset_timer(GTimeVal ts) {
+midi_gm_reset_timer(uint32 ts) {
 	writer->reset_timer(writer);
 
 	return SFX_OK;

Modified: scummvm/trunk/engines/sci/sfx/sequencer.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/sequencer.h	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/sequencer.h	2009-02-24 18:31:05 UTC (rev 38845)
@@ -29,7 +29,6 @@
 
 #include "common/scummsys.h"
 
-#include "sci/tools.h"	// For GTimeVal
 #include "sci/sfx/sfx_core.h"
 #include "sci/sfx/device.h"
 
@@ -88,10 +87,10 @@
 	** Returns   : SFX_OK on success, SFX_ERROR otherwise
 	*/
 
-	int (*reset_timer)(GTimeVal ts);
+	int (*reset_timer)(uint32 ts);
 	/* OPTIONAL -- may be NULL, but highly recommended in combination with delay() */
 	/* Resets the timer counter associated with the 'delay()' function
-	** Parameters: (GTimeVal) ts: Timestamp of the base time
+	** Parameters: (uint32) ts: Timestamp of the base time
 	** Returns   : SFX_OK on success, SFX_ERROR otherwise
 	*/
 

Modified: scummvm/trunk/engines/sci/sfx/sfx_engine.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/sfx_engine.h	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/sfx_engine.h	2009-02-24 18:31:05 UTC (rev 38845)
@@ -34,8 +34,8 @@
 
 namespace Sci {
 
-#define SOUND_TICK 1000000 / 60
-/* Approximately 16666 microseconds */
+#define SOUND_TICK 1000 / 60
+/* Approximately 17 milliseconds */
 
 
 #define SFX_STATE_FLAG_MULTIPLAY (1 << 0) /* More than one song playable

Modified: scummvm/trunk/engines/sci/sfx/sfx_player.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/sfx_player.h	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/sfx_player.h	2009-02-24 18:31:05 UTC (rev 38845)
@@ -32,6 +32,8 @@
 #include "sci/sfx/sfx_iterator.h"
 #include "sci/include/sciresource.h"
 
+#include "common/scummsys.h"
+
 namespace Sci {
 
 typedef void tell_synth_func(int buf_nr, byte *buf);
@@ -55,10 +57,10 @@
 	** Returns   : (int) SFX_OK on success, SFX_ERROR on failure
 	*/
 
-	int (*add_iterator)(song_iterator_t *it, GTimeVal start_time);
+	int (*add_iterator)(song_iterator_t *it, uint32 start_time);
 	/* Adds an iterator to the song player
 	** Parameters: (songx_iterator_t *) it: The iterator to play
-	**             (GTimeVal) start_time: The time to assume as the
+	**             (uint32) start_time: The time to assume as the
 	**                        time the first MIDI command executes at
 	** Returns   : (int) SFX_OK on success, SFX_ERROR on failure
 	** The iterator should not be cloned (to avoid memory leaks) and

Modified: scummvm/trunk/engines/sci/sfx/sfx_songlib.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/sfx_songlib.h	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/sfx_songlib.h	2009-02-24 18:31:05 UTC (rev 38845)
@@ -30,7 +30,6 @@
 
 #include "common/scummsys.h"
 
-#include "sci/tools.h"	// For GTimeVal
 #include "sci/sfx/sfx_iterator.h"
 
 namespace Sci {
@@ -66,7 +65,7 @@
 	song_iterator_t *it;
 	long delay; /* Delay before accessing the iterator, in microseconds */
 
-	GTimeVal wakeup_time; /* Used by the sound core:
+	uint32 wakeup_time; /* Used by the sound core:
 			      ** Playing -> time at which 'delay' has elapsed
 			      ** Suspended/Waiting -> stopping time */
 
@@ -161,21 +160,6 @@
 ** Returns   : (int) The number of songs
 */
 
-GTimeVal song_sleep_time(GTimeVal *lastslept, long ticks);
-/* Caluculates the amount of seconds and microseconds to sleep.
-** Parameters: (GTimeVal *) lastslept: The time to start counting on
-**             (long) ticks: Number of ticks to sleep
-** Returns   : (GTimeVal) The amount of time to sleep
-*/
-
-GTimeVal song_next_wakeup_time(GTimeVal *lastslept, long ticks);
-/* Calculates the time at which "ticks" have passed, counting from "lastslept".
-** Parameters: (GTimeVal *) lastslept: The base to start counting on
-**             (long) ticks: Number of ticks to count
-** Returns   : (GTimeVal) A structure describing the time at which the
-**                              specified number of ticks has passed
-*/
-
 void song_lib_set_restore_behavior(songlib_t songlib, song_handle_t handle,
 	RESTORE_BEHAVIOR action);
 /* Determines what should be done with the song "handle" when

Modified: scummvm/trunk/engines/sci/sfx/sfx_time.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/sfx_time.h	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/sfx_time.h	2009-02-24 18:31:05 UTC (rev 38845)
@@ -26,20 +26,21 @@
 #ifndef SCI_SFX_SFX_TIME_H
 #define SCI_SFX_SFX_TIME_H
 
+#include "common/scummsys.h"
+
 namespace Sci {
 
 struct sfx_timestamp_t {
-	long secs;
-	long usecs;
+	uint32 msecs;
 	int frame_rate;
 	int frame_offset;
-	/* Total time: secs + usecs + frame_offset/frame_rate */
+	/* Total time: msecs + frame_offset/frame_rate */
 };
 
 
-sfx_timestamp_t sfx_new_timestamp(long secs, long usecs, int frame_rate);
+sfx_timestamp_t sfx_new_timestamp(const uint32 msecs, const int frame_rate);
 /* Creates a new mutable timestamp
-** Parameters: (long x long) (secs, usecs): Initial timestamp
+** Parameters: (uint32) msecs: Initial timestamp
 **             (int) frame_rate: Frame rate, for increasing the time stamp
 */
 
@@ -66,18 +67,17 @@
 ** Returns   : (int) a-b
 */
 
-long sfx_timestamp_usecs_diff(sfx_timestamp_t a, sfx_timestamp_t b);
-/* Computes the difference (# of microseconds) between two timestamps
+int sfx_timestamp_msecs_diff(sfx_timestamp_t a, sfx_timestamp_t b);
+/* Computes the difference (# of milliseconds) between two timestamps
 ** Parameters: (sfx_timestamp) a: See below
 **             (sfx_timestamp) b: See below
-** Returns   : (long) a-b
+** Returns   : (int) a-b
 */
 
-void sfx_timestamp_gettime(sfx_timestamp_t *timestamp, long *secs, long *usecs);
+void sfx_timestamp_gettime(sfx_timestamp_t *timestamp, uint32 *msecs);
 /* Determines the time described by a given timestamp
 ** Parameters: (sfx_timestamp_t *) timestamp: Timestamp to read from
-** Returns   : (int * x int *) (secs, usecs): Seconds and microseconds since
-**                                            the epoch described there
+** Returns   : (uint32 *) msecs: Milliseconds since startup
 */
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/sfx/songlib.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/songlib.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/songlib.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -24,6 +24,8 @@
  */
 
 #include <stdio.h>
+
+#include "sci/tools.h"
 #include "sci/sfx/sfx_engine.h"
 #include "sci/sci_memory.h"
 
@@ -31,43 +33,6 @@
 
 #define debug_stream stderr
 
-GTimeVal song_sleep_time(GTimeVal *lastslept, long ticks) {
-	GTimeVal tv;
-	long timetosleep;
-	long timeslept; /* Time already slept */
-	timetosleep = ticks * SOUND_TICK; /* Time to sleep in us */
-
-	sci_get_current_time(&tv);
-	timeslept = 1000000 * (tv.tv_sec - lastslept->tv_sec) +
-	            tv.tv_usec - lastslept->tv_usec;
-
-	timetosleep -= timeslept;
-
-	if (timetosleep < 0)
-		timetosleep = 0;
-
-	tv.tv_sec = timetosleep / 1000000;
-	tv.tv_usec = timetosleep % 1000000;
-
-	return tv;
-}
-
-
-GTimeVal song_next_wakeup_time(GTimeVal *lastslept, long ticks) {
-	GTimeVal retval;
-
-	retval.tv_sec = lastslept->tv_sec + (ticks / 60);
-	retval.tv_usec = lastslept->tv_usec + ((ticks % 60) * SOUND_TICK);
-
-	if (retval.tv_usec >= 1000000) {
-		retval.tv_usec -= 1000000;
-		++retval.tv_sec;
-	}
-
-	return retval;
-}
-
-
 song_t *song_new(song_handle_t handle, song_iterator_t *it, int priority) {
 	song_t *retval;
 	retval = (song_t*) sci_malloc(sizeof(song_t));

Modified: scummvm/trunk/engines/sci/sfx/time.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/time.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/sfx/time.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -28,10 +28,9 @@
 
 namespace Sci {
 
-sfx_timestamp_t sfx_new_timestamp(long secs, long usecs, int frame_rate) {
+sfx_timestamp_t sfx_new_timestamp(const uint32 msecs, const int frame_rate) {
 	sfx_timestamp_t r;
-	r.secs = secs;
-	r.usecs = usecs;
+	r.msecs = msecs;
 	r.frame_rate = frame_rate;
 	r.frame_offset = 0;
 
@@ -45,73 +44,50 @@
 		int secsub = 1 + (-timestamp.frame_offset / timestamp.frame_rate);
 
 		timestamp.frame_offset += timestamp.frame_rate * secsub;
-		timestamp.secs -= secsub;
+		timestamp.msecs -= secsub * 1000;
 	}
 
-	timestamp.secs += (timestamp.frame_offset / timestamp.frame_rate);
+	timestamp.msecs += (timestamp.frame_offset / timestamp.frame_rate) * 1000;
 	timestamp.frame_offset %= timestamp.frame_rate;
 
 	return timestamp;
 }
 
 int sfx_timestamp_frame_diff(sfx_timestamp_t a, sfx_timestamp_t b) {
-	long usecdelta = 0;
+	int msecdelta = 0;
 
 	if (a.frame_rate != b.frame_rate) {
 		fprintf(stderr, "Fatal: The semantics of subtracting two timestamps with a different base from each other is not defined!\n");
 		BREAKPOINT();
 	}
 
-	if (a.usecs != b.usecs) {
-#if (SIZEOF_LONG >= 8)
-		usecdelta = (a.usecs * a.frame_rate) / 1000000
-		            - (b.usecs * b.frame_rate) / 1000000;
-#else
-		usecdelta = ((a.usecs / 1000) * a.frame_rate) / 1000
-		            - ((b.usecs / 1000) * b.frame_rate) / 1000;
-#endif
-	}
+	if (a.msecs != b.msecs)
+		msecdelta = (long(a.msecs) - long(b.msecs)) * a.frame_rate / 1000;
 
-	return usecdelta
-	       + (a.secs - b.secs) * a.frame_rate
-	       + a.frame_offset - b.frame_offset;
+	return msecdelta + a.frame_offset - b.frame_offset;
 }
 
-long sfx_timestamp_usecs_diff(sfx_timestamp_t t1, sfx_timestamp_t t2) {
-	long secs1, secs2;
-	long usecs1, usecs2;
+int sfx_timestamp_msecs_diff(sfx_timestamp_t t1, sfx_timestamp_t t2) {
+	uint32 msecs1, msecs2;
 
-	sfx_timestamp_gettime(&t1, &secs1, &usecs1);
-	sfx_timestamp_gettime(&t2, &secs2, &usecs2);
+	sfx_timestamp_gettime(&t1, &msecs1);
+	sfx_timestamp_gettime(&t2, &msecs2);
 
-	return (usecs1 - usecs2) + ((secs1 - secs2) * 1000000);
+	return long(msecs1) - long(msecs2);
 }
 
 sfx_timestamp_t sfx_timestamp_renormalise(sfx_timestamp_t timestamp, int new_freq) {
 	sfx_timestamp_t r;
-	sfx_timestamp_gettime(&timestamp, &r.secs, &r.usecs);
+	sfx_timestamp_gettime(&timestamp, &r.msecs);
 	r.frame_rate = new_freq;
 	r.frame_offset = 0;
 
 	return r;
 }
 
-void sfx_timestamp_gettime(sfx_timestamp_t *timestamp, long *secs, long *usecs) {
-	long ust = timestamp->usecs;
-	/* On 64 bit machines, we can do an accurate computation */
-#if (SIZEOF_LONG >= 8)
-	ust += (timestamp->frame_offset * 1000000l) / (timestamp->frame_rate);
-#else
-	ust += (timestamp->frame_offset * 1000l) / (timestamp->frame_rate / 1000l);
-#endif
-
-	if (ust > 1000000) {
-		ust -= 1000000;
-		*secs = timestamp->secs + 1;
-	} else
-		*secs = timestamp->secs;
-
-	*usecs = ust;
+void sfx_timestamp_gettime(sfx_timestamp_t *timestamp, uint32 *msecs) {
+	*msecs = timestamp->msecs +
+			 timestamp->frame_offset * 1000l / timestamp->frame_rate;
 }
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/tools.cpp
===================================================================
--- scummvm/trunk/engines/sci/tools.cpp	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/tools.cpp	2009-02-24 18:31:05 UTC (rev 38845)
@@ -29,7 +29,6 @@
 #  include <windows.h>
 #  include <errno.h>
 #  include <mmsystem.h>
-#  include <sys/timeb.h>
 #  include <sys/types.h>
 #  include <sys/stat.h>
 #  include <direct.h>
@@ -44,10 +43,6 @@
 
 namespace Sci {
 
-#ifndef _MSC_VER
-#  include <sys/time.h>
-#endif
-
 int script_debug_flag = 0; // Defaulting to running mode
 int sci_debug_flags = 0; // Special flags
 
@@ -132,47 +127,4 @@
 	}
 }
 
-
-#ifndef _MSC_VER
-void sci_gettime(long *seconds, long *useconds) {
-	struct timeval tv;
-
-	assert(!gettimeofday(&tv, NULL));
-	*seconds = tv.tv_sec;
-	*useconds = tv.tv_usec;
-}
-#elif defined (WIN32)
-
-/*WARNING(Incorrect)*/
-/* Warning: This function only retrieves the amount of mseconds since the start of
-** the Win32 kernel; it does /not/ provide the number of seconds since the epoch!
-** There are no known cases where this causes problems, though.  */
-void sci_gettime(long *seconds, long *useconds) {
-	DWORD tm;
-
-	if (TIMERR_NOERROR != timeBeginPeriod(1)) {
-		fprintf(stderr, "timeBeginPeriod(1) failed in sci_gettime\n");
-	}
-
-	tm = timeGetTime();
-
-	if (TIMERR_NOERROR != timeEndPeriod(1)) {
-		fprintf(stderr, "timeEndPeriod(1) failed in sci_gettime\n");
-	}
-
-	*seconds = tm / 1000;
-	*useconds = (tm % 1000) * 1000;
-}
-#else
-#  error "You need to provide a microsecond resolution sci_gettime implementation for your platform!"
-#endif
-
-
-void sci_get_current_time(GTimeVal *val) {
-	long foo, bar;
-	sci_gettime(&foo, &bar);
-	val->tv_sec = foo;
-	val->tv_usec = bar;
-}
-
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/tools.h
===================================================================
--- scummvm/trunk/engines/sci/tools.h	2009-02-24 18:21:12 UTC (rev 38844)
+++ scummvm/trunk/engines/sci/tools.h	2009-02-24 18:31:05 UTC (rev 38845)
@@ -31,40 +31,14 @@
 
 namespace Sci {
 
-
-struct GTimeVal {
-	long tv_sec;
-	long tv_usec;
-};
-
-
-
 /**** FUNCTION DECLARATIONS ****/
 
 #define getInt16	(int16)READ_LE_UINT16
 #define getUInt16	READ_LE_UINT16
 #define putInt16	WRITE_LE_UINT16
 
-
 /* --- */
 
-void sci_gettime(long *seconds, long *useconds);
-/* Calculates the current time in seconds and microseconds
-** Parameters: (long *) seconds: Pointer to the variable the seconds part of the
-**                               current time will be stored in
-**             (long *) useconds: Pointer to the variable the microseconds part
-**                                of the current time will be stored in
-** Returns   : (void)
-** The resulting values must be relative to an arbitrary fixed point in time
-** (typically 01/01/1970 on *NIX systems).
-*/
-
-void sci_get_current_time(GTimeVal *val);
-/* GTimeVal version of sci_gettime()
-** Parameters: (GTimeVal *) val: Pointer to the structure the values will be stored in
-** Returns   : (void)
-*/
-
 int sciprintf(const char *fmt, ...) GCC_PRINTF(1, 2);
 #define gfxprintf sciprintf
 /* Prints a string to the console stack


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