AudioObjectAddPropertyListenerBlock未在Swift 3中调用
问题描述:
我想观察使用Swift 3进行音频设备参数更改。我查找一些信息并找到此代码。在我的视图模型,我建立一个监听块,并将得到的状态为0(成功):AudioObjectAddPropertyListenerBlock未在Swift 3中调用
override func viewDidLoad() {
super.viewDidLoad()
addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock,
onAudioObjectID: AudioObjectID(bitPattern: kAudioObjectSystemObject),
forPropertyAddress: AudioObjectPropertyAddress(
mSelector: kAudioDevicePropertyVolumeScalar,
mScope: kAudioObjectPropertyScopeGlobal,
mElement: kAudioObjectPropertyElementMaster))
}
// Utility function to simplify adding listener blocks:
func addListenerBlock(listenerBlock: @escaping AudioObjectPropertyListenerBlock, onAudioObjectID: AudioObjectID, forPropertyAddress: AudioObjectPropertyAddress) {
var forPropertyAddress = forPropertyAddress
let status = AudioObjectAddPropertyListenerBlock(onAudioObjectID, &forPropertyAddress, nil, listenerBlock)
print(status)
}
func audioObjectPropertyListenerBlock (numberAddresses: UInt32, addresses: UnsafePointer<AudioObjectPropertyAddress>) {
var index: UInt32 = 0
while index < numberAddresses {
let address: AudioObjectPropertyAddress = addresses[index]
switch address.mSelector {
case kAudioHardwarePropertyDefaultOutputDevice:
let deviceID = getDefaultAudioOutputDevice()
print("kAudioHardwarePropertyDefaultOutputDevice: \(deviceID)")
default:
print("We didn't expect this!")
}
index += 1
}
}
// Utility function to get default audio output device:
func getDefaultAudioOutputDevice() -> AudioObjectID {
var devicePropertyAddress = AudioObjectPropertyAddress(mSelector: kAudioHardwarePropertyDefaultOutputDevice, mScope: kAudioObjectPropertyScopeGlobal, mElement: kAudioObjectPropertyElementMaster)
var deviceID: AudioObjectID = 0
var dataSize = UInt32(truncatingBitPattern: MemoryLayout<AudioDeviceID>.size)
let systemObjectID = AudioObjectID(bitPattern: kAudioObjectSystemObject)
if (kAudioHardwareNoError != AudioObjectGetPropertyData(systemObjectID, &devicePropertyAddress, 0, nil, &dataSize, &deviceID)) { return 0 }
return deviceID
}
而即便OSStatus是0和听众加入,那就不叫当我改变一个参数(在这种情况下,输出量)。我在audioObjectPropertyListenerBlock中设置了一个断点,但我的应用程序永远不会到达那里。我错过了什么?
答
问题所在位置:
addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock,
onAudioObjectID: AudioObjectID(bitPattern: kAudioObjectSystemObject),
forPropertyAddress: AudioObjectPropertyAddress(
mSelector: kAudioDevicePropertyVolumeScalar,
mScope: kAudioObjectPropertyScopeGlobal,
mElement: kAudioObjectPropertyElementMaster))
-
onAudioObjectID
应该是默认的输出设备:getDefaultAudioOutputDevice()
(这些INT-LY类型的API混淆) -
mScope
应kAudioObjectPropertyScopeOutput
,和 -
mElement
应该是1或2.(至少我的输出设备没有主元件!)
一起:
addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock,
onAudioObjectID: getDefaultAudioOutputDevice(),
forPropertyAddress: AudioObjectPropertyAddress(
mSelector: kAudioDevicePropertyVolumeScalar,
mScope: kAudioObjectPropertyScopeOutput,
mElement: 1))
这些变化之后,当左声道输出音量改变你的听众块被调用。
但是,我不确定你要在监听器块中做什么,因为mSelector
始终是您要求的kAudioDevicePropertyVolumeScalar
,从来没有kAudioObjectSystemObject
。
对于无效的'objectID' /'AudioObjectPropertyAddress'组合,'AudioObjectAddPropertyListenerBlock'返回无错误是令人难以置信的错误。 –