mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-22 23:28:16 +00:00
directsoundsrc: Check return values of DirectSound functions in read loop
Otherwise we might end up in an infinite loop because of errors. Also take the element's mutex in unprepare(). https://bugzilla.gnome.org/show_bug.cgi?id=738292
This commit is contained in:
parent
7ae23d13c8
commit
d794908dfd
1 changed files with 13 additions and 1 deletions
|
@ -545,12 +545,14 @@ gst_directsound_src_unprepare (GstAudioSrc * asrc)
|
|||
|
||||
dsoundsrc = GST_DIRECTSOUND_SRC (asrc);
|
||||
|
||||
GST_DSOUND_LOCK (dsoundsrc);
|
||||
|
||||
/* Stop capturing */
|
||||
IDirectSoundCaptureBuffer_Stop (dsoundsrc->pDSBSecondary);
|
||||
|
||||
/* Release buffer */
|
||||
IDirectSoundCaptureBuffer_Release (dsoundsrc->pDSBSecondary);
|
||||
|
||||
GST_DSOUND_UNLOCK (dsoundsrc);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -583,6 +585,11 @@ gst_directsound_src_read (GstAudioSrc * asrc, gpointer data, guint length,
|
|||
hRes = IDirectSoundCaptureBuffer_GetStatus (dsoundsrc->pDSBSecondary,
|
||||
&dwStatus);
|
||||
|
||||
if (FAILED (hRes)) {
|
||||
GST_DSOUND_UNLOCK (dsoundsrc);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Starting capturing if not already */
|
||||
if (!(dwStatus & DSCBSTATUS_CAPTURING)) {
|
||||
hRes = IDirectSoundCaptureBuffer_Start (dsoundsrc->pDSBSecondary,
|
||||
|
@ -598,6 +605,11 @@ gst_directsound_src_read (GstAudioSrc * asrc, gpointer data, guint length,
|
|||
IDirectSoundCaptureBuffer_GetCurrentPosition (dsoundsrc->pDSBSecondary,
|
||||
&dwCurrentCaptureCursor, NULL);
|
||||
|
||||
if (FAILED (hRes)) {
|
||||
GST_DSOUND_UNLOCK (dsoundsrc);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* calculate the buffer */
|
||||
if (dwCurrentCaptureCursor < dsoundsrc->current_circular_offset) {
|
||||
dwBufferSize = dsoundsrc->buffer_size -
|
||||
|
|
Loading…
Reference in a new issue