From 8e9363e2ae6047517bcaded6f2469430a02ed998 Mon Sep 17 00:00:00 2001
From: Vincent Lucas <chenzo@jitsi.org>
Date: Thu, 17 Oct 2013 18:05:35 +0200
Subject: [PATCH] Changes "MacCoreaudio" audio system name into "Core Audio".
 Corrects wrong detection of input and output devices. Avoids concurrent
 process of the "stop" and "read/write" functions at the native level.

---
 lib/native/mac/libjnmaccoreaudio.jnilib       | Bin 74352 -> 83024 bytes
 ...g_jitsi_impl_neomedia_MacCoreAudioDevice.c |   7 +-
 ...g_jitsi_impl_neomedia_MacCoreAudioDevice.h |   3 +-
 src/native/macosx/coreaudio/lib/device.c      | 691 +++++++++++++-----
 src/native/macosx/coreaudio/lib/device.h      |   1 +
 .../impl/neomedia/MacCoreAudioDevice.java     |   3 +-
 .../jitsi/impl/neomedia/device/Devices.java   |  13 +
 .../neomedia/device/MacCoreaudioSystem.java   |   2 +-
 .../maccoreaudio/MacCoreaudioStream.java      |  11 +-
 .../renderer/audio/MacCoreaudioRenderer.java  |   1 +
 10 files changed, 555 insertions(+), 177 deletions(-)

diff --git a/lib/native/mac/libjnmaccoreaudio.jnilib b/lib/native/mac/libjnmaccoreaudio.jnilib
index 5be4b22878f8b79b21dab272c8c80b913127a3f2..45ab370812c8b7c3337591fa32f8d6e2ccca656d 100755
GIT binary patch
literal 83024
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

