diff options
| author | 2024-12-10 15:04:31 -0500 | |
|---|---|---|
| committer | 2024-12-10 15:04:31 -0500 | |
| commit | 49e01c8cde0c212abd3c67091102cfd7797c1e07 (patch) | |
| tree | 7195aa32cfc034566aac5a7c8789c1b394af6ec6 /src | |
| parent | 907766e7d59af88d125aef603fa9c61f67abd328 (diff) | |
| download | camu-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')
| -rw-r--r-- | src/liana/client.c | 1 | ||||
| -rw-r--r-- | src/liana/handlers/codec_client.c | 4 | ||||
| -rw-r--r-- | src/libsink/sink.c | 2 | ||||
| -rw-r--r-- | src/mixer/mixer.c | 2 | ||||
| -rw-r--r-- | src/screen/screen.c | 17 | ||||
| -rw-r--r-- | src/screen/screen.h | 6 | ||||
| -rw-r--r-- | src/sink/desktop.c | 10 | ||||
| -rw-r--r-- | src/sink/input_simulator.c | 3 | ||||
| -rw-r--r-- | src/sink/input_simulator.h | 3 | ||||
| -rw-r--r-- | src/sink/meson.build | 5 |
10 files changed, 32 insertions, 21 deletions
diff --git a/src/liana/client.c b/src/liana/client.c index 59de366..1454ba0 100644 --- a/src/liana/client.c +++ b/src/liana/client.c @@ -95,6 +95,7 @@ static void parse_info_packet(struct lia_client *client, struct aki_packet *pack } #endif } + al_assert(track); track->index = index; track->stream.mode = mode; track->stream.type = type; diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c index f15b3f8..dc53129 100644 --- a/src/liana/handlers/codec_client.c +++ b/src/liana/handlers/codec_client.c @@ -59,10 +59,10 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc // NULL packet = flush. if (!packet) { if (codec->dec) { - s32 ret = codec->dec->push(codec->dec, NULL); // Flush always returns success. - ret = codec->dec->process(codec->dec); + codec->dec->push(codec->dec, NULL); // process() could still error. + s32 ret = codec->dec->process(codec->dec); codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_EOF, codec->handler.stream, NULL); return ret == CAMU_ERR_EOF; } else { diff --git a/src/libsink/sink.c b/src/libsink/sink.c index fe56221..d6d54fd 100644 --- a/src/libsink/sink.c +++ b/src/libsink/sink.c @@ -50,7 +50,7 @@ enum { }; // Number of entries to keep buffered at one time. -#define ENTRY_MAX_AGE 5 +#define ENTRY_MAX_AGE 6 // If a buffer is still INIT or QUEUED after an entry is configured, it's "empty". #define BUFFER_EMPTY(buf) ((buf)->state == BUFFER_INIT || (buf)->state == BUFFER_QUEUED) diff --git a/src/mixer/mixer.c b/src/mixer/mixer.c index 46df146..49a04c2 100644 --- a/src/mixer/mixer.c +++ b/src/mixer/mixer.c @@ -281,13 +281,11 @@ void camu_mixer_resume(struct camu_mixer *mixer) void camu_mixer_clear(struct camu_mixer *mixer) { #ifdef CAMU_MIXER_THREADED - run_queue_internal(mixer); struct camu_audio_buffer *buf; al_array_foreach(mixer->buffers, i, buf) { al_atomic_store(u8)(&buf->ref, 0, AL_ATOMIC_RELAXED); } #endif - mixer->buffers.size = 0; } void camu_mixer_close(struct camu_mixer *mixer) 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 }; diff --git a/src/sink/desktop.c b/src/sink/desktop.c index 85080ba..ccd2e11 100644 --- a/src/sink/desktop.c +++ b/src/sink/desktop.c @@ -10,7 +10,7 @@ #include "desktop.h" #include "common.h" -#ifdef _DEBUG_ +#ifdef CAMU_SCREEN_DEBUG_KEY #include "input_simulator.h" #endif @@ -50,16 +50,16 @@ static void screen_callback(void *userdata, u8 op, void *opaque) case CAMU_SCREEN_RESEEK: camu_sink_reseek(&c->sink); break; +#ifdef CAMU_SCREEN_DEBUG_KEY case CAMU_SCREEN_DEBUG: -#ifdef _DEBUG_ if (camu_input_simulator_running()) { camu_input_simulator_stop(); } else { camu_input_simulator_run(&c->sink); } //camu_sink_unset(&c->sink); -#endif break; +#endif case CAMU_SCREEN_VOLUME: { f64 amount = *(f64 *)opaque; camu_sink_offset_volume(&c->sink, (f32)amount); @@ -121,14 +121,14 @@ bool camu_desktop_tick(struct camu_desktop *c) void camu_desktop_stop(struct camu_desktop *c) { -#ifdef _DEBUG_ +#ifdef CAMU_SCREEN_DEBUG_KEY if (camu_input_simulator_running()) { camu_input_simulator_stop(); } #endif camu_mixer_pause(&c->mixer); camu_mixer_clear(&c->mixer); - camu_screen_set_state(&c->scr, CAMU_SCREEN_CLOSED); + // We have already stopped ticking the screen at this point. camu_screen_clear(&c->scr); camu_sink_stop(&c->sink); } diff --git a/src/sink/input_simulator.c b/src/sink/input_simulator.c index b9c92ca..92e3936 100644 --- a/src/sink/input_simulator.c +++ b/src/sink/input_simulator.c @@ -1,3 +1,5 @@ +#include "../screen/screen.h" +#ifdef CAMU_SCREEN_DEBUG_KEY #include <aki/thread.h> #include <al/random.h> @@ -58,3 +60,4 @@ void camu_input_simulator_stop(void) quit = 1; aki_thread_join(&thread); } +#endif diff --git a/src/sink/input_simulator.h b/src/sink/input_simulator.h index 40253d0..e05b03e 100644 --- a/src/sink/input_simulator.h +++ b/src/sink/input_simulator.h @@ -1,7 +1,10 @@ #pragma once +#include "../screen/screen.h" +#ifdef CAMU_SCREEN_DEBUG_KEY #include "../libsink/sink.h" void camu_input_simulator_run(struct camu_sink *sink); bool camu_input_simulator_running(void); void camu_input_simulator_stop(void); +#endif diff --git a/src/sink/meson.build b/src/sink/meson.build index 067b045..30a5f39 100644 --- a/src/sink/meson.build +++ b/src/sink/meson.build @@ -1,7 +1,4 @@ -desktop_src = ['desktop.c'] -if is_debug - desktop_src += ['input_simulator.c'] -endif +desktop_src = ['desktop.c', 'input_simulator.c'] desktop_deps = [libsink] desktop_args = ['-DCAMU_MIXER_THREADED', '-DCAMU_SCREEN_THREADED'] desktop = declare_dependency(sources: desktop_src, dependencies: desktop_deps, |