Audio Focus分析总结

1、深入理解Android 卷3 张大伟。

讲的是Android M的audiofocus,非常精辟,就是版本有些老。

和张大伟差不多,an 7.1:

cshandroid音频系统(5):AudioService之音频焦点_renshuguo123723的博客-CSDN博客

 Android音频焦点详解(下)——源码详解 - landptf的个人空间 - OSCHINA - 中文开源技术交流社区

2、An P、Q差异不大:

 

2.1 如如何使用audiofocus:

Android10.0AudioFocus之如何使用(一)_l328873524的博客-CSDN博客

2.2 源码分析:

Android10.0AudioFocus之源码分析(二)_l328873524的博客-CSDN博客

2.3 AudioFocusRequest的说明

Android10.0AudioFocus之AudioFocusRequest_l328873524的博客-CSDN博客_android requestaudiofocusAndroid 9 Audio系统笔记:声音焦点AudioFocusRequest说明_biandan1231的专栏-CSDN博客_requestaudiofocusAndroid10.0AudioFocus之AudioFocusRequest_l328873524的博客-CSDN博客_android requestaudiofocus

2.4 audiofocus的场景分析:

音频焦点 AudioFocus与Audio Log分析_WhuSkypiea的博客-CSDN博客

3、Audiofocus的的集中状态

Android java层音频相关的分析与理解(三)调用相关_u012440406的专栏-CSDN博客

Gain/Loss:长期的持有、丢失音频焦点,比如:音乐场景;

Gain Transient/Loss Transient:短暂的持有、丢弃焦点,比如:闹钟、通话;

Gain Transient May Duck/Loss Transient Can Duck:短暂的持有、丢弃焦点,但是其他应用可以降低音量播放,比如:系统通知;车载导航。

Gain Transient Exclusive:短暂的持有焦点,但是是排他的,比如:录音。

 从上面AudioFocus的状态可以看出,其实AudioFocus的状态是对应的。当后一个应用去GainAudioFocus时,前一个应用就相对应地LossAudioFocus。后一个应用以什么形式去Gain,前一个应该就会受到相应Loss的通知。但是,当前一个应用收到这个Loss通知时,应用怎么处理是应用内部的事情。因为AudioFoucs机制是一个建议性而不是强制性的机制。应用使用这种机制只是使用户体验更加好,而不采用这套机制,甚至不遵循这套机制,对应用与系统本身来是,是没有什么影响的。

4、audiofocus机制就是一个栈机制。

(1)音频焦点是使用堆栈方式管理的,可以有多个应用同时存在于堆栈中,栈顶的元素持有音频焦点

如上图所示,AudioFocus机制是以栈的形式实现,位于栈顶的应用能获取到AudioFocus从而能输出音频。非栈顶应用会暂时失去AudioFocus直至位于其上面的全部应用关闭或主动丢失AudioFocus。

这个的第二个图C、B、A,表示暂时失去了焦点,app会收到:

case AUDIOFOCUS_LOSS_TRANSIENT:

case AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:

对应图3的B如果app收到case AUDIOFOCUS_LOSS: 表示audiofocus被长期夺走,当前的app需要stop->abandon();

对应图4的C,如果app收到case AUDIOFOCUS_GAIN::表示audiofocus被归还了,app重新可以播放了。

private onAudioFocusChangeListener mAudioFocusListener = newOnAudioFocusChangeListener(){ 
    //当AudioFocus发生变化时,这个函数将会被调用。其中参数focusChange指示发生了什么变化
    public void onAudioFocusChange(int focusChange){
        switch( focusChange) { 
            /*AudioFocus被长期夺走,需要中止播放,并释放AudioFocus,这种情况对应于
抢走AudioFocus的申请者使用了AUDIOFOCUS_GAIN*/
            case AUDIOFOCUS_LOSS: 
                stop();
                break; 
            /*AudioFocus被临时夺走,不久就会被归还,只需要暂停,AudioFocus被归还后
再恢复播放 ;这对应于抢走AudioFocus的申请者使用了AUDIOFOCUS_GAIN_TRANSIENT*/
            case AUDIOFOCUS_LOSS_TRANSIENT: 
                saveCurrentPlayingState(); 
                    pause();
                    break; 
            /*AudioFocus被临时夺走,允许不暂停,所以降低音量 ,这对应于抢走AudioFocus的
回放实例使用了AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK*/
            case AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                saveCurrentPlayingState();
                setVolume(getVolume()/2); 
                break; 
            /*AudioFocus被归还,这时需要恢复被夺走前的播放状态*/
            case AUDIOFOCUS_GAIN:
                restorePlayingState();
                break; 
        }
    }

(2)申请audiofocus最终的结果:

5、audiofocus的流程图:

Audio AudioFocus流程_一杯咖啡的专栏-CSDN博客_audiofocus

Android Audio(六)—— AudioFocus_tudouhuashengmi的博客-CSDN博客

6、duck流程图

Android Audio(七)—— AudioFocus(duck)_tudouhuashengmi的博客-CSDN博客_audio duck

 跟上图有些差异,最终call到Tracks.cpp

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学如逆水行舟,不进则退3038

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值