2017-05-08 94 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