零基础入门多媒体音频(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);

相关推荐

  1. 基础入门多媒体音频2)-音频焦点2

    2024-03-16 07:56:01       35 阅读
  2. 基础入门多媒体音频2)-音频焦点

    2024-03-16 07:56:01       37 阅读
  3. 基础入门多媒体音频(6)-alsa(2)

    2024-03-16 07:56:01       30 阅读
  4. 基础入门多媒体音频(1)-音频基础

    2024-03-16 07:56:01       37 阅读
  5. 基础入门多媒体音频(5)-alsa(1)

    2024-03-16 07:56:01       33 阅读
  6. 音视频开发2 音频基础

    2024-03-16 07:56:01       31 阅读
  7. Android 音频焦点管理

    2024-03-16 07:56:01       52 阅读
  8. Android音频焦点

    2024-03-16 07:56:01       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 07:56:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 07:56:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 07:56:01       45 阅读
  4. Python语言-面向对象

    2024-03-16 07:56:01       55 阅读

热门阅读

  1. 排序算法-一天两个之冒泡、选择排序

    2024-03-16 07:56:01       33 阅读
  2. 前端实现websocket通信讲解(vue2框架)

    2024-03-16 07:56:01       44 阅读
  3. PMS150C系列 应广8位OTP IO单片机

    2024-03-16 07:56:01       39 阅读
  4. ASP.NET-WebFoms常见前后端交互方式

    2024-03-16 07:56:01       41 阅读
  5. AcWing 4964.子矩阵

    2024-03-16 07:56:01       36 阅读
  6. Kafka的分区(partition和副本)

    2024-03-16 07:56:01       35 阅读
  7. android studio配置gradle

    2024-03-16 07:56:01       34 阅读
  8. 什么是深度学习?

    2024-03-16 07:56:01       34 阅读
  9. 【学习】目标检测中的anchor

    2024-03-16 07:56:01       33 阅读
  10. MacOS安装Homebrew详细教程以及案例

    2024-03-16 07:56:01       35 阅读
  11. 富格林:安全交易阻挠被骗攻略

    2024-03-16 07:56:01       38 阅读