From 59224f03df4f05fe7be9152e394fa2e81d71b53e Mon Sep 17 00:00:00 2001
From: Vincent Lucas <chenzo@jitsi.org>
Date: Thu, 20 Dec 2012 17:08:48 +0000
Subject: [PATCH] Adds a way to retrieve the model identifier for audio
 devices: this allows an USB device without a serial number to be recognized
 as a single device regardless of the USB port used. MacOsX part only.

---
 lib/native/mac/libjnmaccoreaudio.jnilib       | Bin 35144 -> 35600 bytes
 ...org_jitsi_impl_neomedia_CoreAudioDevice.c} |  41 ++++++--
 .../org_jitsi_impl_neomedia_CoreAudioDevice.h |  77 +++++++++++++++
 ...pl_neomedia_maccoreaudio_CoreAudioDevice.h |  60 ------------
 src/native/macosx/coreaudio/lib/device.c      |  89 ++++++++++++++----
 src/native/macosx/coreaudio/lib/device.h      |   7 ++
 ...org_jitsi_impl_neomedia_CoreAudioDevice.c} |  16 ++--
 .../org_jitsi_impl_neomedia_CoreAudioDevice.h |  77 +++++++++++++++
 ...pl_neomedia_wincoreaudio_CoreAudioDevice.h |  69 --------------
 .../{wincoreaudio => }/CoreAudioDevice.java   |  36 +++++--
 .../jitsi/impl/neomedia/device/Devices.java   |  13 +--
 .../device/ExtendedCaptureDeviceInfo.java     |  34 ++++++-
 .../impl/neomedia/device/PortAudioSystem.java |   5 +-
 .../neomedia/device/PulseAudioSystem.java     |   4 +
 .../maccoreaudio/CoreAudioDevice.java         |  51 ----------
 15 files changed, 350 insertions(+), 229 deletions(-)
 rename src/native/macosx/coreaudio/jni/{org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.c => org_jitsi_impl_neomedia_CoreAudioDevice.c} (69%)
 create mode 100644 src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
 delete mode 100644 src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h
 rename src/native/windows/coreaudio/jni/{org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.c => org_jitsi_impl_neomedia_CoreAudioDevice.c} (82%)
 create mode 100644 src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
 delete mode 100644 src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h
 rename src/org/jitsi/impl/neomedia/{wincoreaudio => }/CoreAudioDevice.java (57%)
 delete mode 100644 src/org/jitsi/impl/neomedia/maccoreaudio/CoreAudioDevice.java