literal 74352
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
NcImbK`KW^-{|{89J?8)b

diff --git a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_MacCoreAudioDevice.c b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_MacCoreAudioDevice.c
index 5ec04cd9..31aac0d4 100644
--- a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_MacCoreAudioDevice.c
+++ b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_MacCoreAudioDevice.c
@@ -189,13 +189,14 @@ Java_org_jitsi_impl_neomedia_MacCoreAudioDevice_startStream
         jint bitsPerChannel,
         jboolean isFloat,
         jboolean isBigEndian,
-        jboolean isNonInterleaved)
+        jboolean isNonInterleaved,
+        jboolean isInput)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
     jobject callbackObject = (*env)->NewGlobalRef(env, callback);
     maccoreaudio_stream* stream = NULL;
 
-    if(maccoreaudio_isInputDevice(deviceUIDPtr)) // input
+    if(isInput && maccoreaudio_isInputDevice(deviceUIDPtr)) // input
     {
         jmethodID callbackMethod = maccoreaudio_getCallbackMethodID(
                 env,
@@ -213,7 +214,7 @@ Java_org_jitsi_impl_neomedia_MacCoreAudioDevice_startStream
                 isBigEndian,
                 isNonInterleaved);
     }
-    else if(maccoreaudio_isOutputDevice(deviceUIDPtr)) // output
+    else if(!isInput && maccoreaudio_isOutputDevice(deviceUIDPtr)) // output
     {
         jmethodID callbackMethod = maccoreaudio_getCallbackMethodID(
                 env,
diff --git a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_MacCoreAudioDevice.h b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_MacCoreAudioDevice.h
index 729cbe1d..225dbcca 100644
--- a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_MacCoreAudioDevice.h
+++ b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_MacCoreAudioDevice.h
@@ -93,7 +93,8 @@ JNIEXPORT jlong JNICALL Java_org_jitsi_impl_neomedia_MacCoreAudioDevice_startStr
         jint bitsPerChannel,
         jboolean isFloat,
         jboolean isBigEndian,
-        jboolean isNonInterleaved);
+        jboolean isNonInterleaved,
+        jboolean isInput);
 
 /*
  * Class:     org_jitsi_impl_neomedia_MacCoreAudioDevice
diff --git a/src/native/macosx/coreaudio/lib/device.c b/src/native/macosx/coreaudio/lib/device.c
index d517c2f3..3c9e89f2 100644
--- a/src/native/macosx/coreaudio/lib/device.c
+++ b/src/native/macosx/coreaudio/lib/device.c
@@ -8,6 +8,7 @@
 
 #include <CoreAudio/CoreAudio.h>
 #include <CoreFoundation/CFString.h>
+#include <pthread.h>
 #include <stdio.h>
 
 /**
@@ -135,6 +136,22 @@ OSStatus maccoreaudio_getStreamVirtualFormat(
         AudioStreamID stream,
         AudioStreamBasicDescription * format);
 
+OSStatus
+maccoreaudio_getDeviceFormat(
+        const char * deviceUID,
+        unsigned char isOutput,
+        AudioStreamBasicDescription * deviceFormat);
+
+OSStatus
+maccoreaudio_getDeviceFormatDeprecated(
+        const char * deviceUID,
+        unsigned char isOutput,
+        AudioStreamBasicDescription * deviceFormat);
+
+void
+maccoreaudio_getDefaultFormat(
+        AudioStreamBasicDescription * deviceFormat);
+
 /**
  * Do nothing: there is no need to initializes anything to get device
  * information on MacOsX.
@@ -233,8 +250,10 @@ AudioDeviceID maccoreaudio_getDeviceForSpecificScope(
             kCFStringEncodingASCII)) == NULL)
     {
         fprintf(stderr,
-                "getDevice (coreaudio/device.c): \
-                    \n\tCFStringCreateWithCString\n");
+                "maccoreaudio_getDevice (coreaudio/device.c): \
+                    \n\tCFStringCreateWithCString for device %s\n",
+                    deviceUID);
+        fflush(stderr);
         return kAudioObjectUnknown;
     }
 
@@ -258,9 +277,15 @@ AudioDeviceID maccoreaudio_getDeviceForSpecificScope(
             &translation)) != noErr)
     {
         fprintf(stderr,
-                "getDevice (coreaudio/device.c): \
-                    \n\tAudioObjectGetPropertyData, err: %d\n",
-                ((int) err));
+                "maccoreaudio_getDevice (coreaudio/device.c): \
+                    \n\tAudioObjectGetPropertyData, err: %d for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
+
+        // Frees the allocated device UID ref.
+        CFRelease(deviceUIDRef);
+
         return kAudioObjectUnknown;
     }
 
@@ -331,6 +356,7 @@ char* maccoreaudio_getDefaultDeviceUID(
                 "maccoreaudio_getDefaultDeviceUID (coreaudio/device.c): \
                     \n\tAudioObjectGetPropertyData, err: %d\n",
                     ((int) err));
+        fflush(stderr);
         return NULL;
     }
 
@@ -342,6 +368,7 @@ char* maccoreaudio_getDefaultDeviceUID(
         fprintf(stderr,
                 "maccoreaudio_getDefaultDeviceUID (coreaudio/device.c): \
                     \n\tgetAudioDeviceProperty\n");
+        fflush(stderr);
         return NULL;
     }
 
@@ -399,8 +426,10 @@ char* maccoreaudio_getDeviceProperty(
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "getDeviceProperty (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                "maccoreaudio_getDeviceProperty (coreaudio/device.c): \
+                    \n\tgetDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
         return NULL;
     }
 
@@ -441,9 +470,10 @@ char* maccoreaudio_getAudioDeviceProperty(
             &deviceProperty)) != noErr)
     {
         fprintf(stderr,
-                "getDeviceProperty (coreaudio/device.c): \
+                "maccoreaudio_getDeviceProperty (coreaudio/device.c): \
                     \n\tAudioObjectGetPropertyData, err: %d\n",
                 ((int) err));
+        fflush(stderr);
         return NULL;
     }
 
@@ -455,7 +485,7 @@ char* maccoreaudio_getAudioDeviceProperty(
                 = (char *) malloc(devicePropertyLength * sizeof(char)))
             == NULL)
     {
-        perror("getDeviceProperty (coreaudio/device.c): \
+        perror("maccoreaudio_getDeviceProperty (coreaudio/device.c): \
                     \n\tmalloc\n");
         return NULL;
     }
@@ -539,8 +569,10 @@ OSStatus maccoreaudio_setDeviceVolume(
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "setDeviceVolume (coreaudio/device.c): \
-                    \n\tgetDevice (unknown device for UID: %s)\n", deviceUID);
+                "maccoreaudio_setDeviceVolume (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getDevice (unknown device for UID: %s)\n",
+                    deviceUID);
+        fflush(stderr);
         return -1;
     }
 
@@ -548,9 +580,12 @@ OSStatus maccoreaudio_setDeviceVolume(
     if((maccoreaudio_getChannelsForStereo(deviceUID, channels)) != noErr)
     {
         fprintf(stderr,
-                "setDeviceVolume (coreaudio/device.c): \
-                    \n\tgetChannelsForStereo, err: %d\n",
-                ((int) err));
+                "maccoreaudio_setDeviceVolume (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getChannelsForStereo, err: %d \
+                    for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
         return err;
     }
 
@@ -586,9 +621,12 @@ OSStatus maccoreaudio_setDeviceVolume(
                     &volume)) != noErr)
             {
                 fprintf(stderr,
-                        "setDeviceVolume (coreaudio/device.c): \
-                            \n\tAudioObjectSetPropertyData, err: %d\n",
-                        ((int) err));
+                        "maccoreaudio_setDeviceVolume (coreaudio/device.c): \
+                            \n\tAudioObjectSetPropertyData, err: %d \
+                            for device %s\n",
+                            ((int) err),
+                            deviceUID);
+                fflush(stderr);
                 return err;
             }
         }
@@ -656,8 +694,10 @@ Float32 maccoreaudio_getDeviceVolume(
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "getDeviceVolume (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                "maccoreaudio_getDeviceVolume (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
         return -1.0;
     }
 
@@ -665,9 +705,12 @@ Float32 maccoreaudio_getDeviceVolume(
     if((maccoreaudio_getChannelsForStereo(deviceUID, channels)) != noErr)
     {
         fprintf(stderr,
-                "getDeviceVolume (coreaudio/device.c): \
-                    \n\tgetChannelsForStereo, err: %d\n",
-                ((int) err));
+                "maccoreaudio_getDeviceVolume (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getChannelsForStereo, err: %d \
+                    for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
         return -1.0;
     }
 
@@ -703,9 +746,12 @@ Float32 maccoreaudio_getDeviceVolume(
                     &volume)) != noErr)
             {
                 fprintf(stderr,
-                        "getDeviceVolume (coreaudio/device.c): \
-                            \n\tAudioObjectSetPropertyData, err: %d\n",
-                        ((int) err));
+                        "maccoreaudio_getDeviceVolume (coreaudio/device.c): \
+                            \n\tAudioObjectSetPropertyData, err: %d \
+                            for device %s\n",
+                            ((int) err),
+                            deviceUID);
+                fflush(stderr);
                 return -1.0;
             }
         }
@@ -737,8 +783,10 @@ OSStatus maccoreaudio_getChannelsForStereo(
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "getChannelsForStereo (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                "maccoreaudio_getChannelsForStereo (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
         return -1;
     }
 
@@ -756,9 +804,11 @@ OSStatus maccoreaudio_getChannelsForStereo(
             channels)) != noErr)
     {
         fprintf(stderr,
-                "getChannelsForStereo (coreaudio/device.c): \
-                    \n\tAudioObjectGetPropertyData, err: %d\n",
-                ((int) err));
+                "maccoreaudio_getChannelsForStereo (coreaudio/device.c): \
+                    \n\tAudioObjectGetPropertyData, err: %d for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
         return err;
     }
 
@@ -823,8 +873,10 @@ int maccoreaudio_countChannels(
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "getChannelsForStereo (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                "maccoreaudio_countChannels (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
         return -1;
     }
 
@@ -837,8 +889,11 @@ int maccoreaudio_countChannels(
     {
         fprintf(stderr,
                 "maccoreaudio_countChannels (coreaudio/device.c): \
-                    \n\tAudioObjectGetPropertyDataSize, err: %d\n",
-                    ((int) err));
+                    \n\tAudioObjectGetPropertyDataSize, err: %d \
+                    for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
         return -1;
     }
 
@@ -860,8 +915,10 @@ int maccoreaudio_countChannels(
     {
         fprintf(stderr,
                 "maccoreaudio_countChannels (coreaudio/device.c): \
-                    \n\tAudioObjectGetPropertyData, err: %d\n",
-                    ((int) err));
+                    \n\tAudioObjectGetPropertyData, err: %d for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
         return -1;
     }
     for(i = 0; i < audioBufferList->mNumberBuffers; ++i)
@@ -894,8 +951,10 @@ Float64 maccoreaudio_getNominalSampleRate(
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "getNominalSampleRate (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                "maccoreaudio_getNominalSampleRate (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
         return -1.0;
     }
 
@@ -915,9 +974,11 @@ Float64 maccoreaudio_getNominalSampleRate(
             != noErr)
     {
         fprintf(stderr,
-                "getNominalSampleRate (coreaudio/device.c): \
-                    \n\tAudioObjactGetPropertyData, err: %d\n",
-                    (int) err);
+                "maccoreaudio_getNominalSampleRate (coreaudio/device.c): \
+                    \n\tAudioObjactGetPropertyData, err: %d for device %s\n",
+                    (int) err,
+                    deviceUID);
+        fflush(stderr);
         return -1.0;
     }
 
@@ -950,8 +1011,11 @@ OSStatus maccoreaudio_getAvailableNominalSampleRates(
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "getAvailableNominalSampleRates (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                "maccoreaudio_getAvailableNominalSampleRates \
+                    (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
         return -1.0;
     }
 
@@ -971,9 +1035,12 @@ OSStatus maccoreaudio_getAvailableNominalSampleRates(
             != noErr)
     {
         fprintf(stderr,
-                "getAvailableNominalSampleRates (coreaudio/device.c): \
-                    \n\tAudioObjactGetPropertyData, err: %d\n",
-                    (int) err);
+                "maccoreaudio_getAvailableNominalSampleRates \
+                    (coreaudio/device.c): \
+                    \n\tAudioObjactGetPropertyData, err: %d for device %s\n",
+                    (int) err,
+                    deviceUID);
+        fflush(stderr);
         return -1.0;
     }
 
@@ -1015,9 +1082,10 @@ int maccoreaudio_getDeviceUIDList(
             != noErr)
     {
         fprintf(stderr,
-                "getDeviceUIDList (coreaudio/device.c): \
+                "maccoreaudio_getDeviceUIDList (coreaudio/device.c): \
                     \n\tAudioObjectGetPropertyDataSize, err: %d\n",
                     ((int) err));
+        fflush(stderr);
         return -1;
     }
 
@@ -1026,7 +1094,7 @@ int maccoreaudio_getDeviceUIDList(
     if((devices = (AudioDeviceID*) malloc(nbDevices * sizeof(AudioDeviceID)))
             == NULL)
     {
-        perror("getDeviceUIDList (coreaudio/device.c): \
+        perror("maccoreaudio_getDeviceUIDList (coreaudio/device.c): \
                     \n\tmalloc\n");
         return -1;
     }
@@ -1042,9 +1110,10 @@ int maccoreaudio_getDeviceUIDList(
     {
         free(devices);
         fprintf(stderr,
-                "getDeviceUIDList (coreaudio/device.c): \
+                "maccoreaudio_getDeviceUIDList (coreaudio/device.c): \
                     \n\tAudioObjectGetPropertyData, err: %d\n",
                     ((int) err));
+        fflush(stderr);
         return -1;
     }
 
@@ -1052,7 +1121,7 @@ int maccoreaudio_getDeviceUIDList(
             == NULL)
     {
         free(devices);
-        perror("getDeviceUIDList (coreaudio/device.c): \
+        perror("maccoreaudio_getDeviceUIDList (coreaudio/device.c): \
                     \n\tmalloc\n");
         return -1;
     }
@@ -1073,8 +1142,9 @@ int maccoreaudio_getDeviceUIDList(
             free(*deviceUIDList);
             free(devices);
             fprintf(stderr,
-                    "getDeviceUIDList (coreaudio/device.c): \
-                    \n\tgetAudioDeviceProperty\n");
+                    "maccoreaudio_getDeviceUIDList (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getAudioDeviceProperty\n");
+            fflush(stderr);
             return -1;
         }
     }
@@ -1097,11 +1167,18 @@ void maccoreaudio_initializeHotplug(
         kAudioObjectPropertyElementMaster
     };
 
-    AudioObjectAddPropertyListener(
-            kAudioObjectSystemObject,
-            &address,
-            maccoreaudio_devicesChangedCallback,
-            callbackFunction);
+    if(AudioObjectAddPropertyListener(
+                kAudioObjectSystemObject,
+                &address,
+                maccoreaudio_devicesChangedCallback,
+                callbackFunction)
+            != noErr)
+    {
+        fprintf(stderr,
+                "maccoreaudio_initializeHotplug (coreaudio/device.c): \
+                    \n\tAudioObjectAddPropertyListener\n");
+        fflush(stderr);
+    }
 }
 
 /**
@@ -1116,11 +1193,18 @@ void maccoreaudio_uninitializeHotplug()
         kAudioObjectPropertyElementMaster
     };
 
-    AudioObjectRemovePropertyListener(
-            kAudioObjectSystemObject,
-            &address,
-            maccoreaudio_devicesChangedCallback,
-            NULL);
+    if(AudioObjectRemovePropertyListener(
+                kAudioObjectSystemObject,
+                &address,
+                maccoreaudio_devicesChangedCallback,
+                NULL)
+            != noErr)
+    {
+        fprintf(stderr,
+                "maccoreaudio_uninitializeHotplug (coreaudio/device.c): \
+                    \n\tAudioObjectRemovePropertyListener\n");
+        fflush(stderr);
+    }
 }
 
 /**
@@ -1165,7 +1249,9 @@ const char* maccoreaudio_getTransportType(
     {
         fprintf(stderr,
                 "maccoreaudio_getTransportType (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                    \n\tgetDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
         return NULL;
     }
     // target device transport type property
@@ -1188,8 +1274,10 @@ const char* maccoreaudio_getTransportType(
     {
         fprintf(stderr,
                 "maccoreaudio_getTransportType (coreaudio/device.c): \
-                    \n\tAudioObjectGetPropertyData: err: %d\n",
-                    (int) err);
+                    \n\tAudioObjectGetPropertyData: err: 0x%x for device %s\n",
+                    (int) err,
+                    deviceUID);
+        fflush(stderr);
         return NULL;
     }
 
@@ -1238,6 +1326,11 @@ const char* maccoreaudio_getTransportType(
             return transportTypeVirtual;
             break;
         default:
+            fprintf(stderr,
+                    "maccoreaudio_getTransportType (coreaudio/device.c): \
+                        \n\tNo transport type found for device %s\n",
+                        deviceUID);
+            fflush(stderr);
             return NULL;
             break;
     }
@@ -1320,13 +1413,16 @@ maccoreaudio_stream * maccoreaudio_startStream(
         unsigned char isNonInterleaved)
 {
     AudioDeviceID device;
+    OSStatus err = noErr;
 
     // Gets the correspoding device
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
                 "maccoreaudio_startStream (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                    \n\tmaccoreaudio_getDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
         return NULL;
     }
 
@@ -1344,6 +1440,14 @@ maccoreaudio_stream * maccoreaudio_startStream(
     stream->callbackObject = callbackObject;
     stream->callbackMethod = callbackMethod;
 
+    if(pthread_mutex_init(&stream->mutex, NULL) != 0)
+    {
+        perror("maccoreaudio_startStream (coreaudio/device.c): \
+                    \n\tpthread_mutex_init\n");
+        free(stream);
+        return NULL;
+    }
+
     AudioStreamBasicDescription javaFormat;
     FillOutASBDForLPCM(
             &javaFormat,
@@ -1354,65 +1458,137 @@ maccoreaudio_stream * maccoreaudio_startStream(
             isFloat,
             isBigEndian,
             isNonInterleaved); 
-    if(maccoreaudio_initConverter(
+    if((err = maccoreaudio_initConverter(
                 deviceUID,
                 &javaFormat,
                 isJavaFormatSource,
                 &stream->converter,
-                &stream->conversionRatio)
+                &stream->conversionRatio))
             != noErr)
     {
-        free(stream);
         fprintf(stderr,
                 "maccoreaudio_startStream (coreaudio/device.c): \
-                    \n\tmaccoreaudio_initConverter\n");
+                    \n\tmaccoreaudio_initConverter: 0x%x for device %s\n",
+                    (int) err,
+                    deviceUID);
+        fflush(stderr);
+        pthread_mutex_destroy(&stream->mutex);
+        free(stream);
         return NULL;
     }
 
     //  register the IOProc
-    if(AudioDeviceCreateIOProcID(
+    if((err = AudioDeviceCreateIOProcID(
             device,
             readWriteFunction,
             stream,
-            &stream->ioProcId) != noErr)
+            &stream->ioProcId)) != noErr)
     {
-        free(stream);
         fprintf(stderr,
                 "maccoreaudio_startStream (coreaudio/device.c): \
-                    \n\tAudioDeviceIOProcID\n");
+                    \n\tAudioDeviceIOProcID: 0x%x for device %s\n",
+                    (int) err,
+                    deviceUID);
+        fflush(stderr);
+        AudioConverterDispose(stream->converter);
+        pthread_mutex_destroy(&stream->mutex);
+        free(stream);
         return NULL;
     }
 
     //  start IO
-    AudioDeviceStart(device, stream->ioProcId);
+    if((err = AudioDeviceStart(device, stream->ioProcId)) != noErr)
+    {
+        fprintf(stderr,
+                "maccoreaudio_startStream (coreaudio/device.c): \
+                    \n\tAudioDeviceStart: 0x%x for device %s\n",
+                    (int) err,
+                    deviceUID);
+        fflush(stderr);
+        AudioDeviceDestroyIOProcID(device, stream->ioProcId);
+        AudioConverterDispose(stream->converter);
+        pthread_mutex_destroy(&stream->mutex);
+        free(stream);
+        return NULL;
+    }
 
     return stream;
 }
 
+/**
+ * Stops the stream for the given device.
+ *
+ * @param deviceUID The device identifier.
+ * @param stream The stream to stop.
+ */
 void maccoreaudio_stopStream(
         const char * deviceUID,
         maccoreaudio_stream * stream)
 {
     AudioDeviceID device;
+    OSStatus err = noErr;
+
+    if(pthread_mutex_lock(&stream->mutex) != 0)
+    {
+        perror("maccoreaudio_stopStream (coreaudio/device.c): \
+                \n\tpthread_mutex_lock\n");
+    }
 
     // Gets the correspoding device
     if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
                 "maccoreaudio_stopStream (coreaudio/device.c): \
-                    \n\tgetDevice: %s\n",
+                    \n\tmaccoreaudio_getDevice: %s\n",
                     deviceUID);
         fflush(stderr);
-        return;
+    }
+    else
+    {
+        //  stop IO
+        if((err = AudioDeviceStop(device, stream->ioProcId)) != noErr)
+        {
+            fprintf(stderr,
+                    "maccoreaudio_stopStream (coreaudio/device.c): \
+                        \n\tAudioDeviceStop: 0x%x for device %s\n",
+                        (int) err,
+                        deviceUID);
+            fflush(stderr);
+        }
+        //  unregister the IOProc
+        if((err = AudioDeviceDestroyIOProcID(device, stream->ioProcId))
+                != noErr)
+        {
+            fprintf(stderr,
+                    "maccoreaudio_stopStream (coreaudio/device.c): \
+                        \n\tAudioDeviceDestroyIOProcID: 0x%x for device %s\n",
+                        (int) err,
+                        deviceUID);
+            fflush(stderr);
+        }
     }
 
-    //  stop IO
-    AudioDeviceStop(device, stream->ioProcId);
-
-    //  unregister the IOProc
-    AudioDeviceDestroyIOProcID(device, stream->ioProcId);
+    if((err = AudioConverterDispose(stream->converter)) != noErr)
+    {
+        fprintf(stderr,
+                "maccoreaudio_stopStream (coreaudio/device.c): \
+                \n\tAudioConverterDispose: 0x%x for device %s\n",
+                (int) err,
+                deviceUID);
+        fflush(stderr);
+    }
 
-    AudioConverterDispose(stream->converter);
+    stream->ioProcId = 0;
+    if(pthread_mutex_unlock(&stream->mutex) != 0)
+    {
+        perror("maccoreaudio_stopStream (coreaudio/device.c): \
+                \n\tpthread_mutex_unlock\n");
+    }
+    if(pthread_mutex_destroy(&stream->mutex) != 0)
+    {
+        perror("maccoreaudio_stopStream (coreaudio/device.c): \
+                \n\tpthread_mutex_destroy\n");
+    }
 
     free(stream);
 }
@@ -1434,34 +1610,52 @@ OSStatus maccoreaudio_readInputStream(
         = inInputData->mBuffers[0].mDataByteSize * stream->conversionRatio;
     char tmpBuffer[tmpLength];
     int i;
-    for(i = 0; i < inInputData->mNumberBuffers; ++i)
+
+    if(pthread_mutex_lock(&stream->mutex) == 0)
     {
-        if(inInputData->mBuffers[i].mData != NULL
-                && inInputData->mBuffers[i].mDataByteSize > 0)
+        if(stream->ioProcId != 0)
         {
-            if((err = AudioConverterConvertBuffer(
-                            stream->converter,
-                            inInputData->mBuffers[i].mDataByteSize,
-                            inInputData->mBuffers[i].mData,
-                            &tmpLength,
-                            tmpBuffer))
-                    != noErr)
+            for(i = 0; i < inInputData->mNumberBuffers; ++i)
             {
-                fprintf(stderr,
+                if(inInputData->mBuffers[i].mData != NULL
+                        && inInputData->mBuffers[i].mDataByteSize > 0)
+                {
+                    if((err = AudioConverterConvertBuffer(
+                                    stream->converter,
+                                    inInputData->mBuffers[i].mDataByteSize,
+                                    inInputData->mBuffers[i].mData,
+                                    &tmpLength,
+                                    tmpBuffer))
+                            != noErr)
+                    {
+                        fprintf(stderr,
                         "maccoreaudio_readInputStream (coreaudio/device.c): \
-                            \n\tAudioConverterConvertBuffer: %x\n",
-                            (int) err);
-                fflush(stderr);
-                return err;
+                                \n\tAudioConverterConvertBuffer: 0x%x\n",
+                                (int) err);
+                        fflush(stderr);
+                        pthread_mutex_unlock(&stream->mutex);
+                        return err;
+                    }
+
+                    callbackFunction(
+                            tmpBuffer,
+                            tmpLength,
+                            stream->callbackObject,
+                            stream->callbackMethod);
+                }
             }
-
-            callbackFunction(
-                    tmpBuffer,
-                    tmpLength,
-                    stream->callbackObject,
-                    stream->callbackMethod);
+        }
+        if(pthread_mutex_unlock(&stream->mutex) != 0)
+        {
+            perror("maccoreaudio_readInputStream (coreaudio/device.c): \
+                    \n\tpthread_mutex_unlock\n");
         }
     }
+    else
+    {
+        perror("maccoreaudio_readInputStream (coreaudio/device.c): \
+                \n\tpthread_mutex_lock\n");
+    }
 
     return noErr;
 }
@@ -1490,25 +1684,46 @@ OSStatus maccoreaudio_writeOutputStream(
         = outOutputData->mBuffers[0].mDataByteSize * stream->conversionRatio;
     char tmpBuffer[tmpLength];
 
-    callbackFunction(
-            tmpBuffer,
-            tmpLength,
-            stream->callbackObject,
-            stream->callbackMethod);
-
-    if((err = AudioConverterConvertBuffer(
-                    stream->converter,
-                    tmpLength,
+    if(pthread_mutex_lock(&stream->mutex) == 0)
+    {
+        if(stream->ioProcId != 0)
+        {
+            callbackFunction(
                     tmpBuffer,
-                    &outOutputData->mBuffers[0].mDataByteSize,
-                    outOutputData->mBuffers[0].mData))
-            != noErr)
+                    tmpLength,
+                    stream->callbackObject,
+                    stream->callbackMethod);
+
+            if((err = AudioConverterConvertBuffer(
+                            stream->converter,
+                            tmpLength,
+                            tmpBuffer,
+                            &outOutputData->mBuffers[0].mDataByteSize,
+                            outOutputData->mBuffers[0].mData))
+                    != noErr)
+            {
+                fprintf(stderr,
+                        "maccoreaudio_writeOutputStream (coreaudio/device.c): \
+                        \n\tAudioConverterConvertBuffer: 0x%x\n", (int) err);
+                fflush(stderr);
+                memset(
+                        outOutputData->mBuffers[0].mData,
+                        0,
+                        outOutputData->mBuffers[0].mDataByteSize);
+                pthread_mutex_unlock(&stream->mutex);
+                return err;
+            }
+        }
+        if(pthread_mutex_unlock(&stream->mutex) != 0)
+        {
+            perror("maccoreaudio_writeOutputStream (coreaudio/device.c): \
+                    \n\tpthread_mutex_unlock\n");
+        }
+    }
+    else
     {
-        fprintf(stderr,
-                "maccoreaudio_writeOutputStream (coreaudio/device.c): \
-                    \n\tAudioConverterConvertBuffer\n");
-        fflush(stderr);
-        return err;
+        perror("maccoreaudio_writeOutputStream (coreaudio/device.c): \
+                \n\tpthread_mutex_lock\n");
     }
 
     // Copies the same data into the other buffers.
@@ -1602,56 +1817,38 @@ OSStatus maccoreaudio_initConverter(
         AudioConverterRef * converter,
         double * conversionRatio)
 {
-    AudioDeviceID device;
+    AudioStreamBasicDescription deviceFormat;
     OSStatus err = noErr;
-    AudioObjectPropertyAddress address;
-
-    // Gets the correspoding device
-    if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
+    if((err = maccoreaudio_getDeviceFormat(
+                    deviceUID,
+                    isJavaFormatSource,
+                    &deviceFormat))
+            != noErr)
     {
         fprintf(stderr,
                 "maccoreaudio_initConverter (coreaudio/device.c): \
-                    \n\tgetDevice\n");
+                    \n\tmaccoreaudio_getDeviceFormat for device: %s\n",
+                    deviceUID);
         fflush(stderr);
-        return kAudioObjectUnknown;
-    }
 
-    AudioStreamBasicDescription deviceFormat;
-    AudioStreamID audioStreamIds[1];
-    UInt32 size = sizeof(AudioStreamID *);
-    address.mSelector = kAudioDevicePropertyStreams;
-    address.mScope = kAudioObjectPropertyScopeGlobal;
-    address.mElement = kAudioObjectPropertyElementMaster;
-    if((err = AudioObjectGetPropertyData(
-                    device,
-                    &address,
-                    0,
-                    NULL,
-                    &size,
-                    &audioStreamIds))
-            != noErr)
-    {
-        fprintf(stderr,
-                "maccoreaudio_countChannels (coreaudio/device.c): \
-                    \n\tAudioObjectGetPropertyData, err: 0x%x\n",
-                    ((int) err));
-        fflush(stderr);
-        return err;
-    }
+        if((err = maccoreaudio_getDeviceFormatDeprecated(
+                        deviceUID,
+                        isJavaFormatSource,
+                        &deviceFormat)) != noErr)
+        {
+            fprintf(stderr,
+                    "maccoreaudio_initConverter (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getDeviceFormatDeprecated \
+                    for device: %s\n",
+                    deviceUID);
+            fflush(stderr);
 
-    if((err = maccoreaudio_getStreamVirtualFormat(
-                    audioStreamIds[0],
-                    &deviceFormat))
-                != noErr)
-    {
-        fprintf(stderr,
-                "maccoreaudio_countChannels (coreaudio/device.c): \
-                    \n\tmaccoreaudiogetStreamVirtualFormat, err: 0x%x\n",
-                    ((int) err));
-        fflush(stderr);
-        return err;
+            // Everything has failed to retrieve the device format, then try
+            // with the default one.
+            maccoreaudio_getDefaultFormat(&deviceFormat);
+        }
     }
-    
+
     const AudioStreamBasicDescription *inFormat = javaFormat;
     const AudioStreamBasicDescription *outFormat = &deviceFormat;
     if(!isJavaFormatSource)
@@ -1664,7 +1861,7 @@ OSStatus maccoreaudio_initConverter(
             != noErr)
     {
         fprintf(stderr,
-                "maccoreaudio_countChannels (coreaudio/device.c): \
+                "maccoreaudio_initConverter (coreaudio/device.c): \
                     \n\tAudioConverterNew, err: 0x%x\n",
                     ((int) err));
         fflush(stderr);
@@ -1672,9 +1869,8 @@ OSStatus maccoreaudio_initConverter(
     }
 
     *conversionRatio =
-        ((double) javaFormat->mBytesPerFrame)
-            / ((double) deviceFormat.mBytesPerFrame)
-        * javaFormat->mSampleRate / deviceFormat.mSampleRate;
+        ((double) javaFormat->mBytesPerFrame * javaFormat->mSampleRate)
+            / ((double) deviceFormat.mBytesPerFrame * deviceFormat.mSampleRate);
 
     return err;
 }
@@ -1750,3 +1946,164 @@ inline void FillOutASBDForLPCM(
     outASBD->mChannelsPerFrame = inChannelsPerFrame;
     outASBD->mBitsPerChannel = inValidBitsPerChannel;
 }
+
+/**
+ * Returns the device format.
+ *
+ * @param deviceUID The device identifier.
+ * @param isOutput True if the device is an output device.
+ * @param deviceFormat The structure to fill in with the device format.
+ *
+ * @return noErr if everything works fine. Any other value for an error.
+ */
+OSStatus
+maccoreaudio_getDeviceFormat(
+        const char * deviceUID,
+        unsigned char isOutput,
+        AudioStreamBasicDescription * deviceFormat)
+{
+    AudioDeviceID device;
+    OSStatus err = noErr;
+    AudioObjectPropertyAddress address;
+
+    // Gets the correspoding device
+    if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
+    {
+        fprintf(stderr,
+                "maccoreaudio_getDeviceFormat (coreaudio/device.c): \
+                    \n\tgetDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
+        return kAudioObjectUnknown;
+    }
+
+    AudioStreamID audioStreamIds[1];
+    UInt32 size = sizeof(AudioStreamID *);
+    address.mSelector = kAudioDevicePropertyStreams;
+    if(isOutput)
+    {
+        address.mScope = kAudioDevicePropertyScopeOutput;
+    }
+    else
+    {
+        address.mScope = kAudioDevicePropertyScopeInput;
+    }
+    address.mElement = kAudioObjectPropertyElementMaster;
+    if((err = AudioObjectGetPropertyData(
+                    device,
+                    &address,
+                    0,
+                    NULL,
+                    &size,
+                    &audioStreamIds))
+            != noErr)
+    {
+        fprintf(stderr,
+                "maccoreaudio_getDeviceFormat (coreaudio/device.c): \
+                    \n\tAudioObjectGetPropertyData, err: 0x%x for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
+        return err;
+    }
+
+    if((err = maccoreaudio_getStreamVirtualFormat(
+                    audioStreamIds[0],
+                    deviceFormat))
+                != noErr)
+    {
+        fprintf(stderr,
+                "maccoreaudio_getDeviceFormat (coreaudio/device.c): \
+                    \n\tmaccoreaudio_getStreamVirtualFormat, err: 0x%x\
+                    for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
+        return err;
+    }
+
+    return err;
+}
+
+/**
+ * Returns the device format using deprecated property.
+ *
+ * @param deviceUID The device identifier.
+ * @param isOutput True if the device is an output device.
+ * @param deviceFormat The structure to fill in with the device format.
+ *
+ * @return noErr if everything works fine. Any other value for an error.
+ */
+OSStatus
+maccoreaudio_getDeviceFormatDeprecated(
+        const char * deviceUID,
+        unsigned char isOutput,
+        AudioStreamBasicDescription * deviceFormat)
+{
+    AudioDeviceID device;
+    OSStatus err = noErr;
+    AudioObjectPropertyAddress address;
+
+    // Gets the correspoding device
+    if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown)
+    {
+        fprintf(stderr,
+                "maccoreaudio_getDeviceFormatDeprecated (coreaudio/device.c): \
+                    \n\tgetDevice: %s\n",
+                    deviceUID);
+        fflush(stderr);
+        return kAudioObjectUnknown;
+    }
+
+    UInt32 size = sizeof(AudioStreamBasicDescription);
+    // This property ought to some day be deprecated.
+    address.mSelector = kAudioDevicePropertyStreamFormat;
+    if(isOutput)
+    {
+        address.mScope = kAudioDevicePropertyScopeOutput;
+    }
+    else
+    {
+        address.mScope = kAudioDevicePropertyScopeInput;
+    }
+    address.mElement = kAudioObjectPropertyElementMaster;
+
+    if((err = AudioObjectGetPropertyData(
+                    device,
+                    &address,
+                    0,
+                    NULL,
+                    &size,
+                    deviceFormat))
+            != noErr)
+    {
+        fprintf(stderr,
+                "maccoreaudio_getDeviceFormatDeprecated (coreaudio/device.c): \
+                    \n\tAudioObjectGetPropertyData err: 0x%x for device %s\n",
+                    ((int) err),
+                    deviceUID);
+        fflush(stderr);
+    }
+
+    return err;
+}
+
+/**
+ * Returns the default format.
+ *
+ * @param deviceFormat The structure to fill in with the default format.
+ */
+void
+maccoreaudio_getDefaultFormat(
+        AudioStreamBasicDescription * deviceFormat)
+{
+    FillOutASBDForLPCM(
+            deviceFormat,
+            44100.0,
+            2,
+            8 * sizeof(AudioUnitSampleType),    // 32
+            8 * sizeof(AudioUnitSampleType),    // 32
+            true,
+            false,
+            false);
+}
diff --git a/src/native/macosx/coreaudio/lib/device.h b/src/native/macosx/coreaudio/lib/device.h
index b13fc50f..829375bf 100644
--- a/src/native/macosx/coreaudio/lib/device.h
+++ b/src/native/macosx/coreaudio/lib/device.h
@@ -26,6 +26,7 @@ typedef struct
     void* callbackMethod;
     AudioConverterRef converter;
     double conversionRatio;
+    pthread_mutex_t mutex;
 } maccoreaudio_stream;
 
 int maccoreaudio_initDevices(
diff --git a/src/org/jitsi/impl/neomedia/MacCoreAudioDevice.java b/src/org/jitsi/impl/neomedia/MacCoreAudioDevice.java
index 530ce28f..abae38c8 100644
--- a/src/org/jitsi/impl/neomedia/MacCoreAudioDevice.java
+++ b/src/org/jitsi/impl/neomedia/MacCoreAudioDevice.java
@@ -86,7 +86,8 @@ public static native long startStream(
             int bitsPerChannel,
             boolean isFloat,
             boolean isBigEndian,
-            boolean isNonInterleaved);
+            boolean isNonInterleaved,
+            boolean isInput);
 
     public static native void stopStream(String deviceUID, long stream);
 
diff --git a/src/org/jitsi/impl/neomedia/device/Devices.java b/src/org/jitsi/impl/neomedia/device/Devices.java
index 49deeb96..9cc4fa94 100644
--- a/src/org/jitsi/impl/neomedia/device/Devices.java
+++ b/src/org/jitsi/impl/neomedia/device/Devices.java
@@ -162,6 +162,8 @@ public CaptureDeviceInfo2 getSelectedDevice(
             loadDevicePreferences(property);
             renameOldFashionedIdentifier(activeDevices);
 
+            boolean isEmptyList = devicePreferences.isEmpty();
+
             // Search if an active device is a new one (is not stored in the
             // preferences yet). If true, then active this device and set it as
             // default device (only for USB devices since the user has
@@ -188,6 +190,17 @@ public CaptureDeviceInfo2 getSelectedDevice(
                         isSelected = false;
                     }
 
+                    // When initiates the first list (when there is no user
+                    // preferences yet), set the Bluetooh and Airplay to the end
+                    // of the list (this corresponds to move all other type
+                    // of devices on top of the preference list).
+                    if(isEmptyList
+                            && !activeDevice.isSameTransportType("Bluetooth")
+                            && !activeDevice.isSameTransportType("AirPlay"))
+                    {
+                        isSelected = true;
+                    }
+
                     // Adds the device in the preference list (to the end of the
                     // list, or on top if selected.
                     saveDevice(property, activeDevice, isSelected);
diff --git a/src/org/jitsi/impl/neomedia/device/MacCoreaudioSystem.java b/src/org/jitsi/impl/neomedia/device/MacCoreaudioSystem.java
index 20d1e8b3..1363804c 100644
--- a/src/org/jitsi/impl/neomedia/device/MacCoreaudioSystem.java
+++ b/src/org/jitsi/impl/neomedia/device/MacCoreaudioSystem.java
@@ -779,6 +779,6 @@ private void reinitialize()
     @Override
     public String toString()
     {
-        return "MacCoreaudio";
+        return "Core Audio";
     }
 }
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/maccoreaudio/MacCoreaudioStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/maccoreaudio/MacCoreaudioStream.java
index 1289c46a..8f14c37f 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/maccoreaudio/MacCoreaudioStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/maccoreaudio/MacCoreaudioStream.java
@@ -121,9 +121,11 @@ public void didUpdateAvailableDeviceList()
                 {
                     synchronized(startStopMutex)
                     {
-                        setDeviceUID(deviceUID);
-                        if(start)
+                        if(stream == 0 && start)
+                        {
+                            setDeviceUID(deviceUID);
                             start();
+                        }
                         deviceUID = null;
                         start = false;
                     }
@@ -134,7 +136,7 @@ public void willUpdateAvailableDeviceList()
                 {
                     synchronized(startStopMutex)
                     {
-                        if (stream == 0)
+                        if(stream == 0)
                         {
                             deviceUID = null;
                             start = false;
@@ -369,7 +371,8 @@ public void start()
                         format.getSampleSizeInBits(),
                         false,
                         format.getEndian() == AudioFormat.BIG_ENDIAN,
-                        false);
+                        false,
+                        true);
                 MacCoreaudioSystem.didOpenStream();
             }
         }
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/renderer/audio/MacCoreaudioRenderer.java b/src/org/jitsi/impl/neomedia/jmfext/media/renderer/audio/MacCoreaudioRenderer.java
index c5a30e1b..ac803615 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/renderer/audio/MacCoreaudioRenderer.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/renderer/audio/MacCoreaudioRenderer.java
@@ -448,6 +448,7 @@ public void start()
                         inputFormat.getSampleSizeInBits(),
                         false,
                         inputFormat.getEndian() == AudioFormat.BIG_ENDIAN,
+                        false,
                         false);
                 MacCoreaudioSystem.didOpenStream();
             }
-- 
GitLab