From 907766e7d59af88d125aef603fa9c61f67abd328 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 9 Dec 2024 15:30:13 -0500 Subject: Don't queue remove_sink, cleanup input simulator Signed-off-by: Andrew Opalach --- src/fruits/cmv/cmv.c | 6 ---- src/fruits/cmv/input_simulator.c | 53 ----------------------------------- src/fruits/cmv/input_simulator.h | 6 ---- src/fruits/cmv/meson.build | 2 +- src/liana/list.c | 8 ++---- src/screen/screen.c | 4 +-- src/screen/screen.h | 2 +- src/server/server.c | 3 +- src/sink/desktop.c | 19 +++++++++++-- src/sink/input_simulator.c | 60 ++++++++++++++++++++++++++++++++++++++++ src/sink/input_simulator.h | 7 +++++ src/sink/meson.build | 3 ++ 12 files changed, 96 insertions(+), 77 deletions(-) delete mode 100644 src/fruits/cmv/input_simulator.c delete mode 100644 src/fruits/cmv/input_simulator.h create mode 100644 src/sink/input_simulator.c create mode 100644 src/sink/input_simulator.h (limited to 'src') diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c index 9e3be3f..0fe33ad 100644 --- a/src/fruits/cmv/cmv.c +++ b/src/fruits/cmv/cmv.c @@ -11,8 +11,6 @@ #include "../../server/common.c" #endif -#include "input_simulator.h" - struct cmv { struct aki_event_loop loop; struct camu_desktop desktop; @@ -123,12 +121,8 @@ s32 wmain(s32 argc, wchar_t **argv) struct aki_thread thread0; aki_thread_create(&thread0, event_loop_thread, &c); - //cmv_input_simulator_run(&c.desktop.sink); - while (camu_desktop_tick(&c.desktop)) {} - //cmv_input_simulator_stop(); - camu_desktop_stop(&c.desktop); aki_thread_join(&thread0); camu_desktop_free(&c.desktop); diff --git a/src/fruits/cmv/input_simulator.c b/src/fruits/cmv/input_simulator.c deleted file mode 100644 index 7bc3125..0000000 --- a/src/fruits/cmv/input_simulator.c +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include - -#include "input_simulator.h" - -static struct aki_thread thread; -static s32 quit = 0; - -enum { - SKIP = 0, - BACKSKIP, - SHUFFLE, - BASE, // count - TOGGLE_PAUSE, - SEEK, -}; - -static aki_thread_result AKI_THREADCALL input_simulation_thread(void *userdata) -{ - struct camu_sink *sink = (struct camu_sink *)userdata; - while (!quit) { - aki_thread_sleep(AKI_TS_FROM_USEC(30000)); - switch (al_rand() % BASE) { - case SKIP: - camu_sink_skip(sink, (al_rand() % 5)); - break; - case BACKSKIP: - camu_sink_skip(sink, -(al_rand() % 5)); - break; - case SHUFFLE: - camu_sink_shuffle(sink); - break; - case TOGGLE_PAUSE: - camu_sink_toggle_pause(sink); - break; - case SEEK: - camu_sink_seek(sink, 0.0); - break; - } - } - return 0; -} - -void cmv_input_simulator_run(struct camu_sink *sink) -{ - aki_thread_create(&thread, input_simulation_thread, sink); -} - -void cmv_input_simulator_stop(void) -{ - quit = 1; - aki_thread_join(&thread); -} diff --git a/src/fruits/cmv/input_simulator.h b/src/fruits/cmv/input_simulator.h deleted file mode 100644 index 5380bb2..0000000 --- a/src/fruits/cmv/input_simulator.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "../../libsink/sink.h" - -void cmv_input_simulator_run(struct camu_sink *sink); -void cmv_input_simulator_stop(void); diff --git a/src/fruits/cmv/meson.build b/src/fruits/cmv/meson.build index b2ab0a2..9b83847 100644 --- a/src/fruits/cmv/meson.build +++ b/src/fruits/cmv/meson.build @@ -1,4 +1,4 @@ -cmv_src = ['cmv.c', 'input_simulator.c'] +cmv_src = ['cmv.c'] cmv_deps = [common_deps, desktop] cmv_args = [] if get_option('sink-only') diff --git a/src/liana/list.c b/src/liana/list.c index a192848..059cd07 100644 --- a/src/liana/list.c +++ b/src/liana/list.c @@ -567,11 +567,9 @@ void lia_list_add_sink(struct lia_list *list, void (*callback)(void *, u8, struc void lia_list_remove_sink(struct lia_list *list, void *userdata) { - struct lia_list_cmd *cmd = al_alloc_object(struct lia_list_cmd); - cmd->op = REMOVE_SINK; - cmd->userdata = userdata; - al_array_push(list->queue, cmd); - pump_queue(list); + // Don't queue remove sink because we can't let any currently queued commands + // touch this sink. + handle_remove_sink(list, userdata); } void lia_list_add(struct lia_list *list, void *opaque, u64 duration, wstr *name) diff --git a/src/screen/screen.c b/src/screen/screen.c index b10d486..30d6860 100644 --- a/src/screen/screen.c +++ b/src/screen/screen.c @@ -184,8 +184,8 @@ static bool key_callback(void *userdata, u8 state, u8 button) case 0x12: // e scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL); break; - case 0x16: // u - scr->callback(scr->userdata, CAMU_SCREEN_UNSET, NULL); + case 0x19: // p + scr->callback(scr->userdata, CAMU_SCREEN_DEBUG, NULL); break; case 0x13: { // r struct camu_view *view = get_view_from_mouse_pos(scr); diff --git a/src/screen/screen.h b/src/screen/screen.h index 23a85d0..9467d35 100644 --- a/src/screen/screen.h +++ b/src/screen/screen.h @@ -34,8 +34,8 @@ enum { CAMU_SCREEN_TOGGLE_PAUSE, CAMU_SCREEN_SEEK, CAMU_SCREEN_RESEEK, - CAMU_SCREEN_UNSET, CAMU_SCREEN_VOLUME, + CAMU_SCREEN_DEBUG, CAMU_SCREEN_CLOSE }; diff --git a/src/server/server.c b/src/server/server.c index a72a1b1..f53eb52 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -301,7 +301,7 @@ static void handle_add_command(struct camu_server *server, struct lia_list *list { u8 op = aki_packet_read_u8(packet); struct cch_entry *entry = NULL; - struct camu_resource *resource; + struct camu_resource *resource = NULL; wstr name; switch (op) { case CAMU_RESOURCE_FILE: { @@ -353,6 +353,7 @@ static void handle_add_command(struct camu_server *server, struct lia_list *list break; } } + al_assert(resource); resource->load = CAMU_RESOURCE_NOT_LOADED; resource->entry = entry; resource->node = lia_server_create_node(&server->data.server, resource->entry); diff --git a/src/sink/desktop.c b/src/sink/desktop.c index 11da0f9..85080ba 100644 --- a/src/sink/desktop.c +++ b/src/sink/desktop.c @@ -10,6 +10,9 @@ #include "desktop.h" #include "common.h" +#ifdef _DEBUG_ +#include "input_simulator.h" +#endif static u8 sink_callback(void *userdata, u8 op, u8 type, void *opaque) { @@ -47,8 +50,15 @@ static void screen_callback(void *userdata, u8 op, void *opaque) case CAMU_SCREEN_RESEEK: camu_sink_reseek(&c->sink); break; - case CAMU_SCREEN_UNSET: - camu_sink_unset(&c->sink); + 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; case CAMU_SCREEN_VOLUME: { f64 amount = *(f64 *)opaque; @@ -111,6 +121,11 @@ bool camu_desktop_tick(struct camu_desktop *c) void camu_desktop_stop(struct camu_desktop *c) { +#ifdef _DEBUG_ + 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); diff --git a/src/sink/input_simulator.c b/src/sink/input_simulator.c new file mode 100644 index 0000000..b9c92ca --- /dev/null +++ b/src/sink/input_simulator.c @@ -0,0 +1,60 @@ +#include +#include + +#include "input_simulator.h" + +// This is ignoring all thread-safety. +static s32 quit = 1; +static struct aki_thread thread; + +enum { + SKIP = 0, + BACKSKIP, + SHUFFLE, + MARK, // count + TOGGLE_PAUSE, + SEEK, +}; + +static aki_thread_result AKI_THREADCALL input_simulation_thread(void *userdata) +{ + struct camu_sink *sink = (struct camu_sink *)userdata; + while (!quit) { + aki_thread_sleep(AKI_TS_FROM_USEC(30000)); + switch (al_rand() % MARK) { + case SKIP: + camu_sink_skip(sink, (al_rand() % 5)); + break; + case BACKSKIP: + camu_sink_skip(sink, -(al_rand() % 5)); + break; + case SHUFFLE: + camu_sink_shuffle(sink); + break; + case TOGGLE_PAUSE: + camu_sink_toggle_pause(sink); + break; + case SEEK: + camu_sink_seek(sink, 0.0); + break; + } + } + return 0; +} + +void camu_input_simulator_run(struct camu_sink *sink) +{ + quit = 0; + aki_thread_create(&thread, input_simulation_thread, sink); +} + +bool camu_input_simulator_running(void) +{ + return quit == 0; +} + +void camu_input_simulator_stop(void) +{ + quit = 1; + aki_thread_join(&thread); +} diff --git a/src/sink/input_simulator.h b/src/sink/input_simulator.h new file mode 100644 index 0000000..40253d0 --- /dev/null +++ b/src/sink/input_simulator.h @@ -0,0 +1,7 @@ +#pragma once + +#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); diff --git a/src/sink/meson.build b/src/sink/meson.build index 73a9276..067b045 100644 --- a/src/sink/meson.build +++ b/src/sink/meson.build @@ -1,4 +1,7 @@ desktop_src = ['desktop.c'] +if is_debug + desktop_src += ['input_simulator.c'] +endif desktop_deps = [libsink] desktop_args = ['-DCAMU_MIXER_THREADED', '-DCAMU_SCREEN_THREADED'] desktop = declare_dependency(sources: desktop_src, dependencies: desktop_deps, -- cgit v1.2.3-101-g0448