RK3576 Android14 mic声音小的问题解决

现象

使用录音软件录音,发现收音特别小

录音链路在 HAL 的 codec_config/es8389_config.h

原因

1、tinymix查看,发现PGA=2,增益太小了

2、HAL里in_set_gain是空实现(audio_hw.c:3802 直接 return 0),(hardware/rockchip/audio/tinyalsa_hal/audio_hw.c),App 侧录音音量控制完全无效,所以后面只能在 codec 配置里改。

复制代码
static int in_set_gain(struct audio_stream_in *stream, float gain)
{
    return 0;
}

驱动 probe 里 REG72/73 = 0x10 增益位是 0dB,随后被 HAL 应用 route 覆盖成 6dB。

修改

修改位置:hardware/rockchip/audio/tinyalsa_hal/codec_config/es8389_config.h

复制代码
diff --git a/tinyalsa_hal/codec_config/es8389_config.h b/tinyalsa_hal/codec_config/es8389_config.h
--- a/tinyalsa_hal/codec_config/es8389_config.h
+++ b/tinyalsa_hal/codec_config/es8389_config.h
@@ -17,9 +17,9 @@
 
 #include "config.h"
 
 #define ES8389_DAC_VOL_0DB  0xBF /* -95.5dB + 0xBF * 0.5dB = 0dB */
 #define ES8389_ADC_VOL_0DB  0xBF
-#define ES8389_MIC_PGA_GAIN 0x02 /* 2 * 3dB = 6dB */
+#define ES8389_MIC_PGA_GAIN 0x08 /* 8 * 3dB = 24dB (was 0x02 = 6dB): mic capture too quiet */
 
 const struct config_control es8389_speaker_normal_controls[] = {
     {

补充

为什么是改的.h

这其实是这套 HAL 的架构约定,不是随意选择

这套 HAL 是"数据 / 逻辑"分离的

hardware/rockchip/audio/tinyalsa_hal/codec_config/*_config.h

hardware/rockchip/audio/tinyalsa_hal/alsa_route.c

hardware/rockchip/audio/tinyalsa_hal/audio.c

复制代码
            数值放这里 ↓                流程放这里 ↓
   codec_config/*_config.h  ←──  alsa_route.c  ──→  audio_hw.c
        (数据表)              (翻译器)           (流程逻辑)
                                              什么时候 apply、传什么参数
   改"值"                        把表翻译成 mixer 写操作

① codec_config/*_config.h = 一张数据表,只有三列:控件名、字符串值、整数值

② alsa_route.c = 把表翻译成寄存器写操作(不需要你动)

③ audio_hw.c = 流程逻辑(何时开流、何时切路由、参数怎么解析、要不要做软件处理)

你想改的本质 改哪 原因
一个值:增益数字、开关 on/off、某场景用哪些控件 *_config.h 它就是表格里的一格数据
时机 / 条件 / 流程:什么时候设、满足什么条件才设、运行期传进来的值怎么算 .c 表是 const 静态常量,没有 if/else,装不下 "随时变的值"

用已经遇到的两个例子对照

例 1:mic 太小 → 改 .h(因为改的是"值")

复制代码
#define ES8389_MIC_PGA_GAIN 0x08 /* 8 * 3dB = 24dB (was 0x02 = 6dB): mic capture too quiet */

它就是表格里的一格,被多处 route 引用(181/204 行),改一处全部场景生效 ------ 这是"数据"。

例 2:想让上层能调 mic 音量 → 必须改 .c(因为这不是"值",而是"没有通道")

表里只有"预设值"的概念,没有"变量"的概念。要支持运行期调,就得在 audio_hw.c 里加代码(比如让 in_set_parameters() 认识 mic_gain=x)------ 这是"逻辑"。

还有一个可能会踩的坑:改 .h 不生效

codec_config/ 下有 20 张表,靠声卡名匹配,不是靠 codec 编译选项:

复制代码
            if (strncmp(sound_card_config_list[i].sound_card_name, soundCardID,
...
                route_table = sound_card_config_list[i].route_table;

匹配不到就 fallback 到 default_config_table(alsa_route.c:104)。es8388 / es8389 / es8316 / es8396 四张 Everest 表长得极像,改错文件完全不生效。所以动手前先确认:

复制代码
cat /proc/asound/cards        # 看声卡名,如 rockchipes8389 → 对应 es8389_config_table
相关推荐
运维小文1 年前
MySQL高可用方案MIC&mysqlCluster+mysqlRouter
数据库·mysql·mic·mysql高可用·mysqlcluster·mysqlrouter
Crazy learner2 年前
麦克风传递函数的深度解读:原理、应用与案例
音频·mic
机器学习之心3 年前
分类预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据分类预测
bp神经网络·mic·mic-bp·最大互信息系数·数据特征选择算法·数据分类预测