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