如何区分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
相关产品推荐
相关产品推荐

