summaryrefslogtreecommitdiff
path: root/src/output/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/output/plugins')
-rw-r--r--src/output/plugins/OSXOutputPlugin.cxx91
1 files changed, 48 insertions, 43 deletions
diff --git a/src/output/plugins/OSXOutputPlugin.cxx b/src/output/plugins/OSXOutputPlugin.cxx
index 8034575f1..9ccc45cd2 100644
--- a/src/output/plugins/OSXOutputPlugin.cxx
+++ b/src/output/plugins/OSXOutputPlugin.cxx
@@ -542,16 +542,36 @@ osx_output_hog_device(AudioDeviceID dev_id, bool hog)
}
}
-
-static void
-osx_output_set_device(OSXOutput *oo)
+gcc_pure
+static bool
+IsAudioDeviceName(AudioDeviceID id, const char *expected_name) noexcept
{
- OSStatus status;
- UInt32 size;
+ static constexpr AudioObjectPropertyAddress aopa_name{
+ kAudioObjectPropertyName,
+ kAudioObjectPropertyScopeGlobal,
+ kAudioObjectPropertyElementMaster,
+ };
- if (oo->component_subtype != kAudioUnitSubType_HALOutput)
- return;
+ CFStringRef cfname;
+ 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? */
static constexpr AudioObjectPropertyAddress aopa_hw_devices{
kAudioHardwarePropertyDevices,
@@ -559,60 +579,45 @@ osx_output_set_device(OSXOutput *oo)
kAudioObjectPropertyElementMaster,
};
- const auto deviceids =
+ const auto ids =
AudioObjectGetPropertyDataArray<AudioDeviceID>(kAudioObjectSystemObject,
aopa_hw_devices);
- /* which audio device matches oo->device_name? */
- static constexpr AudioObjectPropertyAddress aopa_name{
- kAudioObjectPropertyName,
- 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;
+ for (const auto id : ids) {
+ if (IsAudioDeviceName(id, name))
+ return id;
+ }
- const Apple::StringRef cfname_(cfname);
+ throw FormatRuntimeError("Found no audio device with name '%s' ",
+ name);
+}
- char name[256];
- if (!cfname_.GetCString(name, sizeof(name)))
- continue;
+static void
+osx_output_set_device(OSXOutput *oo)
+{
+ if (oo->component_subtype != kAudioUnitSubType_HALOutput)
+ return;
- if (StringIsEqual(oo->device_name, name)) {
- FormatDebug(osx_output_domain,
- "found matching device: ID=%u, name=%s",
- (unsigned)deviceids[i], name);
- break;
- }
- }
+ const auto id = FindAudioDeviceByName(oo->device_name);
- if (i == numdevices)
- throw FormatRuntimeError("Found no audio device with name '%s' ",
- 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,
kAudioOutputUnitProperty_CurrentDevice,
kAudioUnitScope_Global,
0,
- &(deviceids[i]),
- sizeof(AudioDeviceID));
+ &id, sizeof(id));
if (status != noErr)
Apple::ThrowOSStatus(status,
"Unable to set OS X audio output device");
- oo->dev_id = deviceids[i];
+ oo->dev_id = id;
FormatDebug(osx_output_domain,
"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)
osx_output_set_channel_map(oo);