Android 全球音轨死亡

Android 全球音轨死亡,android,audio,Android,Audio,我有一个应用程序,其中有几个线程,每个线程都被抽入一个单独的音轨,设置为MODE\u STREAM。在应用程序之间切换工作正常,当应用程序正常关闭时,它似乎可以正确关闭所有应用程序 但是,如果应用程序在外部终止,例如从调试器终止,或者因为我刚刚安装了一个新版本,而旧版本正在运行,那么全局音频混音器中的某些状态似乎会出现混乱,我会得到如下logcat输出: 09-16 14:50:38.965 298 7150 W AudioTrack: obtainBuffer timed out (is

我有一个应用程序,其中有几个线程,每个线程都被抽入一个单独的音轨,设置为
MODE\u STREAM
。在应用程序之间切换工作正常,当应用程序正常关闭时,它似乎可以正确关闭所有应用程序

但是,如果应用程序在外部终止,例如从调试器终止,或者因为我刚刚安装了一个新版本,而旧版本正在运行,那么全局音频混音器中的某些状态似乎会出现混乱,我会得到如下logcat输出:

09-16 14:50:38.965   298  7150 W AudioTrack: obtainBuffer timed out (is the CPU pegged?) 0x83c2348 user=00000eb3, server=00000000
09-16 14:50:39.025  7066  7132 W AudioTrack: obtainBuffer timed out (is the CPU pegged?) 0x8249d40 user=00002000, server=00000000
09-16 14:50:40.277   298  7156 W AudioTrack: obtainBuffer timed out (is the CPU pegged?) 0x84cb810 user=00000eb3, server=00000000
在我重新启动设备之前,任何使用AudioTrack的应用程序都无法再次播放音频。在这个特定的日志片段中,PID 298是system_服务器,7066是应用程序的新实例

我认为正在发生的是,在编剧线程有机会清理之前,有声音乐正在消失。这让我觉得我应该做些别的事情来清理。我已经将我的活动的
捕获到桌面上
ondestory上
,并让它们关闭我的音频线程,但是还有其他地方需要这样做吗


还有,有没有更好的方法来清理音轨?Android的这一部分似乎特别脆弱,但我无法想象每个人都在使用SoundPool和MediaPlayer,因为这些API非常有限和灵活(而且两者似乎只是以不同的方式包装音轨)。

我从我开发的许多摩托罗拉设备中了解到这个特殊问题。你的设备是Droid系列的吗? 无论如何,我能说的最好的情况是,摩托罗拉应该被告知很多次,直到他们费心去修复它


终止进程会绕过活动的生命周期,因此您不会做错任何事情。

不幸的是,您的应用程序在被操作系统终止并替换为新版本之前不会收到任何警告。您可以通过一个非常简单的活动来测试这一点,其中onPause()onStart()onStop()和onDestroy()方法生成日志消息。如果安装新版本的应用程序,onStop()和onDestroy()方法中的消息将永远不会生成

关于AudioTrack问题,这可能是设备音频驱动程序的一个缺陷。此外,这个问题的另一个答案也让我相信了这一点。如果此问题仅限于少数制造商的一部分手机,而不是所有手机,则表明制造商的声音驱动程序不好

您是否考虑过使用MediaPlayer API而不是AudioTrack。它没有同样的灵活性,但它可能是一个可行的解决办法


一个可能的解决方法是将应用程序实际拆分为两个单独的APK进行调试。一个什么也不做,只播放音频,由第二个应用程序控制。这样,无论何时安装更新的控制器,播放音频的二进制文件都不会受到影响,也不会经历突然终止和重新安装。然后,当您准备分发应用程序时,只需将两者合并为一个apk,然后分发即可。

谢谢。这是一个正在开发的设备,所以我要向我们的驱动团队投诉。不幸的是,MediaPlayer不是一个选项,因为我在最初的问题中暗示了各种原因,但我真的不想进入,因为它与我遇到的实际问题无关。基本上,我们需要多个流音频源的低延迟播放,也可以无间隙重复。MediaPlayer也无法处理程序生成的音频,这是我们希望在将来添加的。我使用Surface view自定义类来播放视频,但在三星设备中,它返回
E/MediaPlayer:Error(1,-19)
java.lang.IllegalStateException
在android.media.MediaPlayer.getCurrentPosition(本机方法)
如果我试图在不同的地方播放多时间视频