From 51f94288ce66a0a6a28e45801f4e17eb74044298 Mon Sep 17 00:00:00 2001 From: Thomas Roos Date: Mon, 21 Dec 2015 11:37:26 +0100 Subject: [PATCH] directsoundsink: Fix sleep for buffer-time lower than 200000 https://bugzilla.gnome.org/show_bug.cgi?id=748680 --- sys/directsound/gstdirectsoundsink.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/sys/directsound/gstdirectsoundsink.c b/sys/directsound/gstdirectsoundsink.c index 6f05d80412..ffd1bfe89f 100644 --- a/sys/directsound/gstdirectsoundsink.c +++ b/sys/directsound/gstdirectsoundsink.c @@ -615,7 +615,8 @@ gst_directsound_sink_write (GstAudioSink * asink, gpointer data, guint length) &dwCurrentPlayCursor, NULL); if (SUCCEEDED (hRes) && SUCCEEDED (hRes2) && (dwStatus & DSBSTATUS_PLAYING)) { - DWORD dwFreeBufferSize; + DWORD dwFreeBufferSize = 0; + DWORD sleepTime = 0; calculate_freesize: /* calculate the free size of the circular buffer */ @@ -628,7 +629,17 @@ gst_directsound_sink_write (GstAudioSink * asink, gpointer data, guint length) dwCurrentPlayCursor - dsoundsink->current_circular_offset; if (length >= dwFreeBufferSize) { - Sleep (100); + sleepTime = + ((length - + dwFreeBufferSize) * 1000) / (dsoundsink->bytes_per_sample * + GST_AUDIO_BASE_SINK (asink)->ringbuffer->spec.info.rate); + if (sleepTime > 0) { + GST_DEBUG_OBJECT (dsoundsink, + "gst_directsound_sink_write: length:%i, FreeBufSiz: %ld, sleepTime: %ld, bps: %i, rate: %i", + length, dwFreeBufferSize, sleepTime, dsoundsink->bytes_per_sample, + GST_AUDIO_BASE_SINK (asink)->ringbuffer->spec.info.rate); + Sleep (sleepTime); + } hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, &dwCurrentPlayCursor, NULL);