zoukankan      html  css  js  c++  java
  • AUIOClient_StartIO failed (-12985) when app under background

      这一段时间做的这个项目一直很忙,所以都没有时间总结。最近终于稍有空闲,并且解决了几个所谓的大问题,特意记录一下,避免以后忘记。

      由于公司的音频播放引擎是用audio unit 写的,这项技术非常底层,需要处理很多东西,因此比较容易出问题。前段时间测试经常反馈后台有时候不能播放,并且找不到规律,也就是不能重现的bug,这种bug最叫人头疼,想解决的时候不能重现,你放弃了它就蹦出来烦你。后来在我的不懈努力下,终于找到了重现的方法。当app在后台模式下被中断后,在 endInterruptionWithFlags:(NSUInteger)flags 中再次激活audio session的话会收到失败消息,如果不去激活audio session 的话,直接打开audio unit的话会收到AUIOClient_StartIO failed (-12985)这个错误,导致audio unit无法打开,但是回到前台则可以打开audio unit以播放音频,实在使令人诧异。看了各种的官法文档,搜索了各种资料也没有找到相关的信息。就在要放弃的时候尝试了打开这个属性kAudioSessionProperty_OverrideCategoryMixWithOthers,哈哈这时候便可以在后台被中断后打开audio unit,实现音频的继续播放。但是这个解决方案并不完美,打开这个属性以后会导致remote events实效,这时就在右上角看不到三角形的播放按钮了,所以这是一个不完美的解决方案。

      后来过了一段时间,还是反馈问题,觉得有必要再看看,技术人员都相信没有解决不了的问题,尤其是别家的貌似都没有这个bug。后来无意中再demo中打开了接收remote events,居然可以正常的打开audio unit了。原来是这样,也可以正常的激活audio session了,这样子线控也可以工作,不会有因为使用kAudioSessionProperty_OverrideCategoryMixWithOthers导致的线控失效的问题。

      为什么打开接收remote events就可以激活audio unit,并没有找到可靠的资料证明。如果大家有知道的话,烦请解惑,先谢过了。我猜测的原因是,可能是打开接收remote events后为了保证线控等在app处于后台模式时也可以工作,默默的注册了某些服务,使在后台模式也可以激活audio unit。如果没有打开接受remote events,则app在后台模式被中断后,因为没有注册某些相应的服务,所以audio unit启动失败。

      所以你只需要调用[[UIApplicationsharedApplication] beginReceivingRemoteControlEvents],就可以解决AUIOClient_StartIO failed (-12985)这个错误。

  • 相关阅读:
    poj 1080 dp
    Codeforces Round #280 (Div. 2)
    Codeforces Round #279 (Div. 2)f
    Codeforces Round #278 (Div. 1)
    Codeforces Round #276 (Div. 1)
    搜索
    debug 心得
    ZOJ 1633
    DRF 一对多序列化与反序列化
    HTTP协议
  • 原文地址:https://www.cnblogs.com/CoderPlace/p/3234589.html
Copyright © 2011-2022 走看看