hal
1. 向上对接hidl接口, 属于hidl service. 向下调用hal层接口
hardware\interfaces\audio\core\all-versions\default\PrimaryDevice.cpp
hardware\interfaces\audio\core\all-versions\default\StreamIn.cpp
hardware\interfaces\audio\core\all-versions\default\StreamOut.cpp
android.hardware.audio@6.0-impl.so
android.hardware.audio@7.0-impl.so
hardware\interfaces\audio\core\all-versions\default\Android.bp
filegroup {
name: "android.hardware.audio-impl_srcs",
srcs: [
"Device.cpp",
"DevicesFactory.cpp",
"ParametersUtil.cpp",
"PrimaryDevice.cpp",
"Stream.cpp",
"StreamIn.cpp",
"StreamOut.cpp",
],
}
2. 加载hal层的库
hardware\libhardware\hardware.c
会加载 /vendor/lib64/hw/audio.primary.msmnile.ar.so
3. hal层接口
AOSP的demo接口
hardware\libhardware\modules\audio\audio_hw.c
高通接口
vendor\qcom\opensource\audio-hal-ar\primary-hal\hal-pal\AudioDevice.cpp
vendor\qcom\opensource\audio-hal-ar\primary-hal\hal-pal\AudioStream.cpp
vendor\qcom\opensource\audio-hal-ar\primary-hal\hal-pal\AudioVoice.cpp
极氪接口 TBD
zeekr_sound_hal/zeekr_sound_hal_interface/AudioDevice.cpp
zeekr_sound_hal/zeekr_sound_hal_interface/AudioStream.cpp
StreamInPrimary::StreamInPrimary 构造函数中实现接口
int StreamInPrimary::FillHalFnPtrs() {
int ret = 0;
stream_.get()->common.get_sample_rate = astream_in_get_sample_rate; // 需实现
stream_.get()->common.get_channels = astream_in_get_channels; // 需实现
stream_.get()->common.get_format = astream_in_get_format; // 需实现
stream_.get()->common.get_buffer_size = astream_in_get_buffer_size; // 需实现
stream_.get()->common.standby = astream_in_standby; // 需实现
stream_.get()->read = in_read; // 需实现
stream_.get()->update_sink_metadata = in_update_sink_metadata; // 不知道什么用
stream_.get()->get_active_microphones = astream_in_get_active_microphones; // 不知道什么用
stream_.get()->get_capture_position = astream_in_get_capture_position; // 应该是没用到
stream_.get()->set_gain = astream_in_set_gain; // 应该是没用到
stream_.get()->common.add_audio_effect = astream_in_add_audio_effect; // 应该是没用到
stream_.get()->common.remove_audio_effect = astream_in_remove_audio_effect; // 应该是没用到
stream_.get()->common.set_parameters = astream_in_set_parameters; // 应该是没用到
stream_.get()->common.get_parameters = astream_in_get_parameters; // 不需要具体实现
stream_.get()->common.set_sample_rate = astream_set_sample_rate; // 不需要具体实现
stream_.get()->common.set_format = astream_set_format; // 不需要具体实现
stream_.get()->common.dump = astream_dump; // 不需要具体实现
stream_.get()->get_input_frames_lost = astream_in_get_input_frames_lost; // 不需要具体实现
stream_.get()->set_microphone_direction = astream_in_set_microphone_direction; // 不需要具体实现
stream_.get()->set_microphone_field_dimension = in_set_microphone_field_dimension; // 不需要具体实现
stream_.get()->update_sink_metadata_v7 = in_update_sink_metadata_v7; // 不需要具体实现
return ret;
}
StreamOutPrimary::StreamOutPrimary 构造函数中实现接口
int StreamOutPrimary::FillHalFnPtrs() {
int ret = 0;
stream_.get()->common.get_sample_rate = astream_out_get_sample_rate; // 需实现
stream_.get()->common.get_channels = astream_out_get_channels; // 需实现
stream_.get()->common.get_format = astream_out_get_format; // 需实现
stream_.get()->common.get_buffer_size = astream_out_get_buffer_size; // 需实现
stream_.get()->common.standby = astream_out_standby; // 需实现
stream_.get()->write = out_write; // 需实现
stream_.get()->resume = astream_resume; // 需实现
stream_.get()->pause = astream_pause; // 需实现
stream_.get()->drain = astream_drain; // 需实现
stream_.get()->flush = astream_flush; // 需实现
stream_.get()->set_callback = astream_set_callback; // 应该是有用到,不确定
stream_.get()->get_latency = astream_get_latency; // 应该是有用到,不确定
stream_.get()->get_render_position = out_get_render_position; // 应该是有用到,不确定
stream_.get()->set_volume = astream_out_set_volume; // 应该是没用到,可以实现备用
stream_.get()->get_presentation_position = astream_out_get_presentation_position; // 应该是没用到
stream_.get()->common.set_parameters = astream_out_set_parameters; // 应该是没用到
stream_.get()->common.get_parameters = astream_out_get_parameters; // 应该是没用到
stream_.get()->common.set_sample_rate = astream_set_sample_rate; // 不需要具体实现
stream_.get()->common.set_format = astream_set_format; // 不需要具体实现
stream_.get()->common.dump = astream_dump; // 不需要具体实现
stream_.get()->common.add_audio_effect = astream_out_add_audio_effect; // 不需要具体实现
stream_.get()->common.remove_audio_effect = astream_out_remove_audio_effect; // 不需要具体实现
stream_.get()->get_next_write_timestamp = astream_out_get_next_write_timestamp; // 不需要具体实现
stream_.get()->update_source_metadata = NULL; // 不需要具体实现
stream_.get()->update_source_metadata_v7 = out_update_source_metadata_v7; // 不需要具体实现
return ret;
}
1. adev_open 的Init中会注册各个device相关的操作函数
adev_->device_.get()->common.tag = HARDWARE_DEVICE_TAG; // hardware\libhardware\include\hardware\hardware.h
adev_->device_.get()->common.version = // Y
#ifdef ANDROID_U_HAL7
HARDWARE_DEVICE_API_VERSION(maj_version, 2); // hardware\libhardware\include\hardware\hardware.h
#else
HARDWARE_DEVICE_API_VERSION(maj_version, 0);
#endif
adev_->device_.get()->common.module = (struct hw_module_t *)module;
/************************* 需要实现 ****************************/
// 创建hal层stream out实例, 实例中填充pal device参数并填充stream相关操作函数
adev_->device_.get()->open_output_stream = adev_open_output_stream; // 需实现
// 释放stream out实例资源
adev_->device_.get()->close_output_stream = adev_close_output_stream; // 需实现
// 创建hal层stream in实例, 实例中填充pal device参数并填充stream相关操作函数
adev_->device_.get()->open_input_stream = adev_open_input_stream; // 需实现
// 释放stream in实例资源
adev_->device_.get()->close_input_stream = adev_close_input_stream; // 需实现
// 用于向功放设置音量
adev_->device_.get()->set_audio_port_config = adev_set_audio_port_config; // 需实现
// open source时用此接口下发kv参数
adev_->device_.get()->set_parameters = adev_set_parameters; // 需实现
// 应该是没有用到
adev_->device_.get()->get_parameters = adev_get_parameters; // 有实现
// 目前用于设置蓝牙电话麦克风静音,调用到hfp_set_mic_mute
adev_->device_.get()->set_mic_mute = adev_set_mic_mute; // 需实现
// 应该是没有用到
adev_->device_.get()->get_mic_mute = adev_get_mic_mute; // 有实现
// 不清楚用途,外部音源
adev_->device_.get()->create_audio_patch = adev_create_audio_patch; // 有实现
adev_->device_.get()->release_audio_patch = adev_release_audio_patch; // 有实现
/************************* 不确定 ****************************/
// 调用到audioVoice的SetVoiceVolume,不清楚用途
adev_->device_.get()->set_voice_volume = adev_set_voice_volume; // 有实现
// 调用到audioVoice的setmode,不清楚用途
adev_->device_.get()->set_mode = adev_set_mode; // 有实现
// 不清楚用途
adev_->device_.get()->get_microphones = adev_get_microphones; // // 有实现
// 应该用不到,目前直接返回的BUF_SIZE_CAPTURE * NO_OF_BUF
adev_->device_.get()->get_input_buffer_size = adev_get_input_buffer_size;
/************************* 不需要具体实现 ****************************/
adev_->device_.get()->dump = adev_dump; // 没有具体实现, 可以作为hal层dumpsys接口
adev_->device_.get()->common.close = adev_close; // 没有具体实现
adev_->device_.get()->init_check = adev_init_check; // 没有具体实现
adev_->device_.get()->set_master_volume = adev_set_master_volume; // 没有具体实现,不清楚用途
adev_->device_.get()->get_master_volume = adev_get_master_volume; // 没有具体实现,不清楚用途
adev_->device_.get()->set_master_mute = adev_set_master_mute; // 没有具体实现,不清楚用途
adev_->device_.get()->get_master_mute = adev_get_master_mute; // 没有具体实现,不清楚用途
adev_->device_.get()->get_audio_port_v7 = adev_get_audio_port_v7; // 没有具体实现,不清楚用途
adev_->device_.get()->get_audio_port = adev_get_audio_port; // 没有具体实现,不清楚用途
*device = &(adev_->device_.get()->common);
qcom 接口
adev_open
std::shared_ptr<AudioDevice> adevice = AudioDevice::GetInstance(); // 实例化AudioDevice
*device = adevice->GetAudioDeviceCommon(); // 获取实例中common指针
ret = adevice->Init(device, module); // 传入common指针和module,初始化dev接口
// 开启hfp相关线程
AudioExtn::hfp_start_threads();
#ifdef HAL_AUDIOROUTE
ret = AR_get_dhu_name(adevice->dhu_project_,
adevice->vendor_dhu_type_, dhu_name, DHU_NAME_MAX);
if (!ret && AR_is_support()) {
AR_start(adevice->dhu_project_, adevice->vendor_dhu_type_, dhu_name);
if (ARThread_is_support()) {
ARThread_start();
}
}
#endif // HAL_AUDIOROUTE
#ifdef HAL_AUDIOREMIX
AudioExtn::audio_remix_start_threads(adevice->dhu_project_,
adevice->vendor_dhu_type_, dhu_name);
#endif // HAL_AUDIOREMIX
static struct hw_module_methods_t hal_module_methods = {
.open = adev_open,
};
struct audio_module HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG, // hardware\libhardware\include\hardware\hardware.h
.module_api_version = AUDIO_MODULE_API_VERSION_0_1, // hardware\libhardware\include\hardware\audio.h
.hal_api_version = HARDWARE_HAL_API_VERSION, // hardware\libhardware\include\hardware\hardware.h
.id = AUDIO_HARDWARE_MODULE_ID, // hardware\libhardware\include\hardware\audio.h
.name = "Zeekr Audio HAL",
.author = "The Linux Foundation",
.methods = &hal_module_methods,
},
};
AOSP demo 接口
hardware\libhardware\modules\audio\audio_hw.c
static int adev_open(const hw_module_t* module, const char* name,
hw_device_t** device)
{
ALOGV("adev_open: %s", name);
struct stub_audio_device *adev;
if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
return -EINVAL;
adev = calloc(1, sizeof(struct stub_audio_device));
if (!adev)
return -ENOMEM;
adev->device.common.tag = HARDWARE_DEVICE_TAG;
adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
adev->device.common.module = (struct hw_module_t *) module;
adev->device.common.close = adev_close;
adev->device.init_check = adev_init_check;
adev->device.set_voice_volume = adev_set_voice_volume;
adev->device.set_master_volume = adev_set_master_volume;
adev->device.get_master_volume = adev_get_master_volume;
adev->device.set_master_mute = adev_set_master_mute;
adev->device.get_master_mute = adev_get_master_mute;
adev->device.set_mode = adev_set_mode;
adev->device.set_mic_mute = adev_set_mic_mute;
adev->device.get_mic_mute = adev_get_mic_mute;
adev->device.set_parameters = adev_set_parameters;
adev->device.get_parameters = adev_get_parameters;
adev->device.get_input_buffer_size = adev_get_input_buffer_size;
adev->device.open_output_stream = adev_open_output_stream;
adev->device.close_output_stream = adev_close_output_stream;
adev->device.open_input_stream = adev_open_input_stream;
adev->device.close_input_stream = adev_close_input_stream;
adev->device.dump = adev_dump;
*device = &adev->device.common;
return 0;
}