diff --git a/sys/osxaudio/gstosxcoreaudio.c b/sys/osxaudio/gstosxcoreaudio.c index b425fb2471..10fcd9c361 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 b81af9cb19..39d03ac5b4 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 a05f384615..c1fefcc3c9 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 d2f2f0bde9..76b0eba32d 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