add untested playback api implementation

This commit is contained in:
Kevin Trogant 2023-01-17 11:30:33 +01:00
parent 0b01cfc53b
commit 9a2111f196

View File

@ -156,6 +156,7 @@ typedef struct
typedef struct
{
rtr_record_frame* frame;
double timestamp;
int is_finished;
} rtr_playback_cursor;
@ -177,17 +178,18 @@ int rtr_add_analog_event(rtr_recording* recording, rtr_uint32 axis, double value
* Playback api
*/
int rtr_open_recording(void* buffer, rtr_uint64 buffer_size, void* user_ctx, rtr_recording* recording);
int rtr_open_recording(void* buffer, rtr_uint64 buffer_size, void* user_ctx, rtr_recording* recording, rtr_playback_cursor* cursor);
void rtr_close_recording(rtr_recording* recording);
void rtr_playback_frame(rtr_recording* recording, double delta);
rtr_playback_cursor rtr_create_cursor(rtr_recording* recording);
int rtr_get_events(rtr_recording* recording, unsigned int* num_events, rtr_event** events);
void rtr_advance_playback(rtr_playback_cursor* cursor, double delta);
int rtr_get_events(rtr_playback_cursor* cursor, unsigned int* num_events, rtr_event* events);
#endif
#define RT_REPLAY_IMPLEMENTATION
#ifdef RT_REPLAY_IMPLEMENTATION
#undef RT_REPLAY_IMPLEMENTATION
@ -344,7 +346,7 @@ int rtr_add_analog_event(rtr_recording* recording, rtr_uint32 axis, double value
return rtr_add_event(recording, event);
}
int rtr_open_recording(void* buffer, rtr_uint64 buffer_size, void* user_ctx, rtr_recording* recording)
int rtr_open_recording(void* buffer, rtr_uint64 buffer_size, void* user_ctx, rtr_recording* recording, rtr_playback_cursor* cursor)
{
rtr_buffer_header* hdr = (rtr_buffer_header*)buffer;
if (hdr->version != RTR_VERSION) {
@ -376,6 +378,12 @@ int rtr_open_recording(void* buffer, rtr_uint64 buffer_size, void* user_ctx, rtr
recording->timestamp = 0.0;
recording->ctx = user_ctx;
if (cursor) {
cursor->frame = recording->frames;
cursor->is_finished = 0;
cursor->timestamp = 0.0;
}
return RTR_SUCCESS;
}
@ -387,11 +395,60 @@ void rtr_close_recording(rtr_recording* recording)
RTR_MEMSET(recording, 0, sizeof(recording));
}
void rtr_playback_frame(rtr_recording* recording, double delta)
rtr_playback_cursor rtr_create_cursor(rtr_recording* recording)
{
rtr_playback_cursor cursor = {NULL, 0.0, 0};
if (recording->mode != RTR_RECORDING_MODE_PLAYBACK)
return cursor;
cursor.frame = recording->frames;
cursor.is_finished = 0;
cursor.timestamp = 0.0;
return cursor;
}
int rtr_get_events(rtr_recording* recording, unsigned int* num_events, rtr_event** events);
void rtr_advance_playback(rtr_playback_cursor* cursor, double delta)
{
rtr_record_frame* next_frame = cursor->frame->next;
/* skip extended frames */
while (next_frame && next_frame->timestamp == cursor->frame->timestamp)
next_frame = next_frame->next;
if (next_frame) {
cursor->timestamp += delta;
if (cursor->timestamp >= next_frame->timestamp)
cursor->frame = next_frame;
}
else {
cursor->is_finished = 1;
}
}
int rtr_get_events(rtr_playback_cursor* cursor, unsigned int* num_events, rtr_event* events)
{
/* its possible that multiple frames are concatenated together */
unsigned int n = (unsigned int)cursor->frame->num_events;
double ts = cursor->frame->timestamp;
rtr_record_frame* ext_frame = cursor->frame->next;
while (ext_frame->timestamp == ts) {
n += ext_frame->num_events;
ext_frame = ext_frame->next;
}
if (num_events)
*num_events = n;
if (events) {
RTR_MEMCPY(events, cursor->frame->events, cursor->frame->num_events * sizeof(rtr_event));
rtr_uint32 i = cursor->frame->num_events;
rtr_record_frame* ext_frame = cursor->frame->next;
while (ext_frame->timestamp == ts) {
RTR_MEMCPY(&events[i], ext_frame->events, ext_frame->num_events * sizeof(rtr_event));
i += ext_frame->num_events;
ext_frame = ext_frame->next;
}
}
return 1;
}
#endif