2017-06-20 54 views
3

我有一對帶麥克風輸入的藍牙耳機。麥克風沒有使用,但是當它是時,輸入和輸出都被強制爲8000kHz。當插入藍牙耳機時,AVAudioEngine使用錯誤的格式

我的AVAudioEngine實例在8000kHz模式下連接到耳機,除非我輸入系統設置並指定我不想使用耳機輸入(每次連接耳機時都必須進行此操作)。

我注意到其他應用程序可以在預期的44100kHz下回放,沒有任何問題。我的AVAudioEngine圖中沒有輸入節點。

如何讓AVAudioEngine更喜歡以合理的採樣率連接?

+0

這與https://stackoverflow.com/questions/31501961和https://stackoverflow.com/questions/26728250有關。 – Henrik

回答

2

在我寫給蘋果DTS的失敗賞金之後,得到了一個很好的回覆(包括下面我從Objective-C翻譯的代碼示例)。

下面的函數將以純輸出模式連接到默認音頻設備,而不是默認行爲的輸入/輸出模式。記得在引擎啓動之前調用它!

func setOutputDeviceFor(_ engine: AVAudioEngine) -> Bool { 
    var addr = AudioObjectPropertyAddress(
     mSelector: kAudioHardwarePropertyDefaultOutputDevice, 
     mScope: kAudioObjectPropertyScopeGlobal, 
     mElement: kAudioObjectPropertyElementMaster) 

    var deviceID: AudioObjectID = 0 
    var size = UInt32(MemoryLayout.size(ofValue: deviceID)) 
    let err = AudioObjectGetPropertyData(
     AudioObjectID(kAudioObjectSystemObject), 
     &addr, 
     0, 
     nil, 
     &size, 
     &deviceID) 

    if (noErr == err && kAudioDeviceUnknown != deviceID) { 
     do { 
      try engine.outputNode.auAudioUnit.setDeviceID(deviceID) 
     } catch { 
      print(error) 
      return false 
     } 
     return true 
    } else { 
     print("ERROR: couldn't get default output device, ID = \(deviceID), err = \(err)") 
     return false 
    } 
} 
+0

Hey Henrik,蘋果工程師告訴你爲什麼或者這個代碼在純輸出模式下連接到什麼地方?這是否意味着當沒有明確連接到輸出設備時,引擎將連接到默認輸入和默認輸出? – stronzo

+0

我沒有得到任何細節,爲什麼默認是這樣。但是,是的,默認情況下它連接到兩者。上面的代碼只連接到輸出元素的原因是因爲它沒有指定輸入,只有「kAudioHardwarePropertyDefaultOutputDevice」。 – Henrik