mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-04-04 14:49:40 +00:00
Added SDL_AddTimerNS()
This commit is contained in:
@@ -30,7 +30,8 @@
|
||||
typedef struct SDL_Timer
|
||||
{
|
||||
SDL_TimerID timerID;
|
||||
SDL_TimerCallback callback;
|
||||
SDL_TimerCallback callback_ms;
|
||||
SDL_NSTimerCallback callback_ns;
|
||||
void *userdata;
|
||||
Uint64 interval;
|
||||
Uint64 scheduled;
|
||||
@@ -160,8 +161,11 @@ static int SDLCALL SDL_TimerThread(void *_data)
|
||||
if (SDL_AtomicGet(¤t->canceled)) {
|
||||
interval = 0;
|
||||
} else {
|
||||
/* FIXME: We could potentially support sub-millisecond timers now */
|
||||
interval = SDL_MS_TO_NS(current->callback(current->userdata, current->timerID, (Uint32)SDL_NS_TO_MS(current->interval)));
|
||||
if (current->callback_ms) {
|
||||
interval = SDL_MS_TO_NS(current->callback_ms(current->userdata, current->timerID, (Uint32)SDL_NS_TO_MS(current->interval)));
|
||||
} else {
|
||||
interval = current->callback_ns(current->userdata, current->timerID, current->interval);
|
||||
}
|
||||
}
|
||||
|
||||
if (interval > 0) {
|
||||
@@ -269,7 +273,7 @@ void SDL_QuitTimers(void)
|
||||
}
|
||||
}
|
||||
|
||||
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *userdata)
|
||||
static SDL_TimerID SDL_CreateTimer(Uint64 interval, SDL_TimerCallback callback_ms, SDL_NSTimerCallback callback_ns, void *userdata)
|
||||
{
|
||||
SDL_TimerData *data = &SDL_timer_data;
|
||||
SDL_Timer *timer;
|
||||
@@ -298,9 +302,10 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *user
|
||||
}
|
||||
}
|
||||
timer->timerID = SDL_GetNextObjectID();
|
||||
timer->callback = callback;
|
||||
timer->callback_ms = callback_ms;
|
||||
timer->callback_ns = callback_ns;
|
||||
timer->userdata = userdata;
|
||||
timer->interval = SDL_MS_TO_NS(interval);
|
||||
timer->interval = interval;
|
||||
timer->scheduled = SDL_GetTicksNS() + timer->interval;
|
||||
SDL_AtomicSet(&timer->canceled, 0);
|
||||
|
||||
@@ -329,6 +334,16 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *user
|
||||
return entry->timerID;
|
||||
}
|
||||
|
||||
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *userdata)
|
||||
{
|
||||
return SDL_CreateTimer(SDL_MS_TO_NS(interval), callback, NULL, userdata);
|
||||
}
|
||||
|
||||
SDL_TimerID SDL_AddTimerNS(Uint64 interval, SDL_NSTimerCallback callback, void *userdata)
|
||||
{
|
||||
return SDL_CreateTimer(interval, NULL, callback, userdata);
|
||||
}
|
||||
|
||||
int SDL_RemoveTimer(SDL_TimerID id)
|
||||
{
|
||||
SDL_TimerData *data = &SDL_timer_data;
|
||||
@@ -373,8 +388,9 @@ typedef struct SDL_TimerMap
|
||||
{
|
||||
SDL_TimerID timerID;
|
||||
int timeoutID;
|
||||
Uint32 interval;
|
||||
SDL_TimerCallback callback;
|
||||
Uint64 interval;
|
||||
SDL_TimerCallback callback_ms;
|
||||
SDL_NSTimerCallback callback_ns;
|
||||
void *userdata;
|
||||
struct SDL_TimerMap *next;
|
||||
} SDL_TimerMap;
|
||||
@@ -389,10 +405,14 @@ static SDL_TimerData SDL_timer_data;
|
||||
static void SDL_Emscripten_TimerHelper(void *userdata)
|
||||
{
|
||||
SDL_TimerMap *entry = (SDL_TimerMap *)userdata;
|
||||
entry->interval = entry->callback(entry->userdata, entry->timerID, entry->interval);
|
||||
if (entry->callback_ms) {
|
||||
entry->interval = SDL_MS_TO_NS(entry->callback_ms(entry->userdata, entry->timerID, (Uint32)SDL_NS_TO_MS(entry->interval)));
|
||||
} else {
|
||||
entry->interval = entry->callback_ns(entry->userdata, entry->timerID, entry->interval);
|
||||
}
|
||||
if (entry->interval > 0) {
|
||||
entry->timeoutID = emscripten_set_timeout(&SDL_Emscripten_TimerHelper,
|
||||
entry->interval,
|
||||
SDL_NS_TO_MS(entry->interval),
|
||||
entry);
|
||||
}
|
||||
}
|
||||
@@ -414,7 +434,7 @@ void SDL_QuitTimers(void)
|
||||
}
|
||||
}
|
||||
|
||||
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *userdata)
|
||||
static SDL_TimerID SDL_CreateTimer(Uint64 interval, SDL_TimerCallback callback_ms, SDL_NSTimerCallback callback_ns, void *userdata)
|
||||
{
|
||||
SDL_TimerData *data = &SDL_timer_data;
|
||||
SDL_TimerMap *entry;
|
||||
@@ -424,12 +444,13 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *user
|
||||
return 0;
|
||||
}
|
||||
entry->timerID = SDL_GetNextObjectID();
|
||||
entry->callback = callback;
|
||||
entry->callback_ms = callback_ms;
|
||||
entry->callback_ns = callback_ns;
|
||||
entry->userdata = userdata;
|
||||
entry->interval = interval;
|
||||
|
||||
entry->timeoutID = emscripten_set_timeout(&SDL_Emscripten_TimerHelper,
|
||||
entry->interval,
|
||||
SDL_NS_TO_MS(entry->interval),
|
||||
entry);
|
||||
|
||||
entry->next = data->timermap;
|
||||
@@ -438,6 +459,16 @@ SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *user
|
||||
return entry->timerID;
|
||||
}
|
||||
|
||||
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_TimerCallback callback, void *userdata)
|
||||
{
|
||||
return SDL_CreateTimer(SDL_MS_TO_NS(interval), callback, NULL, userdata);
|
||||
}
|
||||
|
||||
SDL_TimerID SDL_AddTimerNS(Uint64 interval, SDL_NSTimerCallback callback, void *userdata)
|
||||
{
|
||||
return SDL_CreateTimer(interval, NULL, callback, userdata);
|
||||
}
|
||||
|
||||
int SDL_RemoveTimer(SDL_TimerID id)
|
||||
{
|
||||
SDL_TimerData *data = &SDL_timer_data;
|
||||
|
||||
Reference in New Issue
Block a user