void SocketStreamHandle::reportErrorToClient(CFErrorRef error) { CFIndex errorCode = CFErrorGetCode(error); String description; #if PLATFORM(MAC) #if COMPILER(CLANG) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" #endif if (CFEqual(CFErrorGetDomain(error), kCFErrorDomainOSStatus)) { const char* descriptionOSStatus = GetMacOSStatusCommentString(static_cast<OSStatus>(errorCode)); if (descriptionOSStatus && descriptionOSStatus[0] != '\0') description = "OSStatus Error " + String::number(errorCode) + ": " + descriptionOSStatus; } #if COMPILER(CLANG) #pragma clang diagnostic pop #endif #endif if (description.isNull()) { RetainPtr<CFStringRef> descriptionCF(AdoptCF, CFErrorCopyDescription(error)); description = String(descriptionCF.get()); } m_client->didFailSocketStream(this, SocketStreamError(static_cast<int>(errorCode), m_url.string(), description)); }
static PyObject *AE_GetOSStatusStrings(PyObject* self, PyObject* args) { OSStatus errNum; if (!PyArg_ParseTuple(args, "i", &errNum)) return NULL; const char *errorStr = GetMacOSStatusErrorString(errNum); const char *commentStr = GetMacOSStatusCommentString(errNum); return Py_BuildValue("ss", errorStr, commentStr); }
inline void throwOSError(OSStatus status, unsigned line) { std::ostringstream str; #ifdef GOSU_IS_IPHONE str << "Error on line " << line << " (Code " << status << ")"; #else str << "Error on line " << line << " (Code " << status << "): " << GetMacOSStatusErrorString(status) << " (" << GetMacOSStatusCommentString(status) << ")"; #endif throw std::runtime_error(str.str()); }
static bool osx_output_enable(struct audio_output *ao, GError **error_r) { struct osx_output *oo = (struct osx_output *)ao; ComponentDescription desc; desc.componentType = kAudioUnitType_Output; desc.componentSubType = oo->component_subtype; desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; Component comp = FindNextComponent(NULL, &desc); if (comp == 0) { g_set_error(error_r, osx_output_quark(), 0, "Error finding OS X component"); return false; } OSStatus status = OpenAComponent(comp, &oo->au); if (status != noErr) { g_set_error(error_r, osx_output_quark(), status, "Unable to open OS X component: %s", GetMacOSStatusCommentString(status)); return false; } if (!osx_output_set_device(oo, error_r)) { CloseComponent(oo->au); return false; } AURenderCallbackStruct callback; callback.inputProc = osx_render; callback.inputProcRefCon = oo; ComponentResult result = AudioUnitSetProperty(oo->au, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)); if (result != noErr) { CloseComponent(oo->au); g_set_error(error_r, osx_output_quark(), result, "unable to set callback for OS X audio unit"); return false; } return true; }
/* This function only works on 10.5 and later. Pass in a unicode object as path */ static PyObject* usbobserver_send2trash(PyObject *self, PyObject *args) { UInt8 *utf8_chars; FSRef fp; OSStatus op_result; if (!PyArg_ParseTuple(args, "es", "utf-8", &utf8_chars)) { return NULL; } FSPathMakeRefWithOptions(utf8_chars, kFSPathMakeRefDoNotFollowLeafSymlink, &fp, NULL); op_result = FSMoveObjectToTrashSync(&fp, NULL, kFSFileOperationDefaultOptions); PyMem_Free(utf8_chars); if (op_result != noErr) { PyErr_SetString(PyExc_OSError, GetMacOSStatusCommentString(op_result)); return NULL; } Py_RETURN_NONE; }
void SocketStreamHandle::reportErrorToClient(CFErrorRef error) { CFIndex errorCode = CFErrorGetCode(error); String description; #if PLATFORM(MAC) if (CFEqual(CFErrorGetDomain(error), kCFErrorDomainOSStatus)) { const char* descriptionOSStatus = GetMacOSStatusCommentString(static_cast<OSStatus>(errorCode)); if (descriptionOSStatus && descriptionOSStatus[0] != '\0') description = makeString("OSStatus Error ", String::number(errorCode), ": ", descriptionOSStatus); } #endif if (description.isNull()) { RetainPtr<CFStringRef> descriptionCF(AdoptCF, CFErrorCopyDescription(error)); description = String(descriptionCF.get()); } m_client->didFail(this, SocketStreamError(static_cast<int>(errorCode), m_url.string(), description)); }
const char *GetMacOSStatusErrStrings(ErrCode err, const char **comment) { #if defined(WIN32) || defined(_WINDOWS) || defined(_MSC_VER) MacErrorTables *et; if( met_initialised && metMap.count(err) ){ if( (et = metMap[err]) ){ if( comment ){ *comment = et->errComment; } return et->errString; } } return NULL; #else if( comment ){ *comment = GetMacOSStatusCommentString(err); } return GetMacOSStatusErrorString(err); #endif }
// Modified from NESControllerInterface of Macifom project, // used under MIT license from http://macifom.googlecode.com/svn-history/r89/Macifom/trunk/NESControllerInterface.m // Used under MIT license from http://inquisitivecocoa.com/2009/04/05/key-code-translator/ static wchar_t KeyCodeToChar(CGKeyCode keyCode, unsigned int modifierFlags) { TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData); const UCKeyboardLayout *keyboardLayout = uchr ? (const UCKeyboardLayout*)CFDataGetBytePtr(uchr) : NULL; if( keyboardLayout ) { UInt32 deadKeyState = 0; UniCharCount maxStringLength = 255; UniCharCount actualStringLength = 0; UniChar unicodeString[maxStringLength]; OSStatus status = UCKeyTranslate(keyboardLayout, keyCode, kUCKeyActionDown, modifierFlags, LMGetKbdType(), 0, &deadKeyState, maxStringLength, &actualStringLength, unicodeString); if( status != noErr ) { fprintf(stderr, "There was an %s error translating from the '%d' key code to a human readable string: %s\n", GetMacOSStatusErrorString(status), (int)status, GetMacOSStatusCommentString(status)); } else if( actualStringLength == 0 ) { fprintf(stderr, "Couldn't find a translation for the '%d' key code\n", keyCode); } else { return unicodeString[0]; } } else { fprintf(stderr, "Couldn't find a translation for the '%d' key code\n", keyCode); } return 0; }
int macosx_audio_open(audio_desc_t ad, audio_format* ifmt, audio_format *ofmt) { OSStatus err = noErr; UInt32 propertySize; Boolean writable; obtained_ = false; add = ad; //dev[0] = devices[ad]; UNUSED(ofmt); // Get the default input device ID. err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDefaultInputDevice, &propertySize, &writable); if (err != noErr) { return 0; } err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &propertySize, &(devices[ad].inputDeviceID_)); if (err != noErr) { debug_msg("error kAudioHardwarePropertyDefaultInputDevice"); return 0; } if (devices[ad].inputDeviceID_ == kAudioDeviceUnknown) { debug_msg("error kAudioDeviceUnknown"); return 0; } // Get the input stream description. err = AudioDeviceGetPropertyInfo(devices[ad].inputDeviceID_, 0, true, kAudioDevicePropertyStreamFormat, &propertySize, &writable); if (err != noErr) { debug_msg("error AudioDeviceGetPropertyInfo"); return 0; } err = AudioDeviceGetProperty(devices[ad].inputDeviceID_, 0, true, kAudioDevicePropertyStreamFormat, &propertySize, &(devices[ad].inputStreamBasicDescription_)); //printf("inputStreamBasicDescription_.mBytesPerFrame %d\n", devices[add].inputStreamBasicDescription_); if (err != noErr) { debug_msg("error AudioDeviceGetProperty"); return 0; } // nastavime maly endian devices[ad].inputStreamBasicDescription_.mFormatFlags &= (kAudioFormatFlagIsBigEndian & 0); if (writable) { err = AudioDeviceSetProperty(devices[ad].inputDeviceID_, NULL, 0, true, kAudioDevicePropertyStreamFormat, sizeof(AudioStreamBasicDescription), &(devices[ad].inputStreamBasicDescription_)); if (err != noErr) printf("err: AudioDeviceSetProperty: kAudioDevicePropertyStreamFormat\n"); } /* set the buffer size of the device */ /* int bufferByteSize = 8192; propertySize = sizeof(bufferByteSize); err = AudioDeviceSetProperty(devices[ad].inputDeviceID_, NULL, 0, true, kAudioDevicePropertyBufferSize, propertySize, &bufferByteSize); if (err != noErr) debug_msg("err: Set kAudioDevicePropertyBufferSize to %d\n", bufferByteSize); else debug_msg("sucessfully set kAudioDevicePropertyBufferSize to %d\n", bufferByteSize); */ // Set the device sample rate -- a temporary fix for the G5's // built-in audio and possibly other audio devices. Boolean IsInput = 0; int inChannel = 0; Float64 theAnswer = 44100; UInt32 theSize = sizeof(theAnswer); err = AudioDeviceSetProperty(devices[ad].inputDeviceID_, NULL, inChannel, IsInput, kAudioDevicePropertyNominalSampleRate, theSize, &theAnswer); if (err != noErr) { debug_msg("error AudioDeviceSetProperty\n"); return 0; } debug_msg("Sample rate, %f\n", theAnswer); #if defined(MAC_OS_X_VERSION_10_5) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) err = AudioDeviceCreateIOProcID(devices[ad].inputDeviceID_, audioIOProc, (void*)NULL, &devices[ad].inputDeviceProcID_); if (err != noErr) { debug_msg("error AudioDeviceCreateIOProcID, %s\n", GetMacOSStatusCommentString(err)); return 0; } err = OpenADefaultComponent(kAudioUnitType_Output, kAudioUnitSubType_DefaultOutput, &(devices[ad].outputUnit_)); // The HAL AU maybe a better way to in the future... //err = OpenADefaultComponent(kAudioUnitType_Output, kAudioUnitSubType_HALOutput, &(devices[ad].outputUnit_)); if (err != noErr) { debug_msg("error OpenADefaultComponent\n"); return 0; } #else // Register the AudioDeviceIOProc. err = AudioDeviceAddIOProc(devices[ad].inputDeviceID_, audioIOProc, NULL); if (err != noErr) { debug_msg("error AudioDeviceAddIOProc\n"); return 0; } err = OpenDefaultAudioOutput(&(devices[ad].outputUnit_)); if (err != noErr) { debug_msg("error OpenDefaultAudioOutput\n"); return 0; } #endif // Register a callback function to provide output data to the unit. devices[ad].input.inputProc = outputRenderer; devices[ad].input.inputProcRefCon = 0; /* These would be needed if HAL used * UInt32 enableIO =1; err = AudioUnitSetProperty(devices[ad].outputUnit_, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, (const void*)&enableIO, sizeof(UInt32)); enableIO=0; err = AudioUnitSetProperty(devices[ad].outputUnit_, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, (const void*)&enableIO, sizeof(UInt32)); if (err != noErr) { debug_msg("error AudioUnitSetProperty EnableIO with error %ld: %s\n", err, GetMacOSStatusErrorString(err)); return 0; }*/ #if defined(MAC_OS_X_VERSION_10_5) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) err = AudioUnitSetProperty(devices[ad].outputUnit_, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &(devices[ad].input), sizeof(AURenderCallbackStruct)); #else err = AudioUnitSetProperty(devices[ad].outputUnit_, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &(devices[ad].input), sizeof(AURenderCallbackStruct)); #endif if (err != noErr) { debug_msg("error AudioUnitSetProperty1 with error %ld: %s\n", err, GetMacOSStatusErrorString(err)); return 0; } // Define the Mash stream description. Mash puts 20ms of data into each read // and write call. 20ms at 8000Hz equals 160 samples. Each sample is a u_char, // so that's 160 bytes. Mash uses 8-bit mu-law internally, so we need to convert // to 16-bit linear before using the audio data. devices[ad].mashStreamBasicDescription_.mSampleRate = 8000.0; //devices[ad].mashStreamBasicDescription_.mSampleRate = ifmt->sample_rate; devices[ad].mashStreamBasicDescription_.mFormatID = kAudioFormatLinearPCM; #ifdef WORDS_BIGENDIAN devices[ad].mashStreamBasicDescription_.mFormatFlags =kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsBigEndian |kLinearPCMFormatFlagIsPacked; #else devices[ad].mashStreamBasicDescription_.mFormatFlags =kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; #endif devices[ad].mashStreamBasicDescription_.mBytesPerPacket = 2; devices[ad].mashStreamBasicDescription_.mFramesPerPacket = 1; devices[ad].mashStreamBasicDescription_.mBytesPerFrame = 2; devices[ad].mashStreamBasicDescription_.mChannelsPerFrame = 1; devices[ad].mashStreamBasicDescription_.mBitsPerChannel = 16; // Inform the default output unit of our source format. err = AudioUnitSetProperty(devices[ad].outputUnit_, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &(devices[ad].mashStreamBasicDescription_), sizeof(AudioStreamBasicDescription)); if (err != noErr) { debug_msg("error AudioUnitSetProperty2"); printf("error setting output unit source format\n"); return 0; } // check the stream format err = AudioUnitGetPropertyInfo(devices[ad].outputUnit_, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &propertySize, &writable); if (err != noErr) debug_msg("err getting propert info for kAudioUnitProperty_StreamFormat\n"); err = AudioUnitGetProperty(devices[ad].outputUnit_, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamdesc_, &propertySize); if (err != noErr) debug_msg("err getting values for kAudioUnitProperty_StreamFormat\n"); char name[128]; audio_format_name(ifmt, name, 128); debug_msg("Requested ifmt %s\n",name); debug_msg("ifmt bytes pre block: %d\n",ifmt->bytes_per_block); // handle the requested format if (ifmt->encoding != DEV_S16) { audio_format_change_encoding(ifmt, DEV_S16); debug_msg("Requested ifmt changed to %s\n",name); debug_msg("ifmt bytes pre block: %d\n",ifmt->bytes_per_block); } audio_format_name(ofmt, name, 128); debug_msg("Requested ofmt %s\n",name); debug_msg("ofmt bytes pre block: %d\n",ofmt->bytes_per_block); // Allocate the read buffer and Z delay line. //readBufferSize_ = 8192; readBufferSize_ = ifmt->bytes_per_block * ringBufferFactor_; //readBufferSize_ = 320; //printf("readBufferSize_ %d\n", readBufferSize_); readBuffer_ = malloc(sizeof(u_char)*readBufferSize_); bzero(readBuffer_, readBufferSize_ * sizeof(u_char)); //memset(readBuffer_, PCMU_AUDIO_ZERO, readBufferSize_); //inputReadIndex_ = -1; inputReadIndex_ = 0; inputWriteIndex_ = 0; zLine_ = malloc(sizeof(double)*DECIM441_LENGTH / 80); availableInput_ = 0; // Allocate the write buffer. //writeBufferSize_ = 8000; writeBufferSize_ = ofmt->bytes_per_block * ringBufferFactor_; writeBuffer_ = malloc(sizeof(SInt16)*writeBufferSize_); bzero(writeBuffer_, writeBufferSize_ * sizeof(SInt16)); outputReadIndex_ = 0; outputWriteIndex_ = 0; //outputWriteIndex_ = -1; // Start audio processing. err = AudioUnitInitialize(devices[ad].outputUnit_); if (err != noErr) { debug_msg("error AudioUnitInitialize\n"); return 0; } err = AudioDeviceStart(devices[ad].inputDeviceID_, audioIOProc); if (err != noErr) { fprintf(stderr, "Input device error: AudioDeviceStart\n"); return 0; } err = AudioOutputUnitStart(devices[ad].outputUnit_); if (err != noErr) { fprintf(stderr, "Output device error: AudioOutputUnitStart\n"); return 0; } // Inform the default output unit of our source format. /* err = AudioUnitSetProperty(devices[ad].outputUnit_, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &(devices[ad].mashStreamBasicDescription_), sizeof(AudioStreamBasicDescription)); if (err != noErr) { debug_msg("error AudioUnitSetProperty3"); return 0; } */ return 1; };
static OSStatus readRenderProc(void *inRefCon, AudioUnitRenderActionFlags *inActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumFrames, AudioBufferList *ioData) { AURead *d=(AURead*)inRefCon; AudioBufferList lreadAudioBufferList= {0}; mblk_t *rm; OSStatus err; lreadAudioBufferList.mNumberBuffers=1; lreadAudioBufferList.mBuffers[0].mDataByteSize=inNumFrames*sizeof(int16_t)*d->common.nchannels; rm=allocb(lreadAudioBufferList.mBuffers[0].mDataByteSize,0); lreadAudioBufferList.mBuffers[0].mData=rm->b_wptr; lreadAudioBufferList.mBuffers[0].mNumberChannels = 1; //ms_message("request to render %i bytes, inNumFrames=%i",lreadAudioBufferList.mBuffers[0].mDataByteSize,inNumFrames); err=AudioUnitRender(d->common.au, inActionFlags, inTimeStamp, inBusNumber, inNumFrames, &lreadAudioBufferList); if (err!=noErr) { ms_error("AudioUnitRender() for read returned [%i] %s %s",err,GetMacOSStatusErrorString(err),GetMacOSStatusCommentString(err)); return 0; } //ms_message("Got input buffer of size %i",lreadAudioBufferList.mBuffers[0].mDataByteSize); rm->b_wptr+=lreadAudioBufferList.mBuffers[0].mDataByteSize; ms_mutex_lock(&d->common.mutex); putq(&d->rq,rm); ms_mutex_unlock(&d->common.mutex); return 0; }
static bool osx_output_open(void *data, struct audio_format *audio_format, GError **error) { struct osx_output *od = data; ComponentDescription desc; Component comp; AURenderCallbackStruct callback; AudioStreamBasicDescription stream_description; OSStatus status; ComponentResult result; desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_DefaultOutput; desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; comp = FindNextComponent(NULL, &desc); if (comp == 0) { g_set_error(error, osx_output_quark(), 0, "Error finding OS X component"); return false; } status = OpenAComponent(comp, &od->au); if (status != noErr) { g_set_error(error, osx_output_quark(), 0, "Unable to open OS X component: %s", GetMacOSStatusCommentString(status)); return false; } status = AudioUnitInitialize(od->au); if (status != noErr) { CloseComponent(od->au); g_set_error(error, osx_output_quark(), 0, "Unable to initialize OS X audio unit: %s", GetMacOSStatusCommentString(status)); return false; } callback.inputProc = osx_render; callback.inputProcRefCon = od; result = AudioUnitSetProperty(od->au, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, sizeof(callback)); if (result != noErr) { AudioUnitUninitialize(od->au); CloseComponent(od->au); g_set_error(error, osx_output_quark(), 0, "unable to set callback for OS X audio unit"); return false; } stream_description.mSampleRate = audio_format->sample_rate; stream_description.mFormatID = kAudioFormatLinearPCM; stream_description.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; #if G_BYTE_ORDER == G_BIG_ENDIAN stream_description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; #endif stream_description.mBytesPerPacket = audio_format_frame_size(audio_format); stream_description.mFramesPerPacket = 1; stream_description.mBytesPerFrame = stream_description.mBytesPerPacket; stream_description.mChannelsPerFrame = audio_format->channels; switch (audio_format->format) { case SAMPLE_FORMAT_S8: stream_description.mBitsPerChannel = 8; break; case SAMPLE_FORMAT_S16: stream_description.mBitsPerChannel = 16; break; default: audio_format->format = SAMPLE_FORMAT_S16; stream_description.mBitsPerChannel = 16; break; } result = AudioUnitSetProperty(od->au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &stream_description, sizeof(stream_description)); if (result != noErr) { AudioUnitUninitialize(od->au); CloseComponent(od->au); g_set_error(error, osx_output_quark(), 0, "Unable to set format on OS X device"); return false; } /* create a buffer of 1s */ od->buffer_size = (audio_format->sample_rate) * audio_format_frame_size(audio_format); od->buffer = g_realloc(od->buffer, od->buffer_size); od->pos = 0; od->len = 0; status = AudioOutputUnitStart(od->au); if (status != 0) { g_set_error(error, osx_output_quark(), 0, "unable to start audio output: %s", GetMacOSStatusCommentString(status)); return false; } return true; }
static void printErrCode(OSStatus err) { const char * errorStringPtr = GetMacOSStatusErrorString(err); const char * commentStringPtr = GetMacOSStatusCommentString(err); DEBUG_DUMP_N(("ERR: %d -- %s -- %s", err, errorStringPtr, commentStringPtr)); }
const char * coreaudio_object_strerror(struct audio_object *object, int error) { return GetMacOSStatusCommentString(error); }
static bool osx_output_open(struct audio_output *ao, struct audio_format *audio_format, GError **error) { struct osx_output *od = (struct osx_output *)ao; AudioStreamBasicDescription stream_description; stream_description.mSampleRate = audio_format->sample_rate; stream_description.mFormatID = kAudioFormatLinearPCM; stream_description.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; switch (audio_format->format) { case SAMPLE_FORMAT_S8: stream_description.mBitsPerChannel = 8; break; case SAMPLE_FORMAT_S16: stream_description.mBitsPerChannel = 16; break; case SAMPLE_FORMAT_S32: stream_description.mBitsPerChannel = 32; break; default: audio_format->format = SAMPLE_FORMAT_S32; stream_description.mBitsPerChannel = 32; break; } #if G_BYTE_ORDER == G_BIG_ENDIAN stream_description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; #endif stream_description.mBytesPerPacket = audio_format_frame_size(audio_format); stream_description.mFramesPerPacket = 1; stream_description.mBytesPerFrame = stream_description.mBytesPerPacket; stream_description.mChannelsPerFrame = audio_format->channels; ComponentResult result = AudioUnitSetProperty(od->au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &stream_description, sizeof(stream_description)); if (result != noErr) { g_set_error(error, osx_output_quark(), result, "Unable to set format on OS X device"); return false; } OSStatus status = AudioUnitInitialize(od->au); if (status != noErr) { g_set_error(error, osx_output_quark(), status, "Unable to initialize OS X audio unit: %s", GetMacOSStatusCommentString(status)); return false; } /* create a buffer of 1s */ od->buffer = fifo_buffer_new(audio_format->sample_rate * audio_format_frame_size(audio_format)); status = AudioOutputUnitStart(od->au); if (status != 0) { AudioUnitUninitialize(od->au); g_set_error(error, osx_output_quark(), status, "unable to start audio output: %s", GetMacOSStatusCommentString(status)); return false; } return true; }
static bool osx_output_set_device(struct osx_output *oo, GError **error) { bool ret = true; OSStatus status; UInt32 size, numdevices; AudioDeviceID *deviceids = NULL; char name[256]; unsigned int i; if (oo->component_subtype != kAudioUnitSubType_HALOutput) goto done; /* how many audio devices are there? */ status = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &size, NULL); if (status != noErr) { g_set_error(error, osx_output_quark(), status, "Unable to determine number of OS X audio devices: %s", GetMacOSStatusCommentString(status)); ret = false; goto done; } /* what are the available audio device IDs? */ numdevices = size / sizeof(AudioDeviceID); deviceids = g_malloc(size); status = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &size, deviceids); if (status != noErr) { g_set_error(error, osx_output_quark(), status, "Unable to determine OS X audio device IDs: %s", GetMacOSStatusCommentString(status)); ret = false; goto done; } /* which audio device matches oo->device_name? */ for (i = 0; i < numdevices; i++) { size = sizeof(name); status = AudioDeviceGetProperty(deviceids[i], 0, false, kAudioDevicePropertyDeviceName, &size, name); if (status != noErr) { g_set_error(error, osx_output_quark(), status, "Unable to determine OS X device name " "(device %u): %s", (unsigned int) deviceids[i], GetMacOSStatusCommentString(status)); ret = false; goto done; } if (strcmp(oo->device_name, name) == 0) { g_debug("found matching device: ID=%u, name=%s", (unsigned int) deviceids[i], name); break; } } if (i == numdevices) { g_warning("Found no audio device with name '%s' " "(will use default audio device)", oo->device_name); goto done; } status = AudioUnitSetProperty(oo->au, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &(deviceids[i]), sizeof(AudioDeviceID)); if (status != noErr) { g_set_error(error, osx_output_quark(), status, "Unable to set OS X audio output device: %s", GetMacOSStatusCommentString(status)); ret = false; goto done; } g_debug("set OS X audio output device ID=%u, name=%s", (unsigned int) deviceids[i], name); done: if (deviceids != NULL) g_free(deviceids); return ret; }