bool CAHALAudioObject::IsPropertySettable(AudioObjectPropertyAddress& inAddress) const { Boolean isSettable = false; OSStatus theError = AudioObjectIsPropertySettable(mObjectID, &inAddress, &isSettable); ThrowIfError(theError, CAException(theError), "CAHALAudioObject::IsPropertySettable: got an error getting info about a property"); return isSettable != 0; }
static Boolean IsAudioPropertySettable(AudioObjectID id, AudioObjectPropertySelector selector, Boolean *outData) { AudioObjectPropertyAddress property_address; property_address.mSelector = selector; property_address.mScope = kAudioObjectPropertyScopeGlobal; property_address.mElement = kAudioObjectPropertyElementMaster; return AudioObjectIsPropertySettable(id, &property_address, outData); }
Boolean AudioOutputHasVolumeControl(AudioDeviceID device, Boolean *isWritable) { OSStatus err = AudioObjectIsPropertySettable(device, &kAudioOutputVolumeProperty, isWritable); if (noErr == err) { return TRUE; } else { UInt32 channel; err = AudioOutputGetStereoChannels(device, &channel, NULL); if (noErr == err) { return noErr == AudioDeviceGetPropertyInfo(device, channel, FALSE, kAudioDevicePropertyVolumeScalar, NULL, isWritable); } } return FALSE; }
static inline gboolean _audio_device_set_mixing (AudioDeviceID device_id, gboolean enable_mix) { OSStatus status = noErr; UInt32 propertySize = 0, can_mix = enable_mix; Boolean writable = FALSE; gboolean res = FALSE; AudioObjectPropertyAddress audioDeviceSupportsMixingAddress = { kAudioDevicePropertySupportsMixing, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; if (AudioObjectHasProperty (device_id, &audioDeviceSupportsMixingAddress)) { /* Set mixable to false if we are allowed to */ status = AudioObjectIsPropertySettable (device_id, &audioDeviceSupportsMixingAddress, &writable); if (status) { GST_DEBUG ("AudioObjectIsPropertySettable: %d", (int) status); } status = AudioObjectGetPropertyDataSize (device_id, &audioDeviceSupportsMixingAddress, 0, NULL, &propertySize); if (status) { GST_DEBUG ("AudioObjectGetPropertyDataSize: %d", (int) status); } status = AudioObjectGetPropertyData (device_id, &audioDeviceSupportsMixingAddress, 0, NULL, &propertySize, &can_mix); if (status) { GST_DEBUG ("AudioObjectGetPropertyData: %d", (int) status); } if (status == noErr && writable) { can_mix = enable_mix; status = AudioObjectSetPropertyData (device_id, &audioDeviceSupportsMixingAddress, 0, NULL, propertySize, &can_mix); res = TRUE; } if (status != noErr) { GST_ERROR ("failed to set mixmode: %d", (int) status); } } else { GST_DEBUG ("property not found, mixing coudln't be changed"); } return res; }
static BOOL DeviceHasMute(AudioDeviceID deviceID, Boolean isInput) { Boolean writable = false; OSStatus err = noErr; AudioObjectPropertyAddress propertyAddress; propertyAddress.mSelector = kAudioDevicePropertyMute; propertyAddress.mScope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; propertyAddress.mElement = 0; if (AudioObjectHasProperty(deviceID, &propertyAddress)) { /* check if we can set it */ err = AudioObjectIsPropertySettable(deviceID, &propertyAddress, &writable); if (err == noErr) return writable; } return FALSE; }
bool CCoreAudioDevice::GetMixingSupport() { if (!m_DeviceId) return false; UInt32 size; UInt32 mix = 0; Boolean writable = false; AudioObjectPropertyAddress propertyAddress; propertyAddress.mScope = kAudioDevicePropertyScopeOutput; propertyAddress.mElement = 0; propertyAddress.mSelector = kAudioDevicePropertySupportsMixing; if( AudioObjectHasProperty( m_DeviceId, &propertyAddress ) ) { OSStatus ret = AudioObjectIsPropertySettable(m_DeviceId, &propertyAddress, &writable); if (ret) { CLog::Log(LOGERROR, "CCoreAudioDevice::SupportsMixing: " "Unable to get propertyinfo mixing support. Error = %s", GetError(ret).c_str()); writable = false; } if (writable) { size = sizeof(mix); ret = AudioObjectGetPropertyData(m_DeviceId, &propertyAddress, 0, NULL, &size, &mix); if (ret != noErr) mix = 0; } } CLog::Log(LOGDEBUG, "CCoreAudioDevice::SupportsMixing: " "Device mixing support : %s.", mix ? "'Yes'" : "'No'"); return (mix > 0); }
bool CAHALAudioObject::ObjectExists(AudioObjectID inObjectID) { Boolean isSettable; CAPropertyAddress theAddress(kAudioObjectPropertyClass); return (inObjectID == 0) || (AudioObjectIsPropertySettable(inObjectID, &theAddress, &isSettable) != 0); }