diff --git a/src/gst/gstpipewiresink.c b/src/gst/gstpipewiresink.c index 36d158095..001ede9d5 100644 --- a/src/gst/gstpipewiresink.c +++ b/src/gst/gstpipewiresink.c @@ -532,8 +532,13 @@ on_state_changed (void *data, enum pw_stream_state old, enum pw_stream_state sta pw_stream_trigger_process (pwsink->stream); break; case PW_STREAM_STATE_ERROR: - GST_ELEMENT_ERROR (pwsink, RESOURCE, FAILED, - ("stream error: %s", error), (NULL)); + /* make the error permanent, if it is not already; + pw_stream_set_error() will recursively call us again */ + if (pw_stream_get_state (pwsink->stream, NULL) != PW_STREAM_STATE_ERROR) + pw_stream_set_error (pwsink->stream, -EPIPE, "%s", error); + else + GST_ELEMENT_ERROR (pwsink, RESOURCE, FAILED, + ("stream error: %s", error), (NULL)); break; } pw_thread_loop_signal (pwsink->core->loop, FALSE); diff --git a/src/gst/gstpipewiresrc.c b/src/gst/gstpipewiresrc.c index 0514e4caa..e473338ba 100644 --- a/src/gst/gstpipewiresrc.c +++ b/src/gst/gstpipewiresrc.c @@ -681,9 +681,13 @@ on_state_changed (void *data, case PW_STREAM_STATE_STREAMING: break; case PW_STREAM_STATE_ERROR: - pw_stream_set_error (pwsrc->stream, -EPIPE, "%s", error); - GST_ELEMENT_ERROR (pwsrc, RESOURCE, FAILED, - ("stream error: %s", error), (NULL)); + /* make the error permanent, if it is not already; + pw_stream_set_error() will recursively call us again */ + if (pw_stream_get_state (pwsrc->stream, NULL) != PW_STREAM_STATE_ERROR) + pw_stream_set_error (pwsrc->stream, -EPIPE, "%s", error); + else + GST_ELEMENT_ERROR (pwsrc, RESOURCE, FAILED, + ("stream error: %s", error), (NULL)); break; } pw_thread_loop_signal (pwsrc->core->loop, FALSE);