0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

audio_hw.c核心逻辑及第三方算法集成

jf_44130326 来源:Linux1024 2026-02-06 16:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、文件核心内容分析

(一)核心配置解析

该文件的配置主要分为PCM参数配置路由配置设备标识配置三类,是音频硬件抽象层(HAL)与底层ALSA驱动交互的基础。

wKgZPGkaixaABjWTAAJWySiB9qc708.png
1. PCM参数配置(音频数据格式定义)

定义了不同场景下的PCM(脉冲编码调制)数据格式,包括声道数、采样率、周期大小等关键参数,决定了音频数据的传输格式。

配置名称

适用场景

核心参数(channels/rate/format

备注

pcm_config

基础音频输出(如媒体播放)

2声道/ 44100Hz / S16_LE16位小端)

通用播放场景默认配置

pcm_config_in

基础音频输入(如录音)

2声道(默认)/ 44100Hz / S16_LE

支持参考声道扩展(PCM_REFERENCE_CHANNELS

pcm_config_in_low_latency

低延迟输入(如语音通话)

2声道/ 48000Hz / S16_LE

降低延迟以保证实时性

pcm_config_sco

蓝牙SCO链路(语音)

1声道/ 8000Hz / S16_LE

蓝牙语音通话专用(窄带音频)

pcm_config_hdmi_multi

HDMI多声道输出

6声道(可动态修改)/默认采样率/ S16_LE

支持多声道环绕声输出

pcm_config_direct

直接输出(如SPDIF

2声道/ 48000Hz / IEC958S24_LE

用于数字音频直通(无解码,直接传输比特流)

2.路由配置(音频路径映射)

通过route_config结构体和路由表route_configs定义输入源与输出设备的对应关系,决定音频数据的物理传输路径(如扬声器、耳机、蓝牙等)。

route_config结构体:包含播放路径(playback_route)、采集路径(capture_route)等,例如:

staticconststructroute_config media_speaker = { "media-speaker",  // 播放路径(媒体→扬声器) "media-main-mic", // 采集路径(主麦克风) "playback-off",  // 关闭播放时的路径 "capture-off"   // 关闭采集时的路径};

路由表route_configs:二维数组,维度为[输入源][输出设备],映射关系如下:

输入源:IN_SOURCE_MIC(麦克风)、IN_SOURCE_CAMCORDER(摄像机)、IN_SOURCE_VOICE_RECOGNITION语音识别)等。

输出设备:OUT_DEVICE_SPEAKER(扬声器)、OUT_DEVICE_HEADSET(耳机)、OUT_DEVICE_BT_SCO(蓝牙SCO)等。

例如:route_configs[IN_SOURCE_MIC][OUT_DEVICE_SPEAKER] = &media_speaker,表示麦克风输入扬声器输出使用media_speaker路由。

3.设备标识配置(硬件匹配列表)

定义了不同类型设备(如扬声器、HDMI、麦克风)的硬件标识列表,用于匹配系统中的实际声卡(通过解析/proc/asound/cards)。

设备列表名称

含义

示例元素(声卡名称)

SPEAKER_OUT_NAME

扬声器输出设备列表

"rockchipcarrk33""realtekrt5616c"codec名称)

HDMI_OUT_NAME

HDMI输出设备列表

"rkhdmidpsound""rockchiphdmi"

SPDIF_OUT_NAME

SPDIF输出设备列表

"ROCKCHIPSPDIF""rockchipspdif"

MIC_IN_NAME

麦克风输入设备列表

"realtekrt5651co""rockchipes8316c"

BT_IN_NAME/BT_OUT_NAME

蓝牙输入/输出设备列表

"rockchipbt"(蓝牙音频设备)

(二)核心函数解析

函数主要围绕设备管理路由控制流操作三大核心功能,实现音频设备的打开、配置、数据传输等流程。

1.设备管理函数

get_output_device_id/get_input_source_id

Android标准音频设备类型(如AUDIO_DEVICE_OUT_SPEAKER)转换为内部ID(如OUT_DEVICE_SPEAKER),用于路由表索引

示例:AUDIO_DEVICE_OUT_SPEAKEROUT_DEVICE_SPEAKER

name_match/is_specified_out_sound_card

设备匹配函数,通过比较声卡名称(从/proc/asound/cards读取)与SPEAKER_OUT_NAME等列表中的标识,确定当前可用硬件设备。

device_lock/device_unlock

线程安全函数,通过互斥锁保护音频设备操作(如流的创建/销毁),避免并发冲突。

2.路由控制函数

getOutputRouteFromDevice/getInputRouteFromDevice

根据输出/输入设备类型获取对应的路由ID(如SPEAKER_NORMAL_ROUTEMAIN_MIC_CAPTURE_ROUTE),用于底层ALSA路由切换。

force_non_hdmi_out_standby

设备冲突处理函数,当HDMI激活时,强制其他输出设备(如扬声器)进入待机状态,避免音频同时从多个设备输出。

3.流操作函数

adev_get_stream_out_by_io_handle_l/adev_get_stream_in_by_io_handle_l

根据IO句柄查找对应的输出/输入流(stream_out/stream_in),用于流的状态管理(如启动、停止)。

adev_add_stream_to_list

将创建的流添加到设备的流列表中,维护流的生命周期(从创建到销毁)。

二、第三方算法集成方案

第三方算法(如降噪、音效增强、回声消除等)需嵌入音频数据流转链路中,核心是在输入数据读取后输出数据写入前插入处理逻辑。

(一)集成位置

1.输入链路(录音)

在麦克风采集的PCM数据被上层应用读取前处理(如降噪)。

对应代码位置:输入流的read回调函数(如stream_in.read),数据从pcm_read获取后,调用算法处理再返回给上层。

2.输出链路(播放)

在上层应用发送的PCM数据写入硬件前处理(如音效增强)。

对应代码位置:输出流的write回调函数(如stream_out.write),数据传入后先调用算法处理,再通过pcm_write写入硬件。

(二)集成步骤

1.算法初始化(设备打开时)

在音频设备打开(如open_output_streamopen_input_stream)时,根据当前PCM配置(pcm_config的采样率、声道数等)初始化算法(如分配缓冲区、设置参数)。

示例:在stream_out创建时,调用algorithm_init(&out->alg, out->pcm_config)

1.数据处理(读写时)

输入链路:在stream_in.read中,pcm_read获取原始数据后,调用algorithm_process_in(alg, pcm_data, processed_data),再返回处理后的数据。

输出链路:在stream_out.write中,接收上层数据后,调用algorithm_process_out(alg, input_data, processed_data),再通过pcm_write输出。

1.资源释放(设备关闭时)

在流停止(stop_output_stream/stop_input_stream)或设备关闭时,调用algorithm_destroy(alg)释放算法占用的内存、线程等资源。

(三)注意事项

数据格式匹配:算法输入输出格式需与PCM配置一致(如采样率、声道数、位深),必要时通过audio_format_convert进行格式转换。

实时性:算法处理耗时需音频帧周期(如period_size/rate,例如44100Hz采样率、256帧周期对应的周期为~5.8ms),避免卡顿。

线程安全:若算法涉及多线程操作,需通过device_lock/device_unlock加锁保护,避免数据竞争。

三、流程图与脑图(文字版)

(一)音频数据流转与算法集成流程图

wKgZPGkaixaAVOxpAAJbl89q9os332.png

(二)核心模块与算法集成脑图

wKgZPGkaixaAY45WAAMTsfKQkLQ265.png

通过以上分析,可清晰理解audio_hw.c的核心逻辑及第三方算法的集成方式,实际操作时需根据具体算法接口调整处理逻辑,并严格测试实时性和兼容性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PCM
    PCM
    +关注

    关注

    1

    文章

    213

    浏览量

    55999
  • 音频
    +关注

    关注

    31

    文章

    3224

    浏览量

    86275
  • 文件
    +关注

    关注

    1

    文章

    597

    浏览量

    26111
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Labview如何内嵌操作第三方EXE程序!

    自己在网上搜了下相关资料,能把第三方EXE内嵌进入容器里,但是有个问题,这个第三方软件必须手动拖到容器正中间,手动最大化。请问有什么方法可以自动实现吗? 下图是我内嵌的POLL 软件。如图!
    发表于 04-18 14:26

    如何把第三方库加到PROTEUS中?

    新手求教,弱弱的问下,下了一个第三方库,说是要先安装,再添加路径,可是我下来的第三方库没有看到安装文件啊。还望指教如何添加!
    发表于 06-15 22:32

    第三方dll调用问题!!!

    第三方dll,没有.h,labview怎么实现调用,dll可以用VS打开,类库说明也有
    发表于 05-11 09:14

    请问能否推荐下基于ADI DSP的第三方算法公司?

    能否推荐下基于ADI DSP的第三方算法公司?
    发表于 09-20 14:48

    国内知名第三方检测认证机构排名

    第三方检测机构国内起步的很晚,基本是2000年以后的事情,进入改革开放以来,特别是新世纪以来,国家对第三方机构的政策越来越放开了,很多职能部门都逐步下放到第三方机构来做。为了保证产品品质,就有
    发表于 07-19 16:57

    头文件中包含第三方文件

    macrocmake如果源文件(例如 CPP)中包含第三方头文件,但是头文件(例如 hpp)中不包含该第三方文件头,采用 PRIVATE。如果源文件和头文件中都包含该第三方文件头,采用 PUBLIC
    发表于 08-18 08:10

    在Framework下调用第三方C++算法

    Platform: RK3399OS: Android 7.1Kernel: v4.4.83背景:现在在Framework层及以下经常会调用到第三方C++算法库,比如语音识别,人脸识别等等。例如
    发表于 11-24 17:37

    银行和第三方支付:恋爱进行时

    银行和第三方支付:恋爱进行时   北京2010年1月8日电  -- 从第三方支付诞生之时起,银行与第三方支付之间的竞合关系
    发表于 01-09 08:08 913次阅读

    兼容DSP的第三方算法的传真详细数据资料概述

    本文的主要内容介绍的是TI的兼容DSP的第三方算法的传真详细数据资料概述
    发表于 05-07 16:53 3次下载
    兼容DSP的<b class='flag-5'>第三方</b><b class='flag-5'>算法</b>的传真详细数据资料概述

    兼容第三方算法的Excel DSP用在GSM上的详细概述

    本文的主要内容介绍的是TI的兼容第三方算法的Excel DSP用在GSM上的详细概述
    发表于 05-07 16:59 6次下载
    兼容<b class='flag-5'>第三方</b><b class='flag-5'>算法</b>的Excel DSP用在GSM上的详细概述

    TI的基于DSP兼容的第三方算法协议的详细资料概述

    本文的主要内容介绍的是TI的基于DSP兼容的第三方算法协议的详细资料概述
    发表于 05-07 17:04 8次下载
    TI的基于DSP兼容的<b class='flag-5'>第三方</b><b class='flag-5'>算法</b>协议的详细资料概述

    Excel DSP兼容的第三方算法可以用于声码器的芯片概述

    本文介绍的主要内容是TI的Excel DSP兼容的第三方算法可以用在声码器上的芯片概述
    发表于 05-08 08:37 14次下载
    Excel DSP兼容的<b class='flag-5'>第三方</b><b class='flag-5'>算法</b>可以用于声码器的芯片概述

    Express DSP兼容第三方算法的完整列表详细介绍

    本文档介绍的主要内容是TI的Express DSP兼容第三方算法的完整详细的列表介绍
    发表于 05-08 08:45 3次下载
    Express DSP兼容<b class='flag-5'>第三方</b><b class='flag-5'>算法</b>的完整列表详细介绍

    第三方实例:iView开发介绍 (1)

    第三方实例介绍 - iView (1)
    的头像 发表于 08-22 01:42 5420次阅读

    第三方脚本成为网络攻击“重灾区”,多管齐下防范第三方脚本安全隐患

      第三方脚本攻击利用的是第一网站对第三方脚本的控制力不足和难以实现的全面监测,造成较为严重的攻击后果。除此之外,第三方脚本还会带来一些其他的潜在隐患。综合来看,
    的头像 发表于 09-04 14:51 4613次阅读