天天看點

AudioFlinger啟動過程分析(android_audio)

參考 https://blog.csdn.net/zyuanyun/article/details/60890534#t4

首先來分析一下AudioFlinger

  裡面存在一個數組mPlaybackThreads裡面的每一個線程都對應一個output

1.加載哪個so檔案? 檔案名是什麼? 檔案名從何而來? 

參考上一篇https://blog.csdn.net/we1less/article/details/118424539

openDevice  hardware/interfaces/audio/2.0/default/DevicesFactory.cpp  環節

  audio.primary.xxx.so

  audio.primary.goldfish.so

 2.該so檔案由什麼源檔案組成?    (此部分有待驗證)

    audio.primary.$(TARGET_DEVICE) : device/friendly-arm/common/libaudio/AudioHardware.cpp

                                     libhardware_legacy

    libhardware_legacy :     hardware/libhardware_legacy/audio/audio_hw_hal.cpp

 3.對硬體的封裝:

AudioHwDevice  frameworks/av/services/audioflinger/AudioHwDevice.cpp

  每一個AudioHwDevice對應一個.so動态庫所支援的裝置

  再把這些支援的硬體加入到mAudioHwDevs裡面

audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name){
    ...
    sp<DeviceHalInterface> dev;
    int rc = mDevicesFactoryHal->openDevice(name, &dev);
    ...
    mAudioHwDevs.add(handle, new AudioHwDevice(handle, name, dev, flags));
}
           

loadAudioInterface  hardware/interfaces/audio/2.0/default/DevicesFactory.cpp 

   audio_hw_device_t 結構體在 

   libhardware  hardware/libhardware/include/hardware/audio.h

int DevicesFactory::loadAudioInterface(const char *if_name, audio_hw_device_t **dev)
{
    const hw_module_t *mod;
    int rc;
    rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod);
    ...
    rc = audio_hw_device_open(mod, dev);
    ...
out:
    *dev = NULL;
    return rc;
}
           

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

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

    AudioFlinger::instantiate();

    AudioPolicyService::instantiate();
    ProcessState::self()->startThreadPool();
    android::hardware::ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}