directsoundsrc: Correctly calculate segsize and segtotal
segsize should be based on latency-time, and must be a multiple of the frame size. segtotal should be based on buffer-time and segsize. This prevents errors caused by outputting buffers that are not a multiple of the frame size, and actually makes the buffer-time and latency-time properties do what they're supposed to do.
This commit is contained in:
parent
58370ed6cf
commit
6d256d9908
@ -564,22 +564,20 @@ gst_directsound_src_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
|
|||||||
GST_WARNING ("buffer-time was less than latency");
|
GST_WARNING ("buffer-time was less than latency");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the times */
|
spec->segsize =
|
||||||
dsoundsrc->buffer_time = spec->buffer_time;
|
gst_util_uint64_scale (spec->latency_time, wfx.nAvgBytesPerSec, 1000000);
|
||||||
dsoundsrc->latency_time = spec->latency_time;
|
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_size = (gint) wfx.nAvgBytesPerSec *
|
dsoundsrc->latency_time =
|
||||||
dsoundsrc->latency_time / 1000000.0;
|
gst_util_uint64_scale (spec->segsize, 1000000,
|
||||||
|
GST_AUDIO_INFO_BPF (&spec->info) * GST_AUDIO_INFO_RATE (&spec->info));
|
||||||
spec->segsize = (guint) (((double) spec->buffer_time / 1000000.0) *
|
spec->segtotal = spec->buffer_time / dsoundsrc->latency_time;
|
||||||
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,
|
GST_DEBUG_OBJECT (asrc,
|
||||||
"bytes/sec: %lu, buffer size: %d, segsize: %d, segtotal: %d",
|
"bytes/sec: %lu, buffer size: %d, segsize: %d, segtotal: %d",
|
||||||
|
@ -86,10 +86,8 @@ struct _GstDirectSoundSrc
|
|||||||
DWORD notifysize;
|
DWORD notifysize;
|
||||||
|
|
||||||
guint buffer_size;
|
guint buffer_size;
|
||||||
guint latency_size;
|
|
||||||
guint bytes_per_sample;
|
guint bytes_per_sample;
|
||||||
|
|
||||||
guint buffer_time;
|
|
||||||
guint latency_time;
|
guint latency_time;
|
||||||
|
|
||||||
HMIXER mixer;
|
HMIXER mixer;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user