2017-05-08 19 views
1

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にブレークポイントを設定しましたが、私のアプリケーションは決してそこに到達しません。私は何を取りこぼしたか?

+0

'AudioObjectAddPropertyListenerBlock'が無効な' objectID'/'AudioObjectPropertyAddress'の組み合わせに対してエラーを返さないということは非常にバグです。 –

答えて

1

問題はここにある:kAudioObjectPropertyScopeOutput、および

  • mElementでなければなりませんgetDefaultAudioOutputDevice()(これらのint-LYは、APIが混乱している型付け)
  • mScope

    addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock, 
           onAudioObjectID: AudioObjectID(bitPattern: kAudioObjectSystemObject), 
           forPropertyAddress: AudioObjectPropertyAddress(
             mSelector: kAudioDevicePropertyVolumeScalar, 
              mScope: kAudioObjectPropertyScopeGlobal, 
             mElement: kAudioObjectPropertyElementMaster)) 
    
    1. onAudioObjectIDは、デフォルトの出力デバイスでなければなりません1または2でなければなりません(少なくとも私の出力デバイスにはマスター要素がありません!)
    すべて一緒

    :これらの変更後

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

    左チャンネルの出力音量が変更されたとき、あなたのリスナーのブロックが呼び出されます。

    リスナーブロックで何をしようとしているのかわかりませんが、mSelectorは常にkAudioDevicePropertyVolumeScalarであり、決してkAudioObjectSystemObjectとなる予定です。

  • 関連する問題