1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-03-09 23:38:56 +00:00

stop sender properly after session end

This commit is contained in:
Derek Dai 2016-12-19 15:54:59 +08:00
parent d8d538ef65
commit 20ff174fe8
No known key found for this signature in database
GPG key ID: E109CC97553EF009
2 changed files with 32 additions and 6 deletions

View file

@ -463,13 +463,21 @@ static const struct cli_cmd cli_cmds[] = {
{ }, { },
}; };
static void kill_gst(void) static void stop_sender(void)
{ {
if (src_pid <= 0) GError *error = NULL;
if (!sender)
return; return;
kill(src_pid, SIGTERM); sender_call_stop_sync(sender, NULL, &error);
src_pid = 0; if(error) {
cli_error("SOURCE failed to stop sender: %s", error->message);
g_error_free(error);
}
g_object_unref(sender);
sender = NULL;
} }
void ctl_fn_src_connected(struct ctl_src *s) void ctl_fn_src_connected(struct ctl_src *s)
@ -586,7 +594,7 @@ void ctl_fn_peer_free(struct ctl_peer *p)
cli_printf("no longer running on peer %s\n", cli_printf("no longer running on peer %s\n",
running_peer->label); running_peer->label);
stop_timeout(&src_timeout); stop_timeout(&src_timeout);
kill_gst(); stop_sender();
ctl_src_close(src); ctl_src_close(src);
running_peer = NULL; running_peer = NULL;
stop_timeout(&scan_timeout); stop_timeout(&scan_timeout);
@ -686,7 +694,7 @@ void ctl_fn_peer_disconnected(struct ctl_peer *p)
cli_printf("no longer running on peer %s\n", cli_printf("no longer running on peer %s\n",
running_peer->label); running_peer->label);
stop_timeout(&src_timeout); stop_timeout(&src_timeout);
kill_gst(); stop_sender();
ctl_src_close(src); ctl_src_close(src);
running_peer = NULL; running_peer = NULL;
stop_timeout(&scan_timeout); stop_timeout(&scan_timeout);

View file

@ -44,6 +44,8 @@ struct SenderImpl
guint bus_obj_id; guint bus_obj_id;
GDBusMethodInvocation *method_invoke; GDBusMethodInvocation *method_invoke;
guint timer_handle;
}; };
static gchar *arg_host = NULL; static gchar *arg_host = NULL;
@ -519,6 +521,11 @@ static gboolean sender_impl_prepare(struct SenderImpl *self,
guint16 refresh_rate, guint16 refresh_rate,
gboolean interleave) gboolean interleave)
{ {
if(self->timer_handle) {
g_source_remove(self->timer_handle);
self->timer_handle = 0;
}
if(self->pipeline) { if(self->pipeline) {
sender_complete_prepare(SENDER(self->skeleton), invocation); sender_complete_prepare(SENDER(self->skeleton), invocation);
return TRUE; return TRUE;
@ -607,6 +614,15 @@ static gboolean sender_impl_pause(struct SenderImpl *self,
return TRUE; return TRUE;
} }
static gboolean on_timeout_quit(gpointer user_data)
{
struct SenderImpl *self = user_data;
g_main_loop_quit(self->loop);
return FALSE;
}
static gboolean sender_impl_stop(struct SenderImpl *self, static gboolean sender_impl_stop(struct SenderImpl *self,
GDBusMethodInvocation *invocation) GDBusMethodInvocation *invocation)
{ {
@ -628,6 +644,8 @@ static gboolean sender_impl_stop(struct SenderImpl *self,
g_object_unref(self->pipeline); g_object_unref(self->pipeline);
self->pipeline = NULL; self->pipeline = NULL;
self->timer_handle = g_timeout_add_seconds(3, on_timeout_quit, self);
end: end:
sender_complete_stop(SENDER(self->skeleton), invocation); sender_complete_stop(SENDER(self->skeleton), invocation);