summaryrefslogtreecommitdiff
path: root/src/sink
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-10-21 19:22:50 -0400
committerAndrew Opalach <andrew@akon.city> 2024-10-21 19:22:50 -0400
commit60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2 (patch)
tree08ff2ce7975f523112e7ad2fe4f797b4fc7db5de /src/sink
parent2f9a0945bfeee3296cec3d38d094e4c49f9cb65f (diff)
downloadcamu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.tar.gz
camu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.tar.bz2
camu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.zip
Everything before initial synced list
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/sink')
-rw-r--r--src/sink/desktop.c187
-rw-r--r--src/sink/desktop.h26
-rw-r--r--src/sink/meson.build3
3 files changed, 216 insertions, 0 deletions
diff --git a/src/sink/desktop.c b/src/sink/desktop.c
new file mode 100644
index 0000000..8e628fd
--- /dev/null
+++ b/src/sink/desktop.c
@@ -0,0 +1,187 @@
+#include <al/log.h>
+
+#include "../mixer/audio_miniaudio.h"
+//#include "../mixer/audio_null.h"
+#if defined CAMU_RENDERER_TIGER
+#include "../render/renderer_tiger.h"
+#elif defined CAMU_RENDERER_LIBPLACEBO
+#include "../render/renderer_libplacebo.h"
+#endif
+
+#include "desktop.h"
+
+static u8 sink_callback(void *userdata, u8 op, u8 type, void *opaque)
+{
+ struct camu_desktop *c = (struct camu_desktop *)userdata;
+ 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(&c->mixer, buf);
+ al_log_debug("camu_desktop", "Audio buffer added.");
+ break;
+ }
+ case CAMU_SINK_VIDEO: {
+ struct camu_video_buffer *buf = (struct camu_video_buffer *)opaque;
+ camu_screen_add_buffer(&c->scr, buf);
+ al_log_debug("camu_desktop", "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(&c->mixer, buf);
+ al_log_debug("camu_desktop", "Audio buffer removed.");
+ break;
+ }
+ case CAMU_SINK_VIDEO: {
+ struct camu_video_buffer *buf = (struct camu_video_buffer *)opaque;
+ camu_screen_remove_buffer(&c->scr, buf);
+ al_log_debug("camu_desktop", "Video buffer removed.");
+ break;
+ }
+ }
+ break;
+ case CAMU_SINK_SWAP_BUFFER:
+ switch (type) {
+ case CAMU_SINK_AUDIO: {
+ break;
+ }
+ }
+ break;
+ case CAMU_SINK_START:
+ switch (type) {
+ case CAMU_SINK_AUDIO: {
+ camu_mixer_resume(&c->mixer);
+ al_log_info("camu_desktop", "Audio started.");
+ break;
+ }
+ case CAMU_SINK_VIDEO: {
+ camu_screen_set_state(&c->scr, CAMU_SCREEN_PLAYING);
+ camu_screen_wake(&c->scr);
+ al_log_info("camu_desktop", "Video started.");
+ break;
+ }
+ }
+ break;
+ case CAMU_SINK_STOP:
+ switch (type) {
+ case CAMU_SINK_AUDIO: {
+ camu_mixer_pause(&c->mixer);
+ al_log_info("camu_desktop", "Audio stopped.");
+ break;
+ }
+ case CAMU_SINK_VIDEO: {
+ camu_screen_set_state(&c->scr, CAMU_SCREEN_PAUSED);
+ al_log_info("camu_desktop", "Video stopped.");
+ break;
+ }
+ }
+ 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 void screen_callback(void *userdata, u8 op, void *opaque)
+{
+ struct camu_desktop *c = (struct camu_desktop *)userdata;
+ switch (op) {
+ case CAMU_SCREEN_NEXT:
+ camu_sink_skip(&c->sink, 1);
+ break;
+ case CAMU_SCREEN_PREVIOUS:
+ camu_sink_skip(&c->sink, -1);
+ break;
+ case CAMU_SCREEN_SHUFFLE:
+ camu_sink_shuffle(&c->sink);
+ break;
+ case CAMU_SCREEN_TOGGLE_PAUSE:
+ camu_sink_toggle_pause(&c->sink);
+ break;
+ case CAMU_SCREEN_SEEK: {
+ f64 percent = *(f64 *)opaque;
+ camu_sink_seek(&c->sink, percent);
+ break;
+ }
+ case CAMU_SCREEN_RESEEK:
+ camu_sink_reseek(&c->sink);
+ break;
+ 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);
+ if (!camu_mixer_init(&c->mixer, camu_audio_miniaudio_create())) {
+ //if (!camu_mixer_init(&c->mixer, (struct camu_audio *)&audio_plugin_null)) {
+ 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, u8 type, struct aki_event_loop *loop, str *addr, u16 port)
+{
+ c->loop = loop;
+ camu_sink_init(&c->sink, c->loop, &c->mixer, c->renderer);
+ c->sink.callback = sink_callback;
+ c->sink.userdata = c;
+ return camu_sink_connect(&c->sink, type, addr, port, al_str_c("desktop"));
+}
+
+bool camu_desktop_tick(struct camu_desktop *c)
+{
+ if (!c->should_quit && camu_screen_tick(&c->scr)) {
+ c->renderer->render(c->renderer, &c->scr);
+ }
+ return !c->should_quit;
+}
+
+void camu_desktop_stop(struct camu_desktop *c)
+{
+ camu_mixer_pause(&c->mixer);
+ camu_mixer_clear(&c->mixer);
+ camu_screen_set_state(&c->scr, CAMU_SCREEN_CLOSED);
+ 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
new file mode 100644
index 0000000..efc1c34
--- /dev/null
+++ b/src/sink/desktop.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include <al/types.h>
+#include <al/str.h>
+#include <aki/event_loop.h>
+
+#include "../libsink/sink.h"
+
+#include "../screen/screen.h"
+
+struct camu_desktop {
+ struct aki_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, u8 type, struct aki_event_loop *loop, 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/meson.build b/src/sink/meson.build
new file mode 100644
index 0000000..df80934
--- /dev/null
+++ b/src/sink/meson.build
@@ -0,0 +1,3 @@
+desktop_src = ['desktop.c']
+desktop_deps = [common_deps, buffer, render, screen, mixer, libsink]
+desktop = declare_dependency(sources: desktop_src, dependencies: desktop_deps)