Android 音频源码分析——AndroidRecord录音(一)
Android 音频源码分析——AndroidRecord录音(二)
Android 音频源码分析——AndroidRecord音频数据传输流程
Android 音频源码分析——audioserver启动
Android 音频源码分析——AudioFlinger
Android 音频源码分析——AudioTrack设备选择
源码基于Android9.0
混音:把多种来源的声音,整合至一个立体音轨或单音轨中。
AudioFlinger和AudioPolicyService是音频中的两大服务,这里先整理下AudioFlinger。
AudioPolicyService时策略制定者,不和AudioHal直接交互;而AudioFlinger是策略执行者,与AudioHal层进行交互。
简介
AudioFlinger运行在audioserver进程中,是一个音频服务。主要职责:
- 音频数据接收和转发,录音时从HAL层获取音频数据,转给客户端;播放时从客户端获取数据,并发送给HAL层。
- 音频数据处理,包括数据格式转换、声道数转换、重采样、混音、音效、变速、音量等。
- 执行AudioFlinger的策略。
与HAL层通信
framework层hidl相关代码目录: frameworks/av/media/libaudiohal
hal层hidl相关代码: hardware/interfaces/audio
AudioFlinger通过hidl接口的方式调用hal层服务。有上一篇文章可知,启动AudioPolicyService时,会加载音频配置文件,然后根据配置加载HAL module。后续可以调用hal接口进行其他交互(设备选择、通路、读写数据等)。
AudioPolicyService并不直接于Hal层交互,而是由AudioFlinger和Hal通信,这里看看AudioFlinger加载音频模块。
1 加载Module
audio_module_handle_t AudioFlinger::loadHwModule(const char *name)
{
if (name == NULL) {
return AUDIO_MODULE_HANDLE_NONE;
}
if (!settingsAllowed()) {
return AUDIO_MODULE_HANDLE_NONE;
}
Mutex::Autolock _l(mLock);
return loadHwModule_l(name);
}
// loadHwModule_l() must be called with AudioFlinger::mLock held
audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)
{
sp<DeviceHalInterface> dev;
int rc = mDevicesFactoryHal->openDevice(name, &dev);
//......
audio_module_handle_t handle = (audio_module_handle_t) nextUniqueId(AUDIO_UNIQUE_ID_USE_MODULE);
mAudioHwDevs.add(handle, new AudioHwDevice(handle, name, dev, flags));
return handle;
}
加载hal层module,mAudioHwDevs保存handle 和AudioHwDevice.
接着看mDevicesFactoryHal->openDevice流程
mDevicesFactoryHal->openDevice(name, &dev);
>>DevicesFactoryHalHybrid::openDevice
>>
status_t DevicesFactoryHalHidl::openDevice(const char *name, sp<DeviceHalInterface> *device