aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/flext/source/fltimer.cpp
diff options
context:
space:
mode:
authorThomas Grill <xovo@users.sourceforge.net>2009-04-01 21:13:09 +0000
committerThomas Grill <xovo@users.sourceforge.net>2009-04-01 21:13:09 +0000
commit0ed7a8b68dd73e2b0473b8127aeca99f3bac9061 (patch)
tree5c67818b38a5cc2f9caa5ca7f8640ca356adf02b /externals/grill/flext/source/fltimer.cpp
parentbb4c7f6a245394d09dac9adfb2efb093d3d98452 (diff)
cleaned up grill externals - replaced with svn:externals to svn.grrrr.org/ext/trunk/
svn path=/trunk/; revision=10951
Diffstat (limited to 'externals/grill/flext/source/fltimer.cpp')
-rw-r--r--externals/grill/flext/source/fltimer.cpp275
1 files changed, 0 insertions, 275 deletions
diff --git a/externals/grill/flext/source/fltimer.cpp b/externals/grill/flext/source/fltimer.cpp
deleted file mode 100644
index 6f13999f..00000000
--- a/externals/grill/flext/source/fltimer.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
-
-flext - C++ layer for Max/MSP and pd (pure data) externals
-
-Copyright (c) 2001-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-
-*/
-
-/*! \file fltimer.cpp
- \brief flext timer functions and classes
-*/
-
-#include "flext.h"
-
-#if FLEXT_OS == FLEXT_OS_WIN
-#include <windows.h>
-#elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH
-#include <unistd.h>
-#include <sys/time.h>
-#elif FLEXT_OS == FLEXT_OS_MAC
-#include <Timer.h>
-#include <Threads.h>
-#endif
-
-
-#if FLEXT_OS == FLEXT_OS_WIN
-static double perffrq = 0;
-#endif
-
-static double getstarttime();
-static double starttime = getstarttime();
-
-static double getstarttime()
-{
-#if FLEXT_OS == FLEXT_OS_WIN
- LARGE_INTEGER frq;
- if(QueryPerformanceFrequency(&frq)) perffrq = (double)frq.QuadPart;
-#endif
-
- starttime = 0;
- return flext::GetOSTime();
-}
-
-double flext::GetOSTime()
-{
- double tm;
-
-#if FLEXT_OS == FLEXT_OS_WIN
- LARGE_INTEGER cnt;
- if(perffrq && QueryPerformanceCounter(&cnt))
- tm = cnt.QuadPart/perffrq;
- else {
- SYSTEMTIME systm;
- FILETIME fltm;
- GetSystemTime(&systm);
- SystemTimeToFileTime(&systm,&fltm);
- tm = ((LARGE_INTEGER *)&fltm)->QuadPart*1.e-7;
- }
-#elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH // POSIX
- timeval tmv;
- gettimeofday(&tmv,NULL);
- tm = tmv.tv_sec+tmv.tv_usec*1.e-6;
-#elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9 & Carbon!
- UnsignedWide tick;
- Microseconds(&tick);
- tm = (tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo)*1.e-6;
-#else
- #error Not implemented
-#endif
- return tm-starttime;
-}
-
-void flext::Sleep(double s)
-{
- if(s <= 0) return;
-#if FLEXT_OS == FLEXT_OS_WIN
-#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x400
-#if 0
- LARGE_INTEGER liDueTime;
- liDueTime.QuadPart = (LONGLONG)(-1.e7*s);
-
- // Create a waitable timer.
- HANDLE hTimer = CreateWaitableTimer(NULL,TRUE,NULL);
- if(hTimer) {
- if(SetWaitableTimer(hTimer,&liDueTime,0,NULL,NULL,0))
- // Wait for the timer.
- WaitForSingleObject(hTimer,INFINITE); // != WAIT_OBJECT_0)
- else
- ::Sleep((long)(s*1000.));
- CloseHandle(hTimer);
- }
- else
-#else
- LARGE_INTEGER cnt;
- if(perffrq && QueryPerformanceCounter(&cnt)) {
- LONGLONG dst = (LONGLONG)(cnt.QuadPart+perffrq*s);
- for(;;) {
- SwitchToThread(); // while waiting switch to another thread
- QueryPerformanceCounter(&cnt);
- if(cnt.QuadPart > dst) break;
- }
- }
- else
-#endif
-#endif
- // last resort....
- ::Sleep((long)(s*1000.));
-#elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH // POSIX
- usleep((long)(s*1000000.));
-#elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9 & Carbon!
- UnsignedWide tick;
- Microseconds(&tick);
- double target = tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo+s*1.e6;
- for(;;) {
- // this is just a loop running until the time has passed - stone age (but we yield at least)
- Microseconds(&tick);
- if(target <= tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo) break;
- YieldToAnyThread(); // yielding surely reduces the timing precision (but we're civilized)
- }
-#else
- #error Not implemented
-#endif
-}
-
-/* \param qu determines whether timed messages should be queued (low priority - only when supported by the system).
-*/
-flext::Timer::Timer(bool qu):
- queued(qu),
- clss(NULL),userdata(NULL),
- period(0)
-{
-#if FLEXT_SYS == FLEXT_SYS_PD
- clk = (t_clock *)clock_new(this,(t_method)callback);
-#elif FLEXT_SYS == FLEXT_SYS_MAX
- clk = (t_clock *)clock_new(this,(t_method)callback);
- if(queued) qelem = (t_qelem *)qelem_new(this,(method)queuefun);
-#else
- #error Not implemented
-#endif
-}
-
-flext::Timer::~Timer()
-{
-#if FLEXT_SYS == FLEXT_SYS_PD
- clock_free(clk);
-#elif FLEXT_SYS == FLEXT_SYS_MAX
- clock_free(clk);
- if(queued) ::qelem_free(qelem);
-#else
- #error Not implemented
-#endif
-}
-
-bool flext::Timer::Reset()
-{
-#if FLEXT_SYS == FLEXT_SYS_PD
- clock_unset(clk);
-#elif FLEXT_SYS == FLEXT_SYS_MAX
- clock_unset(clk);
- if(queued) ::qelem_unset(qelem);
-#else
- #error Not implemented
-#endif
- return true;
-}
-
-/*! \param tm absolute time (in seconds)
- \param data user data
- \param dopast if set events with times lying in the past will be triggered immediately, if not set they are ignored
- \return true on success
-*/
-bool flext::Timer::At(double tm,void *data,bool dopast)
-{
- userdata = data;
- period = 0;
-#if FLEXT_SYS == FLEXT_SYS_PD
- const double systm = clock_gettimesince(0);
- double df = tm*1000.-systm;
- if(dopast && df < 0) df = 0;
- if(df >= 0)
- clock_delay(clk,df);
-#elif FLEXT_SYS == FLEXT_SYS_MAX
- const double ms = tm*1000.;
- double cur;
- clock_getftime(&cur);
- if(cur <= ms)
- clock_fdelay(clk,ms-cur);
- else if(dopast) // trigger timer is past
- clock_fdelay(clk,0);
-#else
- #error Not implemented
-#endif
- return true;
-}
-
-/*! \param tm relative time (in seconds)
- \param data user data
- \return true on success
-*/
-bool flext::Timer::Delay(double tm,void *data)
-{
- userdata = data;
- period = 0;
-#if FLEXT_SYS == FLEXT_SYS_PD
- clock_delay(clk,tm*1000);
-#elif FLEXT_SYS == FLEXT_SYS_MAX
- clock_fdelay(clk,tm*1000.);
-#else
- #error Not implemented
-#endif
- return true;
-}
-
-/*! \param tm relative time between periodic events (in seconds)
- \param data user data
- \return true on success
- \note the first event will be delayed by tm
-*/
-bool flext::Timer::Periodic(double tm,void *data)
-{
- userdata = data;
- period = tm;
-#if FLEXT_SYS == FLEXT_SYS_PD
- clock_delay(clk,tm*1000.);
-#elif FLEXT_SYS == FLEXT_SYS_MAX
- clock_fdelay(clk,tm*1000.);
-#else
- #error Not implemented
-#endif
- return true;
-}
-
-//! \brief Callback function for system clock.
-void flext::Timer::callback(Timer *tmr)
-{
-#if FLEXT_SYS == FLEXT_SYS_MAX
- if(tmr->queued)
- qelem_set(tmr->qelem);
- else
-#endif
- tmr->Work();
-
- if(tmr->period) {
- // reschedule
-#if FLEXT_SYS == FLEXT_SYS_PD
- clock_delay(tmr->clk,tmr->period*1000.);
-#elif FLEXT_SYS == FLEXT_SYS_MAX
- clock_fdelay(tmr->clk,tmr->period*1000.);
-#else
- #error Not implemented
-#endif
- }
-}
-
-#if FLEXT_SYS == FLEXT_SYS_MAX
-/*! \brief Callback function for low priority clock (for queued messages).
-*/
-void flext::Timer::queuefun(Timer *tmr) { tmr->Work(); }
-#endif
-
-/*! \brief Virtual worker function - by default it calls the user callback function.
- \remark The respective callback parameter format is chosen depending on whether clss is defined or not.
-*/
-void flext::Timer::Work()
-{
- if(cback) {
- if(clss)
- ((bool (*)(flext_base *,void *))cback)(clss,userdata);
- else
- cback(userdata);
- }
-}
-