diff options
| author | 2024-11-12 18:52:33 -0500 | |
|---|---|---|
| committer | 2024-11-12 19:28:50 -0500 | |
| commit | 8c996a5b597bd1cd9c188a0e61eae1ff718c8ca2 (patch) | |
| tree | 2195b2b6e43d2c879a01b72c0c7a159447c1c35f /src/fruits/ctv | |
| parent | bacabb8f2b488b3da58dc3ea4159326298a003f6 (diff) | |
| download | camu-8c996a5b597bd1cd9c188a0e61eae1ff718c8ca2.tar.gz camu-8c996a5b597bd1cd9c188a0e61eae1ff718c8ca2.tar.bz2 camu-8c996a5b597bd1cd9c188a0e61eae1ff718c8ca2.zip | |
Bare minimum Android sink
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/fruits/ctv')
| -rw-r--r-- | src/fruits/ctv/ctv.c | 102 | ||||
| -rw-r--r-- | src/fruits/ctv/meson.build | 4 |
2 files changed, 98 insertions, 8 deletions
diff --git a/src/fruits/ctv/ctv.c b/src/fruits/ctv/ctv.c index 9c45637..75936eb 100644 --- a/src/fruits/ctv/ctv.c +++ b/src/fruits/ctv/ctv.c @@ -1,26 +1,116 @@ #include <stl/window.h> #include <stl/platform.h> -#include "../../sink/desktop.h" +#include "../../screen/screen.h" +#include "../../render/renderer_libplacebo.h" +#include "../../mixer/mixer.h" +#include "../../libsink/sink.h" +#include "../../mixer/audio_null.h" +#include "../../mixer/audio_miniaudio.h" +#include "../../sink/common.h" +#include "../../server/common.c" struct ctv { struct aki_event_loop loop; - struct camu_desktop desktop; + struct camu_screen scr; + struct camu_renderer *renderer; + struct camu_mixer mixer; + struct camu_sink sink; + struct aki_thread thread; + bool created; }; -static void onSurfaceDestroyed(GLFMDisplay *display) { +static u8 sink_callback(void *userdata, u8 op, u8 type, void *opaque) +{ + struct ctv *c = (struct ctv *)userdata; + if (!camu_default_sink_callback(&c->scr, &c->mixer, op, type, opaque)) { + camu_sink_close(&c->sink); + } + return CAMU_SINK_OK; } -static void onDraw(GLFMDisplay *display) { +static void screen_callback(void *userdata, u8 op, void *opaque) +{ + struct ctv *c = (struct ctv *)userdata; + (void)c; + (void)op; + (void)opaque; } -void glfmMain(GLFMDisplay *display) { +static aki_thread_result AKI_THREADCALL event_loop_thread(void *userdata) +{ + struct ctv *c = (struct ctv *)userdata; + aki_event_loop_run(&c->loop); + return 0; +} + +static void onSurfaceCreated(GLFMDisplay *display, s32 width, s32 height) +{ + struct ctv *c = (struct ctv *)glfmGetUserData(display); + (void)width; + (void)height; + if (!c->created) { + c->scr.callback = screen_callback; + c->scr.userdata = c; + camu_screen_init(&c->scr, display); + camu_screen_create_window(&c->scr, "ctv"); + c->renderer = camu_renderer_lp_create(); + camu_screen_create_renderer(&c->scr, c->renderer); + + camu_mixer_init(&c->mixer, camu_audio_miniaudio_create()); + c->mixer.audio->configure_stream(c->mixer.audio, NULL); + camu_mixer_pick_format(&c->mixer, &c->mixer.fmt); + + aki_event_loop_init(&c->loop); + + camu_sink_init(&c->sink, &c->loop, &c->mixer, c->renderer); + c->sink.callback = sink_callback; + c->sink.userdata = c; + camu_sink_connect(&c->sink, AKI_SOCKET_TCP, CAMU_SERVER_IP, CAMU_PORT, al_str_c("ctv")); + + aki_thread_create(&c->thread, event_loop_thread, c); + + c->created = true; + } +} + +static void onSurfaceDestroyed(GLFMDisplay *display) +{ + (void)display; +} + +static void onDraw(GLFMDisplay *display) +{ + struct ctv *c = (struct ctv *)glfmGetUserData(display); + if (camu_screen_tick(&c->scr)) { + c->renderer->render(c->renderer, &c->scr); + } +} + +static s32 log_callback(void *userdata, char *message) +{ + (void)userdata; + __android_log_print(ANDROID_LOG_DEBUG, "CTV", "%s", message); + s32 ret = al_strlen(message); + al_free(message); + return ret; +} + +void glfmMain(GLFMDisplay *display) +{ + struct ctv *c = al_alloc_object(struct ctv); + c->created = false; + + al_set_print(log_callback, c); + + glfmSetUserData(display, c); glfmSetDisplayConfig(display, GLFMRenderingAPIOpenGLES2, GLFMColorFormatRGBA8888, GLFMDepthFormatNone, GLFMStencilFormatNone, GLFMMultisampleNone); - glfmSetRenderFunc(display, onDraw); + glfmSetSurfaceCreatedFunc(display, onSurfaceCreated); glfmSetSurfaceDestroyedFunc(display, onSurfaceDestroyed); + glfmSetRenderFunc(display, onDraw); } diff --git a/src/fruits/ctv/meson.build b/src/fruits/ctv/meson.build index 768f9e1..c06cec3 100644 --- a/src/fruits/ctv/meson.build +++ b/src/fruits/ctv/meson.build @@ -1,6 +1,6 @@ ctv_src = ['ctv.c'] -ctv_deps = [desktop] -ctv_args = [] +ctv_deps = [common_deps, buffer, render, screen, mixer, libsink] +ctv_args = ['-DCAMU_MIXER_THREADED', '-DCAMU_SCREEN_THREADED'] # https://github.com/google/ExoPlayer/issues/9933#issuecomment-1029775358 shared_library('ctv', ctv_src, dependencies: ctv_deps, c_args: ctv_args, link_args: ['-Wl,-Bsymbolic', '-static-libstdc++']) |