• 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);
    }

  • 相关阅读:
    基于宽表的数据建模
    硬件【11】超全讲解I2C的上拉电阻
    说明白正反向代理,以及Nginx和Gunicorn
    自动化测试框架知识,居然这么详细?有这一篇完全够了......
    linux系统与应用
    LeetCode刷题
    go语言学习-异常处理
    单向链表·初识【c语言】
    剑指offer 20. 调整数组顺序使奇数位于偶数前面
    极大似然函数和似然函数的区别
  • 原文地址:https://blog.csdn.net/aningxiaoxixi/article/details/125437091