diff options
| author | Jordi Vilalta Prat | 2009-02-15 06:10:59 +0000 |
|---|---|---|
| committer | Jordi Vilalta Prat | 2009-02-15 06:10:59 +0000 |
| commit | fa6e10e9cec163845aa29e7940c86e9c9ab8a2bc (patch) | |
| tree | ce87338830cc8c149e1de545246bcefe4f45da00 /engines/sci/sfx/timer | |
| parent | 7c148ddf021c990fa866b7600f979aac9a5b26c9 (diff) | |
| download | scummvm-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.am | 4 | ||||
| -rw-r--r-- | engines/sci/sfx/timer/pthread.c | 104 | ||||
| -rw-r--r-- | engines/sci/sfx/timer/scummvm.cpp | 52 | ||||
| -rw-r--r-- | engines/sci/sfx/timer/sigalrm.c | 157 | ||||
| -rw-r--r-- | engines/sci/sfx/timer/timers.c | 73 |
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(¤t_sigset); + sigaddset(¤t_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, ¤t_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, ¤t_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]; + } +} |
