aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/sfx/timer
diff options
context:
space:
mode:
authorJordi Vilalta Prat2009-02-15 06:10:59 +0000
committerJordi Vilalta Prat2009-02-15 06:10:59 +0000
commitfa6e10e9cec163845aa29e7940c86e9c9ab8a2bc (patch)
treece87338830cc8c149e1de545246bcefe4f45da00 /engines/sci/sfx/timer
parent7c148ddf021c990fa866b7600f979aac9a5b26c9 (diff)
downloadscummvm-rg350-fa6e10e9cec163845aa29e7940c86e9c9ab8a2bc.tar.gz
scummvm-rg350-fa6e10e9cec163845aa29e7940c86e9c9ab8a2bc.tar.bz2
scummvm-rg350-fa6e10e9cec163845aa29e7940c86e9c9ab8a2bc.zip
Import the SCI engine sources from the FreeSCI Glutton branch (it doesn't compile yet)
svn-id: r38192
Diffstat (limited to 'engines/sci/sfx/timer')
-rw-r--r--engines/sci/sfx/timer/Makefile.am4
-rw-r--r--engines/sci/sfx/timer/pthread.c104
-rw-r--r--engines/sci/sfx/timer/scummvm.cpp52
-rw-r--r--engines/sci/sfx/timer/sigalrm.c157
-rw-r--r--engines/sci/sfx/timer/timers.c73
5 files changed, 390 insertions, 0 deletions
diff --git a/engines/sci/sfx/timer/Makefile.am b/engines/sci/sfx/timer/Makefile.am
new file mode 100644
index 0000000000..74f3bee426
--- /dev/null
+++ b/engines/sci/sfx/timer/Makefile.am
@@ -0,0 +1,4 @@
+EXTRA_DIST = pthread.c
+noinst_LIBRARIES = libscitimer.a
+INCLUDES = -I$(top_srcdir)/src/include @EXTRA_INCLUDES@
+libscitimer_a_SOURCES = timers.c sigalrm.c
diff --git a/engines/sci/sfx/timer/pthread.c b/engines/sci/sfx/timer/pthread.c
new file mode 100644
index 0000000000..074adbe08f
--- /dev/null
+++ b/engines/sci/sfx/timer/pthread.c
@@ -0,0 +1,104 @@
+/***************************************************************************
+ pthread.c Copyright (C) 2005 Walter van Niftrik
+
+
+ This program may be modified and copied freely according to the terms of
+ the GNU general public license (GPL), as long as the above copyright
+ notice and the licensing information contained herein are preserved.
+
+ Please refer to www.gnu.org for licensing details.
+
+ This work is provided AS IS, without warranty of any kind, expressed or
+ implied, including but not limited to the warranties of merchantibility,
+ noninfringement, and fitness for a specific purpose. The author will not
+ be held liable for any damage caused by this work or derivatives of it.
+
+ By using this source code, you agree to the licensing terms as stated
+ above.
+
+
+ Please contact the maintainer for bug reports or inquiries.
+
+ Current Maintainer:
+
+ Walter van Niftrik <w.f.b.w.v.niftrik@stud.tue.nl>
+
+***************************************************************************/
+
+#include <sfx_timer.h>
+#include <pthread.h>
+#include <unistd.h>
+
+/* Timer frequency in hertz */
+#define FREQ 60
+
+/* Delay in ms */
+#define DELAY (1000 / FREQ)
+
+static void (*callback)(void *) = NULL;
+static void *callback_data = NULL;
+pthread_t thread;
+volatile static int thread_run;
+
+static void *
+timer_thread(void *arg)
+{
+ while (thread_run) {
+ if (callback)
+ callback(callback_data);
+
+ usleep(DELAY * 1000);
+ }
+
+ return NULL;
+}
+
+static int
+set_option(char *name, char *value)
+{
+ return SFX_ERROR;
+}
+
+static int
+init(void (*func)(void *), void *data)
+{
+ if (callback) {
+ fprintf(stderr, "Error: Attempt to initialize pthread timer more than once\n");
+ return SFX_ERROR;
+ }
+
+ if (!func) {
+ fprintf(stderr, "Error: Attempt to initialize pthread timer w/o callback\n");
+ return SFX_ERROR;
+ }
+
+ callback = func;
+ callback_data = data;
+
+ thread_run = 1;
+ if (pthread_create(&thread, NULL, timer_thread, NULL)) {
+ fprintf(stderr, "Error: Could not create thread.\n");
+ return SFX_ERROR;
+ }
+
+ return SFX_OK;
+}
+
+static int
+stop(void)
+{
+ thread_run = 0;
+ pthread_join(thread, NULL);
+
+ return SFX_OK;
+}
+
+sfx_timer_t sfx_timer_pthread = {
+ "pthread",
+ "0.1",
+ DELAY,
+ 0,
+ &set_option,
+ &init,
+ &stop
+};
diff --git a/engines/sci/sfx/timer/scummvm.cpp b/engines/sci/sfx/timer/scummvm.cpp
new file mode 100644
index 0000000000..f4e08d441a
--- /dev/null
+++ b/engines/sci/sfx/timer/scummvm.cpp
@@ -0,0 +1,52 @@
+#include "common/timer.h"
+#include "engines/engine.h"
+#include "sfx_timer.h"
+
+
+#define FREQ 60
+#define DELAY (1000000 / FREQ)
+
+typedef void (*scummvm_timer_callback_t)(void *);
+static scummvm_timer_callback_t scummvm_timer_callback = NULL;
+static void *scummvm_timer_callback_data = NULL;
+extern ::Engine *g_engine;
+
+void scummvm_timer_update_internal(void *ptr) {
+ if (scummvm_timer_callback)
+ scummvm_timer_callback(scummvm_timer_callback_data);
+}
+
+int scummvm_timer_start(void (*func)(void *), void *data) {
+ if (scummvm_timer_callback) {
+ fprintf(stderr,
+ "Error: Attempt to initialize gametick timer more than once\n");
+ return SFX_ERROR;
+ }
+
+ if (!func) {
+ fprintf(stderr,
+ "Error: Attempt to initialize gametick timer w/o callback\n");
+ return SFX_ERROR;
+ }
+
+ scummvm_timer_callback = func;
+ scummvm_timer_callback_data = data;
+
+ ::g_engine->_timer->installTimerProc(&scummvm_timer_update_internal, DELAY, NULL);
+ return SFX_OK;
+}
+
+int scummvm_timer_stop() {
+ scummvm_timer_callback = NULL;
+ return SFX_OK;
+}
+
+
+sfx_timer_t sfx_timer_scummvm = {
+ "ScummVM",
+ "0.1",
+ DELAY/1000, 0,
+ NULL,
+ &scummvm_timer_start,
+ &scummvm_timer_stop
+ };
diff --git a/engines/sci/sfx/timer/sigalrm.c b/engines/sci/sfx/timer/sigalrm.c
new file mode 100644
index 0000000000..40cc2872e1
--- /dev/null
+++ b/engines/sci/sfx/timer/sigalrm.c
@@ -0,0 +1,157 @@
+/***************************************************************************
+ sigalrm.c Copyright (C) 2002 Christoph Reichenbach
+
+
+ This program may be modified and copied freely according to the terms of
+ the GNU general public license (GPL), as long as the above copyright
+ notice and the licensing information contained herein are preserved.
+
+ Please refer to www.gnu.org for licensing details.
+
+ This work is provided AS IS, without warranty of any kind, expressed or
+ implied, including but not limited to the warranties of merchantibility,
+ noninfringement, and fitness for a specific purpose. The author will not
+ be held liable for any damage caused by this work or derivatives of it.
+
+ By using this source code, you agree to the licensing terms as stated
+ above.
+
+
+ Please contact the maintainer for bug reports or inquiries.
+
+ Current Maintainer:
+
+ Christoph Reichenbach (CR) <jameson@linuxgames.com>
+
+***************************************************************************/
+
+#include <sfx_timer.h>
+
+#ifdef HAVE_SETITIMER
+
+#include <sys/time.h>
+#include <signal.h>
+#include <stdio.h>
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+#define sigprocmask pthread_sigmask
+#endif
+
+static void (*sig_callback)(void *) = NULL;
+static void *sig_callback_data = NULL;
+static sigset_t current_sigset;
+
+static void
+timer_handler(int i)
+{
+ if (sig_callback)
+ sig_callback(sig_callback_data);
+}
+
+static int
+sigalrm_set_option(char *name, char *value)
+{
+ return SFX_ERROR;
+}
+
+
+static int
+sigalrm_start(void)
+{
+ struct itimerval itimer;
+
+ itimer.it_value.tv_sec = 0;
+ itimer.it_value.tv_usec = 1000000/60;
+ itimer.it_interval = itimer.it_value;
+
+ signal(SIGALRM, timer_handler); /* Re-instate timer handler, to make sure */
+ setitimer(ITIMER_REAL, &itimer, NULL);
+
+ return SFX_OK;
+}
+
+
+static int
+sigalrm_init(void (*callback)(void *), void *data)
+{
+ if (sig_callback) {
+ fprintf(stderr, "Error: Attempt to initialize sigalrm timer more than once\n");
+ return SFX_ERROR;
+ }
+
+ if (!callback) {
+ fprintf(stderr, "Error: Attempt to initialize sigalrm timer w/o callback\n");
+ return SFX_ERROR;
+ }
+
+ sig_callback = callback;
+ sig_callback_data = data;
+
+ sigalrm_start();
+
+ sigemptyset(&current_sigset);
+ sigaddset(&current_sigset, SIGALRM);
+
+ return SFX_OK;
+}
+
+
+static int
+sigalrm_stop(void)
+{
+ struct itimerval itimer;
+
+ if (!sig_callback) {
+ fprintf(stderr, "Error: Attempt to stop sigalrm timer when not running\n");
+ return SFX_ERROR;
+ }
+
+ itimer.it_value.tv_sec = 0;
+ itimer.it_value.tv_usec = 0;
+ itimer.it_interval = itimer.it_value;
+
+ setitimer(ITIMER_REAL, &itimer, NULL); /* Stop timer */
+ signal(SIGALRM, SIG_DFL);
+
+ return SFX_OK;
+}
+
+
+static int
+sigalrm_block(void)
+{
+ if (sigprocmask(SIG_BLOCK, &current_sigset, NULL) != 0) {
+ fprintf(stderr, "Error: Failed to block sigalrm\n");
+ return SFX_ERROR;
+ }
+
+ return SFX_OK;
+}
+
+
+static int
+sigalrm_unblock(void)
+{
+ if (sigprocmask(SIG_UNBLOCK, &current_sigset, NULL) != 0) {
+ fprintf(stderr, "Error: Failed to unblock sigalrm\n");
+ return SFX_ERROR;
+ }
+
+ return SFX_OK;
+}
+
+
+sfx_timer_t sfx_timer_sigalrm = {
+ "sigalrm",
+ "0.1",
+ 17, /* 1000 / 60 */
+ 0,
+ &sigalrm_set_option,
+ &sigalrm_init,
+ &sigalrm_stop,
+ &sigalrm_block,
+ &sigalrm_unblock
+};
+
+#endif /* HAVE_SETITIMER */
diff --git a/engines/sci/sfx/timer/timers.c b/engines/sci/sfx/timer/timers.c
new file mode 100644
index 0000000000..b2a51d6062
--- /dev/null
+++ b/engines/sci/sfx/timer/timers.c
@@ -0,0 +1,73 @@
+/***************************************************************************
+ timers.c Copyright (C) 2002 Christoph Reichenbach
+
+
+ This program may be modified and copied freely according to the terms of
+ the GNU general public license (GPL), as long as the above copyright
+ notice and the licensing information contained herein are preserved.
+
+ Please refer to www.gnu.org for licensing details.
+
+ This work is provided AS IS, without warranty of any kind, expressed or
+ implied, including but not limited to the warranties of merchantibility,
+ noninfringement, and fitness for a specific purpose. The author will not
+ be held liable for any damage caused by this work or derivatives of it.
+
+ By using this source code, you agree to the licensing terms as stated
+ above.
+
+
+ Please contact the maintainer for bug reports or inquiries.
+
+ Current Maintainer:
+
+ Christoph Reichenbach (CR) <jameson@linuxgames.com>
+
+***************************************************************************/
+
+#include <sfx_timer.h>
+#include <resource.h>
+
+#ifdef SCUMMVM
+extern sfx_timer_t sfx_timer_scummvm;
+#else // SCUMMVM
+
+#ifdef HAVE_SETITIMER
+extern sfx_timer_t sfx_timer_sigalrm;
+#endif
+
+#ifdef _DREAMCAST
+extern sfx_timer_t sfx_timer_pthread;
+#endif
+#endif // SCUMMVM
+
+sfx_timer_t *sfx_timers[] = {
+#ifdef SCUMMVM
+ &sfx_timer_scummvm,
+#else // SCUMMVM
+#ifdef HAVE_SETITIMER
+ &sfx_timer_sigalrm,
+#endif
+#ifdef _DREAMCAST
+ &sfx_timer_pthread,
+#endif
+#endif // SCUMMVM
+ NULL
+};
+
+
+sfx_timer_t *
+sfx_find_timer(char *name)
+{
+ if (!name) {
+ /* Policies go here */
+ return sfx_timers[0];
+ } else {
+ int n = 0;
+ while (sfx_timers[n]
+ && strcasecmp(sfx_timers[n]->name, name))
+ ++n;
+
+ return sfx_timers[n];
+ }
+}