output/osx: move code to FindAudioDeviceByName()
This commit is contained in:
		@@ -542,16 +542,36 @@ osx_output_hog_device(AudioDeviceID dev_id, bool hog)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gcc_pure
 | 
				
			||||||
static void
 | 
					static bool
 | 
				
			||||||
osx_output_set_device(OSXOutput *oo)
 | 
					IsAudioDeviceName(AudioDeviceID id, const char *expected_name) noexcept
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	OSStatus status;
 | 
						static constexpr AudioObjectPropertyAddress aopa_name{
 | 
				
			||||||
	UInt32 size;
 | 
							kAudioObjectPropertyName,
 | 
				
			||||||
 | 
							kAudioObjectPropertyScopeGlobal,
 | 
				
			||||||
 | 
							kAudioObjectPropertyElementMaster,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (oo->component_subtype != kAudioUnitSubType_HALOutput)
 | 
						CFStringRef cfname;
 | 
				
			||||||
		return;
 | 
						UInt32 size = sizeof(cfname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (AudioObjectGetPropertyData(id, &aopa_name,
 | 
				
			||||||
 | 
									       0, nullptr,
 | 
				
			||||||
 | 
									       &size, &cfname) != noErr)
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const Apple::StringRef cfname_(cfname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char actual_name[256];
 | 
				
			||||||
 | 
						if (!cfname_.GetCString(actual_name, sizeof(actual_name)))
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return StringIsEqual(actual_name, expected_name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static AudioDeviceID
 | 
				
			||||||
 | 
					FindAudioDeviceByName(const char *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
	/* what are the available audio device IDs? */
 | 
						/* what are the available audio device IDs? */
 | 
				
			||||||
	static constexpr AudioObjectPropertyAddress aopa_hw_devices{
 | 
						static constexpr AudioObjectPropertyAddress aopa_hw_devices{
 | 
				
			||||||
		kAudioHardwarePropertyDevices,
 | 
							kAudioHardwarePropertyDevices,
 | 
				
			||||||
@@ -559,60 +579,45 @@ osx_output_set_device(OSXOutput *oo)
 | 
				
			|||||||
		kAudioObjectPropertyElementMaster,
 | 
							kAudioObjectPropertyElementMaster,
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const auto deviceids =
 | 
						const auto ids =
 | 
				
			||||||
		AudioObjectGetPropertyDataArray<AudioDeviceID>(kAudioObjectSystemObject,
 | 
							AudioObjectGetPropertyDataArray<AudioDeviceID>(kAudioObjectSystemObject,
 | 
				
			||||||
							       aopa_hw_devices);
 | 
												       aopa_hw_devices);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* which audio device matches oo->device_name? */
 | 
						for (const auto id : ids) {
 | 
				
			||||||
	static constexpr AudioObjectPropertyAddress aopa_name{
 | 
							if (IsAudioDeviceName(id, name))
 | 
				
			||||||
		kAudioObjectPropertyName,
 | 
								return id;
 | 
				
			||||||
		kAudioObjectPropertyScopeGlobal,
 | 
					 | 
				
			||||||
		kAudioObjectPropertyElementMaster,
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const unsigned numdevices = deviceids.size();
 | 
					 | 
				
			||||||
	unsigned i;
 | 
					 | 
				
			||||||
	size = sizeof(CFStringRef);
 | 
					 | 
				
			||||||
	for (i = 0; i < numdevices; i++) {
 | 
					 | 
				
			||||||
		CFStringRef cfname = nullptr;
 | 
					 | 
				
			||||||
		status = AudioObjectGetPropertyData(deviceids[i], &aopa_name,
 | 
					 | 
				
			||||||
						    0, nullptr,
 | 
					 | 
				
			||||||
						    &size, &cfname);
 | 
					 | 
				
			||||||
		if (status != noErr)
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		const Apple::StringRef cfname_(cfname);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		char name[256];
 | 
					 | 
				
			||||||
		if (!cfname_.GetCString(name, sizeof(name)))
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (StringIsEqual(oo->device_name, name)) {
 | 
					 | 
				
			||||||
			FormatDebug(osx_output_domain,
 | 
					 | 
				
			||||||
				    "found matching device: ID=%u, name=%s",
 | 
					 | 
				
			||||||
				    (unsigned)deviceids[i], name);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (i == numdevices)
 | 
						throw FormatRuntimeError("Found no audio device with name '%s' ",
 | 
				
			||||||
		throw FormatRuntimeError("Found no audio device with name '%s' ",
 | 
									 name);
 | 
				
			||||||
			      oo->device_name);
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					osx_output_set_device(OSXOutput *oo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (oo->component_subtype != kAudioUnitSubType_HALOutput)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const auto id = FindAudioDeviceByName(oo->device_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						FormatDebug(osx_output_domain,
 | 
				
			||||||
 | 
							    "found matching device: ID=%u, name=%s",
 | 
				
			||||||
 | 
							    (unsigned)id, oo->device_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						OSStatus status;
 | 
				
			||||||
	status = AudioUnitSetProperty(oo->au,
 | 
						status = AudioUnitSetProperty(oo->au,
 | 
				
			||||||
				      kAudioOutputUnitProperty_CurrentDevice,
 | 
									      kAudioOutputUnitProperty_CurrentDevice,
 | 
				
			||||||
				      kAudioUnitScope_Global,
 | 
									      kAudioUnitScope_Global,
 | 
				
			||||||
				      0,
 | 
									      0,
 | 
				
			||||||
				      &(deviceids[i]),
 | 
									      &id, sizeof(id));
 | 
				
			||||||
				      sizeof(AudioDeviceID));
 | 
					 | 
				
			||||||
	if (status != noErr)
 | 
						if (status != noErr)
 | 
				
			||||||
		Apple::ThrowOSStatus(status,
 | 
							Apple::ThrowOSStatus(status,
 | 
				
			||||||
				     "Unable to set OS X audio output device");
 | 
									     "Unable to set OS X audio output device");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	oo->dev_id = deviceids[i];
 | 
						oo->dev_id = id;
 | 
				
			||||||
	FormatDebug(osx_output_domain,
 | 
						FormatDebug(osx_output_domain,
 | 
				
			||||||
		    "set OS X audio output device ID=%u, name=%s",
 | 
							    "set OS X audio output device ID=%u, name=%s",
 | 
				
			||||||
		    (unsigned)deviceids[i], oo->device_name);
 | 
							    (unsigned)id, oo->device_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (oo->channel_map)
 | 
						if (oo->channel_map)
 | 
				
			||||||
		osx_output_set_channel_map(oo);
 | 
							osx_output_set_channel_map(oo);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user