You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分macOS新Core Audio API的输入/输出AudioHardwareControl?

macOS Sequoia纯Swift版Core Audio API区分输入/输出控件的方法

macOS Sequoia中推出了纯Swift版Core Audio API,无需使用不安全指针即可获取默认输出设备及其所有可用控件,但存在无法区分控件属于输入还是输出的问题:

let system = AudioHardwareSystem.shared
guard let defaultOutputDevice = try system.defaultOutputDevice else { return }
let allControls = try defaultOutputDevice.controls
let volumeControls = allControls.filter { (try? $0.classID) == kAudioVolumeControlClassID }
print(volumeControls) // 2个音量控件,包含输入和输出,但无法区分

虽然可以沿用旧方法实现精准获取:

let system = AudioHardwareSystem.shared
guard let defaultOutputDevice = try system.defaultOutputDevice else { return }
let address = AudioObjectPropertyAddress(mSelector: kAudioHardwareServiceDeviceProperty_VirtualMainVolume,
                                         mScope: kAudioDevicePropertyScopeOutput,
                                         mElement: kAudioObjectPropertyElementMain)
guard defaultOutputDevice.hasProperty(address: address) else { return }
let data = try defaultOutputDevice.propertyData(address: address)
let volume = data.withUnsafeBytes { $0.load(as: Float32.self) }

但通过纯Swift API本身即可区分AudioHardwareControl对应的输入/输出类型:

利用AudioHardwareControl的scope属性,该属性返回的AudioObjectPropertyScope值与旧API中的作用域常量直接对应,可精准筛选输入或输出控件:

let system = AudioHardwareSystem.shared
guard let defaultOutputDevice = try system.defaultOutputDevice else { return }
let allControls = try defaultOutputDevice.controls
let volumeControls = allControls.filter { (try? $0.classID) == kAudioVolumeControlClassID }

// 获取输出音量控件
let outputVolumeControls = volumeControls.filter {
    (try? $0.scope) == kAudioDevicePropertyScopeOutput
}

// 获取输入音量控件
let inputVolumeControls = volumeControls.filter {
    (try? $0.scope) == kAudioDevicePropertyScopeInput
}

内容的提问来源于stack exchange,提问作者Alexander Vasenin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:02:07