• audiosever 基础知识点


    可执行文件
    ./system/bin/audioserver 在手机里面可以找到这个文件

    这是生成 audioserver 的信息

    frameworks/av/media/audioserver/main_audioserver.cpp

        AudioFlinger::instantiate();
        AudioPolicyService::instantiate();
        IPCThreadState::self()->joinThreadPool();
    
    • 1
    • 2
    • 3

    初始化 AudioFlinger AudioPolicyService
    加入线程池 joinThreadPool

    frameworks/av/media/audioserver/Android.mk

    LOCAL_MODULE := audioserver

    LOCAL_INIT_RC := audioserver.rc

    LOCAL_CFLAGS := -Werror -Wall

    include $(BUILD_EXECUTABLE) //生成可执行文件 ./system/bin/audioserver

    frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp 看出audiopolicy创建

    AudioPolicyService::AudioPolicyService()
    BnAudioPolicyService(), mpAudioPolicyDev(NULL), mpAudioPolicy(NULL),
    mAudioPolicyManager(NULL), mAudioPolicyClient(NULL), mPhoneState(AUDIO_MODE_INVALID)
    {
    }

    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);  //创建 3条线程
    
        mAudioPolicyClient = new AudioPolicyClient(this);
        mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient); 
    }
    // load audio processing modules
    sp<AudioPolicyEffects>audioPolicyEffects = new AudioPolicyEffects();
    {
        Mutex::Autolock _l(mLock);
        mAudioPolicyEffects = audioPolicyEffects;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    }
    // 这个似乎没用解析audiopolicy.so
    frameworks/av/services/audiopolicy/AudioPolicyInterface.h 这个函数定义了 audiopolicy.so 的接口

    audiosystem 调用 aps 的 setDeviceConnectionState
    status_t AudioSystem::setDeviceConnectionState(audio_devices_t device,
    audio_policy_dev_state_t state,
    const char *device_address,
    const char *device_name)
    {
    const sp& aps = AudioSystem::get_audio_policy_service();
    const char *address = “”;
    const char *name = “”;

    if (aps == 0) return PERMISSION_DENIED;
    
    if (device_address != NULL) {
        address = device_address;
    }
    if (device_name != NULL) {
        name = device_name;
    }
    return aps->setDeviceConnectionState(device, state, address, name);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    }

    audiosystem 调用 aps 的createAudioPatch
    status_t AudioSystem::createAudioPatch(const struct audio_patch *patch,
    audio_patch_handle_t *handle)
    {
    const sp& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return PERMISSION_DENIED;
    return aps->createAudioPatch(patch, handle);
    }

  • 相关阅读:
    StarRocks实战——首汽约车实时数仓实践
    设计模式之门面模式
    超级好用绘图工具(Draw.io+Github)
    leaflet教程029: 加载KML文件(代码示例)
    Vmware+UOS-server-1050e虚拟机安装(含软件链接)
    显卡核心 短路 原因是什么?
    excel表格,下拉选项如何修改?
    [word] word 如何在文档中进行分栏排版? #媒体#其他#媒体
    【qml学习笔记】QML与C++的交互
    【机器学习】集成学习(以随机森林为例)
  • 原文地址:https://blog.csdn.net/aningxiaoxixi/article/details/125437091