diff --git a/src/screencast/pipewire_screencast.c b/src/screencast/pipewire_screencast.c index babe2842..64195416 100644 --- a/src/screencast/pipewire_screencast.c +++ b/src/screencast/pipewire_screencast.c @@ -101,6 +101,8 @@ static void pwr_handle_stream_param_changed(void *data, uint32_t id, SPA_PARAM_META_size, SPA_POD_Int(sizeof(struct spa_meta_header))); pw_stream_update_params(stream, params, 2); + cast->changed = false; + pw_stream_set_active(stream, true); } static void pwr_handle_stream_add_buffer(void *data, struct pw_buffer *buffer) { @@ -154,6 +156,7 @@ static void pwr_handle_stream_remove_buffer(void *data, struct pw_buffer *buffer logprint(TRACE, "pipewire: remove buffer event handle"); + logprint(TRACE, "pipewire: buffer %p", buffer); d = buffer->buffer->datas; if (buffer == cast->current_pw_buffer) { logprint(TRACE, "pipewire: can't remove buffer. still in use"); @@ -168,12 +171,18 @@ static void pwr_handle_stream_remove_buffer(void *data, struct pw_buffer *buffer } } +static void pwr_handle_stream_drained(void *data) { + + logprint(TRACE, "pipewire: drained event handle"); + +} static const struct pw_stream_events pwr_stream_events = { PW_VERSION_STREAM_EVENTS, .state_changed = pwr_handle_stream_state_changed, .param_changed = pwr_handle_stream_param_changed, .add_buffer = pwr_handle_stream_add_buffer, .remove_buffer = pwr_handle_stream_remove_buffer, + .drained = pwr_handle_stream_drained, }; void xdpw_pwr_import_buffer(struct xdpw_screencast_instance *cast) { @@ -230,11 +239,7 @@ void xdpw_pwr_export_buffer(struct xdpw_screencast_instance *cast) { logprint(TRACE, "pipewire: y_invert %d", cast->simple_frame.y_invert); logprint(TRACE, "********************"); - if (cast->current_pw_buffer) { - pw_stream_queue_buffer(cast->stream, pw_buf); - } else { - xdpw_pwr_destroy_shm_buffer(cast, pw_buf); - } + pw_stream_queue_buffer(cast->stream, pw_buf); cast->current_pw_buffer = NULL; } @@ -242,6 +247,7 @@ void xdpw_pwr_export_buffer(struct xdpw_screencast_instance *cast) { void xdpw_pwr_destroy_shm_buffer(struct xdpw_screencast_instance *cast, struct pw_buffer *buffer) { struct spa_data *d; + logprint(TRACE, "pipewire: destroy buffer %p", buffer); d = buffer->buffer->datas; wl_buffer_destroy(d[0].data); d[0].data = NULL; @@ -256,12 +262,19 @@ void pwr_update_stream_param(struct xdpw_screencast_instance *cast) { SPA_POD_BUILDER_INIT(params_buffer, sizeof(params_buffer)); const struct spa_pod *params[1]; + + pw_stream_flush(stream, true); + enum spa_video_format format = xdpw_format_pw_from_wl_shm(cast); params[0] = build_format(&b, format, cast->simple_frame.width, cast->simple_frame.height, cast->framerate); + logprint(TRACE, "pipewire: params updated"); pw_stream_update_params(stream, params, 1); + + //pw_stream_set_active(stream, false); + pw_stream_flush(stream, true); } void xdpw_pwr_stream_create(struct xdpw_screencast_instance *cast) { diff --git a/src/screencast/wlr_screencast.c b/src/screencast/wlr_screencast.c index 64b0db5e..e6567432 100644 --- a/src/screencast/wlr_screencast.c +++ b/src/screencast/wlr_screencast.c @@ -34,7 +34,7 @@ void xdpw_wlr_frame_free(struct xdpw_screencast_instance *cast) { return ; } - if (cast->pwr_stream_state) { + if (cast->pwr_stream_state && !cast->changed) { xdpw_wlr_frame_start(cast); } } @@ -106,7 +106,6 @@ static void wlr_frame_buffer_done(void *data, if (cast->pwr_stream_state) { pwr_update_stream_param(cast); } - cast->changed = false; xdpw_wlr_frame_free(cast); return; }