From eb229b708e8f3aa8ac17c54bb776a0356e9a8337 Mon Sep 17 00:00:00 2001 From: Dan Shick Date: Fri, 6 Mar 2020 14:41:53 -0500 Subject: [PATCH] Remove thread for pipewire and all locking. Add support for elogind in meson. --- include/pipewire_screencast.h | 1 + include/screencast_common.h | 7 +------ include/wlr_screencast.h | 1 + include/xdpw.h | 4 ++++ meson.build | 11 ++++++++-- src/screencast/pipewire_screencast.c | 31 ++++++++++++++++++---------- src/screencast/screencast.c | 7 +------ src/screencast/wlr_screencast.c | 17 +++++---------- 8 files changed, 42 insertions(+), 37 deletions(-) diff --git a/include/pipewire_screencast.h b/include/pipewire_screencast.h index 3c19743..4eb1711 100644 --- a/include/pipewire_screencast.h +++ b/include/pipewire_screencast.h @@ -14,5 +14,6 @@ #define ALIGN 16 void *pwr_start(void *data); +int pwr_dispatch(struct pw_loop *loop); #endif diff --git a/include/screencast_common.h b/include/screencast_common.h index 693bb71..ca4e94b 100644 --- a/include/screencast_common.h +++ b/include/screencast_common.h @@ -1,7 +1,6 @@ #ifndef SCREENCAST_COMMON_H #define SCREENCAST_COMMON_H -#include #include #include #include @@ -42,7 +41,7 @@ struct screencast_context { // pipewire struct pwr_type type; - struct pw_main_loop *loop; + struct pw_loop *loop; struct spa_source *event; struct pw_core *core; struct pw_type *t; @@ -54,7 +53,6 @@ struct screencast_context { uint32_t seq; uint32_t node_id; bool stream_state; - pthread_t pwr_thread; // wlroots struct wl_display *display; @@ -76,9 +74,6 @@ struct screencast_context { struct zwlr_screencopy_frame_v1 *wlr_frame; struct simple_frame simple_frame; - // frame mutex - pthread_mutex_t lock; - // cli options const char *output_name; const char *forced_pixelformat; diff --git a/include/wlr_screencast.h b/include/wlr_screencast.h index 8b3ab0e..4b45ce2 100644 --- a/include/wlr_screencast.h +++ b/include/wlr_screencast.h @@ -16,6 +16,7 @@ #include #include +#include "pipewire_screencast.h" #include "screencast_common.h" #define SC_MANAGER_VERSION 2 diff --git a/include/xdpw.h b/include/xdpw.h index d9c70e5..e6b0c12 100644 --- a/include/xdpw.h +++ b/include/xdpw.h @@ -2,7 +2,11 @@ #define XDPW_H #include +#ifdef HAVE_SYSTEMD #include +#elif HAVE_ELOGIND +#include +#endif #include "logger.h" struct xdpw_request { diff --git a/meson.build b/meson.build index 8203209..55fc326 100644 --- a/meson.build +++ b/meson.build @@ -28,7 +28,14 @@ pipewire = dependency('libpipewire-0.2') spa = dependency('libspa-0.1') wayland_client = dependency('wayland-client') wayland_protos = dependency('wayland-protocols', version: '>=1.14') -systemd = dependency('libsystemd') + +logind = dependency('libsystemd', required: false) +if logind.found() + add_project_arguments('-DHAVE_SYSTEMD=1', language: 'c') +else + logind = dependency('libelogind') + add_project_arguments('-DHAVE_ELOGIND=1', language: 'c') +endif subdir('protocols') @@ -48,7 +55,7 @@ executable( dependencies: [ wayland_client, wlr_protos, - systemd, + logind, pipewire, spa, threads, diff --git a/src/screencast/pipewire_screencast.c b/src/screencast/pipewire_screencast.c index 13c14bd..8259310 100644 --- a/src/screencast/pipewire_screencast.c +++ b/src/screencast/pipewire_screencast.c @@ -57,7 +57,6 @@ static void pwr_on_event(void *data, uint64_t expirations) { d[0].type = ctx->t->data.MemPtr; d[0].maxsize = ctx->simple_frame.size; - // d[0].data = ctx->simple_frame.data; d[0].mapoffset = 0; d[0].chunk->size = ctx->simple_frame.size; d[0].chunk->stride = ctx->simple_frame.stride; @@ -152,7 +151,8 @@ static void pwr_handle_state_changed(void *data, enum pw_remote_state old, logprint(INFO, "pipewire: remote state changed to \"%s\"", pw_remote_state_as_string(state)); logprint(ERROR, "pipewire: remote error: %s", error); - pw_main_loop_quit(ctx->loop); + pw_loop_leave(ctx->loop); + pw_loop_destroy(ctx->loop); break; case PW_REMOTE_STATE_CONNECTED: { @@ -210,9 +210,12 @@ void *pwr_start(void *data) { pw_init(NULL, NULL); - /* create a main loop */ - ctx->loop = pw_main_loop_new(NULL); - ctx->core = pw_core_new(pw_main_loop_get_loop(ctx->loop), NULL); + /* create a loop */ + ctx->loop = pw_loop_new(NULL); + pw_loop_enter(ctx->loop); + + /* create a core, a remote, and initialize types */ + ctx->core = pw_core_new(ctx->loop, NULL); ctx->t = pw_core_get_type(ctx->core); ctx->remote = pw_remote_new(ctx->core, NULL, 0); @@ -220,16 +223,22 @@ void *pwr_start(void *data) { /* make an event to signal frame ready */ ctx->event = - pw_loop_add_event(pw_main_loop_get_loop(ctx->loop), pwr_on_event, ctx); + pw_loop_add_event(ctx->loop, pwr_on_event, ctx); pw_remote_add_listener(ctx->remote, &ctx->remote_listener, &pwr_remote_events, ctx); pw_remote_connect(ctx->remote); - /* run the loop, this will trigger the callbacks */ - pw_main_loop_run(ctx->loop); - - pw_core_destroy(ctx->core); - pw_main_loop_destroy(ctx->loop); return NULL; } + +int pwr_dispatch(struct pw_loop *loop) { + + logprint(TRACE, "pipewire: dispatch"); + int res; + res = pw_loop_iterate(loop, 0); + if (res < 0) + logprint(ERROR, "pw_loop_iterate failed: %s", spa_strerror(res)); + return res; + +} diff --git a/src/screencast/screencast.c b/src/screencast/screencast.c index ac1acc9..18e7e8e 100644 --- a/src/screencast/screencast.c +++ b/src/screencast/screencast.c @@ -42,17 +42,13 @@ void *start_screencast(void *data){ struct screencast_context *ctx = data; - pthread_mutex_init(&ctx->lock, NULL); - wlr_register_cb(ctx); - pthread_create(&ctx->pwr_thread, NULL, pwr_start, ctx); + pwr_start((void *) ctx); /* Run capture */ while (wl_display_dispatch(ctx->display) != -1 && !ctx->err && !ctx->quit); - pthread_join(ctx->pwr_thread, NULL); - return NULL; } @@ -310,7 +306,6 @@ int init_screencast(sd_bus *bus, const char *output_name, const char *forced_pix // TODO: cleanup sd_bus_slot *slot = NULL; - //struct screencast_context ctx = (struct screencast_context){0}; ctx.forced_pixelformat = forced_pixelformat; ctx.output_name = output_name; ctx.simple_frame = (struct simple_frame){0}; diff --git a/src/screencast/wlr_screencast.c b/src/screencast/wlr_screencast.c index 2e05097..c7350e2 100644 --- a/src/screencast/wlr_screencast.c +++ b/src/screencast/wlr_screencast.c @@ -6,7 +6,6 @@ void wlr_frame_free(struct screencast_context *ctx) { munmap(ctx->simple_frame.data, ctx->simple_frame.size); wl_buffer_destroy(ctx->simple_frame.buffer); logprint(TRACE, "wlroots: frame destroyed"); - pthread_mutex_unlock(&ctx->lock); } @@ -56,8 +55,6 @@ static void wlr_frame_buffer(void *data, struct zwlr_screencopy_frame_v1 *frame, uint32_t stride) { struct screencast_context *ctx = data; - pthread_mutex_lock(&ctx->lock); - logprint(TRACE, "wlroots: buffer event handler"); ctx->wlr_frame = frame; ctx->simple_frame.width = width; @@ -72,21 +69,16 @@ static void wlr_frame_buffer(void *data, struct zwlr_screencopy_frame_v1 *frame, exit(EXIT_FAILURE); } - // zwlr_screencopy_frame_v1_copy(frame, ctx->simple_frame.buffer); zwlr_screencopy_frame_v1_copy_with_damage(frame, ctx->simple_frame.buffer); - pthread_mutex_unlock(&ctx->lock); } static void wlr_frame_flags(void *data, struct zwlr_screencopy_frame_v1 *frame, uint32_t flags) { struct screencast_context *ctx = data; - pthread_mutex_lock(&ctx->lock); - logprint(TRACE, "wlroots: flags event handler"); ctx->simple_frame.y_invert = flags & ZWLR_SCREENCOPY_FRAME_V1_FLAGS_Y_INVERT; - pthread_mutex_unlock(&ctx->lock); } static void wlr_frame_ready(void *data, struct zwlr_screencopy_frame_v1 *frame, @@ -94,16 +86,17 @@ static void wlr_frame_ready(void *data, struct zwlr_screencopy_frame_v1 *frame, uint32_t tv_nsec) { struct screencast_context *ctx = data; - pthread_mutex_lock(&ctx->lock); - logprint(TRACE, "wlroots: ready event handler"); ctx->simple_frame.tv_sec = ((((uint64_t)tv_sec_hi) << 32) | tv_sec_lo); ctx->simple_frame.tv_nsec = tv_nsec; if (!ctx->quit && !ctx->err) { - pw_loop_signal_event(pw_main_loop_get_loop(ctx->loop), ctx->event); - // sleep(1); + pw_loop_signal_event(ctx->loop, ctx->event); + + if(ctx->loop) + if(pwr_dispatch(ctx->loop) < 0) ctx->err = true; + wlr_register_cb(ctx); } }