AudioPolicyManager(一)

基于上一篇文章,已经把解析audio_policy_configuration.xml的代码trace 完毕,AudioPolicyManager 的成员变量已经保存了xml 解析得到的参数,接下来,继续Trace AudioPolicymanager如何使用这些configuration 参数。

一、回顾audio_policy_configuration.xml 解析

回顾上一篇APM 的结论:

audio_policy_configuration.xml文件解析的参数,会首先储存在class AudioPolicyManager : AudioPolicyConfig mConfig; 这个成员变量。
mConfig 的关键成员参数( mHwModules,mOutputDevices,mInputDevices,mDefaultOutputDevice )对应到AudioPolicyManager这个类的这些参数 (mHwModulesAll, mOutputDevicesAll, mInputDevicesAll, mDefaultOutputDevice),也就是通过AudioPolicyManager的这些成员已经可以访问到xml 解析得到的所有信息。
(mOutputDevices,mInputDevices)( mOutputDevicesAll, mInputDevicesAll ) 分别代表的信息是,所有HwModule 声明并且已经在<attachedDevices> 中声明,只有<attachedDevices> 声明的device 才是可以被使用的device。关于这点,可以从下面的code 找到答案。
\frameworks\av\services\audiopolicy\common\managerdefinitions\src\ Serializer.cpp
template<>
std::variant<status_t, ModuleTraits::Element> PolicySerializer::deserialize<ModuleTraits>(
        const xmlNode *cur, ModuleTraits::PtrSerializingCtx ctx){for (const xmlNode *children = cur->xmlChildrenNode; children != NULL;
         children = children->next) {
        if (!xmlStrcmp(children->name, reinterpret_cast<const xmlChar*>(childAttachedDevicesTag))) {
            ALOGV("%s: %s %s found", __func__, tag, childAttachedDevicesTag);
            for (const xmlNode *child = children->xmlChildrenNode; child != NULL;
                 child = child->next) {
                if (!xmlStrcmp(child->name,
                                reinterpret_cast<const xmlChar*>( childAttachedDeviceTag))) {
                    auto attachedDevice = make_xmlUnique(xmlNodeListGetString(
                                    child->doc, child->xmlChildrenNode, 1));
                    if (attachedDevice != nullptr) {
                        ALOGV("%s: %s %s=%s", __func__, tag, childAttachedDeviceTag,
                                reinterpret_cast<const char*>(attachedDevice.get()));
                        sp<DeviceDescriptor> device = module-> getDeclaredDevices().
                                getDeviceFromTagName(std::string(reinterpret_cast<const char*>(
                                                        attachedDevice.get())));
                        if (device == nullptr && mIgnoreVendorExtensions) {
                            ALOGW("Skipped attached device \"%s\" because it likely uses a vendor"
                                    "extension type",
                                    reinterpret_cast<const char*>(attachedDevice.get()));
                            continue;
                        }
                        ctx-> addDevice(device);
                    }
                }
            }
        }
}

class AudioPolicyConfig

......

private:
    static const constexpr char* const kDefaultEngineLibraryNameSuffix = "default";

    std::string mSource;
    std::string mEngineLibraryNameSuffix;
    HwModuleCollection &mHwModules; /**< Collection of Module, with Profiles, i.e. Mix Ports. */(xml 解析到的所有Hw Modules 都放在这个变量
    DeviceVector &mOutputDevices;//(xml 所声明的所有的output devices,并且在<attachedDevices> list 里面)
    DeviceVector &mInputDevices;//(xml 所声明的所有的input devices并且在<attachedDevices> list 里面)
    sp<DeviceDescriptor> &mDefaultOutputDevice;//audio_policy_configuration.xml 声明的default device, 一般audio_policy_configuration.xml 会包含多个Hw modules,但是只会有一个Hw modules 声明<defaultOutputDevice>
    // TODO: remove when legacy conf file is removed. true on devices that use DRC on the
    // DEVICE_CATEGORY_SPEAKER path to boost soft sounds, used to adjust volume curves accordingly.
    // Note: remove also speaker_drc_enabled from global configuration of XML config file.
    bool mIsSpeakerDrcEnabled;
    bool mIsCallScreenModeSupported;
    SurroundFormats mSurroundFormats;
};

mixports / routes/ devices 等信息,会储存在class HwModule 这个class

class HwModule : public RefBase
{

......

private:
    void refreshSupportedDevices();

    const String8 mName; // base name of the audio HW module (prim

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!audiopolicymanager 是 Android 系统中的一个重要组件,用于管理音频相关的策略和规则。它负责调度所有应用程序对音频硬件的访问,并确定哪些应用程序可以访问哪些硬件设备、以及何时和如何访问这些设备。 在 Android 系统中,audiopolicymanager 是通过使用一系列音频策略来管理音频资源的。这些策略可以根据应用程序的类型、音频源、硬件设备的可用性以及其他因素进行配置和管理。 audiopolicymanager 还允许应用程序和系统之间建立通信,以协调音频资源的使用和控制。它还可以监控音频设备的状态和性能,并在需要时自动调整音频策略。 总之,audiopolicymanager 在 Android 系统中扮演着至关重要的角色,确保不同应用程序之间的音频资源分配和管理的有效性和可靠性。 ### 回答2: audiopolicymanager是安卓系统中的一个重要组件,它负责控制和管理所有音频的策略和行为。它在安卓系统中起到了至关重要的作用,确保了各种音频资源的合理分配和管理。 audiopolicymanager可以根据不同的情境和需求来调整音频策略,比如在电话通话时将其他应用的音频暂时静音,或者在使用媒体播放器时将铃声音量降低。它可以为每个应用程序提供独立的音频输出通道,使用户能够自由选择和管理音频的播放方式。 audiopolicymanager还具有灵活的音频路由功能,可以根据外部设备的连接和断开自动调整音频输出的目标。例如,在插入耳机时将音频输出切换到耳机,而在拔出耳机时切换回扬声器。 此外,audiopolicymanager还负责处理音频焦点的分配和管理。当有多个应用同时播放音频时,它可以根据应用程序的优先级和用户设置分配音频焦点,并确保正在使用焦点的应用程序能够优先获得音频播放权限。 总之,audiopolicymanager充当了安卓系统中的音频管理者,负责协调和管理各种音频资源的分配和控制。它的存在使得用户可以更方便地管理音频,并提升了安卓系统的音频体验。 ### 回答3: Audiopolicymanager是安卓系统的一个模块,主要负责管理和协调设备的音频行为。具体来说,它是一个音频策略管理器,负责控制音频资源的分配和调度,以满足不同应用程序和设备的音频需求。 Audiopolicymanager负责如下功能: 1. 音频路由和混音:根据应用程序的需求,Audiopolicymanager决定将音频路由到哪个设备上播放。它可以将音频发送到扬声器,耳机,蓝牙设备等。此外,它还可以混合和平衡不同来源的音频流,以确保音频效果的稳定和高质量。 2. 音频焦点管理:在同时播放多个应用程序的情况下,Audiopolicymanager负责管理音频焦点。它会根据优先级,将焦点分配给需要优先处理音频的应用程序。例如,当来电时,它会暂停正在播放音乐的应用程序,并将焦点转移到电话。 3. 音频策略配置:Audiopolicymanager还允许开发人员根据应用程序或设备的需求,进行自定义音频策略配置。开发人员可以根据需要定义不同设备和应用程序的音频行为,以实现更好的用户体验。 总之,Audiopolicymanager是安卓系统中非常重要的一个模块,它负责管理和协调设备的音频行为,确保音频资源的有效分配和调度,以提供稳定和高质量的音频效果。它的功能包括音频路由和混音、音频焦点管理以及音频策略配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值