当前位置: 首页> 游戏> 单机 > 兰州新站seo_邢台市隆尧县疫情最新消息_seo技术蜘蛛屯_seo系统教程

兰州新站seo_邢台市隆尧县疫情最新消息_seo技术蜘蛛屯_seo系统教程

时间:2025/7/16 23:40:43来源:https://blog.csdn.net/haijiaoningxia/article/details/145618354 浏览次数:0次
兰州新站seo_邢台市隆尧县疫情最新消息_seo技术蜘蛛屯_seo系统教程


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;
}

关键字:兰州新站seo_邢台市隆尧县疫情最新消息_seo技术蜘蛛屯_seo系统教程

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: