From b3fa7044dca9912ae83ba85a5646044b0634a16f Mon Sep 17 00:00:00 2001 From: Vincent Lucas <chenzo@jitsi.org> Date: Thu, 20 Dec 2012 20:47:34 +0000 Subject: [PATCH] Adds capability for Windows to retrieve the model identifier for audio devices. But there is still some issues with using it. Thus, disables temporaly the use of model identifier. --- lib/native/windows-64/jnwincoreaudio.dll | Bin 53925 -> 55426 bytes lib/native/windows/jnwincoreaudio.dll | Bin 51840 -> 53877 bytes .../org_jitsi_impl_neomedia_CoreAudioDevice.c | 15 ++ src/native/windows/coreaudio/lib/device.c | 209 ++++++++++++++++-- src/native/windows/coreaudio/lib/device.h | 3 + .../jitsi/impl/neomedia/device/Devices.java | 10 +- .../impl/neomedia/device/PortAudioSystem.java | 2 + 7 files changed, 217 insertions(+), 22 deletions(-) diff --git a/lib/native/windows-64/jnwincoreaudio.dll b/lib/native/windows-64/jnwincoreaudio.dll index 2b0bac5c104f9894577c899445f278dbbcbcd7ce..6ded173cda25bc7c162b9ed4e9a55f7719c94cd0 100644 GIT binary patch delta 17189 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 EpEsIRrvLx| delta 15459 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 aI*z`7`f+>S2Qzv5p}*b^w4dwvv+&=_7>ykO diff --git a/lib/native/windows/jnwincoreaudio.dll b/lib/native/windows/jnwincoreaudio.dll index 9f1768b7f65952c06ff79882bce8525e5083cea3..cbc7a20c6ee184e2d022b518df7f39569e42ad82 100644 GIT binary patch delta 15265 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 EU$yS+6#xJL delta 13659 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 diff --git a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c index 2afc9305..68d3704f 100644 --- a/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c +++ b/src/native/windows/coreaudio/jni/org_jitsi_impl_neomedia_CoreAudioDevice.c @@ -49,6 +49,21 @@ Java_org_jitsi_impl_neomedia_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(deviceUID, 0); + char * deviceModelIdentifier = getDeviceModelIdentifier(deviceUIDPtr); + jbyteArray deviceModelIdentifierBytes + = getStrBytes(env, deviceModelIdentifier); + // Free + free(deviceModelIdentifier); + env->ReleaseStringUTFChars(deviceUID, deviceUIDPtr); + + return deviceModelIdentifierBytes; +} + JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_CoreAudioDevice_setInputDeviceVolume (JNIEnv *env, jclass clazz, jstring deviceUID, jfloat volume) diff --git a/src/native/windows/coreaudio/lib/device.c b/src/native/windows/coreaudio/lib/device.c index 5895b46f..ebeb979f 100644 --- a/src/native/windows/coreaudio/lib/device.c +++ b/src/native/windows/coreaudio/lib/device.c @@ -16,6 +16,7 @@ #include <commctrl.h> // Must be defined after mmdeviceapi.h #include <endpointvolume.h> // Must be defined after mmdeviceapi.h + /** * Functions to list, access and modifies audio devices via coreaudio. * @@ -31,6 +32,16 @@ IAudioEndpointVolume * getEndpointVolume( void freeEndpointVolume( IAudioEndpointVolume * endpointVolume); +char* getDeviceDescription( + const char * deviceUID); + +char* getDeviceInterfaceName( + const char * deviceUID); + +char* getDeviceProperty( + const char * deviceUID, + PROPERTYKEY propertyKey); + int setDeviceVolume( const char * deviceUID, float volume); @@ -38,8 +49,15 @@ int setDeviceVolume( float getDeviceVolume( const char * deviceUID); +// Definitions find in "functiondiscoverykeys_devpkey.h" but not found by +// MINGW64 TDM-gcc compiler. +DEFINE_PROPERTYKEY(PKEY_DeviceInterface_FriendlyName, 0x026e516e, 0xb814, 0x414b, 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22, 2); // DEVPROP_TYPE_STRING +DEFINE_PROPERTYKEY(PKEY_Device_DeviceDesc, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 2); // DEVPROP_TYPE_STRING DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14); // DEVPROP_TYPE_STRING + +DEFINE_PROPERTYKEY(PKEY_Device_BusNumber, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 23); // DEVPROP_TYPE_UINT32 + /** * Initializes the COM component. This function must be called first in order to * able each following function to work correctly. Once finished, the caller of @@ -224,7 +242,8 @@ void freeEndpointVolume( /** * Returns the device name for the given device. Or NULL, if not available. The - * returned string must be freed by the caller. + * returned string must be freed by the caller. The device name is composed of + * the device description and of the device interface name. * * @param device The device to get the name from. * @@ -234,10 +253,162 @@ void freeEndpointVolume( char* getDeviceName( const char * deviceUID) { - size_t deviceNameLength; - char * deviceName = NULL; - PROPVARIANT propertyDeviceName; - PropVariantInit(&propertyDeviceName); + return getDeviceProperty(deviceUID, PKEY_Device_FriendlyName); +} + +/** + * 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) +{ + int deviceModelIdentifierLength; + char * deviceModelIdentifier = NULL; + char * deviceDescription; + char * deviceInterface; + char * genericDeviceInterface; + + if((deviceDescription = getDeviceDescription(deviceUID)) == NULL) + { + fprintf(stderr, + "getDeviceModelIdentifier (coreaudio/device.c): \ + \n\tgetDeviceDescription\n"); + fflush(stderr); + return NULL; + } + if((deviceInterface = getDeviceInterfaceName(deviceUID)) == NULL) + { + fprintf(stderr, + "getDeviceModelIdentifier (coreaudio/device.c): \ + \n\tgetDeviceInterfaceName\n"); + fflush(stderr); + return NULL; + } + + // A USB device (without a serial ID) puts into a USB port will add the + // port number (if greater than 1) with the following prefix: "X- " + // (with X the port number). + genericDeviceInterface = deviceInterface; + // First skip the number at the beginning of the prefix. + while(genericDeviceInterface[0] != '\0' + && genericDeviceInterface[0] >= '0' + && genericDeviceInterface[0] <= '9') + { + ++genericDeviceInterface; + } + // Then skips the "-". + if(genericDeviceInterface[0] != '\0' + && genericDeviceInterface[0] == '-') + { + ++genericDeviceInterface; + } + // Finally skips the " ". + if(genericDeviceInterface[0] != '\0' + && genericDeviceInterface[0] == ' ') + { + ++genericDeviceInterface; + } + // If we have reached the end of the string, then the string does not + // contain the prefix. + if(genericDeviceInterface[0] == '\0') + { + genericDeviceInterface = deviceInterface; + } + + // Finally, concatenate the device description and its generic device + // interface. + deviceModelIdentifierLength + = strlen(deviceDescription) + 2 + strlen(genericDeviceInterface) + 2; + if((deviceModelIdentifier + = (char*) malloc(deviceModelIdentifierLength * sizeof(char))) + == NULL) + { + fprintf(stderr, + "getDeviceModelIdentifier (coreaudio/device.c): \ + \n\tmalloc\n"); + fflush(stderr); + return NULL; + } + if(snprintf( + deviceModelIdentifier, + deviceModelIdentifierLength, + "%s (%s)", + deviceDescription, + genericDeviceInterface) != (deviceModelIdentifierLength - 1)) + { + free(deviceModelIdentifier); + fprintf(stderr, + "getDeviceModelIdentifier (coreaudio/device.c): \ + \n\tsnprintf\n"); + fflush(stderr); + return NULL; + } + + // Frees memory. + free(deviceDescription); + free(deviceInterface); + + return deviceModelIdentifier; +} + +/** + * Returns the device description for the given device. Or NULL, if not + * available. The returned string must be freed by the caller. The device + * description is a generic name such as "microphone", "speaker", etc. + * + * @param device The device to get the name from. + * + * @return The device description for the given device. Or NULL, if not + * available. The returned string must be freed by the caller. + */ +char* getDeviceDescription( + const char * deviceUID) +{ + return getDeviceProperty(deviceUID, PKEY_Device_DeviceDesc); +} + +/** + * Returns the device interface name for the given device. Or NULL, if not + * available. The returned string must be freed by the caller. The device + * interface name describes the way the device is connected, such as "USB audio + * adapter". + * + * @param device The device to get the name from. + * + * @return The device interface name for the given device. Or NULL, if not + * available. The returned string must be freed by the caller. + */ +char* getDeviceInterfaceName( + const char * deviceUID) +{ + return getDeviceProperty(deviceUID, PKEY_DeviceInterface_FriendlyName); +} + +/** + * Returns the 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 propertyKey The requested property (i.e. PKEY_Device_FriendlyName for + * the device name). + * + * @return The 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, + PROPERTYKEY propertyKey) +{ + size_t devicePropertyLength; + char * deviceProperty = NULL; + PROPVARIANT propertyDevice; + PropVariantInit(&propertyDevice); IPropertyStore * properties = NULL; // Gets the audio device. @@ -245,7 +416,7 @@ char* getDeviceName( if(device == NULL) { fprintf(stderr, - "getDeviceName (coreaudio/device.c): \ + "getDeviceProperty (coreaudio/device.c): \ \n\tgetDevice\n"); fflush(stderr); return NULL; @@ -255,35 +426,39 @@ char* getDeviceName( if(device->OpenPropertyStore(STGM_READ, &properties) != S_OK) { fprintf(stderr, - "getDeviceName (coreaudio/device.c): \ + "getDeviceProperty (coreaudio/device.c): \ \n\tIMMDevice.OpenPropertyStore\n"); fflush(stderr); return NULL; } - if(properties->GetValue(PKEY_Device_FriendlyName, &propertyDeviceName) + if(properties->GetValue(propertyKey, &propertyDevice) != S_OK) { fprintf(stderr, - "getDeviceName (coreaudio/device.c): \ + "getDeviceProperty (coreaudio/device.c): \ \n\tIPropertyStore.GetValue\n"); fflush(stderr); return NULL; } - deviceNameLength = wcslen(propertyDeviceName.pwszVal); - if((deviceName = (char *) malloc((deviceNameLength + 1) * sizeof(char))) + devicePropertyLength = wcslen(propertyDevice.pwszVal); + if((deviceProperty + = (char *) malloc((devicePropertyLength + 1) * sizeof(char))) == NULL) { fprintf(stderr, - "getDeviceName (coreaudio/device.c): \ + "getDeviceProperty (coreaudio/device.c): \ \n\tmalloc\n"); fflush(stderr); return NULL; } - if(wcstombs(deviceName, propertyDeviceName.pwszVal, deviceNameLength + 1) - != deviceNameLength) + if(wcstombs( + deviceProperty, + propertyDevice.pwszVal, + devicePropertyLength + 1) + != devicePropertyLength) { fprintf(stderr, - "getDeviceName (coreaudio/device.c): \ + "getDeviceProperty (coreaudio/device.c): \ \n\twcstombs\n"); fflush(stderr); return NULL; @@ -291,9 +466,9 @@ char* getDeviceName( // Frees. freeDevice(device); - PropVariantClear(&propertyDeviceName); + PropVariantClear(&propertyDevice); - return deviceName; + return deviceProperty; } /** diff --git a/src/native/windows/coreaudio/lib/device.h b/src/native/windows/coreaudio/lib/device.h index abc05f2e..0fc0417f 100644 --- a/src/native/windows/coreaudio/lib/device.h +++ b/src/native/windows/coreaudio/lib/device.h @@ -28,6 +28,9 @@ void freeDevice( char* getDeviceName( const char * deviceUID); +char* getDeviceModelIdentifier( + const char * deviceUID); + int setInputDeviceVolume( const char * deviceUID, float volume); diff --git a/src/org/jitsi/impl/neomedia/device/Devices.java b/src/org/jitsi/impl/neomedia/device/Devices.java index 5bad919c..c7e9ca32 100644 --- a/src/org/jitsi/impl/neomedia/device/Devices.java +++ b/src/org/jitsi/impl/neomedia/device/Devices.java @@ -73,7 +73,7 @@ public ExtendedCaptureDeviceInfo getDevice( ExtendedCaptureDeviceInfo activeDevice = activeDevices.get(i); if(!devicePreferences.contains( - activeDevice.getModelIdentifier())) + activeDevice.getIdentifier())) { // Adds the device in the preference list (to the end of the // list, but the save device will push it to the top of @@ -98,7 +98,7 @@ public ExtendedCaptureDeviceInfo getDevice( // If we have found the "preferred" device among active // device. if(devicePreference.equals( - activeDevice.getModelIdentifier())) + activeDevice.getIdentifier())) { return activeDevice; } @@ -210,7 +210,7 @@ private void saveDevice( String selectedDeviceIdentifier = (device == null) ? NoneAudioSystem.LOCATOR_PROTOCOL - : device.getModelIdentifier(); + : device.getIdentifier(); // Sorts the user preferences to put the selected device on top. addToDevicePreferences( @@ -306,7 +306,7 @@ private void addToDevicePreferences( for(ExtendedCaptureDeviceInfo activeDevice : activeDevices) { if(devicePreference.equals( - activeDevice.getModelIdentifier()) + activeDevice.getIdentifier()) || devicePreference.equals( NoneAudioSystem.LOCATOR_PROTOCOL)) { @@ -337,7 +337,7 @@ private void renameOldFashionedIdentifier( for(ExtendedCaptureDeviceInfo activeDevice : activeDevices) { String name = activeDevice.getName(); - String id = activeDevice.getModelIdentifier(); + String id = activeDevice.getIdentifier(); // We can only switch to the new fashioned notation, only if the OS // API gives us a unique identifier (different from the device diff --git a/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java b/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java index 43bb6a92..104bf1b1 100644 --- a/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java +++ b/src/org/jitsi/impl/neomedia/device/PortAudioSystem.java @@ -264,6 +264,7 @@ protected void doInitialize() = new LinkedList<ExtendedCaptureDeviceInfo>(); final boolean loggerIsDebugEnabled = logger.isDebugEnabled(); + CoreAudioDevice.initDevices(); for (int deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++) { long deviceInfo = Pa.GetDeviceInfo(deviceIndex); @@ -397,6 +398,7 @@ else if (maxOutputChannels > 0) } } } + CoreAudioDevice.freeDevices(); /* * Make sure that devices which support both capture and playback are -- GitLab