summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2018-02-09 02:05:23 +0530
committerNirbheek Chauhan <nirbheek@centricular.com>2018-02-09 02:09:04 +0530
commit8f617854857f261ea28d716e3663f5d84496cba0 (patch)
tree2c37f974052aea7ce2f1f1adc2a89393e8d171e0
parent34276dc373094084d65c992c819d6e9b8093d7c3 (diff)
downloadgstreamer-plugins-bad-8f617854857f261ea28d716e3663f5d84496cba0.tar.gz
wasapisrc: Re-align device period if necessary
Same changes as done for wasapisink in cbe2fc40a. Turns out this is sometimes also needed for capture. Reported by Mathieu_Du. Also improve logging in that case for easier debugging.
-rw-r--r--sys/wasapi/gstwasapisink.c4
-rw-r--r--sys/wasapi/gstwasapisrc.c32
2 files changed, 32 insertions, 4 deletions
diff --git a/sys/wasapi/gstwasapisink.c b/sys/wasapi/gstwasapisink.c
index 972a827b3..a4568d5c5 100644
--- a/sys/wasapi/gstwasapisink.c
+++ b/sys/wasapi/gstwasapisink.c
@@ -480,8 +480,8 @@ gst_wasapi_sink_prepare (GstAudioSink * asink, GstAudioRingBufferSpec * spec)
device_period = (GST_SECOND / 100) * n_frames / rate;
- GST_WARNING_OBJECT (self, "trying to re-initialize with period %i",
- (int) device_period);
+ GST_WARNING_OBJECT (self, "trying to re-initialize with period %i "
+ "(%i frames, %i rate)", (int) device_period, n_frames, rate);
hr = IAudioClient_Initialize (self->client, self->sharemode,
AUDCLNT_STREAMFLAGS_EVENTCALLBACK, device_period,
diff --git a/sys/wasapi/gstwasapisrc.c b/sys/wasapi/gstwasapisrc.c
index 87557e7fd..2425c68c3 100644
--- a/sys/wasapi/gstwasapisrc.c
+++ b/sys/wasapi/gstwasapisrc.c
@@ -394,6 +394,9 @@ gst_wasapi_src_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
GST_INFO_OBJECT (self, "wasapi default period: %" G_GINT64_FORMAT
", min period: %" G_GINT64_FORMAT, default_period, min_period);
+ bpf = GST_AUDIO_INFO_BPF (&spec->info);
+ rate = GST_AUDIO_INFO_RATE (&spec->info);
+
if (self->low_latency) {
if (self->sharemode == AUDCLNT_SHAREMODE_SHARED) {
device_period = default_period;
@@ -418,6 +421,33 @@ gst_wasapi_src_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
/* This must always be 0 in shared mode */
self->sharemode == AUDCLNT_SHAREMODE_SHARED ? 0 : device_period,
self->mix_format, NULL);
+
+ if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED &&
+ self->sharemode == AUDCLNT_SHAREMODE_EXCLUSIVE) {
+ guint32 n_frames;
+
+ GST_WARNING_OBJECT (self, "initialize failed due to unaligned period %i",
+ (int) device_period);
+
+ /* Calculate a new aligned period. First get the aligned buffer size. */
+ hr = IAudioClient_GetBufferSize (self->client, &n_frames);
+ if (hr != S_OK) {
+ gchar *msg = gst_wasapi_util_hresult_to_string (hr);
+ GST_ELEMENT_ERROR (self, RESOURCE, OPEN_WRITE, (NULL),
+ ("IAudioClient::GetBufferSize() failed: %s", msg));
+ g_free (msg);
+ goto beach;
+ }
+
+ device_period = (GST_SECOND / 100) * n_frames / rate;
+
+ GST_WARNING_OBJECT (self, "trying to re-initialize with period %i "
+ "(%i frames, %i rate)", (int) device_period, n_frames, rate);
+
+ hr = IAudioClient_Initialize (self->client, self->sharemode,
+ AUDCLNT_STREAMFLAGS_EVENTCALLBACK, device_period,
+ device_period, self->mix_format, NULL);
+ }
if (hr != S_OK) {
gchar *msg = gst_wasapi_util_hresult_to_string (hr);
GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ, (NULL),
@@ -433,8 +463,6 @@ gst_wasapi_src_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
goto beach;
}
- bpf = GST_AUDIO_INFO_BPF (&spec->info);
- rate = GST_AUDIO_INFO_RATE (&spec->info);
GST_INFO_OBJECT (self, "buffer size is %i frames, bpf is %i bytes, "
"rate is %i Hz", buffer_frames, bpf, rate);