summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2017-04-12 13:17:24 +0300
committerSebastian Dröge <sebastian@centricular.com>2017-04-12 13:18:18 +0300
commit244a80787d628f2fd4750b85c1513efddc0cf9f9 (patch)
tree88229bd02f4b5b9831300611f64b844d13e4ff26
parent94fe5c690e757ef986f7ba4eee1a068eded07bf4 (diff)
downloadgstreamer-plugins-bad-244a80787d628f2fd4750b85c1513efddc0cf9f9.tar.gz
Revert "directsoundsrc: Correctly calculate segsize and segtotal"
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.
-rw-r--r--sys/directsound/gstdirectsoundsrc.c32
-rw-r--r--sys/directsound/gstdirectsoundsrc.h2
2 files changed, 19 insertions, 15 deletions
diff --git a/sys/directsound/gstdirectsoundsrc.c b/sys/directsound/gstdirectsoundsrc.c
index 3bb62fdcd..397746641 100644
--- a/sys/directsound/gstdirectsoundsrc.c
+++ b/sys/directsound/gstdirectsoundsrc.c
@@ -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) {
diff --git a/sys/directsound/gstdirectsoundsrc.h b/sys/directsound/gstdirectsoundsrc.h
index 31218976d..9aa225fb3 100644
--- a/sys/directsound/gstdirectsoundsrc.h
+++ b/sys/directsound/gstdirectsoundsrc.h
@@ -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;