AudioPolicyService启动过程分析(android_audio)

此文章部分参考  https://blog.youkuaiyun.com/marshal_zsx/article/details/81060100

AudioPolicyService是策略的制定者,
AudioFlinger是策略的执行者,
所以: AudioPolicyService根据配置文件使唤AudioFlinger来创建Thread

管理输入输出设备,包括设备的连接、断开状态,设备的选择和切换等

管理系统的音频策略,比如通话时播放音乐、或者播放音乐时来电话的一系列处理

管理系统的音量

上层的一些音频参数也可以通过AudioPolicyService设置到底层去

godv@godv-OptiPlex-7070:/dev/snd$ ls -la
总用量 0
drwxr-xr-x   3 root root      320 7月   1 21:26 .
drwxr-xr-x  21 root root     4320 7月   1 21:41 ..
drwxr-xr-x   2 root root       60 7月   1 21:26 by-path
crw-rw----+  1 root audio 116,  2 7月   1 21:26 controlC0
crw-rw----+  1 root audio 116, 11 7月   1 21:26 hwC0D0
crw-rw----+  1 root audio 116, 12 7月   1 21:26 hwC0D2
crw-rw----+  1 root audio 116,  4 7月   1 21:26 pcmC0D0c
crw-rw----+  1 root audio 116,  3 7月   1 21:39 pcmC0D0p
crw-rw----+  1 root audio 116, 10 7月   1 21:26 pcmC0D10p
crw-rw----+  1 root audio 116,  5 7月   1 21:26 pcmC0D2c
crw-rw----+  1 root audio 116,  6 7月   1 21:26 pcmC0D3p
crw-rw----+  1 root audio 116,  7 7月   1 21:26 pcmC0D7p
crw-rw----+  1 root audio 116,  8 7月   1 21:26 pcmC0D8p
crw-rw----+  1 root audio 116,  9 7月   1 21:26 pcmC0D9p
crw-rw----+  1 root audio 116,  1 7月   1 21:26 seq
crw-rw----+  1 root audio 116, 33 7月   1 21:26 timer

默认声卡  &  声卡上存在何种硬件资源(耳机孔/喇叭)  厂家通过配置文件声明

1.读取、解析配置文件

2.AudioPolicyService根据配置文件调用AudioFlinger服务创建线程,打开output


audioserver.rc    frameworks/av/media/audioserver/audioserver.rc

service audioserver /system/bin/audioserver
    class main
    user audioserver
    # media gid needed for /dev/fm (radio) and for /data/misc/media (tee)
    group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct
    ioprio rt 4
    writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks
    onrestart restart audio-hal-2-0

on property:vts.native_server.on=1
    stop audioserver
on property:vts.native_server.on=0
    start audioserver

main_audioserver.cpp    frameworks/av/media/audioserver/main_audioserver.cpp

int main(int argc __unused, char **argv)
{
    signal(SIGPIPE, SIG_IGN);
    ...
        sp<ProcessState> proc(ProcessState::self());
        sp<IServiceManager> sm = defaultServiceManager();
        ALOGI("ServiceManager: %p", sm.get());
        AudioFlinger::instantiate();
        AudioPolicyService::instantiate();

...
        SoundTriggerHwService::instantiate();
        ProcessState::self()->startThreadPool();

// FIXME: remove when BUG 31748996 is fixed
        android::hardware::ProcessState::self()->startThreadPool();

        IPCThreadState::self()->joinThreadPool();
    }
}

frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp

void AudioPolicyService::onFirstRef()
{
    {
        Mutex::Autolock _l(mLock);

        // start tone playback thread
        mTonePlaybackThread = new AudioCommandThread(String8("ApmTone"), this);
        // start audio commands thread
        mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
        // start output activity command thread
        mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);

        mAudioPolicyClient = new AudioPolicyClient(this);
        mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
    }
    // load audio processing modules
    sp<AudioPolicyEffects>audioPolicyEffects = new AudioPolicyEffects();
    {
        Mutex::Autolock _l(mLock);
        mAudioPolicyEffects = audioPolicyEffects;
    }
}

frameworks/av/services/audiopolicy/service/AudioPolicyService.h

class AudioPolicyClient : public AudioPolicyClientInterface
    {
     ...
     private:
        AudioPolicyService *mAudioPolicyService;
    };

AudioPolicyClient的实现文件frameworks/av/services/audiopolicy/service/AudioPolicyClientImpl.cpp


createAudioPolicyManager  frameworks/av/services/audiopolicy/AudioPolicyInterface.h

