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