如何使用 Android 双簧管库处理扬声器更改?

How to handle speaker change with Android Oboe library?

我正在尝试在我的项目中实施双簧管库,以便在播放声音时执行最少的延迟。我可以执行回放操作、平移、混合,以及 SoundPool 等内部 Android 库可以提供的基础知识。

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

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

相反,如果我在连接耳机的情况下启动应用程序,它可以通过耳机很好地播放声音。它甚至还可以执行声像效果,但是如果我断开耳机与设备的连接,它将停止播放任何声音。

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

如此处所述,当主要音频设备发生变化时,您需要打开新的音频流 oboe full guide. 如果您配置 Oboe,它会自动为您检测设备变化。

Disconnected audio stream An audio stream can become disconnected at any time if one of these events happens:

The associated audio device is no longer connected (for example when headphones are unplugged). An error occurs internally. An audio device is no longer the primary audio device. - When a stream is disconnected, it has the state "Disconnected" and calls to write() or other functions will return Result::ErrorDisconnected. When a stream is disconnected, all you can do is close it.

这是一个例子

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
    }
}

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