summaryrefslogtreecommitdiff
path: root/src/screen
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-12-10 15:04:31 -0500
committerAndrew Opalach <andrew@akon.city> 2024-12-10 15:04:31 -0500
commit49e01c8cde0c212abd3c67091102cfd7797c1e07 (patch)
tree7195aa32cfc034566aac5a7c8789c1b394af6ec6 /src/screen
parent907766e7d59af88d125aef603fa9c61f67abd328 (diff)
downloadcamu-49e01c8cde0c212abd3c67091102cfd7797c1e07.tar.gz
camu-49e01c8cde0c212abd3c67091102cfd7797c1e07.tar.bz2
camu-49e01c8cde0c212abd3c67091102cfd7797c1e07.zip
Improve screen and mixer deinitialization
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/screen')
-rw-r--r--src/screen/screen.c17
-rw-r--r--src/screen/screen.h6
2 files changed, 16 insertions, 7 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c
index 30d6860..d5f6c78 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -184,9 +184,11 @@ static bool key_callback(void *userdata, u8 state, u8 button)
case 0x12: // e
scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL);
break;
+#ifdef CAMU_SCREEN_DEBUG_KEY
case 0x19: // p
scr->callback(scr->userdata, CAMU_SCREEN_DEBUG, NULL);
break;
+#endif
case 0x13: { // r
struct camu_view *view = get_view_from_mouse_pos(scr);
if (view) {
@@ -293,7 +295,7 @@ bool camu_screen_init(struct camu_screen *scr, void *context)
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 ) {
+ while (scr->window->poll(scr->window, true) && al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED) != CAMU_SCREEN_STOPPED) {
scr->window->process_events(scr->window);
}
return 0;
@@ -499,7 +501,9 @@ bool camu_screen_poll(struct camu_screen *scr, bool block)
bool camu_screen_tick(struct camu_screen *scr)
{
- bool paused = al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED) == CAMU_SCREEN_PAUSED;
+ s32 state = al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED);
+ al_assert(state != CAMU_SCREEN_STOPPED);
+ bool paused = state == CAMU_SCREEN_PAUSED;
return camu_screen_poll(scr, paused) || !paused;
}
@@ -515,13 +519,14 @@ void camu_screen_wake(struct camu_screen *scr)
void camu_screen_clear(struct camu_screen *scr)
{
#ifdef CAMU_SCREEN_THREADED
- run_queue_internal(scr);
+ aki_mutex_lock(&scr->mutex);
struct camu_screen_video *video;
al_array_foreach_ptr(scr->videos, i, video) {
- al_atomic_store(u8)(&video->buf->ref, 0, AL_ATOMIC_RELAXED);
+ struct camu_video_buffer *buf = video->buf;
+ al_atomic_store(u8)(&buf->ref, 0, AL_ATOMIC_RELAXED);
}
+ aki_mutex_unlock(&scr->mutex);
#endif
- scr->videos.size = 0;
}
void camu_screen_close(struct camu_screen *scr)
@@ -532,7 +537,7 @@ 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);
+ al_atomic_store(s32)(&scr->state, CAMU_SCREEN_STOPPED, AL_ATOMIC_RELAXED);
#ifdef STELA_EVENT_BUFFER
aki_thread_join(&scr->thread);
#endif
diff --git a/src/screen/screen.h b/src/screen/screen.h
index 9467d35..36d9075 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -12,6 +12,8 @@
#include "view.h"
+#define CAMU_SCREEN_DEBUG_KEY
+
#define CAMU_SCREEN_WIDTH 700
#define CAMU_SCREEN_HEIGHT 700
@@ -24,7 +26,7 @@ enum {
enum {
CAMU_SCREEN_PAUSED = 0,
CAMU_SCREEN_PLAYING,
- CAMU_SCREEN_CLOSED
+ CAMU_SCREEN_STOPPED
};
enum {
@@ -35,7 +37,9 @@ enum {
CAMU_SCREEN_SEEK,
CAMU_SCREEN_RESEEK,
CAMU_SCREEN_VOLUME,
+#ifdef CAMU_SCREEN_DEBUG_KEY
CAMU_SCREEN_DEBUG,
+#endif
CAMU_SCREEN_CLOSE
};