diff options
author | dec05eba <dec05eba@protonmail.com> | 2024-07-19 22:08:04 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2024-07-19 22:08:04 +0200 |
commit | 637d306a243e83c797f4a818cb0342d9af564843 (patch) | |
tree | 723d6978da05606e1972baf1230d8e44a66392e1 | |
parent | 739fab83ba60087eb598a0fc8732c1bc7669b839 (diff) |
Stop recording when pipewire target window is closed or when pressing close in the desktop environments record button
-rw-r--r-- | include/pipewire.h | 4 | ||||
-rw-r--r-- | src/capture/kms.c | 11 | ||||
-rw-r--r-- | src/capture/portal.c | 13 | ||||
-rw-r--r-- | src/pipewire.c | 12 |
4 files changed, 19 insertions, 21 deletions
diff --git a/include/pipewire.h b/include/pipewire.h index 2e22ccc..2a0b134 100644 --- a/include/pipewire.h +++ b/include/pipewire.h @@ -68,6 +68,9 @@ typedef struct { gsr_pipewire_data_version server_version; gsr_pipewire_video_info video_info; gsr_pipewire_dmabuf_data dmabuf_data; + + bool started; + bool stopped; } gsr_pipewire; /* @@ -79,5 +82,6 @@ bool gsr_pipewire_init(gsr_pipewire *self, int pipewire_fd, uint32_t pipewire_no void gsr_pipewire_deinit(gsr_pipewire *self); bool gsr_pipewire_map_texture(gsr_pipewire *self, unsigned int texture_id, unsigned int cursor_texture_id, gsr_pipewire_region *region, gsr_pipewire_region *cursor_region, int *plane_fd); +bool gsr_pipewire_recording_stopped(gsr_pipewire *self); #endif /* GSR_PIPEWIRE_H */ diff --git a/src/capture/kms.c b/src/capture/kms.c index 3e66bdb..f522df3 100644 --- a/src/capture/kms.c +++ b/src/capture/kms.c @@ -25,9 +25,6 @@ typedef struct { typedef struct { gsr_capture_kms_params params; - - bool should_stop; - bool stop_is_error; gsr_kms_client kms_client; gsr_kms_response kms_response; @@ -477,13 +474,7 @@ static int gsr_capture_kms_capture(gsr_capture *cap, AVFrame *frame, gsr_color_c } static bool gsr_capture_kms_should_stop(gsr_capture *cap, bool *err) { - gsr_capture_kms *cap_kms = cap->priv; - if(cap_kms->should_stop) { - if(err) - *err = cap_kms->stop_is_error; - return true; - } - + (void)cap; if(err) *err = false; return false; diff --git a/src/capture/portal.c b/src/capture/portal.c index 5af5163..aa73cd0 100644 --- a/src/capture/portal.c +++ b/src/capture/portal.c @@ -15,9 +15,6 @@ typedef struct { gsr_capture_portal_params params; - bool should_stop; - bool stop_is_error; - unsigned int input_texture_id; unsigned int cursor_texture_id; @@ -328,16 +325,10 @@ static int gsr_capture_portal_capture(gsr_capture *cap, AVFrame *frame, gsr_colo } static bool gsr_capture_portal_should_stop(gsr_capture *cap, bool *err) { - gsr_capture_portal *cap_portal = cap->priv; - if(cap_portal->should_stop) { - if(err) - *err = cap_portal->stop_is_error; - return true; - } - + gsr_capture_portal *self = cap->priv; if(err) *err = false; - return false; + return gsr_pipewire_recording_stopped(&self->pipewire); } static void gsr_capture_portal_capture_end(gsr_capture *cap, AVFrame *frame) { diff --git a/src/pipewire.c b/src/pipewire.c index 985a80a..1828f90 100644 --- a/src/pipewire.c +++ b/src/pipewire.c @@ -246,6 +246,14 @@ static void on_param_changed_cb(void *user_data, uint32_t id, const struct spa_p static void on_state_changed_cb(void *user_data, enum pw_stream_state old, enum pw_stream_state state, const char *error) { (void)old; gsr_pipewire *self = user_data; + if(state == PW_STREAM_STATE_STREAMING) + self->started = true; + + if(self->started && state == PW_STREAM_STATE_PAUSED) { + self->started = false; + self->stopped = true; + } + fprintf(stderr, "gsr info: pipewire: stream %p state: \"%s\" (error: %s)\n", (void*)self->stream, pw_stream_state_as_string(state), error ? error : "none"); @@ -627,3 +635,7 @@ bool gsr_pipewire_map_texture(gsr_pipewire *self, unsigned int texture_id, unsig pthread_mutex_unlock(&self->mutex); return true; } + +bool gsr_pipewire_recording_stopped(gsr_pipewire *self) { + return self->stopped; +} |