1

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

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

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

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

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

1 回答 1

1

当主音频设备发生变化时,您需要打开一个新的音频流,如双簧管完整指南中所述。如果您配置,Oboe 将自动为您处理设备更改的检测。

断开的音频流 如果发生以下事件之一,音频流可能随时断开:

关联的音频设备不再连接(例如拔下耳机时)。内部发生错误。音频设备不再是主要音频设备。- 当流断开连接时,它的状态为“Disconnected”,并且调用 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 还有一个特殊情况。请阅读此内容,这很重要!

于 2021-04-17T16:08:41.653 回答