1
我想觀察使用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中設置了一個斷點,但我的應用程序永遠不會到達那裏。我錯過了什麼?
對於無效的'objectID' /'AudioObjectPropertyAddress'組合,'AudioObjectAddPropertyListenerBlock'返回無錯誤是令人難以置信的錯誤。 –