2017-05-08 41 views
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中设置了一个断点,但我的应用程序永远不会到达那里。我错过了什么?

+0

对于无效的'objectID' /'AudioObjectPropertyAddress'组合,'AudioObjectAddPropertyListenerBlock'返回无错误是令人难以置信的错误。 –

回答

1

问题所在位置:

addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock, 
       onAudioObjectID: AudioObjectID(bitPattern: kAudioObjectSystemObject), 
       forPropertyAddress: AudioObjectPropertyAddress(
         mSelector: kAudioDevicePropertyVolumeScalar, 
          mScope: kAudioObjectPropertyScopeGlobal, 
         mElement: kAudioObjectPropertyElementMaster)) 
  1. onAudioObjectID应该是默认的输出设备:getDefaultAudioOutputDevice()(这些INT-LY类型的API混淆)
  2. mScopekAudioObjectPropertyScopeOutput,和
  3. mElement应该是1或2.(至少我的输出设备没有主元件!)

一起:

addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock, 
       onAudioObjectID: getDefaultAudioOutputDevice(), 
       forPropertyAddress: AudioObjectPropertyAddress(
        mSelector: kAudioDevicePropertyVolumeScalar, 
        mScope: kAudioObjectPropertyScopeOutput, 
        mElement: 1)) 

这些变化之后,当左声道输出音量改变你的听众块被调用。

但是,我不确定你要在监听器块中做什么,因为mSelector始终是您要求的kAudioDevicePropertyVolumeScalar,从来没有kAudioObjectSystemObject

相关问题