summaryrefslogtreecommitdiff
path: root/src/fruits/ctv
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-11-12 18:52:33 -0500
committerAndrew Opalach <andrew@akon.city> 2024-11-12 19:28:50 -0500
commit8c996a5b597bd1cd9c188a0e61eae1ff718c8ca2 (patch)
tree2195b2b6e43d2c879a01b72c0c7a159447c1c35f /src/fruits/ctv
parentbacabb8f2b488b3da58dc3ea4159326298a003f6 (diff)
downloadcamu-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.c102
-rw-r--r--src/fruits/ctv/meson.build4
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++'])