summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorArun Raghavan <arun@centricular.com>2015-04-06 16:22:34 +0530
committerArun Raghavan <git@arunraghavan.net>2015-07-14 17:49:50 +0530
commit691ecebe227d27914cd6efb1ff86d2d42679d3f3 (patch)
tree03e32121ec0a7fd6b2928deb29d71859fd28503c /sys
parent22f6d62796743530f537d980992a4c1b9866f4f1 (diff)
downloadgstreamer-plugins-good-691ecebe227d27914cd6efb1ff86d2d42679d3f3.tar.gz
osxaudio: Don't set the format on an initialized AudioUnit
We need to initialize the AudioUnit early to be able to probe the underlying device, but according to the AudioUnitInitialize() and AudioUnitUninitialize() documentation, format changes should be done while the AudioUnit is uninitialized. So we explicitly uninitialize the AudioUnit during a format change and reinitialize it when we're done.
Diffstat (limited to 'sys')
-rw-r--r--sys/osxaudio/gstosxcoreaudio.c3
-rw-r--r--sys/osxaudio/gstosxcoreaudiocommon.c2
-rw-r--r--sys/osxaudio/gstosxcoreaudiohal.c18
-rw-r--r--sys/osxaudio/gstosxcoreaudioremoteio.c27
4 files changed, 47 insertions, 3 deletions
diff --git a/sys/osxaudio/gstosxcoreaudio.c b/sys/osxaudio/gstosxcoreaudio.c
index b425fb247..10fcd9c36 100644
--- a/sys/osxaudio/gstosxcoreaudio.c
+++ b/sys/osxaudio/gstosxcoreaudio.c
@@ -168,7 +168,8 @@ gst_core_audio_open (GstCoreAudio * core_audio)
"listener for AudioUnit: %d", (int) status);
}
- /* Initialize the AudioUnit */
+ /* Initialize the AudioUnit. We keep the audio unit initialized early so that
+ * we can probe the underlying device. */
status = AudioUnitInitialize (core_audio->audiounit);
if (status) {
GST_ERROR_OBJECT (core_audio, "Failed to initialize AudioUnit: %d",
diff --git a/sys/osxaudio/gstosxcoreaudiocommon.c b/sys/osxaudio/gstosxcoreaudiocommon.c
index b81af9cb1..39d03ac5b 100644
--- a/sys/osxaudio/gstosxcoreaudiocommon.c
+++ b/sys/osxaudio/gstosxcoreaudiocommon.c
@@ -238,6 +238,7 @@ _core_audio_set_property (GstCoreAudio * core_audio, AudioUnitPropertyID inID,
return TRUE;
}
+/* The AudioUnit must be uninitialized before calling this */
gboolean
gst_core_audio_set_channel_layout (GstCoreAudio * core_audio,
gint channels, GstCaps * caps)
@@ -297,6 +298,7 @@ gst_core_audio_set_channel_layout (GstCoreAudio * core_audio,
return ret;
}
+/* The AudioUnit must be uninitialized before calling this */
gboolean
gst_core_audio_set_format (GstCoreAudio * core_audio,
AudioStreamBasicDescription format)
diff --git a/sys/osxaudio/gstosxcoreaudiohal.c b/sys/osxaudio/gstosxcoreaudiohal.c
index a05f38461..c1fefcc3c 100644
--- a/sys/osxaudio/gstosxcoreaudiohal.c
+++ b/sys/osxaudio/gstosxcoreaudiohal.c
@@ -1123,6 +1123,15 @@ gst_core_audio_initialize_impl (GstCoreAudio * core_audio,
gboolean is_passthrough, guint32 * frame_size)
{
gboolean ret = FALSE;
+ OSStatus status;
+
+ /* Uninitialize the AudioUnit before changing formats */
+ status = AudioUnitUninitialize (core_audio->audiounit);
+ if (status) {
+ GST_ERROR_OBJECT (core_audio, "Failed to uninitialize AudioUnit: %d",
+ (int) status);
+ return FALSE;
+ }
core_audio->is_passthrough = is_passthrough;
if (is_passthrough) {
@@ -1157,9 +1166,18 @@ gst_core_audio_initialize_impl (GstCoreAudio * core_audio,
ret = TRUE;
done:
+ /* Format changed, initialise the AudioUnit again */
+ status = AudioUnitInitialize (core_audio->audiounit);
+ if (status) {
+ GST_ERROR_OBJECT (core_audio, "Failed to initialize AudioUnit: %d",
+ (int) status);
+ ret = FALSE;
+ }
+
if (ret) {
GST_DEBUG_OBJECT (core_audio, "osxbuf ring buffer acquired");
}
+
return ret;
}
diff --git a/sys/osxaudio/gstosxcoreaudioremoteio.c b/sys/osxaudio/gstosxcoreaudioremoteio.c
index d2f2f0bde..76b0eba32 100644
--- a/sys/osxaudio/gstosxcoreaudioremoteio.c
+++ b/sys/osxaudio/gstosxcoreaudioremoteio.c
@@ -84,10 +84,22 @@ gst_core_audio_initialize_impl (GstCoreAudio * core_audio,
AudioStreamBasicDescription format, GstCaps * caps,
gboolean is_passthrough, guint32 * frame_size)
{
+ gboolean ret = FALSE;
+ OSStatus status;
+
+ /* Uninitialize the AudioUnit before changing formats */
+ status = AudioUnitUninitialize (core_audio->audiounit);
+ if (status) {
+ GST_ERROR_OBJECT (core_audio, "Failed to uninitialize AudioUnit: %d",
+ (int) status);
+ return FALSE;
+ }
+
core_audio->is_passthrough = is_passthrough;
core_audio->stream_idx = 0;
+
if (!gst_core_audio_set_format (core_audio, format))
- return FALSE;
+ goto done;
/* FIXME: Use kAudioSessionProperty_CurrentHardwareSampleRate and
* kAudioSessionProperty_CurrentHardwareIOBufferDuration with property
@@ -96,7 +108,18 @@ gst_core_audio_initialize_impl (GstCoreAudio * core_audio,
*frame_size = 4196;
GST_DEBUG_OBJECT (core_audio, "osxbuf ring buffer acquired");
- return TRUE;
+ ret = TRUE;
+
+done:
+ /* Format changed, initialise the AudioUnit again */
+ status = AudioUnitInitialize (core_audio->audiounit);
+ if (status) {
+ GST_ERROR_OBJECT (core_audio, "Failed to initialize AudioUnit: %d",
+ (int) status);
+ ret = FALSE;
+ }
+
+ return ret;
}
static gboolean