Revert "directsoundsrc: Correctly calculate segsize and segtotal"
authorSebastian Dröge <sebastian@centricular.com>
Wed, 12 Apr 2017 10:17:24 +0000 (13:17 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 12 Apr 2017 10:18:18 +0000 (13:18 +0300)
This reverts commit 6d256d9908e292f6c593bf45e69354f6b613cc8b.

It was configuring the period/buffer size in a way that often causes
drop-outs or complete underruns. Needs further investigation.

sys/directsound/gstdirectsoundsrc.c
sys/directsound/gstdirectsoundsrc.h

index 3bb62fd..3977466 100644 (file)
@@ -564,20 +564,22 @@ gst_directsound_src_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
     GST_WARNING ("buffer-time was less than latency");
   }
 
-  spec->segsize =
-      gst_util_uint64_scale (spec->latency_time, wfx.nAvgBytesPerSec, 1000000);
-  if (spec->segsize < GST_AUDIO_INFO_BPF (&spec->info))
-    spec->segsize = GST_AUDIO_INFO_BPF (&spec->info);
-  else if (spec->segsize % GST_AUDIO_INFO_BPF (&spec->info) != 0)
-    spec->segsize =
-        ((spec->segsize + GST_AUDIO_INFO_BPF (&spec->info) -
-            1) / GST_AUDIO_INFO_BPF (&spec->info)) *
-        GST_AUDIO_INFO_BPF (&spec->info);
-
-  dsoundsrc->latency_time =
-      gst_util_uint64_scale (spec->segsize, 1000000,
-      GST_AUDIO_INFO_BPF (&spec->info) * GST_AUDIO_INFO_RATE (&spec->info));
-  spec->segtotal = spec->buffer_time / dsoundsrc->latency_time;
+  /* Save the times */
+  dsoundsrc->buffer_time = spec->buffer_time;
+  dsoundsrc->latency_time = spec->latency_time;
+
+  dsoundsrc->latency_size = (gint) wfx.nAvgBytesPerSec *
+      dsoundsrc->latency_time / 1000000.0;
+
+  spec->segsize = (guint) (((double) spec->buffer_time / 1000000.0) *
+      wfx.nAvgBytesPerSec);
+
+  /* just in case */
+  if (spec->segsize < 1)
+    spec->segsize = 1;
+
+  spec->segtotal = GST_AUDIO_INFO_BPF (&spec->info) * 8 *
+      (wfx.nAvgBytesPerSec / spec->segsize);
 
   GST_DEBUG_OBJECT (asrc,
       "bytes/sec: %lu, buffer size: %d, segsize: %d, segtotal: %d",
@@ -816,7 +818,7 @@ gst_directsound_src_mixer_find (GstDirectSoundSrc * dsoundsrc,
     if (mmres != MMSYSERR_NOERROR)
       continue;
 
-    mmres = mixerGetDevCaps ((UINT_PTR) dsoundsrc->mixer,
+    mmres = mixerGetDevCaps ((UINT_PTR)dsoundsrc->mixer,
         mixer_caps, sizeof (MIXERCAPS));
 
     if (mmres != MMSYSERR_NOERROR) {
index 3121897..9aa225f 100644 (file)
@@ -86,8 +86,10 @@ struct _GstDirectSoundSrc
   DWORD notifysize;
 
   guint buffer_size;
+  guint latency_size;
   guint bytes_per_sample;
 
+  guint buffer_time;
   guint latency_time;
 
   HMIXER mixer;