diff --git a/lib/native/mac/libjnmaccoreaudio.jnilib b/lib/native/mac/libjnmaccoreaudio.jnilib index 45ab370812c8b7c3337591fa32f8d6e2ccca656d..777733cb2ecfbae27e33546c3989077d02742dcd 100755 Binary files a/lib/native/mac/libjnmaccoreaudio.jnilib and b/lib/native/mac/libjnmaccoreaudio.jnilib differ diff --git a/src/native/macosx/coreaudio/jni/maccoreaudio_util.c b/src/native/macosx/coreaudio/jni/maccoreaudio_util.c index 2a74413146b2b7b5c39f61a5bb7b4e7afde54f87..bab964f9004eec27527624fa4cf25dc336adefdc 100644 --- a/src/native/macosx/coreaudio/jni/maccoreaudio_util.c +++ b/src/native/macosx/coreaudio/jni/maccoreaudio_util.c @@ -248,3 +248,52 @@ void maccoreaudio_freeHotplug( maccoreaudio_devicesChangedCallbackClass = NULL; maccoreaudio_devicesChangedCallbackMethodID = NULL; } + +/** + * Logs the corresponding error message. + * + * @param error_format The format of the error message. + * @param ... The list of variable specified in the format argument. + */ +void maccoreaudio_log( + const char * error_format, + ...) +{ + JNIEnv *env = NULL; + + if((*maccoreaudio_VM)->AttachCurrentThreadAsDaemon( + maccoreaudio_VM, + (void**) &env, + NULL) + == 0) + { + jclass clazz = (*env)->FindClass( + env, + "org/jitsi/impl/neomedia/CoreAudioDevice"); + if (clazz) + { + jmethodID methodID + = (*env)->GetStaticMethodID(env, clazz, "log", "([B)V"); + + int error_length = 2048; + char error[error_length]; + va_list arg; + va_start (arg, error_format); + vsnprintf(error, error_length, error_format, arg); + va_end (arg); + + int str_len = strlen(error); + jbyteArray bufferBytes = (*env)->NewByteArray(env, str_len); + (*env)->SetByteArrayRegion( + env, + bufferBytes, + 0, + str_len, + (jbyte *) error); + + (*env)->CallStaticVoidMethod(env, clazz, methodID, bufferBytes); + } + + (*maccoreaudio_VM)->DetachCurrentThread(maccoreaudio_VM); + } +} diff --git a/src/native/macosx/coreaudio/jni/maccoreaudio_util.h b/src/native/macosx/coreaudio/jni/maccoreaudio_util.h index 9f8b5cb96e81dad75d87449f3cebd6e9c13fadb5..fd40fc6749e37e6075c147bca9369be1099971d4 100644 --- a/src/native/macosx/coreaudio/jni/maccoreaudio_util.h +++ b/src/native/macosx/coreaudio/jni/maccoreaudio_util.h @@ -39,4 +39,8 @@ void maccoreaudio_callbackMethod( void maccoreaudio_devicesChangedCallbackMethod( void); +void maccoreaudio_log( + const char * error_format, + ...); + #endif diff --git a/src/native/macosx/coreaudio/lib/device.c b/src/native/macosx/coreaudio/lib/device.c index 3c9e89f2a35452d270affc43c88c610c9bafc3f4..f9c901319986862da7ee1888ab5e2ff1c8c459e5 100644 --- a/src/native/macosx/coreaudio/lib/device.c +++ b/src/native/macosx/coreaudio/lib/device.c @@ -11,6 +11,10 @@ #include <pthread.h> #include <stdio.h> +extern void maccoreaudio_log( + const char * error_format, + ...); + /** * Functions to list, access and modifies audio devices via coreaudio. * @@ -249,11 +253,10 @@ AudioDeviceID maccoreaudio_getDeviceForSpecificScope( deviceUID, kCFStringEncodingASCII)) == NULL) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDevice (coreaudio/device.c): \ - \n\tCFStringCreateWithCString for device %s\n", + \n\tCFStringCreateWithCString for device %s", deviceUID); - fflush(stderr); return kAudioObjectUnknown; } @@ -276,12 +279,11 @@ AudioDeviceID maccoreaudio_getDeviceForSpecificScope( &size, &translation)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDevice (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData, err: %d for device %s\n", + \n\tAudioObjectGetPropertyData, err: %d for device %s", ((int) err), deviceUID); - fflush(stderr); // Frees the allocated device UID ref. CFRelease(deviceUIDRef); @@ -352,11 +354,10 @@ char* maccoreaudio_getDefaultDeviceUID( &device)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDefaultDeviceUID (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData, err: %d\n", + \n\tAudioObjectGetPropertyData, err: %d", ((int) err)); - fflush(stderr); return NULL; } @@ -365,10 +366,9 @@ char* maccoreaudio_getDefaultDeviceUID( kAudioDevicePropertyDeviceUID)) == NULL) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDefaultDeviceUID (coreaudio/device.c): \ - \n\tgetAudioDeviceProperty\n"); - fflush(stderr); + \n\tgetAudioDeviceProperty"); return NULL; } @@ -425,11 +425,10 @@ char* maccoreaudio_getDeviceProperty( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceProperty (coreaudio/device.c): \ - \n\tgetDevice: %s\n", + \n\tgetDevice: %s", deviceUID); - fflush(stderr); return NULL; } @@ -469,11 +468,10 @@ char* maccoreaudio_getAudioDeviceProperty( &size, &deviceProperty)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceProperty (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData, err: %d\n", + \n\tAudioObjectGetPropertyData, err: %d", ((int) err)); - fflush(stderr); return NULL; } @@ -485,8 +483,11 @@ char* maccoreaudio_getAudioDeviceProperty( = (char *) malloc(devicePropertyLength * sizeof(char))) == NULL) { - perror("maccoreaudio_getDeviceProperty (coreaudio/device.c): \ - \n\tmalloc\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_getDeviceProperty (coreaudio/device.c): \ + \n\tmalloc", + strerror(errno)); return NULL; } if(CFStringGetCString( @@ -568,24 +569,22 @@ OSStatus maccoreaudio_setDeviceVolume( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_setDeviceVolume (coreaudio/device.c): \ - \n\tmaccoreaudio_getDevice (unknown device for UID: %s)\n", + \n\tmaccoreaudio_getDevice (unknown device for UID: %s)", deviceUID); - fflush(stderr); return -1; } // get the input device stereo channels if((maccoreaudio_getChannelsForStereo(deviceUID, channels)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_setDeviceVolume (coreaudio/device.c): \ \n\tmaccoreaudio_getChannelsForStereo, err: %d \ - for device %s\n", + for device %s", ((int) err), deviceUID); - fflush(stderr); return err; } @@ -620,13 +619,12 @@ OSStatus maccoreaudio_setDeviceVolume( size, &volume)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_setDeviceVolume (coreaudio/device.c): \ \n\tAudioObjectSetPropertyData, err: %d \ - for device %s\n", + for device %s", ((int) err), deviceUID); - fflush(stderr); return err; } } @@ -693,24 +691,22 @@ Float32 maccoreaudio_getDeviceVolume( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceVolume (coreaudio/device.c): \ - \n\tmaccoreaudio_getDevice: %s\n", + \n\tmaccoreaudio_getDevice: %s", deviceUID); - fflush(stderr); return -1.0; } // get the input device stereo channels if((maccoreaudio_getChannelsForStereo(deviceUID, channels)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceVolume (coreaudio/device.c): \ \n\tmaccoreaudio_getChannelsForStereo, err: %d \ - for device %s\n", + for device %s", ((int) err), deviceUID); - fflush(stderr); return -1.0; } @@ -745,13 +741,12 @@ Float32 maccoreaudio_getDeviceVolume( &size, &volume)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceVolume (coreaudio/device.c): \ \n\tAudioObjectSetPropertyData, err: %d \ - for device %s\n", + for device %s", ((int) err), deviceUID); - fflush(stderr); return -1.0; } } @@ -782,11 +777,10 @@ OSStatus maccoreaudio_getChannelsForStereo( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getChannelsForStereo (coreaudio/device.c): \ - \n\tmaccoreaudio_getDevice: %s\n", + \n\tmaccoreaudio_getDevice: %s", deviceUID); - fflush(stderr); return -1; } @@ -803,12 +797,11 @@ OSStatus maccoreaudio_getChannelsForStereo( &size, channels)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getChannelsForStereo (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData, err: %d for device %s\n", + \n\tAudioObjectGetPropertyData, err: %d for device %s", ((int) err), deviceUID); - fflush(stderr); return err; } @@ -872,11 +865,10 @@ int maccoreaudio_countChannels( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_countChannels (coreaudio/device.c): \ - \n\tmaccoreaudio_getDevice: %s\n", + \n\tmaccoreaudio_getDevice: %s", deviceUID); - fflush(stderr); return -1; } @@ -887,21 +879,23 @@ int maccoreaudio_countChannels( if((err = AudioObjectGetPropertyDataSize(device, &address, 0, NULL, &size)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_countChannels (coreaudio/device.c): \ \n\tAudioObjectGetPropertyDataSize, err: %d \ - for device %s\n", + for device %s", ((int) err), deviceUID); - fflush(stderr); return -1; } // Gets the number of channels ofr each stream. if((audioBufferList = (AudioBufferList *) malloc(size)) == NULL) { - perror("maccoreaudio_countChannels (coreaudio/device.c): \ - \n\tmalloc\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_countChannels (coreaudio/device.c): \ + \n\tmalloc", + strerror(errno)); return -1; } if((err = AudioObjectGetPropertyData( @@ -913,12 +907,11 @@ int maccoreaudio_countChannels( audioBufferList)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_countChannels (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData, err: %d for device %s\n", + \n\tAudioObjectGetPropertyData, err: %d for device %s", ((int) err), deviceUID); - fflush(stderr); return -1; } for(i = 0; i < audioBufferList->mNumberBuffers; ++i) @@ -950,11 +943,10 @@ Float64 maccoreaudio_getNominalSampleRate( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getNominalSampleRate (coreaudio/device.c): \ - \n\tmaccoreaudio_getDevice: %s\n", + \n\tmaccoreaudio_getDevice: %s", deviceUID); - fflush(stderr); return -1.0; } @@ -973,12 +965,11 @@ Float64 maccoreaudio_getNominalSampleRate( &rate)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getNominalSampleRate (coreaudio/device.c): \ - \n\tAudioObjactGetPropertyData, err: %d for device %s\n", + \n\tAudioObjactGetPropertyData, err: %d for device %s", (int) err, deviceUID); - fflush(stderr); return -1.0; } @@ -1010,12 +1001,11 @@ OSStatus maccoreaudio_getAvailableNominalSampleRates( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getAvailableNominalSampleRates \ (coreaudio/device.c): \ - \n\tmaccoreaudio_getDevice: %s\n", + \n\tmaccoreaudio_getDevice: %s", deviceUID); - fflush(stderr); return -1.0; } @@ -1034,13 +1024,12 @@ OSStatus maccoreaudio_getAvailableNominalSampleRates( &minMaxRate)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getAvailableNominalSampleRates \ (coreaudio/device.c): \ - \n\tAudioObjactGetPropertyData, err: %d for device %s\n", + \n\tAudioObjactGetPropertyData, err: %d for device %s", (int) err, deviceUID); - fflush(stderr); return -1.0; } @@ -1081,11 +1070,10 @@ int maccoreaudio_getDeviceUIDList( &propsize)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceUIDList (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyDataSize, err: %d\n", + \n\tAudioObjectGetPropertyDataSize, err: %d", ((int) err)); - fflush(stderr); return -1; } @@ -1094,8 +1082,11 @@ int maccoreaudio_getDeviceUIDList( if((devices = (AudioDeviceID*) malloc(nbDevices * sizeof(AudioDeviceID))) == NULL) { - perror("maccoreaudio_getDeviceUIDList (coreaudio/device.c): \ - \n\tmalloc\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_getDeviceUIDList (coreaudio/device.c): \ + \n\tmalloc", + strerror(errno)); return -1; } @@ -1109,11 +1100,10 @@ int maccoreaudio_getDeviceUIDList( != noErr) { free(devices); - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceUIDList (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData, err: %d\n", + \n\tAudioObjectGetPropertyData, err: %d", ((int) err)); - fflush(stderr); return -1; } @@ -1121,8 +1111,11 @@ int maccoreaudio_getDeviceUIDList( == NULL) { free(devices); - perror("maccoreaudio_getDeviceUIDList (coreaudio/device.c): \ - \n\tmalloc\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_getDeviceUIDList (coreaudio/device.c): \ + \n\tmalloc", + strerror(errno)); return -1; } @@ -1141,10 +1134,9 @@ int maccoreaudio_getDeviceUIDList( } free(*deviceUIDList); free(devices); - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceUIDList (coreaudio/device.c): \ - \n\tmaccoreaudio_getAudioDeviceProperty\n"); - fflush(stderr); + \n\tmaccoreaudio_getAudioDeviceProperty"); return -1; } } @@ -1174,10 +1166,9 @@ void maccoreaudio_initializeHotplug( callbackFunction) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_initializeHotplug (coreaudio/device.c): \ - \n\tAudioObjectAddPropertyListener\n"); - fflush(stderr); + \n\tAudioObjectAddPropertyListener"); } } @@ -1200,10 +1191,9 @@ void maccoreaudio_uninitializeHotplug() NULL) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_uninitializeHotplug (coreaudio/device.c): \ - \n\tAudioObjectRemovePropertyListener\n"); - fflush(stderr); + \n\tAudioObjectRemovePropertyListener"); } } @@ -1247,11 +1237,10 @@ const char* maccoreaudio_getTransportType( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getTransportType (coreaudio/device.c): \ - \n\tgetDevice: %s\n", + \n\tgetDevice: %s", deviceUID); - fflush(stderr); return NULL; } // target device transport type property @@ -1272,12 +1261,11 @@ const char* maccoreaudio_getTransportType( &transportType)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getTransportType (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData: err: 0x%x for device %s\n", + \n\tAudioObjectGetPropertyData: err: 0x%x for device %s", (int) err, deviceUID); - fflush(stderr); return NULL; } @@ -1326,11 +1314,10 @@ const char* maccoreaudio_getTransportType( return transportTypeVirtual; break; default: - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getTransportType (coreaudio/device.c): \ - \n\tNo transport type found for device %s\n", + \n\tNo transport type found for device %s", deviceUID); - fflush(stderr); return NULL; break; } @@ -1418,11 +1405,10 @@ maccoreaudio_stream * maccoreaudio_startStream( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_startStream (coreaudio/device.c): \ - \n\tmaccoreaudio_getDevice: %s\n", + \n\tmaccoreaudio_getDevice: %s", deviceUID); - fflush(stderr); return NULL; } @@ -1431,8 +1417,11 @@ maccoreaudio_stream * maccoreaudio_startStream( if((stream = (maccoreaudio_stream*) malloc(sizeof(maccoreaudio_stream))) == NULL) { - perror("maccoreaudio_startStream (coreaudio/device.c): \ - \n\tmalloc\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_startStream (coreaudio/device.c): \ + \n\tmalloc", + strerror(errno)); return NULL; } stream->ioProcId = NULL; @@ -1442,8 +1431,11 @@ maccoreaudio_stream * maccoreaudio_startStream( if(pthread_mutex_init(&stream->mutex, NULL) != 0) { - perror("maccoreaudio_startStream (coreaudio/device.c): \ - \n\tpthread_mutex_init\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_startStream (coreaudio/device.c): \ + \n\tpthread_mutex_init", + strerror(errno)); free(stream); return NULL; } @@ -1466,12 +1458,11 @@ maccoreaudio_stream * maccoreaudio_startStream( &stream->conversionRatio)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_startStream (coreaudio/device.c): \ - \n\tmaccoreaudio_initConverter: 0x%x for device %s\n", + \n\tmaccoreaudio_initConverter: 0x%x for device %s", (int) err, deviceUID); - fflush(stderr); pthread_mutex_destroy(&stream->mutex); free(stream); return NULL; @@ -1484,12 +1475,11 @@ maccoreaudio_stream * maccoreaudio_startStream( stream, &stream->ioProcId)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_startStream (coreaudio/device.c): \ - \n\tAudioDeviceIOProcID: 0x%x for device %s\n", + \n\tAudioDeviceIOProcID: 0x%x for device %s", (int) err, deviceUID); - fflush(stderr); AudioConverterDispose(stream->converter); pthread_mutex_destroy(&stream->mutex); free(stream); @@ -1499,12 +1489,11 @@ maccoreaudio_stream * maccoreaudio_startStream( // start IO if((err = AudioDeviceStart(device, stream->ioProcId)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_startStream (coreaudio/device.c): \ - \n\tAudioDeviceStart: 0x%x for device %s\n", + \n\tAudioDeviceStart: 0x%x for device %s", (int) err, deviceUID); - fflush(stderr); AudioDeviceDestroyIOProcID(device, stream->ioProcId); AudioConverterDispose(stream->converter); pthread_mutex_destroy(&stream->mutex); @@ -1530,64 +1519,69 @@ void maccoreaudio_stopStream( if(pthread_mutex_lock(&stream->mutex) != 0) { - perror("maccoreaudio_stopStream (coreaudio/device.c): \ - \n\tpthread_mutex_lock\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_stopStream (coreaudio/device.c): \ + \n\tpthread_mutex_lock", + strerror(errno)); } // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_stopStream (coreaudio/device.c): \ - \n\tmaccoreaudio_getDevice: %s\n", + \n\tmaccoreaudio_getDevice: %s", deviceUID); - fflush(stderr); } else { // stop IO if((err = AudioDeviceStop(device, stream->ioProcId)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_stopStream (coreaudio/device.c): \ - \n\tAudioDeviceStop: 0x%x for device %s\n", + \n\tAudioDeviceStop: 0x%x for device %s", (int) err, deviceUID); - fflush(stderr); } // unregister the IOProc if((err = AudioDeviceDestroyIOProcID(device, stream->ioProcId)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_stopStream (coreaudio/device.c): \ - \n\tAudioDeviceDestroyIOProcID: 0x%x for device %s\n", + \n\tAudioDeviceDestroyIOProcID: 0x%x for device %s", (int) err, deviceUID); - fflush(stderr); } } if((err = AudioConverterDispose(stream->converter)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_stopStream (coreaudio/device.c): \ - \n\tAudioConverterDispose: 0x%x for device %s\n", + \n\tAudioConverterDispose: 0x%x for device %s", (int) err, deviceUID); - fflush(stderr); } stream->ioProcId = 0; if(pthread_mutex_unlock(&stream->mutex) != 0) { - perror("maccoreaudio_stopStream (coreaudio/device.c): \ - \n\tpthread_mutex_unlock\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_stopStream (coreaudio/device.c): \ + \n\tpthread_mutex_unlock", + strerror(errno)); } if(pthread_mutex_destroy(&stream->mutex) != 0) { - perror("maccoreaudio_stopStream (coreaudio/device.c): \ - \n\tpthread_mutex_destroy\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_stopStream (coreaudio/device.c): \ + \n\tpthread_mutex_destroy", + strerror(errno)); } free(stream); @@ -1603,6 +1597,7 @@ OSStatus maccoreaudio_readInputStream( void* inClientData) { OSStatus err = noErr; + int error = 0; maccoreaudio_stream * stream = (maccoreaudio_stream*) inClientData; void (*callbackFunction) (char*, int, void*, void*) = stream->callbackFunction; @@ -1611,7 +1606,7 @@ OSStatus maccoreaudio_readInputStream( char tmpBuffer[tmpLength]; int i; - if(pthread_mutex_lock(&stream->mutex) == 0) + if((error = pthread_mutex_trylock(&stream->mutex)) == 0) { if(stream->ioProcId != 0) { @@ -1628,11 +1623,10 @@ OSStatus maccoreaudio_readInputStream( tmpBuffer)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_readInputStream (coreaudio/device.c): \ - \n\tAudioConverterConvertBuffer: 0x%x\n", + \n\tAudioConverterConvertBuffer: 0x%x", (int) err); - fflush(stderr); pthread_mutex_unlock(&stream->mutex); return err; } @@ -1647,14 +1641,22 @@ OSStatus maccoreaudio_readInputStream( } if(pthread_mutex_unlock(&stream->mutex) != 0) { - perror("maccoreaudio_readInputStream (coreaudio/device.c): \ - \n\tpthread_mutex_unlock\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_readInputStream (coreaudio/device.c): \ + \n\tpthread_mutex_unlock", + strerror(errno)); } } - else + // If the error equals EBUSY, this means that the mutex is already locked by + // the stop function. + else if(error != EBUSY) { - perror("maccoreaudio_readInputStream (coreaudio/device.c): \ - \n\tpthread_mutex_lock\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_readInputStream (coreaudio/device.c): \ + \n\tpthread_mutex_lock", + strerror(errno)); } return noErr; @@ -1670,6 +1672,7 @@ OSStatus maccoreaudio_writeOutputStream( void* inClientData) { OSStatus err = noErr; + int error = 0; maccoreaudio_stream * stream = (maccoreaudio_stream*) inClientData; void (*callbackFunction) (char*, int, void*, void*) @@ -1684,7 +1687,7 @@ OSStatus maccoreaudio_writeOutputStream( = outOutputData->mBuffers[0].mDataByteSize * stream->conversionRatio; char tmpBuffer[tmpLength]; - if(pthread_mutex_lock(&stream->mutex) == 0) + if((error = pthread_mutex_trylock(&stream->mutex)) == 0) { if(stream->ioProcId != 0) { @@ -1702,10 +1705,9 @@ OSStatus maccoreaudio_writeOutputStream( outOutputData->mBuffers[0].mData)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_writeOutputStream (coreaudio/device.c): \ - \n\tAudioConverterConvertBuffer: 0x%x\n", (int) err); - fflush(stderr); + \n\tAudioConverterConvertBuffer: 0x%x", (int) err); memset( outOutputData->mBuffers[0].mData, 0, @@ -1716,14 +1718,27 @@ OSStatus maccoreaudio_writeOutputStream( } if(pthread_mutex_unlock(&stream->mutex) != 0) { - perror("maccoreaudio_writeOutputStream (coreaudio/device.c): \ - \n\tpthread_mutex_unlock\n"); + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_writeOutputStream (coreaudio/device.c): \ + \n\tpthread_mutex_unlock", + strerror(errno)); } } else { - perror("maccoreaudio_writeOutputStream (coreaudio/device.c): \ - \n\tpthread_mutex_lock\n"); + outOutputData->mBuffers[0].mDataByteSize = 0; + + // If the error equals EBUSY, this means that the mutex is already + // locked by the stop function. + if(error != EBUSY) + { + maccoreaudio_log( + "%s: %s\n", + "maccoreaudio_writeOutputStream (coreaudio/device.c): \ + \n\tpthread_mutex_lock", + strerror(errno)); + } } // Copies the same data into the other buffers. @@ -1786,11 +1801,10 @@ OSStatus maccoreaudio_getStreamVirtualFormat( format)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getStreamVirtualFormat (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData, err: 0x%x\n", + \n\tAudioObjectGetPropertyData, err: 0x%x", ((int) err)); - fflush(stderr); return err; } @@ -1825,23 +1839,21 @@ OSStatus maccoreaudio_initConverter( &deviceFormat)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_initConverter (coreaudio/device.c): \ - \n\tmaccoreaudio_getDeviceFormat for device: %s\n", + \n\tmaccoreaudio_getDeviceFormat for device: %s", deviceUID); - fflush(stderr); if((err = maccoreaudio_getDeviceFormatDeprecated( deviceUID, isJavaFormatSource, &deviceFormat)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_initConverter (coreaudio/device.c): \ \n\tmaccoreaudio_getDeviceFormatDeprecated \ - for device: %s\n", + for device: %s", deviceUID); - fflush(stderr); // Everything has failed to retrieve the device format, then try // with the default one. @@ -1860,11 +1872,10 @@ OSStatus maccoreaudio_initConverter( if((err = AudioConverterNew(inFormat, outFormat, converter)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_initConverter (coreaudio/device.c): \ - \n\tAudioConverterNew, err: 0x%x\n", + \n\tAudioConverterNew, err: 0x%x", ((int) err)); - fflush(stderr); return err; } @@ -1969,11 +1980,10 @@ maccoreaudio_getDeviceFormat( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceFormat (coreaudio/device.c): \ - \n\tgetDevice: %s\n", + \n\tgetDevice: %s", deviceUID); - fflush(stderr); return kAudioObjectUnknown; } @@ -1998,12 +2008,11 @@ maccoreaudio_getDeviceFormat( &audioStreamIds)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceFormat (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData, err: 0x%x for device %s\n", + \n\tAudioObjectGetPropertyData, err: 0x%x for device %s", ((int) err), deviceUID); - fflush(stderr); return err; } @@ -2012,13 +2021,12 @@ maccoreaudio_getDeviceFormat( deviceFormat)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceFormat (coreaudio/device.c): \ \n\tmaccoreaudio_getStreamVirtualFormat, err: 0x%x\ - for device %s\n", + for device %s", ((int) err), deviceUID); - fflush(stderr); return err; } @@ -2047,11 +2055,10 @@ maccoreaudio_getDeviceFormatDeprecated( // Gets the correspoding device if((device = maccoreaudio_getDevice(deviceUID)) == kAudioObjectUnknown) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceFormatDeprecated (coreaudio/device.c): \ - \n\tgetDevice: %s\n", + \n\tgetDevice: %s", deviceUID); - fflush(stderr); return kAudioObjectUnknown; } @@ -2077,12 +2084,11 @@ maccoreaudio_getDeviceFormatDeprecated( deviceFormat)) != noErr) { - fprintf(stderr, + maccoreaudio_log( "maccoreaudio_getDeviceFormatDeprecated (coreaudio/device.c): \ - \n\tAudioObjectGetPropertyData err: 0x%x for device %s\n", + \n\tAudioObjectGetPropertyData err: 0x%x for device %s", ((int) err), deviceUID); - fflush(stderr); } return err; diff --git a/src/org/jitsi/impl/neomedia/CoreAudioDevice.java b/src/org/jitsi/impl/neomedia/CoreAudioDevice.java index ae2d56b4739602ff4a38a1dffbaf4d27c7c0863f..01c4f67e9db18162992804037fa9ea91217f1de2 100644 --- a/src/org/jitsi/impl/neomedia/CoreAudioDevice.java +++ b/src/org/jitsi/impl/neomedia/CoreAudioDevice.java @@ -15,6 +15,13 @@ */ public class CoreAudioDevice { + /** + * The <tt>Logger</tt> used by the <tt>CoreAudioDevice</tt> class and + * its instances for logging output. + */ + private static final Logger logger + = Logger.getLogger(CoreAudioDevice.class); + /** * Tells if the CoreAudio library used by this CoreAudioDevice is correctly * loaded: if we are under a supported operating system. @@ -132,4 +139,10 @@ public static void setDevicesChangedCallback( { CoreAudioDevice.devicesChangedCallback = devicesChangedCallback; } + + public static void log(byte[] error) + { + String errorString = StringUtils.newString(error); + logger.info(errorString); + } }