add untested playback api implementation
This commit is contained in:
		
							parent
							
								
									0b01cfc53b
								
							
						
					
					
						commit
						9a2111f196
					
				
							
								
								
									
										73
									
								
								rt_replay.h
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								rt_replay.h
									
									
									
									
									
								
							@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user