Skip to content

Commit

Permalink
audio/alsa: Exit write loop if underlying device is already paused.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dougnazar authored and GStreamer Marge Bot committed Apr 8, 2021
1 parent f38d2d3 commit 1d5ad7d
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 0 deletions.
4 changes: 4 additions & 0 deletions ext/alsa/gstalsasink.c
Expand Up @@ -1089,6 +1089,10 @@ gst_alsasink_write (GstAudioSink * asink, gpointer data, guint length)
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);
Expand Down
3 changes: 3 additions & 0 deletions gst-libs/gst/audio/gstaudiosink.c
Expand Up @@ -254,6 +254,9 @@ audioringbuffer_thread_func (GstAudioRingBuffer * buf)
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;
Expand Down

0 comments on commit 1d5ad7d

Please sign in to comment.