In ALSA, there is possible temporary failures that may require a retry,
though in certain situation, this may leak to the write() function
holding on a lock forever preventing the pipeline from going to pause
or stop. Fix this by shortly dropping the lock between retries.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1261>
if (err < 0) {
GST_DEBUG_OBJECT (asink, "Write error: %s (%d)", snd_strerror (err), err);
if (err == -EAGAIN) {
- continue;
+ /* will continue out of the if/else group */
} else if (err == -ENODEV) {
goto device_disappeared;
} else if (xrun_recovery (alsa, alsa->handle, err) < 0) {
goto write_error;
}
+
+ /* Unlock so that _reset() can run and break an otherwise infinit loop
+ * here */
+ GST_ALSA_SINK_UNLOCK (asink);
+ g_thread_yield ();
+ GST_ALSA_SINK_LOCK (asink);
continue;
} else if (err == 0 && alsa->hw_support_pause) {
/* We might be already paused, if so, just bail */