2017-06-20 7 views
3

マイク入力付きのBluetoothヘッドフォンが1組あります。マイクは使用されませんが、入力と出力の両方が8000kHzに強制されます。AVAudioEngineは、Bluetoothヘッドセットを接続したときに間違った形式を使用します

AVAudioEngineインスタンスは、システム設定を入力して入力用にヘッドセットを使用しない限り(ヘッドセットが接続されるたびに実行する必要があります)、8000kHzモードでヘッドセットに接続します。

他のアプリケーションが44100kHzで問題なく再生できることに気付きました。私のAVAudioEngineグラフに入力ノードはありません。

AVAudioEngineを合理的なサンプルレートで接続するにはどうすればいいですか?

+0

これはhttps://stackoverflow.com/questions/31501961とhttps://stackoverflow.com/questions/26728250に関連しています。 – Henrik

答えて

2

私の賞金を払わなかった後、私はApple 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

関連する問題