summaryrefslogtreecommitdiff
path: root/src/sink
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-04-28 14:11:28 -0400
committerAndrew Opalach <andrew@akon.city> 2025-04-28 14:11:28 -0400
commitc8c0af300dde117a839f2d5d6b777694d7f118e9 (patch)
tree3297f1ba256da0b837fbaa9c581d7f420ce98a4a /src/sink
parent61492af23ecc5dd9ab4956a84a7c0451deb8b84b (diff)
downloadcamu-c8c0af300dde117a839f2d5d6b777694d7f118e9.tar.gz
camu-c8c0af300dde117a839f2d5d6b777694d7f118e9.tar.bz2
camu-c8c0af300dde117a839f2d5d6b777694d7f118e9.zip
Minor restructure and dependency updates
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/sink')
-rw-r--r--src/sink/desktop.c266
-rw-r--r--src/sink/desktop.h26
-rw-r--r--src/sink/input_simulator.c68
-rw-r--r--src/sink/input_simulator.h10
-rw-r--r--src/sink/meson.build4
-rw-r--r--src/sink/util.h21
6 files changed, 0 insertions, 395 deletions
diff --git a/src/sink/desktop.c b/src/sink/desktop.c
deleted file mode 100644
index fcb7cf1..0000000
--- a/src/sink/desktop.c
+++ /dev/null
@@ -1,266 +0,0 @@
-#define AL_LOG_SECTION "desktop"
-#include <al/log.h>
-
-//#define DESKTOP_NULL_AUDIO
-
-#ifdef DESKTOP_NULL_AUDIO
-#include "../mixer/audio_null.h"
-#else
-#include "../mixer/audio_miniaudio.h"
-#endif
-#if defined CAMU_RENDERER_TIGER
-#include "../render/renderer_tiger.h"
-#elif defined CAMU_RENDERER_LIBPLACEBO
-#include "../render/renderer_libplacebo.h"
-#endif
-
-#include "desktop.h"
-#include "util.h"
-#ifdef CAMU_SCREEN_DEBUG_KEY
-#include "input_simulator.h"
-#endif
-
-static u8 sink_callback(void *userdata, u8 op, u8 type, void *opaque)
-{
- struct camu_desktop *c = (struct camu_desktop *)userdata;
- struct camu_mixer *mixer = &c->mixer;
- struct camu_screen *scr = &c->scr;
- switch (op) {
- case CAMU_SINK_ADD_BUFFER:
- switch (type) {
- case CAMU_SINK_AUDIO: {
- struct camu_audio_buffer *buf = (struct camu_audio_buffer *)opaque;
- camu_mixer_add_buffer(mixer, buf);
- log_info("Audio buffer added.");
- break;
- }
- case CAMU_SINK_VIDEO: {
- struct camu_video_buffer *buf = (struct camu_video_buffer *)opaque;
- camu_screen_add_buffer(scr, buf);
- log_info("Video buffer added.");
- break;
- }
- }
- break;
- case CAMU_SINK_REMOVE_BUFFER:
- switch (type) {
- case CAMU_SINK_AUDIO: {
- struct camu_audio_buffer *buf = (struct camu_audio_buffer *)opaque;
- camu_mixer_remove_buffer(mixer, buf);
- log_info("Audio buffer removed.");
- break;
- }
- case CAMU_SINK_VIDEO: {
- struct camu_video_buffer *buf = (struct camu_video_buffer *)opaque;
- camu_screen_remove_buffer(scr, buf);
- log_info("Video buffer removed.");
- break;
- }
- }
- break;
- case CAMU_SINK_START:
- switch (type) {
- case CAMU_SINK_AUDIO:
- camu_mixer_resume(mixer);
- log_info("Audio started.");
- break;
- case CAMU_SINK_VIDEO:
- camu_screen_set_state(scr, CAMU_SCREEN_PLAYING);
- camu_screen_wake(scr);
- log_info("Video started.");
- break;
- }
- break;
- case CAMU_SINK_STOP:
- switch (type) {
- case CAMU_SINK_AUDIO:
- camu_mixer_pause(mixer);
- log_info("Audio stopped.");
- break;
- case CAMU_SINK_VIDEO:
- camu_screen_set_state(scr, CAMU_SCREEN_PAUSED);
- log_info("Video stopped.");
- break;
- }
- break;
- case CAMU_SINK_REFRESH_VIDEO:
- camu_screen_force_refresh(scr);
- break;
- case CAMU_SINK_CLEAR:
- switch (type) {
- case CAMU_SINK_AUDIO:
- camu_mixer_clear(mixer);
- break;
- case CAMU_SINK_VIDEO:
- camu_screen_clear(scr);
- break;
- }
- break;
- case CAMU_SINK_MOCK_CLOSE:
- c->should_quit = 1;
- camu_screen_wake(&c->scr);
- break;
- case CAMU_SINK_EXIT:
- camu_sink_close(&c->sink);
- if (c->exit_callback) {
- c->exit_callback(c->userdata, c);
- }
- break;
- }
- return CAMU_SINK_OK;
-}
-
-static char status[64];
-
-static void print_status(struct camu_sink *sink)
-{
- struct camu_sink_entry *current = camu_sink_get_current(sink);
- if (!current) {
- camu_sink_return_current(sink);
- goto notplaying;
- }
-
- u64 pts = camu_clock_get_last_pts(&current->clock) * 1000000u;
- u64 duration = current->client.duration;
- pts = MIN(duration, pts);
- bool paused = current->paused;
-
- camu_sink_return_current(sink);
-
- u64 remaining = duration - pts;
- if (remaining == 0) {
- goto notplaying;
- }
-
- bool show_hour = duration > 60u * 60u * 1000000u;
- s32 offset = al_snprintf(status, sizeof(status), paused ? "⏸ " : "⏵ ");
- offset += al_snprintf(status + offset, sizeof(status) - offset, "[");
- offset += camu_print_time(status + offset, sizeof(status) - offset, pts, show_hour, 2);
- offset += al_snprintf(status + offset, sizeof(status) - offset, "/");
- offset += camu_print_time(status + offset, sizeof(status) - offset, duration, show_hour, 2);
- offset += al_snprintf(status + offset, sizeof(status) - offset, "]");
- status[offset] = '\0';
-
- log_info("%s", status);
- return;
-notplaying:
- log_info("Not playing.");
-}
-
-static void screen_callback(void *userdata, u8 op, void *opaque)
-{
- struct camu_desktop *c = (struct camu_desktop *)userdata;
- switch (op) {
- case CAMU_SCREEN_SET_VOLUME:
- camu_mixer_set_volume(&c->mixer, *(f32 *)opaque);
- break;
- case CAMU_SCREEN_OFFSET_VOLUME:
- camu_mixer_offset_volume(&c->mixer, *(f32 *)opaque);
- break;
- case CAMU_SCREEN_SKIP:
- camu_sink_skip(&c->sink, *(s32 *)opaque);
- break;
- case CAMU_SCREEN_TOGGLE_PAUSE:
- camu_sink_toggle_pause(&c->sink);
- break;
- case CAMU_SCREEN_PERCENT_SEEK:
- camu_sink_seek(&c->sink, opaque, CAMU_SEEK_PERCENT);
- break;
- case CAMU_SCREEN_RELATIVE_SEEK:
- camu_sink_seek(&c->sink, opaque, CAMU_SEEK_RELATIVE);
- break;
- case CAMU_SCREEN_RESEEK:
- camu_sink_reseek(&c->sink);
- break;
- case CAMU_SCREEN_SHUFFLE:
- camu_sink_shuffle(&c->sink);
- break;
- case CAMU_SCREEN_STATUS:
- print_status(&c->sink);
- break;
-#ifdef CAMU_SCREEN_DEBUG_KEY
- case CAMU_SCREEN_DEBUG:
- if (camu_input_simulator_running()) {
- camu_input_simulator_stop();
- } else {
- camu_input_simulator_run(&c->sink);
- }
- break;
-#endif
- case CAMU_SCREEN_CLOSE:
- c->should_quit = 1;
- break;
- }
-}
-
-bool camu_desktop_init(struct camu_desktop *c, const char *name)
-{
- c->scr.callback = screen_callback;
- c->scr.userdata = c;
- if (!camu_screen_init(&c->scr) || !camu_screen_create_window(&c->scr, name)) {
- return false;
- }
-#if defined CAMU_RENDERER_TIGER
- c->renderer = camu_renderer_tiger_create();
-#elif defined CAMU_RENDERER_LIBPLACEBO
- c->renderer = camu_renderer_lp_create();
-#endif
- if (!camu_screen_create_renderer(&c->scr, c->renderer)) {
- return false;
- }
- c->renderer->render(c->renderer, &c->scr, true);
-#ifdef DESKTOP_NULL_AUDIO
- if (!camu_mixer_init(&c->mixer, (struct camu_audio *)&audio_plugin_null)) {
-#else
- if (!camu_mixer_init(&c->mixer, camu_audio_miniaudio_create())) {
-#endif
- return false;
- }
- if (!c->mixer.audio->configure_stream(c->mixer.audio, NULL)) {
- return false;
- }
- camu_mixer_pick_format(&c->mixer, &c->mixer.fmt);
- c->should_quit = 0;
- c->exit_callback = NULL;
- c->userdata = NULL;
- return true;
-}
-
-bool camu_desktop_connect(struct camu_desktop *c, struct nn_event_loop *loop, u8 type, str *addr, u16 port)
-{
- c->loop = loop;
- camu_sink_init(&c->sink, c->loop, &c->mixer, c->renderer);
- al_str_from(&c->sink.default_list, "default");
- c->sink.callback = sink_callback;
- c->sink.userdata = c;
- return camu_sink_connect(&c->sink, &al_str_c("desktop"), type, addr, port);
-}
-
-bool camu_desktop_tick(struct camu_desktop *c)
-{
- bool force;
- if (!c->should_quit && camu_screen_tick(&c->scr, &force)) {
- c->renderer->render(c->renderer, &c->scr, force);
- }
- return !c->should_quit;
-}
-
-void camu_desktop_stop(struct camu_desktop *c)
-{
-#ifdef CAMU_SCREEN_DEBUG_KEY
- if (camu_input_simulator_running()) {
- camu_input_simulator_stop();
- }
-#endif
- // We have already stopped ticking the screen at this point.
- camu_screen_clear(&c->scr);
- camu_sink_stop(&c->sink);
-}
-
-void camu_desktop_free(struct camu_desktop *c)
-{
- camu_sink_free(&c->sink);
- camu_mixer_close(&c->mixer);
- c->renderer->free(&c->renderer);
- camu_screen_close(&c->scr);
-}
diff --git a/src/sink/desktop.h b/src/sink/desktop.h
deleted file mode 100644
index 65fcfe0..0000000
--- a/src/sink/desktop.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#pragma once
-
-#include <al/types.h>
-#include <al/str.h>
-#include <nnwt/event_loop.h>
-
-#include "../libsink/sink.h"
-
-#include "../screen/screen.h"
-
-struct camu_desktop {
- struct nn_event_loop *loop;
- s32 should_quit;
- struct camu_screen scr;
- struct camu_renderer *renderer;
- struct camu_mixer mixer;
- struct camu_sink sink;
- void (*exit_callback)(void *, struct camu_desktop *);
- void *userdata;
-};
-
-bool camu_desktop_init(struct camu_desktop *c, const char *name);
-bool camu_desktop_connect(struct camu_desktop *c, struct nn_event_loop *loop, u8 type, str *addr, u16 port);
-bool camu_desktop_tick(struct camu_desktop *c);
-void camu_desktop_stop(struct camu_desktop *c);
-void camu_desktop_free(struct camu_desktop *c);
diff --git a/src/sink/input_simulator.c b/src/sink/input_simulator.c
deleted file mode 100644
index 80fde02..0000000
--- a/src/sink/input_simulator.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include "../screen/screen.h"
-#ifdef CAMU_SCREEN_DEBUG_KEY
-#include <nnwt/thread.h>
-#include <al/random.h>
-
-#include "input_simulator.h"
-
-// This is ignoring all thread-safety.
-static s32 quit = 1;
-static struct nn_thread thread;
-
-enum {
- SEEK,
- SKIP,
- BACKSKIP,
- TOGGLE_PAUSE,
- SHUFFLE,
- MARK, // count
-};
-
-static nn_thread_result NNWT_THREADCALL input_simulation_thread(void *userdata)
-{
- struct camu_sink *sink = (struct camu_sink *)userdata;
- while (!quit) {
- nn_thread_sleep(NNWT_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: {
- f64 pos = al_rand() / (f64)AL_RAND_MAX;
- if (pos < 0.005) pos = 0.0;
- if (pos > 0.995) pos = 1.0;
- else if (pos > 0.99) pos = .9999;
- camu_sink_seek(sink, &pos, CAMU_SEEK_PERCENT);
- break;
- }
- }
- }
- return 0;
-}
-
-void camu_input_simulator_run(struct camu_sink *sink)
-{
- quit = 0;
- nn_thread_create(&thread, input_simulation_thread, sink);
-}
-
-bool camu_input_simulator_running(void)
-{
- return quit == 0;
-}
-
-void camu_input_simulator_stop(void)
-{
- quit = 1;
- nn_thread_join(&thread);
-}
-#endif
diff --git a/src/sink/input_simulator.h b/src/sink/input_simulator.h
deleted file mode 100644
index e05b03e..0000000
--- a/src/sink/input_simulator.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#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
deleted file mode 100644
index 8d13b26..0000000
--- a/src/sink/meson.build
+++ /dev/null
@@ -1,4 +0,0 @@
-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, compile_args: desktop_args)
diff --git a/src/sink/util.h b/src/sink/util.h
deleted file mode 100644
index d9dd4cc..0000000
--- a/src/sink/util.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#pragma once
-
-#include <al/lib.h>
-
-static inline s32 camu_print_time(char *buf, size_t size, u64 nanoseconds, bool always_show_hour, u32 hour_padding)
-{
- u32 hours = nanoseconds / 3600000000u;
- u32 minutes = nanoseconds / 60000000u;
- bool show_hour = always_show_hour || minutes >= 60u;
- u32 seconds = nanoseconds / 1000000u;
- seconds -= minutes * 60u;
- minutes -= hours * 60u;
- s32 offset = 0;
- if (show_hour) {
- static const char *padding_table[] = { "%.2u:", "%.3u:", "%.4u:" };
- hour_padding = CLAMP(hour_padding, 2u, 4u) - 2u;
- offset += al_snprintf(buf, size, padding_table[hour_padding], hours);
- }
- offset += al_snprintf(buf + offset, size - offset, "%.2u:%.2u", minutes, seconds);
- return offset;
-}