diff --git a/src/disp/dispd-dbus.c b/src/disp/dispd-dbus.c index 85af206..a38ac52 100644 --- a/src/disp/dispd-dbus.c +++ b/src/disp/dispd-dbus.c @@ -728,9 +728,14 @@ static int dispd_dbus_session_teardown(sd_bus_message *m, sd_bus_error *ret_error) { struct dispd_session *s = userdata; - int r = dispd_session_teardown(s); + int r = 0; + + if(dispd_session_is_established(s)) { + r = dispd_session_teardown(s); + } + if(0 > r) { - return log_ERRNO(); + dispd_session_destroy(s); } r = sd_bus_reply_method_return(m, NULL); diff --git a/src/disp/dispd-out-session.c b/src/disp/dispd-out-session.c index c885db5..fbb88f6 100644 --- a/src/disp/dispd-out-session.c +++ b/src/disp/dispd-out-session.c @@ -902,6 +902,17 @@ static int dispd_out_session_request_set_parameter(struct dispd_session *s, return 0; } + +int dispd_fn_sink_detach(struct dispd_sink *sink) +{ + assert_ret(sink); + assert_ret(dispd_is_out_session(sink->session)); + + dispd_out_session(sink->session)->sink = NULL; + + return 0; +} + static const struct rtsp_dispatch_entry out_session_rtsp_disp_tbl[] = { [RTSP_M1_REQUEST_SINK_OPTIONS] = { .request = dispd_out_session_request_options, diff --git a/src/disp/dispd-session.c b/src/disp/dispd-session.c index 5bb902f..815b84c 100644 --- a/src/disp/dispd-session.c +++ b/src/disp/dispd-session.c @@ -165,7 +165,8 @@ bool dispd_session_is_established(struct dispd_session *s) { assert_retv(dispd_is_session(s), false); - return DISPD_SESSION_STATE_ESTABLISHED <= s->state; + return DISPD_SESSION_STATE_ESTABLISHED <= s->state && + DISPD_SESSION_STATE_TEARING_DOWN > s->state; } int dispd_session_resume(struct dispd_session *s) diff --git a/src/disp/dispd-sink.c b/src/disp/dispd-sink.c index 3e40d01..9ccbcbe 100644 --- a/src/disp/dispd-sink.c +++ b/src/disp/dispd-sink.c @@ -36,11 +36,12 @@ static int dispd_sink_set_session(struct dispd_sink *sink, if(session) { r = dispd_add_session(dispd_get(), session); if(0 > r) { - return r; + return log_ERR(r); } } if(sink->session) { + dispd_fn_sink_detach(sink); dispd_remove_session_by_id(dispd_get(), dispd_session_get_id(sink->session), NULL); @@ -152,9 +153,14 @@ int dispd_sink_create_session(struct dispd_sink *sink, struct dispd_session **ou int dispd_fn_out_session_ended(struct dispd_session *s) { + struct dispd_sink *sink; + assert_ret(dispd_is_out_session(s)); - dispd_sink_set_session(dispd_out_session_get_sink(s), NULL); + sink = dispd_out_session_get_sink(s); + if(sink) { + dispd_sink_set_session(sink, NULL); + } return 0; } diff --git a/src/disp/dispd.h b/src/disp/dispd.h index fdfe123..f61478a 100644 --- a/src/disp/dispd.h +++ b/src/disp/dispd.h @@ -216,5 +216,6 @@ int dispd_fn_out_session_ended(struct dispd_session *s); int dispd_fn_sink_new(struct dispd_sink *s); int dispd_fn_sink_free(struct dispd_sink *s); +int dispd_fn_sink_detach(struct dispd_sink *s); #endif /* DISP_DISP_H */