參考 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();
}