零基础入门多媒体音频(2)-音频焦点2

说实话,android的代码是越来越难以阅读。业务函数里面狗皮膏药似的补丁与日俱增。继上篇简要介绍音频焦点的文章,这篇文章的主要内容是分析audiofocus的实现。看了一下午的相关代码都没找到做audiofocus策略的核心逻辑。目前能看懂的大概包含下面两个逻辑。欢迎评论区沟通。

audiofocus实现的核心代码是在project_dir/frameworks/base/services/core/java/com/android/server/audio/MediaFocusControl.java

project_dir/frameworks/base/services/core/java/com/android/server/audio/FocusRequester.java

project_dir在这里指代android源码的根目录。

1.MediaFocusControl会维护所有audiofocus申请信息的堆栈mFocusStack。

2.android当系统进入铃声或者通话状态,会静音住媒体播放器,代码片段如下,mRingOrCallActive变量会在应用申请焦点时进行判断刷新。

                    if (mRingOrCallActive) {
                        mFocusEnforcer.mutePlayersForCall(USAGES_TO_MUTE_IN_RING_OR_CALL);
                    } else {
                        mFocusEnforcer.unmutePlayersForCall();
                    }

3.audiofocus的监听器都是在AudioManager的队列里维护。代码如下:

    public void registerAudioFocusRequest(@NonNull AudioFocusRequest afr) {
        final Handler h = afr.getOnAudioFocusChangeListenerHandler();
        final FocusRequestInfo fri = new FocusRequestInfo(afr, (h == null) ? null :
            new ServiceEventHandlerDelegate(h).getHandler());
        final String key = getIdForAudioFocusListener(afr.getOnAudioFocusChangeListener());
        mAudioFocusIdListenerMap.put(key, fri);
    }

4.audiomanager进行焦点变化通知的核心类IAudioFocusDispatcher会调用listener。IAudioFocusDispatcher

自身会被注册给audioservice。

                status = service.requestAudioFocus(afr.getAudioAttributes(),
                        afr.getFocusGain(), mICallBack,
                        mAudioFocusDispatcher,
                        clientId,
                        getContext().getOpPackageName() /* package name */, afr.getFlags(),
                        ap != null ? ap.cb() : null,
                        sdk);
相关推荐
weixin_460783871 小时前
Flutter解决TabBar顶部页面切换导致页面重载问题
android·javascript·flutter
诸葛小猿2 小时前
windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐
windows·音视频·音频·语音识别·spleeter
qhs15733 小时前
Kotlin字符串操作在Android开发中的应用示例
android·开发语言·kotlin
网络安全(king)4 小时前
Android networkSecurityConfig 代码配置
android
LuXi_foryou5 小时前
【2025深夜随笔】简单认识一下Android Studio
android·ide·android studio
缘来的精彩5 小时前
Android Studio Gradle 8.0 适配指南
android·ide·android studio
星仔_X5 小时前
Android Studio安装配置
android·ide·android studio
驜鸈5 小时前
MySQL 的EXPLAIN 计划 type 字段详细说明
android·数据库·mysql
程序员Linc5 小时前
用OpenCV写个视频播放器可还行?(C++版)
c++·opencv·音视频·opencv 4.11
春末的南方城市5 小时前
阿里发布新开源视频生成模型Wan-Video,支持文生图和图生图,最低6G就能跑,ComFyUI可用!
人工智能·计算机视觉·自然语言处理·开源·aigc·音视频