// Audio Policy client Interface
class AudioPolicyClientInterface
{
...
extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface);
extern "C" void destroyAudi
### AudioPolicyService 启动流程分析 AudioPolicyServiceAndroid 系统中音频管理的核心服务之一,负责音频策略的制定和硬件模块的加载。其启动流程主要发生在系统启动阶段,通过 audioserver 进程进行实例化并初始化。 AudioPolicyService启动流程从 `main_audioserver.cpp` 开始。在 audioserver 进程启动时,`main()` 函数会调用 `AudioPolicyService::instantiate()` 来创建 AudioPolicyService 的实例。该函数定义在 `AudioPolicyService.cpp` 中,其构造函数会初始化 BnAudioPolicyService(Binder 接口)以及相关成员变量,例如 `mpAudioPolicyDev` 和 `mpAudioPolicy`,为后续的音频策略管理做好准备 [^4]。 在 AudioPolicyService 实例化之后,会进入 `onFirstRef()` 方法,该方法会在第一次引用时被调用。在此阶段,AudioPolicyService 会加载音频策略配置文件,并创建 AudioPolicyManager 对象。AudioPolicyManager 负责具体的音频策略管理,包括音频设备的打开、关闭、路由设置等操作。加载配置文件是 AudioPolicyManager 初始化的重要步骤,它决定了系统支持的音频设备类型以及对应的硬件模块 [^1]。 AudioPolicyManager 在初始化过程中会调用 `loadHwModule()` 方法,用于加载音频硬件模块。此方法会根据配置文件中定义的音频硬件模块名称,调用 `hw_get_module()` 函数获取对应的硬件抽象层(HAL)模块,并通过 `open_output_stream()` 打开音频输出流。这些操作涉及到与 AudioFlinger 的交互,AudioFlinger 是 Android 系统中负责音频数据处理的核心服务,其初始化流程通常在 AudioPolicyService 之后进行 [^2]。 AudioPolicyService启动还受到 Android 启动脚本的控制。在 Android 11 中,AudioPolicyService 通过 `audioserver.rc` 文件配置启动参数,该文件位于 `frameworks/av/media/audioserver/` 目录下。`audioserver` 服务会在系统启动时由 init 进程启动,并以特定的用户权限和组权限运行,确保其能够访问必要的系统资源,例如音频设备节点和配置文件 [^3]。 ### AudioPolicyManager 初始化流程 AudioPolicyManager 的初始化是 AudioPolicyService 启动流程中的关键环节。它负责加载音频策略配置文件,并根据配置文件中的定义加载相应的音频硬件模块。配置文件通常位于 `/system/etc/audio_policy.conf` 或 `/vendor/etc/audio_policy.conf`,具体路径取决于设备制造商和 Android 版本。 加载配置文件后,AudioPolicyManager 会解析其中的音频设备信息,并调用 `loadHwModule()` 方法加载对应的音频硬件模块。每个音频硬件模块对应一个特定的音频设备类型,例如扬声器、耳机、麦克风等。加载硬件模块的过程涉及调用 HAL 层的 `hw_get_module()` 函数,并通过 `open_output_stream()` 打开音频输出流。这些操作为后续的音频播放和录制提供了底层支持 [^1]。 ### AudioPolicyServiceAudioFlinger 的交互 AudioPolicyService启动过程中会与 AudioFlinger 进行交互,以完成音频流的创建和管理。AudioFlinger 是 Android 系统中负责音频数据处理的核心服务,其初始化流程通常在 AudioPolicyService 之后进行。AudioPolicyService 通过 Binder 接口与 AudioFlinger 进行通信,传递音频流的参数信息,并请求 AudioFlinger 创建相应的音频流。这种交互机制确保了音频策略与音频数据处理的分离,提高了系统的灵活性和可扩展性 [^2]。 ```cpp // AudioPolicyService.cpp void AudioPolicyService::onFirstRef() { // 加载音频策略配置文件 loadAudioPolicyConfig(); // 创建 AudioPolicyManager mpAudioPolicyManager = new AudioPolicyManager(this); // 初始化 AudioPolicyManager mpAudioPolicyManager-&gt;initCheck(); } ``` ### 相关问题 1. AudioPolicyServiceAudioFlinger 之间的交互机制是怎样的? 2. AudioPolicyManager 如何加载音频硬件模块? 3. AudioPolicyService 的配置文件结构和作用是什么? 4. AudioPolicyServiceAndroid 系统中的主要职责是什么? 5. AudioPolicyService启动流程是否会影响系统的音频播放性能?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值