如何使用 Android Oboe 库处理扬声器变化?

问题描述

我正在尝试在我的项目中实现双簧管库,以在播放声音时执行最少的延迟。我可以执行播放操作、平移、混合以及内部 Android 库(例如 SoundPool)可以提供的基本功能

我想测试平移效果,我将耳机连接到我的设备,但随后我注意到我的耳机没有播放任何声音。设备扬声器也没有播放任何声音。所以我断开了耳机以检查是否出现问题。我按下了声音播放按钮,但即使耳机与设备完全断开连接,我也听不到任何声音。

当我第一次打开应用程序时,它可以通过设备扬声器播放声音而没有任何问题,但是一旦我连接耳机,设备扬声器和耳机都没有声音播放。

相反,如果我用耳机连接设备启动应用程序,它可以通过耳机很好地播放声音。它甚至可以执行平移效果,但如果我从设备上断开耳机,它会停止播放任何声音。

  1. 每当首选音频设备发生更改时,我是否必须重新打开音频流?
  2. 如果是 1,有什么方法可以通知应用程序音频设备已更改,以便我可以手动关闭流并重新打开它?或者我可以让双簧管自动处理音频设备更改吗?

解决方法

当主要音频设备发生变化时,您需要打开一个新的音频流,如oboe full guide.中所述,如果您对其进行配置,Oboe 将自动为您检测设备变化。

断开的音频流 音频流可能在以下位置断开 如果发生这些事件之一,则随时:

关联的音频设备不再连接(例如当 耳机已拔下)。内部发生错误。一个音频设备 不再是主要的音频设备。 - 当流断开时, 它具有“断开连接”状态并调用 write() 或其他 函数将返回 Result::ErrorDisconnected。当一个流是 断开连接,您所能做的就是关闭它。

这是一个例子

void OboeStreamCallback::onErrorAfterClose(AudioStream *stream,Result result) {
    if (result == oboe::Result::ErrorDisconnected) {
        LOGI("Restarting AudioStream after disconnect");
        soundEngine.restart(); // please check oboe samples for soundEngine.restart(); call
    }
}

Android P 还有一个特例。Please read this,its important!