If the alsasink thread starts the write loop but another thread pauses
the underlying alsa device, the sink thread will endlessly loop.
snd_pcm_writei() will return 0 if the state is SND_PCM_STATE_PAUSED
and the loop will never make any progress.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1097>
goto write_error;
}
continue;
+ } else if (err == 0 && alsa->hw_support_pause) {
+ /* We might be already paused, if so, just bail */
+ if (snd_pcm_state (alsa->handle) == SND_PCM_STATE_PAUSED)
+ break;
}
ptr += snd_pcm_frames_to_bytes (alsa->handle, err);
GST_DEBUG_FUNCPTR_NAME (writefunc),
(errno > 1 ? g_strerror (errno) : "unknown"), left, written);
break;
+ } else if (written == 0 && G_UNLIKELY (g_atomic_int_get (&buf->state) !=
+ GST_AUDIO_RING_BUFFER_STATE_STARTED)) {
+ break;
}
left -= written;
readptr += written;