From 60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 21 Oct 2024 19:22:50 -0400 Subject: Everything before initial synced list Signed-off-by: Andrew Opalach --- src/screen/meson.build | 10 +-- src/screen/screen.c | 228 ++++++++++++++++++++++++++++++------------------- src/screen/screen.h | 16 ++-- 3 files changed, 149 insertions(+), 105 deletions(-) (limited to 'src/screen') diff --git a/src/screen/meson.build b/src/screen/meson.build index 7f9738c..9c01566 100644 --- a/src/screen/meson.build +++ b/src/screen/meson.build @@ -1,10 +1,2 @@ screen_src = ['screen.c', 'view.c'] -sekihi = subproject('sekihi', - default_options: [ - sink_use_vulkan ? 'api=vulkan' : 'api=opengl', - 'window=glfw', - 'poll=inline', - 'event-buffer=false', - 'pause=true' - ]).get_variable('sekihi') -screen = declare_dependency(sources: screen_src, dependencies: [sekihi]) +screen = declare_dependency(sources: screen_src, dependencies: [stela]) diff --git a/src/screen/screen.c b/src/screen/screen.c index f92cd98..afc6b9b 100644 --- a/src/screen/screen.c +++ b/src/screen/screen.c @@ -1,5 +1,7 @@ -#include #include +#include + +#include "../liana/list.h" #include "view.h" #include "screen.h" @@ -23,7 +25,7 @@ static struct camu_view *get_view_from_mouse_pos(struct camu_screen *scr) static void should_close_callback(void *userdata) { struct camu_screen *scr = (struct camu_screen *)userdata; - scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, 0.0); + scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, NULL); } static void resize_callback(void *userdata, s32 width, s32 height) @@ -62,8 +64,8 @@ static bool pointer_pos_callback(void *userdata, f64 x, f64 y) view->mode = CAMU_VIEW_DETACHED; queue_refresh = true; } + if (fabs(dx) + fabs(dy) > 3.0) scr->last_click_ts = 0; } - scr->last_click_ts = 0; } } scr->last_mouse_x = x; @@ -75,51 +77,54 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button) { struct camu_screen *scr = (struct camu_screen *)userdata; switch (button) { - case SEKIHI_MOUSE1: + case STELA_MOUSE1: switch (state) { - case SEKIHI_BUTTON_PRESSED: + case STELA_BUTTON_PRESSED: scr->flags |= CAMU_SCREEN_DRAGGING; scr->last_click_ts = aki_get_timestamp(); break; - case SEKIHI_BUTTON_RELEASED: + case STELA_BUTTON_RELEASED: scr->flags &= ~CAMU_SCREEN_DRAGGING; if (scr->last_click_ts && aki_get_timestamp() - scr->last_click_ts <= 300000) { if (scr->flags & CAMU_SCREEN_MODIFIER) { - scr->callback(scr->userdata, CAMU_SCREEN_SEEK, scr->last_mouse_x / scr->width); + f64 percent = scr->last_mouse_x / scr->width; + scr->callback(scr->userdata, CAMU_SCREEN_SEEK, &percent); } else { if (scr->last_mouse_x >= scr->width / 2.f) { - scr->callback(scr->userdata, CAMU_SCREEN_NEXT, 0.0); + scr->callback(scr->userdata, CAMU_SCREEN_NEXT, NULL); } else { - scr->callback(scr->userdata, CAMU_SCREEN_PREVIOUS, 0.0); + scr->callback(scr->userdata, CAMU_SCREEN_PREVIOUS, NULL); } } } break; } break; - case SEKIHI_MOUSE2: + case STELA_MOUSE2: switch (state) { - case SEKIHI_BUTTON_PRESSED: + case STELA_BUTTON_PRESSED: scr->flags |= CAMU_SCREEN_MODIFIER; break; - case SEKIHI_BUTTON_RELEASED: + case STELA_BUTTON_RELEASED: scr->flags &= ~CAMU_SCREEN_MODIFIER; break; } break; - case SEKIHI_MOUSE3: - scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, 0.0); + case STELA_MOUSE3: { + f64 percent = scr->last_mouse_x / scr->width; + scr->callback(scr->userdata, CAMU_SCREEN_SEEK, &percent); break; + } default: break; } return false; } -#if defined SEKIHI_WINDOW_WAYLAND -#define SCROLL_MULTIPLIER 150.0 +#if defined STELA_WINDOW_WAYLAND +#define SCROLL_MULTIPLIER 155.0 #else -#define SCROLL_MULTIPLIER 25.0 +#define SCROLL_MULTIPLIER 13.0 #endif static bool scroll_callback(void *userdata, f64 y) @@ -127,11 +132,7 @@ static bool scroll_callback(void *userdata, f64 y) struct camu_screen *scr = (struct camu_screen *)userdata; struct camu_view *view = get_view_from_mouse_pos(scr); if (view) { - if (scr->flags & CAMU_SCREEN_MODIFIER) { - // Unimplemented. - view->rotation += y; - return true; - } else if (scr->flags & CAMU_SCREEN_ZOOM_PAN_SIMPLE) { + if (scr->flags & CAMU_SCREEN_ZOOM_PAN_SIMPLE) { y = -y / SCROLL_MULTIPLIER; if (camu_view_zoom_simple(view, scr->width, scr->height, scr->last_mouse_x, scr->last_mouse_y, y)) { view->mode = CAMU_VIEW_DETACHED; @@ -146,40 +147,35 @@ static bool key_callback(void *userdata, u8 state, u8 button) { struct camu_screen *scr = (struct camu_screen *)userdata; switch (state) { - case SEKIHI_BUTTON_PRESSED: + case STELA_BUTTON_PRESSED: //al_printf("%x\n", button); switch (button) { - case 0x1d: + case 0x1d: // control scr->flags |= CAMU_SCREEN_MODIFIER; break; - case 0x10: - case 0x18: - case 'q': - scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, 0.0); + case 0x10: // q + scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, NULL); + break; + case 0x31: // n + case 0x20: // d + case 0x6a: // right arrow + scr->callback(scr->userdata, CAMU_SCREEN_NEXT, NULL); break; - case 0x6a: - case 0x31: - case 0x4d: - case 'n': - scr->callback(scr->userdata, CAMU_SCREEN_NEXT, 0.0); + case 0x30: // b + case 0x1e: // a + case 0x69: // left arrow + scr->callback(scr->userdata, CAMU_SCREEN_PREVIOUS, NULL); break; - case 0x69: - case 0x30: - case 0x4b: - case 'b': - scr->callback(scr->userdata, CAMU_SCREEN_PREVIOUS, 0.0); + case 0x39: // spacebar + scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL); break; - case 0x41: - case 0x39: - scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, 0.0); + case 0x1f: // s + scr->callback(scr->userdata, CAMU_SCREEN_SHUFFLE, NULL); break; - case 0x1f: - case 's': - scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, 0.0); + case 0x12: // e + scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL); break; - case 0x13: - case 0x1b: - case 'r': { + case 0x13: { // r struct camu_view *view = get_view_from_mouse_pos(scr); if (view) { if (!(scr->flags & CAMU_SCREEN_MODIFIER)) { @@ -206,7 +202,7 @@ static bool key_callback(void *userdata, u8 state, u8 button) } break; } - case 0xd: { + case 0xd: { // + struct camu_view *view = get_view_from_mouse_pos(scr); if (view) { camu_view_zoom_simple(view, scr->width, scr->height, scr->width / 2.0, scr->height / 2.0, 0.05); @@ -214,7 +210,7 @@ static bool key_callback(void *userdata, u8 state, u8 button) } break; } - case 0xc: { + case 0xc: { // - struct camu_view *view = get_view_from_mouse_pos(scr); if (view) { camu_view_zoom_simple(view, scr->width, scr->height, scr->width / 2.0, scr->height / 2.0, -0.05); @@ -226,9 +222,9 @@ static bool key_callback(void *userdata, u8 state, u8 button) break; } break; - case SEKIHI_BUTTON_RELEASED: + case STELA_BUTTON_RELEASED: switch (button) { - case 0x1d: + case 0x1d: // control scr->flags &= ~CAMU_SCREEN_MODIFIER; break; } @@ -242,10 +238,9 @@ static void key_immediate_callback(void *userdata, u8 state, u8 button) { struct camu_screen *scr = (struct camu_screen *)userdata; switch (state) { - case SEKIHI_BUTTON_PRESSED: + case STELA_BUTTON_PRESSED: switch (button) { - case 0x29: - case 0x21: + case 0x21: // f scr->window->toggle_fullscreen(scr->window); break; } @@ -257,10 +252,10 @@ static void key_immediate_callback(void *userdata, u8 state, u8 button) bool camu_screen_init(struct camu_screen *scr) { - al_atomic_s32_store(&scr->state, CAMU_SCREEN_PAUSED, AL_ATOMIC_RELAXED); + al_atomic_store(s32)(&scr->state, CAMU_SCREEN_PAUSED, AL_ATOMIC_RELAXED); al_array_init(scr->videos); scr->renderer = NULL; - scr->window = skh_window_create(); + scr->window = stl_window_create(); scr->window->pointer_pos_callback = pointer_pos_callback; scr->window->scroll_callback = scroll_callback; scr->window->mouse_button_callback = mouse_button_callback; @@ -273,24 +268,37 @@ bool camu_screen_init(struct camu_screen *scr) #ifdef CAMU_SCREEN_THREADED al_array_init(scr->add_queue); al_array_init(scr->rem_queue); - al_atomic_bool_store(&scr->queued, false, AL_ATOMIC_RELAXED); + al_atomic_store(u8)(&scr->queued, 0, AL_ATOMIC_RELAXED); aki_mutex_init(&scr->mutex); #endif - scr->last_mouse_x = 0; - scr->last_mouse_y = 0; + scr->last_mouse_x = 0.0; + scr->last_mouse_y = 0.0; scr->flags = CAMU_SCREEN_ZOOM_PAN_SIMPLE; return true; } +#if defined STELA_EVENT_BUFFER +static aki_thread_result AKI_THREADCALL event_thread(void *userdata) +{ + struct camu_screen *scr = (struct camu_screen *)userdata; + while (scr->window->poll(scr->window, true) && al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED) != CAMU_SCREEN_CLOSED ) { + scr->window->process_events(scr->window); + } + return 0; +} +#endif + bool camu_screen_create_window(struct camu_screen *scr, const char *name) { - s32 flags = SEKIHI_WINDOW_VSYNC; - //flags |= SEKIHI_WINDOW_WALLPAPER; - if (!scr->window->create_window(scr->window, CAMU_SCREEN_WIDTH, CAMU_SCREEN_HEIGHT, "DP-1", name, flags)) { + s32 flags = STELA_WINDOW_VSYNC; + if (!scr->window->create_window(scr->window, CAMU_SCREEN_WIDTH, CAMU_SCREEN_HEIGHT, "", name, flags)) { return false; } scr->width = scr->window->width; scr->height = scr->window->height; +#if defined STELA_EVENT_BUFFER + aki_thread_create(&scr->thread, event_thread, scr); +#endif return true; } @@ -314,23 +322,30 @@ bool camu_screen_create_renderer(struct camu_screen *scr, struct camu_renderer * static void add_buffer_internal(struct camu_screen *scr, struct camu_video_buffer *buf) { - struct camu_stream *stream = buf->stream; struct camu_screen_video video = { - .buf = buf, - .view = { - .mode = CAMU_DEFAULT_VIEW, - .width = stream->video.width, - .height = stream->video.height, - .stretch = 1.0, - .rotation = CAMU_VIEW_ROTATION_0, - .zindex = 0 - } + .buf = buf }; -#ifdef CAMU_SCREEN_THREADED - al_atomic_bool_store(&buf->ref, true, AL_ATOMIC_RELAXED); + struct camu_codec_stream *stream = buf->stream; + if (buf->view.mode != CAMU_VIEW_NONE) { + video.view = buf->view; +#if 0 + } else if (!al_array_is_empty(scr->videos)) { + video.view = al_array_last(scr->videos).view; + video.view.width = stream->video.width; + video.view.height = stream->video.height; #endif - if (buf->view.mode != CAMU_VIEW_NONE) video.view = buf->view; + } else { + video.view.mode = CAMU_DEFAULT_VIEW; + video.view.width = stream->video.width; + video.view.height = stream->video.height; + video.view.stretch = 1.0; + video.view.rotation = CAMU_VIEW_ROTATION_0; + video.view.zindex = 0; + } camu_view_calculate(&video.view, scr->width, scr->height); +#ifdef CAMU_SCREEN_THREADED + al_atomic_store(u8)(&buf->ref, 1, AL_ATOMIC_RELAXED); +#endif al_array_push(scr->videos, video); } @@ -339,11 +354,11 @@ static void remove_buffer_internal(struct camu_screen *scr, struct camu_video_bu struct camu_screen_video *video; al_array_foreach_ptr(scr->videos, i, video) { if (video->buf == buf) { + buf->view = video->view; #ifdef CAMU_SCREEN_THREADED - al_atomic_bool_store(&buf->ref, false, AL_ATOMIC_RELAXED); + al_atomic_store(u8)(&buf->ref, 0, AL_ATOMIC_RELAXED); #endif - buf->view = video->view; - al_array_remove_at_iter(scr->videos, i); + al_array_remove_at(scr->videos, i); break; } } @@ -355,7 +370,7 @@ void camu_screen_add_buffer(struct camu_screen *scr, struct camu_video_buffer *b aki_mutex_lock(&scr->mutex); al_array_push(scr->add_queue, buf); al_array_reserve(scr->videos, scr->videos.size + scr->add_queue.size); - al_atomic_bool_store(&scr->queued, true, AL_ATOMIC_RELAXED); + al_atomic_store(u8)(&scr->queued, 1, AL_ATOMIC_RELAXED); aki_mutex_unlock(&scr->mutex); #else add_buffer_internal(scr, buf); @@ -382,11 +397,20 @@ void camu_screen_remove_buffer(struct camu_screen *scr, struct camu_video_buffer { #ifdef CAMU_SCREEN_THREADED aki_mutex_lock(&scr->mutex); - al_array_push(scr->rem_queue, buf); - al_atomic_bool_store(&scr->queued, true, AL_ATOMIC_RELAXED); - if (al_atomic_s32_load(&scr->state, AL_ATOMIC_RELAXED) == CAMU_SCREEN_CLOSED) { - run_queue_internal(scr); + struct camu_video_buffer *rbuf; + al_array_foreach(scr->add_queue, i, rbuf) { + if (rbuf == buf) { + al_array_remove_at(scr->add_queue, i); + bool queue_empty = scr->add_queue.size + scr->rem_queue.size == 0; + if (queue_empty) { + al_atomic_store(u8)(&scr->queued, 0, AL_ATOMIC_RELAXED); + } + aki_mutex_unlock(&scr->mutex); + return; + } } + al_array_push(scr->rem_queue, buf); + al_atomic_store(u8)(&scr->queued, 1, AL_ATOMIC_RELAXED); aki_mutex_unlock(&scr->mutex); #else remove_buffer_internal(scr, buf); @@ -399,24 +423,30 @@ void camu_screen_run_queue(struct camu_screen *scr) { aki_mutex_lock(&scr->mutex); run_queue_internal(scr); - al_atomic_bool_store(&scr->queued, false, AL_ATOMIC_RELAXED); + al_atomic_store(u8)(&scr->queued, 0, AL_ATOMIC_RELAXED); aki_mutex_unlock(&scr->mutex); } #endif void camu_screen_set_state(struct camu_screen *scr, s32 state) { - al_atomic_s32_store(&scr->state, state, AL_ATOMIC_RELAXED); + al_atomic_store(s32)(&scr->state, state, AL_ATOMIC_RELAXED); } +#define CAMU_SCREEN_POLL_HZ 576 + bool camu_screen_poll(struct camu_screen *scr, bool block) { +#if defined STELA_EVENT_BUFFER + if (block) { + aki_thread_sleep(AKI_TS_FROM_USEC(1000000/CAMU_SCREEN_POLL_HZ)); + } + stl_window_read_events(scr->window); +#else scr->window->poll(scr->window, block); scr->window->process_events(scr->window); -#if defined SEKIHI_EVENT_BUFFER - skh_window_read_events(scr->window); #endif -#if defined SEKIHI_PAUSE +#if defined STELA_PAUSE return scr->window->should_refresh(scr->window); #else return true; @@ -425,15 +455,29 @@ bool camu_screen_poll(struct camu_screen *scr, bool block) bool camu_screen_tick(struct camu_screen *scr) { - bool paused = al_atomic_s32_load(&scr->state, AL_ATOMIC_RELAXED) == CAMU_SCREEN_PAUSED; + bool paused = al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED) == CAMU_SCREEN_PAUSED; return camu_screen_poll(scr, paused) || !paused; } void camu_screen_wake(struct camu_screen *scr) { -#if defined SEKIHI_POLL_INLINE && defined SEKIHI_PAUSE +#if defined STELA_POLL_INLINE && defined STELA_PAUSE scr->window->wake(scr->window); +#else + (void)scr; +#endif +} + +void camu_screen_clear(struct camu_screen *scr) +{ +#ifdef CAMU_SCREEN_THREADED + run_queue_internal(scr); + struct camu_screen_video *video; + al_array_foreach_ptr(scr->videos, i, video) { + al_atomic_store(u8)(&video->buf->ref, 0, AL_ATOMIC_RELAXED); + } #endif + scr->videos.size = 0; } void camu_screen_close(struct camu_screen *scr) @@ -444,5 +488,9 @@ void camu_screen_close(struct camu_screen *scr) aki_mutex_destroy(&scr->mutex); #endif al_array_free(scr->videos); + al_atomic_store(s32)(&scr->state, CAMU_SCREEN_CLOSED, AL_ATOMIC_RELAXED); +#if defined STELA_EVENT_BUFFER + aki_thread_join(&scr->thread); +#endif scr->window->free(&scr->window); } diff --git a/src/screen/screen.h b/src/screen/screen.h index 67cd7ed..af4169e 100644 --- a/src/screen/screen.h +++ b/src/screen/screen.h @@ -7,11 +7,10 @@ #include #include #endif -#include +#include #include "../buffer/video.h" #include "../render/renderer.h" -#include "../codec/codec.h" #include "view.h" @@ -33,6 +32,7 @@ enum { enum { CAMU_SCREEN_NEXT = 0, CAMU_SCREEN_PREVIOUS, + CAMU_SCREEN_SHUFFLE, CAMU_SCREEN_TOGGLE_PAUSE, CAMU_SCREEN_SEEK, CAMU_SCREEN_RESEEK, @@ -45,9 +45,12 @@ struct camu_screen_video { }; struct camu_screen { - atomic_s32 state; + atomic(s32) state; u32 flags; - struct skh_window *window; + struct stl_window *window; +#if defined STELA_EVENT_BUFFER + struct aki_thread thread; +#endif struct camu_renderer *renderer; s32 width; s32 height; @@ -58,10 +61,10 @@ struct camu_screen { #ifdef CAMU_SCREEN_THREADED array(struct camu_video_buffer *) add_queue; array(struct camu_video_buffer *) rem_queue; - atomic_bool queued; + atomic(u8) queued; struct aki_mutex mutex; #endif - void (*callback)(void *, u8, f64); + void (*callback)(void *, u8, void *); void *userdata; }; @@ -77,4 +80,5 @@ void camu_screen_set_state(struct camu_screen *scr, s32 state); bool camu_screen_poll(struct camu_screen *scr, bool block); bool camu_screen_tick(struct camu_screen *scr); void camu_screen_wake(struct camu_screen *scr); +void camu_screen_clear(struct camu_screen *scr); void camu_screen_close(struct camu_screen *scr); -- cgit v1.2.3-101-g0448