audioflinger 如何连接 hal
1 audio_hw_hal.cpp : audio_hw_device 这个文件塑造出 audio_hw_device
2
struct legacy_audio_device {
struct audio_hw_device device; 向上提供
struct AudioHardwareInterface *hwif; 向下提供
};
3 audio_hw_hal.cpp 文件中 legacy_adev_open 函数里面有 ladev->hwif = createAudioHardware();
4 createAudioHardware的流程
https://blog.youkuaiyun.com/syh63053767/article/details/9112153
从这个函数 可以连接到 厂家提供的 类(audiohardware)
5 输入 输出 接口 adev_open_output_stream adev_open_input_stream
struct legacy_stream_out {
struct audio_stream_out stream;
AudioStreamOut *legacy_out;
};
struct legacy_stream_in {
struct audio_stream_in stream;
AudioStreamIn *legacy_in;
};
上面这两个接口 也是通过 legacy_adev_open 建立联系的
6
AudioPolicyService启动过程分析
a. 加载解析/vendor/etc/audio_policy.conf或/system/etc/audio_policy.conf
对于配置文件里的每一个module项, new HwModule(name), 放入mHwModules数组
对于module里的每一个output, new IOProfile, 放入module的mOutputProfiles
对于module里的每一个input, new IOProfile, 放入module的mInputProfiles
b. 根据module的name加载厂家提供的so文件 (通过AudioFlinger来加载)
c. 打开对应的output (通过AudioFlinger来open output)
profile : 配置,用来描述output
a. 本可以支持哪些设备
b. 参数: 采样率,通道
android 音频总结
https://www.jianshu.com/p/5389a9abe2b9
7
DeviceVector mAvailableOutputDevices; // all available output devices
DeviceVector mAvailableInputDevices; // all available input devices
输出设备,用mAvailableOutputDevices维护,主要是连接和断开时的处理。听筒,Speaker等手机自带的设备,一般只有启动的时候才会处理一下,其他时间都是不需要处理的。所以主要是还是我们所说的,蓝牙耳机,有线耳机等。
参考文件
Android Audio和耳机,蓝牙耳机等音频外设
8
moutputs
解析完audio_policy.conf之后,遍历mHwModules[i]->mOutputProfiles,然后加到mOutputs中去。
参考
Android audio 输出设备选择过程分析(上)