我有一个应用程序,其中有多个线程,每个线程都注入(inject)一个单独的 AudioTrack 设置为 MODE_STREAM。在应用程序之间切换工作正常,当应用程序正常关闭时,它似乎正确关闭了所有内容。
但是,如果应用程序在外部终止,例如从调试器终止,或者因为我刚刚在旧版本运行时安装了新版本,似乎全局 AudioMixer 中的某些状态变得困惑,我得到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 的任何应用程序都无法再次播放音频。在这个特定的日志 fragment 中,PID 298 是 system_server,7066 是应用程序的新实例。
我认为正在发生的事情是 AudioTrack 在编写器线程有机会清理之前消失了。这让我觉得我应该做些其他事情来清理。我已经捕获了我的 Activity 的 onStop 和 onDestroy 并让它们关闭了我的音频线程,但是还有其他地方需要发生这种情况吗?
还有,有没有更好的方法来清理AudioTrack? Android 的这一部分似乎特别脆弱,但我无法想象每个人都使用 SoundPool 和 MediaPlayer 来处理所有事情,因为这些 API 非常有限且繁琐(而且两者似乎只是以不同的方式包装 AudioTrack)。
最佳答案
不幸的是,您的应用在被操作系统终止并替换为新版本之前没有收到任何警告。您可以使用一个非常简单的 Activity 对此进行测试,其中 onPause()、onStart()、onStop() 和 onDestroy() 方法会生成日志消息。如果您安装新版本的应用程序,则永远不会生成 onStop() 和 onDestroy() 方法中的消息。
关于 AudioTrack 问题,这可能是您设备的音频驱动程序存在错误。 Some people trying to port Android get similar problems due to bad drivers .此外,这个问题的其他答案之一也让我相信这一点。如果此问题仅限于少数几个制造商的部分手机而非所有手机,则表明制造商的声音驱动程序有问题。
您是否考虑过使用 MediaPlayer API 而不是 AudioTrack。它没有相同的灵 active ,但它可能是一个可行的解决方法。 Here is a nice comparison of the three different audio apis .
一种可能的解决方法是将应用实际拆分为两个单独的 apk 以进行调试。一个除了播放音频外什么都不做,并由第二个应用程序控制。这样,无论何时安装更新的 Controller ,播放音频的二进制文件都不会受到影响,也不会遇到突然终止和重新安装的情况。然后,当您准备好分发该应用程序时,只需将两者组合成一个 apk,然后进行分发即可。
关于android - AudioTrack 的全局死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7450828/
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho
我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r
在许多ruby类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..
如何在出现异常时指定全局救援,如果您将Sinatra用于API或应用程序,您将如何处理日志记录? 最佳答案 404可以在not_found方法的帮助下处理,例如:not_founddo'Sitedoesnotexist.'end500s可以通过调用带有block的错误方法来处理,例如:errordo"Applicationerror.Plstrylater."end错误的详细信息可以通过request.env中的sinatra.error访问,如下所示:errordo'Anerroroccured:'+request.env['si
我读过这个:Let’sstartwithasimpleRubyprogram.We’llwriteamethodthatreturnsacheery,personalizedgreeting.defsay_goodnight(name)result="Goodnight,"+namereturnresultend我的理解是,方法是定义在类中的函数或子程序,可以关联到类(类方法)或对象(实例方法)。那么,如果它不是在类中定义的,怎么可能是方法呢? 最佳答案 当你在Ruby中以这种方式在全局范围内定义一个函数时,它在技术上变成了Obje
假设我有:get'/'do$random=Random.rand()response.body=$randomend如果我每秒有数千个请求到达/,$random是否会被共享并“泄漏”到上下文之外,或者它会像getblock的“本地”变量一样?我想如果它是在get'/'do的上下文之外定义的,它确实会被共享,但我想知道在ruby中是否有我不知道的$机制。 最佳答案 ThispartoftheSinatraREADMEaboutscopeisalwayshelpfultoread但是,如果您只需要为请求保留变量,那么我认为我建议使用
我正在尝试将全局导航菜单项添加到我的ActiveAdmin安装(在“仪表板”导航按钮旁边)。ActiveAdmin说这在他们的网站上是可能的,但他们没有任何关于如何实现它的文档。有谁知道如何做到这一点?编辑:抱歉,我应该更清楚。我想添加一个指向由任意文本/链接对组成的全局导航的链接。IE,如果我想添加一个链接到http://google.com在事件管理员的全局导航中使用文本“Google”,我将如何实现? 最佳答案 ActiveAdmin.register_page"Google"domenu:priority=>1,:label
在回答另一个问题时,我意识到下面的程序并没有完全按照我的想法去做。puts"test"self.puts"test"#=>privatemethod`puts'calledformain:Object(NoMethodError)异常让我感到惊讶,因为我一直认为顶级方法调用将由main对象实例解决,但事实似乎并非如此。谁是第一个电话的实际接收者?如何解决?这是仅适用于顶级范围内的方法调用的特殊规则吗? 最佳答案 这是一个gooddiscussion说的就是这个问题。顶级方法,由Kernel提供,自动包含在Object类中。这意味着内
我正在使用Rails5beta的开箱即用的普通测试套件。我想知道是否有人知道如何运行全局设置并拆除。这是我在任何测试开始之前启动一个内存中的Elasticsearch集群并在测试完成后停止该集群所必需的原因。Rspec不是一个选项。 最佳答案 在Minitest(这是Rails4+中的默认测试环境)下,要获得“全局设置”行为,只需在test_helper.rb中运行任何内容即可。(在测试本身或任何setup方法之外),即在您从中加载测试环境的文件中。测试助手通常在测试中需要,因此它的代码在任何测试之前运行一次。对于“全局拆解”,Mi