diff options
Diffstat (limited to 'src/sink')
| -rw-r--r-- | src/sink/desktop.c | 19 | ||||
| -rw-r--r-- | src/sink/input_simulator.c | 60 | ||||
| -rw-r--r-- | src/sink/input_simulator.h | 7 | ||||
| -rw-r--r-- | src/sink/meson.build | 3 |
4 files changed, 87 insertions, 2 deletions
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 <aki/thread.h> +#include <al/random.h> + +#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, |