Swift 3を使用してAudio Device Parameterの変更を監視したいと思います。私のviewmodelで、Iセットアップリスナーブロック、そして得られたステータスは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にブレークポイントを設定しましたが、私のアプリケーションは決してそこに到達しません。私は何を取りこぼしたか?
'AudioObjectAddPropertyListenerBlock'が無効な' objectID'/'AudioObjectPropertyAddress'の組み合わせに対してエラーを返さないということは非常にバグです。 –