diff --git a/lib/native/mac/libjnmaccoreaudio.jnilib b/lib/native/mac/libjnmaccoreaudio.jnilib
index 320601a6d1e7e5fe3897e225ef5efb88cf19341b..36b14be8817c9e4c79dcf50bdc6e2017a6509850 100755
GIT binary patch
delta 5858
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
Y|AN9w{@<Y-UFrC4o9r;%3g!s;5BI3#9RL6T

delta 4805
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
R{C}I(`LZQn@u9u0e*qQHZ?gaZ

diff --git a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.c b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
similarity index 69%
rename from src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.c
rename to src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
index 460bb397..7ad57402 100644
--- a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.c
+++ b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
@@ -5,7 +5,7 @@
  * See terms of license at gnu.org.
  */
 
-#include "org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h"
+#include "org_jitsi_impl_neomedia_CoreAudioDevice.h"
 
 #include "../lib/device.h"
 
@@ -21,8 +21,22 @@ static jbyteArray getStrBytes(JNIEnv *env, const char *str);
 
 // Implementation
 
+JNIEXPORT jint JNICALL
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_initDevices
+  (JNIEnv *env, jclass clazz)
+{
+    return initDevices();
+}
+
+JNIEXPORT void JNICALL
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_freeDevices
+  (JNIEnv *env, jclass clazz)
+{
+    freeDevices();
+}
+
 JNIEXPORT jbyteArray JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getDeviceNameBytes
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
@@ -35,8 +49,23 @@ Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getDeviceNameBytes
     return deviceNameBytes;
 }
 
+JNIEXPORT jbyteArray JNICALL
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceModelIdentifierBytes
+  (JNIEnv *env, jclass clazz, jstring deviceUID)
+{
+    const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
+    char * deviceModelIdentifier = getDeviceModelIdentifier(deviceUIDPtr);
+    jbyteArray deviceModelIdentifierBytes
+        = getStrBytes(env, deviceModelIdentifier);
+    // Free
+    free(deviceModelIdentifier);
+    (*env)->ReleaseStringUTFChars(env, deviceUID, deviceUIDPtr);
+
+    return deviceModelIdentifierBytes;
+}
+
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setInputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
@@ -48,7 +77,7 @@ Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setInputDeviceVolume
 }
 
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setOutputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_setOutputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
@@ -60,7 +89,7 @@ Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setOutputDeviceVolume
 }
 
 JNIEXPORT jfloat JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getInputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
@@ -72,7 +101,7 @@ Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getInputDeviceVolume
 }
 
 JNIEXPORT jfloat JNICALL
-Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getOutputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getOutputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = (*env)->GetStringUTFChars(env, deviceUID, 0);
diff --git a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
new file mode 100644
index 00000000..c02caef4
--- /dev/null
+++ b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
@@ -0,0 +1,77 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_jitsi_impl_neomedia_CoreAudioDevice */
+
+#ifndef _Included_org_jitsi_impl_neomedia_CoreAudioDevice
+#define _Included_org_jitsi_impl_neomedia_CoreAudioDevice
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    initDevices
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_initDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    freeDevices
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_freeDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getDeviceNameBytes
+ * Signature: (Ljava/lang/String;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getDeviceModelIdentifierBytes
+ * Signature: (Ljava/lang/String;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceModelIdentifierBytes
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    setInputDeviceVolume
+ * Signature: (Ljava/lang/String;F)I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
+  (JNIEnv *, jclass, jstring, jfloat);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    setOutputDeviceVolume
+ * Signature: (Ljava/lang/String;F)I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setOutputDeviceVolume
+  (JNIEnv *, jclass, jstring, jfloat);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getInputDeviceVolume
+ * Signature: (Ljava/lang/String;)F
+ */
+JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getInputDeviceVolume
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getOutputDeviceVolume
+ * Signature: (Ljava/lang/String;)F
+ */
+JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getOutputDeviceVolume
+  (JNIEnv *, jclass, jstring);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h b/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h
deleted file mode 100644
index 06ff03ca..00000000
--- a/src/native/macosx/coreaudio/jni/org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice */
-
-#ifndef _Included_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
-#define _Included_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    getDeviceNameBytes
- * Signature: (Ljava/lang/String;)[B
- */
-JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getDeviceNameBytes
-  (JNIEnv *, jclass, jstring);
-
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    setInputDeviceVolume
- * Signature: (Ljava/lang/String;F)I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setInputDeviceVolume
-  (JNIEnv *, jclass, jstring, jfloat);
-
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    setOutputDeviceVolume
- * Signature: (Ljava/lang/String;F)I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_setOutputDeviceVolume
-  (JNIEnv *, jclass, jstring, jfloat);
-
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    getInputDeviceVolume
- * Signature: (Ljava/lang/String;)F
- */
-JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getInputDeviceVolume
-  (JNIEnv *, jclass, jstring);
-
-/*
- * Class:     org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice
- * Method:    getOutputDeviceVolume
- * Signature: (Ljava/lang/String;)F
- */
-JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_maccoreaudio_CoreAudioDevice_getOutputDeviceVolume
-  (JNIEnv *, jclass, jstring);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/src/native/macosx/coreaudio/lib/device.c b/src/native/macosx/coreaudio/lib/device.c
index a7e1df9f..0894ae2a 100644
--- a/src/native/macosx/coreaudio/lib/device.c
+++ b/src/native/macosx/coreaudio/lib/device.c
@@ -18,6 +18,10 @@
 /**
  * Private definition of functions,
  */
+char* getDeviceProperty(
+        const char * deviceUID,
+        AudioObjectPropertySelector propertySelector);
+
 OSStatus setDeviceVolume(
         const char * deviceUID,
         Float32 volume,
@@ -31,6 +35,26 @@ OSStatus getChannelsForStereo(
         const char * deviceUID,
         UInt32 * channels);
 
+/**
+ * Do nothing: there is no need to initializes anything to get device
+ * information on MacOsX.
+ *
+ * @return Always returns 0 (always works).
+ */
+int initDevices(void)
+{
+    return 0;
+}
+
+/**
+ * Do nothing: there is no need to frees anything once getting device
+ * information is finished on MacOsX.
+ */
+void freeDevices(void)
+{
+    // Nothing to do.
+}
+
 /**
  * Returns the audio device corresponding to the UID given in parameter. Or
  * kAudioObjectUnknown if the device is nonexistant or if anything as failed.
@@ -104,6 +128,38 @@ AudioDeviceID getDevice(
  */
 char* getDeviceName(
         const char * deviceUID)
+{
+    return getDeviceProperty(deviceUID, kAudioObjectPropertyName);
+}
+
+/**
+ * Returns the device model identifier for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ *
+ * @param device The device to get the name from.
+ *
+ * @return The device model identifier for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ */
+char* getDeviceModelIdentifier(
+        const char * deviceUID)
+{
+    return getDeviceProperty(deviceUID, kAudioDevicePropertyModelUID);
+}
+
+/**
+ * Returns the requested device property for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ *
+ * @param device The device to get the name from.
+ * @param propertySelector The property we want to retrieve.
+ *
+ * @return The requested device property for the given device. Or NULL, if not
+ * available. The returned string must be freed by the caller.
+ */
+char* getDeviceProperty(
+        const char * deviceUID,
+        AudioObjectPropertySelector propertySelector)
 {
     AudioDeviceID device;
     OSStatus err = noErr;
@@ -114,15 +170,15 @@ char* getDeviceName(
     if((device = getDevice(deviceUID)) == kAudioObjectUnknown)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\tgetDevice\n");
         return NULL;
     }
 
-    // Gets the device name
-    CFStringRef deviceName;
-    size = sizeof(deviceName);
-    address.mSelector = kAudioObjectPropertyName;
+    // Gets the device property
+    CFStringRef deviceProperty;
+    size = sizeof(deviceProperty);
+    address.mSelector = propertySelector;
     address.mScope = kAudioObjectPropertyScopeGlobal;
     address.mElement = kAudioObjectPropertyElementMaster;
 
@@ -132,33 +188,34 @@ char* getDeviceName(
             0,
             NULL,
             &size,
-            &deviceName)) != noErr)
+            &deviceProperty)) != noErr)
     {
         fprintf(stderr,
-                "getDeviceName (coreaudio/device.c): \
+                "getDeviceProperty (coreaudio/device.c): \
                     \n\tAudioObjectGetPropertyData, err: %d\n",
                 ((int) err));
         return NULL;
     }
 
-    // Converts the device name to ASCII.
-    CFIndex deviceNameLength = CFStringGetLength(deviceName) + 1;
-    char * deviceASCIIName;
+    // Converts the device property to ASCII.
+    CFIndex devicePropertyLength = CFStringGetLength(deviceProperty) + 1;
+    char * deviceASCIIProperty;
     // The caller of this function must free the string.
-    if((deviceASCIIName = (char *) malloc(deviceNameLength * sizeof(char)))
+    if((deviceASCIIProperty
+                = (char *) malloc(devicePropertyLength * sizeof(char)))
             == NULL)
     {
-        perror("getDeviceName (coreaudio/device.c): \
+        perror("getDeviceProperty (coreaudio/device.c): \
                     \n\tmalloc\n");
         return NULL;
     }
     if(CFStringGetCString(
-                deviceName,
-                deviceASCIIName,
-                deviceNameLength,
+                deviceProperty,
+                deviceASCIIProperty,
+                devicePropertyLength,
                 kCFStringEncodingASCII))
     {
-        return deviceASCIIName;
+        return deviceASCIIProperty;
     }
     return NULL;
 }
diff --git a/src/native/macosx/coreaudio/lib/device.h b/src/native/macosx/coreaudio/lib/device.h
index ed5b12cb..3a78e844 100644
--- a/src/native/macosx/coreaudio/lib/device.h
+++ b/src/native/macosx/coreaudio/lib/device.h
@@ -17,12 +17,19 @@
  *
  * @author Vincent Lucas
  */
+int initDevices(void);
+
+void freeDevices(void);
+
 AudioDeviceID getDevice(
         const char * deviceUID);
 
 char* getDeviceName(
         const char * deviceUID);
 
+char* getDeviceModelIdentifier(
+        const char * deviceUID);
+
 OSStatus setInputDeviceVolume(
         const char * deviceUID,
         Float32 volume);
diff --git a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.c b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
similarity index 82%
rename from src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.c
rename to src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
index a0824d3e..2afc9305 100644
--- a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.c
+++ b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c
@@ -5,7 +5,7 @@
  * See terms of license at gnu.org.
  */
 
-#include "org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h"
+#include "org_jitsi_impl_neomedia_CoreAudioDevice.h"
 
 #include "../lib/device.h"
 
@@ -22,21 +22,21 @@ static jbyteArray getStrBytes(JNIEnv *env, const char *str);
 // Implementation
 
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_initDevices
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_initDevices
   (JNIEnv *env, jclass clazz)
 {
     return initDevices();
 }
 
 JNIEXPORT void JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_freeDevices
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_freeDevices
   (JNIEnv *env, jclass clazz)
 {
     freeDevices();
 }
 
 JNIEXPORT jbyteArray JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getDeviceNameBytes
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
@@ -50,7 +50,7 @@ Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getDeviceNameBytes
 }
 
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setInputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
@@ -62,7 +62,7 @@ Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setInputDeviceVolume
 }
 
 JNIEXPORT jint JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setOutputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_setOutputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
@@ -74,7 +74,7 @@ Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setOutputDeviceVolume
 }
 
 JNIEXPORT jfloat JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getInputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getInputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
@@ -86,7 +86,7 @@ Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getInputDeviceVolume
 }
 
 JNIEXPORT jfloat JNICALL
-Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getOutputDeviceVolume
+Java_org_jitsi_impl_neomedia_CoreAudioDevice_getOutputDeviceVolume
   (JNIEnv *env, jclass clazz, jstring deviceUID)
 {
     const char * deviceUIDPtr = env->GetStringUTFChars(deviceUID, 0);
diff --git a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
new file mode 100644
index 00000000..c02caef4
--- /dev/null
+++ b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.h
@@ -0,0 +1,77 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_jitsi_impl_neomedia_CoreAudioDevice */
+
+#ifndef _Included_org_jitsi_impl_neomedia_CoreAudioDevice
+#define _Included_org_jitsi_impl_neomedia_CoreAudioDevice
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    initDevices
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_initDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    freeDevices
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_freeDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getDeviceNameBytes
+ * Signature: (Ljava/lang/String;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceNameBytes
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getDeviceModelIdentifierBytes
+ * Signature: (Ljava/lang/String;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getDeviceModelIdentifierBytes
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    setInputDeviceVolume
+ * Signature: (Ljava/lang/String;F)I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume
+  (JNIEnv *, jclass, jstring, jfloat);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    setOutputDeviceVolume
+ * Signature: (Ljava/lang/String;F)I
+ */
+JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setOutputDeviceVolume
+  (JNIEnv *, jclass, jstring, jfloat);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getInputDeviceVolume
+ * Signature: (Ljava/lang/String;)F
+ */
+JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getInputDeviceVolume
+  (JNIEnv *, jclass, jstring);
+
+/*
+ * Class:     org_jitsi_impl_neomedia_CoreAudioDevice
+ * Method:    getOutputDeviceVolume
+ * Signature: (Ljava/lang/String;)F
+ */
+JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_getOutputDeviceVolume
+  (JNIEnv *, jclass, jstring);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h
deleted file mode 100644
index fafe376c..00000000
--- a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice */
-
-#ifndef _Included_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
-#define _Included_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    initDevices
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_initDevices
-  (JNIEnv *, jclass);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    freeDevices
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_freeDevices
-  (JNIEnv *, jclass);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    getDeviceNameBytes
- * Signature: (Ljava/lang/String;)[B
- */
-JNIEXPORT jbyteArray JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getDeviceNameBytes
-  (JNIEnv *, jclass, jstring);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    setInputDeviceVolume
- * Signature: (Ljava/lang/String;F)I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setInputDeviceVolume
-  (JNIEnv *, jclass, jstring, jfloat);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    setOutputDeviceVolume
- * Signature: (Ljava/lang/String;F)I
- */
-JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_setOutputDeviceVolume
-  (JNIEnv *, jclass, jstring, jfloat);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    getInputDeviceVolume
- * Signature: (Ljava/lang/String;)F
- */
-JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getInputDeviceVolume
-  (JNIEnv *, jclass, jstring);
-
-/*
- * Class:     org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice
- * Method:    getOutputDeviceVolume
- * Signature: (Ljava/lang/String;)F
- */
-JNIEXPORT jfloat JNICALL Java_org_jitsi_impl_neomedia_wincoreaudio_CoreAudioDevice_getOutputDeviceVolume
-  (JNIEnv *, jclass, jstring);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/src/org/jitsi/impl/neomedia/wincoreaudio/CoreAudioDevice.java b/src/org/jitsi/impl/neomedia/CoreAudioDevice.java
similarity index 57%
rename from src/org/jitsi/impl/neomedia/wincoreaudio/CoreAudioDevice.java
rename to src/org/jitsi/impl/neomedia/CoreAudioDevice.java
index 3477f5ec..4c152927 100644
--- a/src/org/jitsi/impl/neomedia/wincoreaudio/CoreAudioDevice.java
+++ b/src/org/jitsi/impl/neomedia/CoreAudioDevice.java
@@ -4,12 +4,12 @@
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
-package org.jitsi.impl.neomedia.wincoreaudio;
+package org.jitsi.impl.neomedia;
 
 import org.jitsi.util.*;
 
 /**
- * JNI link to the Windows CoreAudio library.
+ * JNI link to the MacOsX / Windows CoreAudio library.
  *
  * @author Vincent Lucqs
  */
@@ -17,11 +17,21 @@ public class CoreAudioDevice
 {
     static
     {
-        System.loadLibrary("jnwincoreaudio");
+        if(OSUtils.IS_MAC)
+        {
+            System.loadLibrary("jnmaccoreaudio");
+        }
+        else if(OSUtils.IS_WINDOWS_VISTA
+                || OSUtils.IS_WINDOWS_7
+                || OSUtils.IS_WINDOWS_8)
+        {
+            System.loadLibrary("jnwincoreaudio");
+        }
     }
 
-//    public static native AudioDeviceID getDevice(
-//            String deviceUID);
+    public static native int initDevices();
+
+    public static native void freeDevices();
 
     public static String getDeviceName(
             String deviceUID)
@@ -32,11 +42,21 @@ public static String getDeviceName(
         return deviceName;
     }
 
-    public static native int initDevices();
+    public static native byte[] getDeviceNameBytes(
+            String deviceUID);
 
-    public static native void freeDevices();
+    public static String getDeviceModelIdentifier(
+            String deviceUID)
+    {
+        byte[] deviceModelIdentifierBytes
+            = getDeviceModelIdentifierBytes(deviceUID);
+        String deviceModelIdentifier
+            = StringUtils.newString(deviceModelIdentifierBytes);
 
-    public static native byte[] getDeviceNameBytes(
+        return deviceModelIdentifier;
+    }
+
+    public static native byte[] getDeviceModelIdentifierBytes(
             String deviceUID);
 
     public static native int setInputDeviceVolume(
diff --git a/src/org/jitsi/impl/neomedia/device/Devices.java b/src/org/jitsi/impl/neomedia/device/Devices.java
index a8f32f83..5bad919c 100644
--- a/src/org/jitsi/impl/neomedia/device/Devices.java
+++ b/src/org/jitsi/impl/neomedia/device/Devices.java
@@ -72,7 +72,8 @@ public ExtendedCaptureDeviceInfo getDevice(
             {
                 ExtendedCaptureDeviceInfo activeDevice = activeDevices.get(i);
 
-                if(!devicePreferences.contains(activeDevice.getIdentifier()))
+                if(!devicePreferences.contains(
+                            activeDevice.getModelIdentifier()))
                 {
                     // Adds the device in the preference list (to the end of the
                     // list, but the save device will push it to the top of
@@ -97,7 +98,7 @@ public ExtendedCaptureDeviceInfo getDevice(
                         // If we have found the "preferred" device among active
                         // device.
                         if(devicePreference.equals(
-                                activeDevice.getIdentifier()))
+                                activeDevice.getModelIdentifier()))
                         {
                             return activeDevice;
                         }
@@ -209,7 +210,7 @@ private void saveDevice(
         String selectedDeviceIdentifier
             = (device == null)
                 ? NoneAudioSystem.LOCATOR_PROTOCOL
-                : device.getIdentifier();
+                : device.getModelIdentifier();
 
         // Sorts the user preferences to put the selected device on top.
         addToDevicePreferences(
@@ -305,7 +306,7 @@ private void addToDevicePreferences(
                     for(ExtendedCaptureDeviceInfo activeDevice : activeDevices)
                     {
                         if(devicePreference.equals(
-                                    activeDevice.getIdentifier())
+                                    activeDevice.getModelIdentifier())
                                 || devicePreference.equals(
                                         NoneAudioSystem.LOCATOR_PROTOCOL))
                         {
@@ -336,12 +337,12 @@ private void renameOldFashionedIdentifier(
         for(ExtendedCaptureDeviceInfo activeDevice : activeDevices)
         {
             String name = activeDevice.getName();
-            String id = activeDevice.getIdentifier();
+            String id = activeDevice.getModelIdentifier();
 
             // We can only switch to the new fashioned notation, only if the OS
             // API gives us a unique identifier (different from the device
             // name).
-            if(!name.equals(id))
+            if(id != null)
             {
                 synchronized(devicePreferences)
                 {
diff --git a/src/org/jitsi/impl/neomedia/device/ExtendedCaptureDeviceInfo.java b/src/org/jitsi/impl/neomedia/device/ExtendedCaptureDeviceInfo.java
index 7a3f6110..f166a83d 100644
--- a/src/org/jitsi/impl/neomedia/device/ExtendedCaptureDeviceInfo.java
+++ b/src/org/jitsi/impl/neomedia/device/ExtendedCaptureDeviceInfo.java
@@ -27,6 +27,11 @@ public class ExtendedCaptureDeviceInfo
      */
     private final String uid;
 
+    /**
+     * The persistent identifier for the model of this device.
+     */
+    private final String modelIdentifier;
+
     /**
      * Constructs a CaptureDeviceInfo object with the specified name, media
      * locator, and array of Format objects.
@@ -34,18 +39,22 @@ public class ExtendedCaptureDeviceInfo
      * @param captureDeiceInfo the device info.
      * @param uid The device UID (unique identifier).
      * @param transportType The device transport type.
+     * @param modelIdentifier The persistent identifier for the model of this
+     * device.
      */
     public ExtendedCaptureDeviceInfo(
             CaptureDeviceInfo captureDeviceInfo,
             String uid,
-            String transportType)
+            String transportType,
+            String modelIdentifier)
     {
         this(
                 captureDeviceInfo.getName(),
                 captureDeviceInfo.getLocator(),
                 captureDeviceInfo.getFormats(),
                 uid,
-                transportType);
+                transportType,
+                modelIdentifier);
     }
 
     /**
@@ -57,15 +66,22 @@ public ExtendedCaptureDeviceInfo(
      * @param formats An array of the output formats supported by the device.
      * @param uid The device UID (unique identifier).
      * @param transportType The device transport type.
+     * @param modelIdentifier The persistent identifier for the model of this
+     * device.
      */
     public ExtendedCaptureDeviceInfo(
-            String name, MediaLocator locator, Format[] formats,
-            String uid, String transportType)
+            String name,
+            MediaLocator locator,
+            Format[] formats,
+            String uid,
+            String transportType,
+            String modelIdentifier)
     {
         super(name, locator, formats);
 
         this.uid = uid;
         this.transportType = transportType;
+        this.modelIdentifier = modelIdentifier;
     }
 
     /**
@@ -119,6 +135,16 @@ public String getUID()
         return uid;
     }
 
+    /**
+     * Returns the model identifier of this instance.
+     *
+     * @return the model identifier of this instance
+     */
+    public String getModelIdentifier()
+    {
+        return modelIdentifier;
+    }
+
     /**
      * Returns a hash code value for this object for the benefit of hashtables.
      *
diff --git a/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java b/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
index c46f6164..43bb6a92 100644
--- a/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
+++ b/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java
@@ -280,6 +280,8 @@ protected void doInitialize()
                 = Pa.DeviceInfo_getTransportType(deviceInfo);
             String deviceUID
                 = Pa.DeviceInfo_getDeviceUID(deviceInfo);
+            String modelIdentifier
+                = CoreAudioDevice.getDeviceModelIdentifier(deviceUID);
 
             /*
              * TODO The intention of reinitialize() was to perform the
@@ -336,7 +338,8 @@ protected void doInitialize()
                                         Format.byteArray)
                             },
                             deviceUID,
-                            transportType);
+                            transportType,
+                            modelIdentifier);
             }
 
             /*
diff --git a/src/org/jitsi/impl/neomedia/device/PulseAudioSystem.java b/src/org/jitsi/impl/neomedia/device/PulseAudioSystem.java
index c91ba16c..d7c8cda7 100644
--- a/src/org/jitsi/impl/neomedia/device/PulseAudioSystem.java
+++ b/src/org/jitsi/impl/neomedia/device/PulseAudioSystem.java
@@ -370,6 +370,7 @@ public void callback(long c, long i, int eol)
                             captureDeviceFormats.toArray(
                                     new Format[captureDeviceFormats.size()]),
                             null,
+                            null,
                             null));
         }
         if (!playbackDevices.isEmpty())
@@ -381,6 +382,7 @@ public void callback(long c, long i, int eol)
                             new MediaLocator(LOCATOR_PROTOCOL + ":"),
                             null,
                             null,
+                            null,
                             null));
         }
 
@@ -473,6 +475,7 @@ private void sinkInfoListCallback(
                                     + name),
                         null,
                         null,
+                        null,
                         null));
     }
 
@@ -539,6 +542,7 @@ private void sourceInfoListCallback(
                             sourceInfoFormatList.toArray(
                                     new Format[sourceInfoFormatList.size()]),
                             null,
+                            null,
                             null));
         }
     }
diff --git a/src/org/jitsi/impl/neomedia/maccoreaudio/CoreAudioDevice.java b/src/org/jitsi/impl/neomedia/maccoreaudio/CoreAudioDevice.java
deleted file mode 100644
index 21d7481a..00000000
--- a/src/org/jitsi/impl/neomedia/maccoreaudio/CoreAudioDevice.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jitsi.impl.neomedia.maccoreaudio;
-
-import org.jitsi.util.*;
-
-/**
- * JNI link to the MacOSX CoreAudio library.
- *
- * @author Vincent Lucqs
- */
-public class CoreAudioDevice
-{
-    static
-    {
-        System.loadLibrary("jnmaccoreaudio");
-    }
-
-//    public static native AudioDeviceID getDevice(
-//            String deviceUID);
-
-    public static String getDeviceName(
-            String deviceUID)
-    {
-        byte[] deviceNameBytes = getDeviceNameBytes(deviceUID);
-        String deviceName = StringUtils.newString(deviceNameBytes);
-
-        return deviceName;
-    }
-
-    public static native byte[] getDeviceNameBytes(
-            String deviceUID);
-
-    public static native int setInputDeviceVolume(
-            String deviceUID,
-            float volume);
-
-    public static native int setOutputDeviceVolume(
-            String deviceUID,
-            float volume);
-
-    public static native float getInputDeviceVolume(
-            String deviceUID);
-
-    public static native float getOutputDeviceVolume(
-            String deviceUID);
-}
-- 
GitLab