summaryrefslogtreecommitdiff
path: root/src/screen
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen')
-rw-r--r--src/screen/meson.build10
-rw-r--r--src/screen/screen.c228
-rw-r--r--src/screen/screen.h16
3 files changed, 149 insertions, 105 deletions
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 <aki/thread.h>
#include <al/log.h>
+#include <aki/thread.h>
+
+#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 <al/atomic.h>
#include <aki/thread.h>
#endif
-#include <skh/window.h>
+#include <stl/window.h>
#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);