From 49e01c8cde0c212abd3c67091102cfd7797c1e07 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Tue, 10 Dec 2024 15:04:31 -0500 Subject: Improve screen and mixer deinitialization Signed-off-by: Andrew Opalach --- flake.lock | 36 ++++++++++++++++++------------------ flake.nix | 1 + src/liana/client.c | 1 + src/liana/handlers/codec_client.c | 4 ++-- src/libsink/sink.c | 2 +- src/mixer/mixer.c | 2 -- src/screen/screen.c | 17 +++++++++++------ src/screen/screen.h | 6 +++++- src/sink/desktop.c | 10 +++++----- src/sink/input_simulator.c | 3 +++ src/sink/input_simulator.h | 3 +++ src/sink/meson.build | 5 +---- subprojects/BLAKE3.wrap | 2 +- subprojects/libakiyo.wrap | 2 +- subprojects/libalabaster.wrap | 2 +- 15 files changed, 54 insertions(+), 42 deletions(-) diff --git a/flake.lock b/flake.lock index cec783a..5111b7d 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", "owner": "edolstra", "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", "type": "github" }, "original": { @@ -21,11 +21,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1726560853, - "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -41,11 +41,11 @@ ] }, "locked": { - "lastModified": 1733754861, - "narHash": "sha256-3JKzIou54yjiMVmvgdJwopekEvZxX3JDT8DpKZs4oXY=", + "lastModified": 1733769654, + "narHash": "sha256-aVvYDt8eitZVF6fdOrSoIzYRkQ5Gh6kfRvqkiaDRLL0=", "owner": "nix-community", "repo": "home-manager", - "rev": "9ebaa80a227eaca9c87c53ed515ade013bc2bca9", + "rev": "e952e94955dcc6fa2120c1430789fc41363f5237", "type": "github" }, "original": { @@ -78,11 +78,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1733754474, - "narHash": "sha256-+Fd2VIEFgLJAYIzRkCCSvbYXovoZj9k7K04cmUUzlHI=", + "lastModified": 1733854371, + "narHash": "sha256-K9qGHniYBbjqVcEiwXyiofj/IFf78L5F0/FCf+CKyr0=", "owner": "nix-community", "repo": "NixOS-WSL", - "rev": "7c85eb172eef3a8814e6c1127f0e64b6e8ffc3b7", + "rev": "dee4425dcee3149475ead0cb6a616b8a028c5888", "type": "github" }, "original": { @@ -94,11 +94,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1729973466, - "narHash": "sha256-knnVBGfTCZlQgxY1SgH0vn2OyehH9ykfF8geZgS95bk=", + "lastModified": 1733384649, + "narHash": "sha256-K5DJ2LpPqht7K76bsxetI+YHhGGRyVteTPRQaIIKJpw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cd3e8833d70618c4eea8df06f95b364b016d4950", + "rev": "190c31a89e5eec80dd6604d7f9e5af3802a58a13", "type": "github" }, "original": { @@ -110,11 +110,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1733581040, - "narHash": "sha256-Qn3nPMSopRQJgmvHzVqPcE3I03zJyl8cSbgnnltfFDY=", + "lastModified": 1733759999, + "narHash": "sha256-463SNPWmz46iLzJKRzO3Q2b0Aurff3U1n0nYItxq7jU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "22c3f2cf41a0e70184334a958e6b124fb0ce3e01", + "rev": "a73246e2eef4c6ed172979932bc80e1404ba2d56", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index d57fb3c..499bb02 100644 --- a/flake.nix +++ b/flake.nix @@ -137,6 +137,7 @@ nativeBuildInputs = packages.${system}.default.nativeBuildInputs ++ [ gdb clang-tools + clang-analyzer ruff ruff-lsp perf-tools 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 #include @@ -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, diff --git a/subprojects/BLAKE3.wrap b/subprojects/BLAKE3.wrap index 92a75d0..ebccf0d 100644 --- a/subprojects/BLAKE3.wrap +++ b/subprojects/BLAKE3.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/BLAKE3-team/BLAKE3.git -revision = 1.5.4 +revision = 5c8b350b3531102359b89e9f0a3367e6de4a43f4 depth = 1 patch_directory = BLAKE3 method = cmake diff --git a/subprojects/libakiyo.wrap b/subprojects/libakiyo.wrap index 8df0163..38cd4f7 100644 --- a/subprojects/libakiyo.wrap +++ b/subprojects/libakiyo.wrap @@ -1,4 +1,4 @@ [wrap-git] url = https://git.akon.city/libakiyo -revision = 54b720762349fb71b73914d52bc7ddf49c0b60af +revision = dcc43df0a40cbb2126505396cac4db26008d49b1 depth = 1 diff --git a/subprojects/libalabaster.wrap b/subprojects/libalabaster.wrap index 3c1d0b1..c5e3d54 100644 --- a/subprojects/libalabaster.wrap +++ b/subprojects/libalabaster.wrap @@ -1,4 +1,4 @@ [wrap-git] url = https://git.akon.city/libalabaster -revision = 27cbe448f08a783196e49aa58d9af57240a20d43 +revision = ec924efb4168f906efe8978a6c083d63e550ae3f depth = 1 -- cgit v1.2.3-101-g0448