diff options
| author | 2024-10-21 19:22:50 -0400 | |
|---|---|---|
| committer | 2024-10-21 19:22:50 -0400 | |
| commit | 60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2 (patch) | |
| tree | 08ff2ce7975f523112e7ad2fe4f797b4fc7db5de /src/sink | |
| parent | 2f9a0945bfeee3296cec3d38d094e4c49f9cb65f (diff) | |
| download | camu-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.c | 187 | ||||
| -rw-r--r-- | src/sink/desktop.h | 26 | ||||
| -rw-r--r-- | src/sink/meson.build | 3 |
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) |