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

标签 android audio oboe

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

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

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

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

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

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

关于android - 如何使用 Android 双簧管库处理扬声器更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67092859/

相关文章:

python - 使用 python + 元数据读写立体声 .wav 文件

c++ - 通过 Flutter 从 C++ 插件访问资源

android - 与android ndk混合后是否可以访问音频输出流?

android - 使用编译的 lua 脚本的 Cocos2d-x 在 Android 上不起作用

java - Android 中的单例与应用程序上下文?

android - 在OCR之后从Android中的图像检测字体颜色

java - Java中的频率控制

java - 检查 Firebase Android 中是否存在 ID

iphone - 在后台使用MPMoviePlayer播放mp3文件

android - 将音频(麦克风)输入共享到 Android 中的多个应用程序