From 6134465ddc10f8b43bddf74209f0ec8654595041 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Wed, 29 Jan 2025 16:45:30 -0500 Subject: Fixes and optimizations around seek and loop Signed-off-by: Andrew Opalach --- src/screen/screen.c | 52 +++++++++++++++++++++++++++++++++------------------- src/screen/screen.h | 4 +++- 2 files changed, 36 insertions(+), 20 deletions(-) (limited to 'src/screen') diff --git a/src/screen/screen.c b/src/screen/screen.c index 8e3ecbd..b4f65c2 100644 --- a/src/screen/screen.c +++ b/src/screen/screen.c @@ -2,8 +2,6 @@ #include #include -#include "../liana/list.h" - #include "view.h" #include "screen.h" @@ -46,7 +44,7 @@ static void resize_callback(void *userdata, s32 width, s32 height) al_array_foreach_ptr(scr->videos, i, video) { camu_view_calculate(&video->view, scr->width, scr->height); } - scr->force_render = true; + scr->force_refresh = true; } static void refresh_callback(void *userdata) @@ -58,6 +56,13 @@ static void refresh_callback(void *userdata) } } +static void seek_to_percent_at_pointer(struct camu_screen *scr) +{ + f64 percent = scr->last_mouse_x / scr->width; + percent = CLAMP(percent, 0.0, 100.0); + scr->callback(scr->userdata, CAMU_SCREEN_SEEK, &percent); +} + static bool pointer_pos_callback(void *userdata, f64 x, f64 y) { struct camu_screen *scr = (struct camu_screen *)userdata; @@ -74,6 +79,15 @@ static bool pointer_pos_callback(void *userdata, f64 x, f64 y) queue_refresh = true; } if (fabs(dx) + fabs(dy) > 3.0) scr->last_click_ts = 0; + } else { + u64 now = nn_get_timestamp(); + if (!scr->last_click_ts) { + scr->last_click_ts = now; + } + if (now - scr->last_seek_ts > 100000) { + scr->last_seek_ts = now; + seek_to_percent_at_pointer(scr); + } } } } @@ -96,9 +110,7 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button) scr->flags &= ~CAMU_SCREEN_DRAGGING; if (scr->last_click_ts && nn_get_timestamp() - scr->last_click_ts <= 300000) { if (scr->flags & CAMU_SCREEN_MODIFIER) { - f64 percent = scr->last_mouse_x / scr->width; - percent = CLAMP(percent, 0.0, 100.0); - scr->callback(scr->userdata, CAMU_SCREEN_SEEK, &percent); + seek_to_percent_at_pointer(scr); } else { if (scr->last_mouse_x >= scr->width / 2.f) { scr->callback(scr->userdata, CAMU_SCREEN_NEXT, NULL); @@ -123,9 +135,7 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button) case STELA_MOUSE3: { switch (state) { case STELA_BUTTON_RELEASED: { - f64 percent = scr->last_mouse_x / scr->width; - percent = CLAMP(percent, 0.0, 100.0); - scr->callback(scr->userdata, CAMU_SCREEN_SEEK, &percent); + seek_to_percent_at_pointer(scr); break; } } @@ -291,7 +301,7 @@ bool camu_screen_init(struct camu_screen *scr, void *context) scr->window->should_close_callback = should_close_callback; scr->window->userdata = scr; scr->renderer = NULL; - scr->force_render = false; + scr->force_refresh = false; scr->flags = CAMU_SCREEN_ZOOM_PAN_SIMPLE; scr->last_mouse_x = 0.0; scr->last_mouse_y = 0.0; @@ -418,6 +428,7 @@ static void run_queue_internal(struct camu_screen *scr) add_buffer_internal(scr, buf); } scr->add_queue.count = 0; + //scr->force_refresh = scr->videos.count == 0; } #endif @@ -509,13 +520,19 @@ void camu_screen_set_state(struct camu_screen *scr, s32 state) al_atomic_store(s32)(&scr->state, state, AL_ATOMIC_RELAXED); } +void camu_screen_force_refresh(struct camu_screen *scr) +{ + scr->force_refresh = true; + camu_screen_wake(scr); +} + #define CAMU_SCREEN_POLL_HZ 576 bool camu_screen_poll(struct camu_screen *scr, bool block) { #ifdef STELA_EVENT_BUFFER if (block) { - nn_thread_sleep(NNWT_TS_FROM_USEC(1000000/CAMU_SCREEN_POLL_HZ)); + nn_thread_sleep(NNWT_TS_FROM_USEC(1000000 / CAMU_SCREEN_POLL_HZ)); } stl_window_read_events(scr->window); #else @@ -534,11 +551,11 @@ bool camu_screen_tick(struct camu_screen *scr, bool *force) s32 state = al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED); al_assert(state != CAMU_SCREEN_STOPPED); bool paused = state == CAMU_SCREEN_PAUSED; - bool render = camu_screen_poll(scr, paused) || !paused; - render |= scr->force_render; - *force = scr->force_render; - scr->force_render = false; - return render; + bool do_render = camu_screen_poll(scr, paused) || !paused; + do_render |= scr->force_refresh; + *force = scr->force_refresh; + scr->force_refresh = false; + return do_render; } void camu_screen_wake(struct camu_screen *scr) @@ -548,9 +565,6 @@ void camu_screen_wake(struct camu_screen *scr) #else (void)scr; #endif -#ifndef LIANA_LIST_SCUFFED_LOOP - scr->force_render = true; -#endif } void camu_screen_close(struct camu_screen *scr) diff --git a/src/screen/screen.h b/src/screen/screen.h index 7203018..e0d1fc3 100644 --- a/src/screen/screen.h +++ b/src/screen/screen.h @@ -55,7 +55,7 @@ struct camu_screen { struct nn_thread thread; #endif struct camu_renderer *renderer; - bool force_render; + bool force_refresh; u32 flags; s32 width; s32 height; @@ -63,6 +63,7 @@ struct camu_screen { u64 last_click_ts; f64 last_mouse_y; f64 last_mouse_x; + u64 last_seek_ts; array(struct camu_screen_video) videos; #ifdef CAMU_SCREEN_THREADED array(struct camu_video_buffer *) add_queue; @@ -84,6 +85,7 @@ void camu_screen_run_queue(struct camu_screen *scr); void camu_screen_clear(struct camu_screen *scr); #endif void camu_screen_set_state(struct camu_screen *scr, s32 state); +void camu_screen_force_refresh(struct camu_screen *scr); bool camu_screen_poll(struct camu_screen *scr, bool block); bool camu_screen_tick(struct camu_screen *scr, bool *force); void camu_screen_wake(struct camu_screen *scr); -- cgit v1.2.3-101-g0448