Added 'timer' backend module, based on the existing TimerManager code (work in progress)
svn-id: r23279
This commit is contained in:
parent
75628fe9d7
commit
c9fd9c4878
6 changed files with 85 additions and 59 deletions
|
@ -12,7 +12,8 @@ MODULE_OBJS := \
|
||||||
midi/morphos.o \
|
midi/morphos.o \
|
||||||
midi/quicktime.o \
|
midi/quicktime.o \
|
||||||
midi/seq.o \
|
midi/seq.o \
|
||||||
midi/windows.o
|
midi/windows.o \
|
||||||
|
timer/default/default-timer.o
|
||||||
|
|
||||||
# Include common rules
|
# Include common rules
|
||||||
include $(srcdir)/rules.mk
|
include $(srcdir)/rules.mk
|
||||||
|
|
|
@ -19,24 +19,25 @@
|
||||||
* $Id$
|
* $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __MORPHOS__
|
|
||||||
|
|
||||||
#include "common/stdafx.h"
|
#include "common/stdafx.h"
|
||||||
#include "common/scummsys.h"
|
#include "common/scummsys.h"
|
||||||
#include "common/timer.h"
|
#include "backends/timer/default/default-timer.h"
|
||||||
#include "common/util.h"
|
#include "common/util.h"
|
||||||
#include "common/system.h"
|
#include "common/system.h"
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
// FIXME: Hack: This global variable shouldn't be declared here; in fact it
|
||||||
|
// probably shouldn't be declared at all but rather a different method to
|
||||||
|
// query the TimerManager object should be invented.
|
||||||
TimerManager *g_timer = NULL;
|
TimerManager *g_timer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
TimerManager::TimerManager(OSystem *system) :
|
DefaultTimerManager::DefaultTimerManager(OSystem *system) :
|
||||||
_system(system),
|
_system(system),
|
||||||
_timerHandler(0),
|
_timerHandler(0),
|
||||||
_lastTime(0) {
|
_lastTime(0) {
|
||||||
|
|
||||||
g_timer = this;
|
Common::g_timer = this;
|
||||||
|
|
||||||
for (int i = 0; i < MAX_TIMERS; i++) {
|
for (int i = 0; i < MAX_TIMERS; i++) {
|
||||||
_timerSlots[i].procedure = NULL;
|
_timerSlots[i].procedure = NULL;
|
||||||
|
@ -51,14 +52,14 @@ TimerManager::TimerManager(OSystem *system) :
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TimerManager::~TimerManager() {
|
DefaultTimerManager::~DefaultTimerManager() {
|
||||||
// Remove the timer callback.
|
// Remove the timer callback.
|
||||||
// Note: backends *must* gurantee that after this method call returns,
|
// Note: backends *must* gurantee that after this method call returns,
|
||||||
// the handler is not in use anymore; else race condtions could occur.
|
// the handler is not in use anymore; else race condtions could occur.
|
||||||
_system->setTimerCallback(0, 0);
|
_system->setTimerCallback(0, 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
StackLock lock(_mutex);
|
Common::StackLock lock(_mutex);
|
||||||
for (int i = 0; i < MAX_TIMERS; i++) {
|
for (int i = 0; i < MAX_TIMERS; i++) {
|
||||||
_timerSlots[i].procedure = NULL;
|
_timerSlots[i].procedure = NULL;
|
||||||
_timerSlots[i].interval = 0;
|
_timerSlots[i].interval = 0;
|
||||||
|
@ -67,14 +68,14 @@ TimerManager::~TimerManager() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int TimerManager::timer_handler(int t) {
|
int DefaultTimerManager::timer_handler(int t) {
|
||||||
if (g_timer)
|
if (Common::g_timer)
|
||||||
return g_timer->handler(t);
|
return ((DefaultTimerManager *)Common::g_timer)->handler(t);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TimerManager::handler(int t) {
|
int DefaultTimerManager::handler(int t) {
|
||||||
StackLock lock(_mutex);
|
Common::StackLock lock(_mutex);
|
||||||
uint32 interval, l;
|
uint32 interval, l;
|
||||||
|
|
||||||
_lastTime = _thisTime;
|
_lastTime = _thisTime;
|
||||||
|
@ -97,9 +98,9 @@ int TimerManager::handler(int t) {
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TimerManager::installTimerProc(TimerProc procedure, int32 interval, void *refCon) {
|
bool DefaultTimerManager::installTimerProc(TimerProc procedure, int32 interval, void *refCon) {
|
||||||
assert(interval > 0);
|
assert(interval > 0);
|
||||||
StackLock lock(_mutex);
|
Common::StackLock lock(_mutex);
|
||||||
|
|
||||||
for (int l = 0; l < MAX_TIMERS; l++) {
|
for (int l = 0; l < MAX_TIMERS; l++) {
|
||||||
if (!_timerSlots[l].procedure) {
|
if (!_timerSlots[l].procedure) {
|
||||||
|
@ -115,8 +116,8 @@ bool TimerManager::installTimerProc(TimerProc procedure, int32 interval, void *r
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimerManager::removeTimerProc(TimerProc procedure) {
|
void DefaultTimerManager::removeTimerProc(TimerProc procedure) {
|
||||||
StackLock lock(_mutex);
|
Common::StackLock lock(_mutex);
|
||||||
|
|
||||||
for (int l = 0; l < MAX_TIMERS; l++) {
|
for (int l = 0; l < MAX_TIMERS; l++) {
|
||||||
if (_timerSlots[l].procedure == procedure) {
|
if (_timerSlots[l].procedure == procedure) {
|
||||||
|
@ -127,7 +128,3 @@ void TimerManager::removeTimerProc(TimerProc procedure) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // End of namespace Common
|
|
||||||
|
|
||||||
#endif
|
|
59
backends/timer/default/default-timer.h
Normal file
59
backends/timer/default/default-timer.h
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/* ScummVM - Scumm Interpreter
|
||||||
|
* Copyright (C) 2002-2006 The ScummVM project
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* $URL$
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BACKENDS_TIMER_DEFAULT_H
|
||||||
|
#define BACKENDS_TIMER_DEFAULT_H
|
||||||
|
|
||||||
|
#include "common/timer.h"
|
||||||
|
#include "common/mutex.h"
|
||||||
|
|
||||||
|
class OSystem;
|
||||||
|
|
||||||
|
class DefaultTimerManager : public Common::TimerManager {
|
||||||
|
private:
|
||||||
|
enum {
|
||||||
|
MAX_TIMERS = 8
|
||||||
|
};
|
||||||
|
OSystem *_system;
|
||||||
|
Common::Mutex _mutex;
|
||||||
|
void *_timerHandler;
|
||||||
|
int32 _thisTime;
|
||||||
|
int32 _lastTime;
|
||||||
|
|
||||||
|
struct TimerSlots {
|
||||||
|
TimerProc procedure;
|
||||||
|
int32 interval;
|
||||||
|
int32 counter;
|
||||||
|
void *refCon;
|
||||||
|
} _timerSlots[MAX_TIMERS];
|
||||||
|
|
||||||
|
public:
|
||||||
|
DefaultTimerManager(OSystem *system);
|
||||||
|
~DefaultTimerManager();
|
||||||
|
bool installTimerProc(TimerProc proc, int32 interval, void *refCon);
|
||||||
|
void removeTimerProc(TimerProc proc);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static int timer_handler(int t);
|
||||||
|
int handler(int t);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -34,6 +34,8 @@
|
||||||
#include "base/commandLine.h"
|
#include "base/commandLine.h"
|
||||||
#include "base/plugins.h"
|
#include "base/plugins.h"
|
||||||
#include "base/version.h"
|
#include "base/version.h"
|
||||||
|
|
||||||
|
#include "backends/timer/default/default-timer.h"
|
||||||
#include "common/config-manager.h"
|
#include "common/config-manager.h"
|
||||||
#include "common/file.h"
|
#include "common/file.h"
|
||||||
#include "common/fs.h"
|
#include "common/fs.h"
|
||||||
|
@ -317,7 +319,7 @@ extern "C" int scummvm_main(int argc, char *argv[]) {
|
||||||
system.initBackend();
|
system.initBackend();
|
||||||
|
|
||||||
// Create the timer services
|
// Create the timer services
|
||||||
Common::g_timer = new Common::TimerManager(&system);
|
Common::g_timer = new DefaultTimerManager(&system);
|
||||||
|
|
||||||
// Set initial window caption
|
// Set initial window caption
|
||||||
system.setWindowCaption(gScummVMFullVersion);
|
system.setWindowCaption(gScummVMFullVersion);
|
||||||
|
|
|
@ -10,7 +10,6 @@ MODULE_OBJS := \
|
||||||
mutex.o \
|
mutex.o \
|
||||||
str.o \
|
str.o \
|
||||||
stream.o \
|
stream.o \
|
||||||
timer.o \
|
|
||||||
util.o \
|
util.o \
|
||||||
savefile.o \
|
savefile.o \
|
||||||
system.o \
|
system.o \
|
||||||
|
|
|
@ -23,16 +23,6 @@
|
||||||
#define COMMON_TIMER_H
|
#define COMMON_TIMER_H
|
||||||
|
|
||||||
#include "common/scummsys.h"
|
#include "common/scummsys.h"
|
||||||
#include "common/mutex.h"
|
|
||||||
|
|
||||||
#define MAX_TIMERS 8
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __MORPHOS__
|
|
||||||
#include "morphos_timer.h"
|
|
||||||
#else
|
|
||||||
|
|
||||||
class OSystem;
|
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
|
@ -40,23 +30,7 @@ class TimerManager {
|
||||||
public:
|
public:
|
||||||
typedef void (*TimerProc)(void *refCon);
|
typedef void (*TimerProc)(void *refCon);
|
||||||
|
|
||||||
private:
|
virtual ~TimerManager() {}
|
||||||
OSystem *_system;
|
|
||||||
Mutex _mutex;
|
|
||||||
void *_timerHandler;
|
|
||||||
int32 _thisTime;
|
|
||||||
int32 _lastTime;
|
|
||||||
|
|
||||||
struct TimerSlots {
|
|
||||||
TimerProc procedure;
|
|
||||||
int32 interval;
|
|
||||||
int32 counter;
|
|
||||||
void *refCon;
|
|
||||||
} _timerSlots[MAX_TIMERS];
|
|
||||||
|
|
||||||
public:
|
|
||||||
TimerManager(OSystem *system);
|
|
||||||
~TimerManager();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Install a new timer callback. It will from now be called every interval microseconds.
|
* Install a new timer callback. It will from now be called every interval microseconds.
|
||||||
|
@ -70,16 +44,12 @@ public:
|
||||||
* @param refCon an arbitrary void pointer; will be passed to the timer callback
|
* @param refCon an arbitrary void pointer; will be passed to the timer callback
|
||||||
* @return true if the timer was installed successfully, false otherwise
|
* @return true if the timer was installed successfully, false otherwise
|
||||||
*/
|
*/
|
||||||
bool installTimerProc(TimerProc proc, int32 interval, void *refCon);
|
virtual bool installTimerProc(TimerProc proc, int32 interval, void *refCon) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the given timer callback. It will not be invoked anymore.
|
* Remove the given timer callback. It will not be invoked anymore.
|
||||||
*/
|
*/
|
||||||
void removeTimerProc(TimerProc proc);
|
virtual void removeTimerProc(TimerProc proc) = 0;
|
||||||
|
|
||||||
protected:
|
|
||||||
static int timer_handler(int t);
|
|
||||||
int handler(int t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern TimerManager *g_timer;
|
extern TimerManager *g_timer;
|
||||||
|
@ -87,5 +57,3 @@ extern TimerManager *g_timer;
|
||||||
} // End of namespace Common
|
} // End of namespace Common
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue