rk3568 Android蓝牙语音通话故障排查:从问题定位到落地解决

电子说

1.4w人已加入

描述

 

 

在平板的日常使用中,蓝牙功能常扮演着关键角色,可一旦出现语音通话问题,便会严重影响使用体验。近期,我们遇到了平板蓝牙无法进行语音通话的故障,具体表现为进入腾讯会议后,蓝牙选项直接消失,无法选择蓝牙进行语音传输。经过一系列排查与调试,我们成功解决了该问题,现将完整的故障排查与解决过程分享给大家。

 

 

一、精准定位:揪出蓝牙语音故障的元凶

 

要解决问题,首先得找准问题根源。我们通过对系统、代码及硬件的逐层排查,最终锁定了三大核心问题:

蓝牙功能主要问题是不能进行语音通话,其他正常,主要表现在进入腾讯会议后蓝牙不可选,没有蓝牙选项。Android

1. 蓝牙声卡未加载

 

声卡是音频信号处理的关键硬件,若蓝牙声卡未成功加载,系统自然无法识别蓝牙音频设备。我们通过在终端执行指令cat /proc/asound/cards 查看声卡加载情况,发现系统中虽有其他声卡信息,但蓝牙对应的声卡并未在列表中显示,这直接导致蓝牙音频功能无法启用。

AndroidAndroid

2. 音频代码缺失蓝牙处理配置

 

在深入分析音频部分代码时,我们发现与蓝牙处理相关的代码和配置处于未开启状态。例如,在hardware/rockchip/audio/tinyalsa_hal/audio_hw.c 文件中,缺少蓝牙声卡的自动加载配置,同时音频输入输出处理逻辑中,也未添加蓝牙设备的适配代码,使得系统无法对蓝牙音频信号进行正常处理。

 

 

3. 录音存在杂音、不清晰问题

 

除了蓝牙不可选的问题,即使在部分场景下勉强启用蓝牙录音,也会出现明显的杂音,且录音清晰度极差。这一问题不仅影响语音通话质量,还可能隐藏着音频信号处理或硬件驱动层面的隐患。

 

 

二、分步突破:三大环节实现蓝牙语音功能调试

 

针对定位出的问题,我们将调试工作分为加载声卡、启用 HAL 层代码、保障驱动层正常运行三大环节,逐一攻克故障。

 

 

1. 声卡加载:为蓝牙音频 铺路

 

声卡是蓝牙语音功能的基础,我们首先要确保蓝牙声卡成功加载。通过终端指令cat /proc/asound/cards 可实时查看声卡加载状态,最终实现蓝牙声卡(如sndscoaic)在系统中的正常显示,为后续蓝牙音频传输提供硬件支持。

 

 

2. HAL 层代码修改:完善蓝牙音频处理逻辑

 

HAL(硬件抽象层)是连接系统软件与硬件的桥梁,对该层代码的修改是解决蓝牙语音问题的核心步骤。

 

 

增加蓝牙配置:在audio_hw.c 文件中定义蓝牙 PCM(脉冲编码调制)配置结构体,明确声道数、采样率、周期大小等关键参数,确保蓝牙音频信号的格式符合系统处理要求:

Android

 

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
struct pcm_config bt_pcm_config={    .channels =1,    .rate =8000,    .period_size =120,    .period_count =4,    .format = PCM_FORMAT_S16_LE,}

添加声卡自动加载:在声卡设备信息列表中,加入蓝牙声卡(rockchipbtsndscoaic)的配置,让系统启动时能自动识别并加载蓝牙声卡,避免手动操作的繁琐与遗漏。

Android之前宏定义RK3399_LAPTOP没有开启,所以没有蓝牙语音功能AndroidAndroid

优化音频输入输出处理:在音频输出流(start_output_stream)和输入流(start_input_stream)处理函数中,新增蓝牙设备的适配逻辑。当检测到蓝牙设备时,自动切换到蓝牙声卡,并使用上述定义的蓝牙 PCM 配置进行音频信号的传输与处理。同时,修复宏定义 RK3399_LAPTOP 未开启的问题,确保蓝牙语音功能相关代码能正常执行。

Android

取消降噪配置:在调试过程中发现,降噪功能暂时未对音质产生积极影响,反而可能增加音频处理的复杂度。因此,我们注释掉RK_DENOISE_ENABLE 宏定义,暂时关闭降噪功能,简化音频处理流程。

 

 

3. 驱动层保障:筑牢蓝牙语音的 根基

 

驱动层是硬件正常工作的关键,由于驱动调试涉及芯片底层逻辑,主要由芯片原厂负责。原厂基于system/bt 提供了替换的 SO 文件,并通过以下操作确保驱动正常运行:

 

 

aic_uart_sco.ko 文件推送至板卡vendor/lib/modules 目录,为蓝牙串口音频通信提供驱动支持;

 

 

libbluetooth.so 文件分别推送至system/lib64/ vendor_dlkm/lib/modules/ 目录,保障蓝牙功能的库文件依赖;

 

 

将所有蓝牙固件(如fmacfw.binfw_patch.bin 等)推送至vendor/etc/firmware 目录,为蓝牙硬件提供运行所需的固件程序。

AndroidAndroid

三、调试验证:确保蓝牙语音功能稳定运行

 

调试完成后,我们通过多层级验证,确保蓝牙语音功能达到预期效果:

 

 

1. 上层功能验证

 

直接在腾讯会议中测试蓝牙功能,检查是否能正常选择蓝牙设备,同时验证通话双方是否能清晰听到声音,确保无卡顿、无断连现象。

 

 

2. 底层录音播放测试

 

若上层测试出现声音异常,需通过底层工具进一步排查。使用tinycap tinyplay 工具获取并播放原始音频数据,指令如下:

 

 

录音:tinycap /sdcard/rec.wav -D 1 -d 0 -c 1 -r 8000 -b 16 -p 480 -n 2

 

 

播放:tinyplay /sdcard/rec.wav -D 1 -d 0 -c 1 -r 8000 -b 16 -p 480 -n 2

 

 

通过这些指令,可快速判断底层音频信号是否正常,为问题定位提供依据。

 

 

3. PCM 数据验证

 

PCM 数据是音频信号的数字表示,通过获取并分析 PCM 数据,能更精准地判断音频处理是否正常。具体操作步骤如下:

 

 

1.执行adb root adb shell setenforce 0 获取系统权限并关闭 SELinux

 

 

2.创建 PCM 数据文件:

  •  
  •  
  •  
  •  
touch /data/misc/audioserver/debug_in.pcm(录音文件)touch /data/misc/audioserver/debug.pcm(播放文件)

3.赋予文件读写权限:

  •  
  •  
chmod 777 /data/misc/audioserver/debug.pcmchmod 777 /data/misc/audioserver/debug_in.pcm

4.启动录音与播放:setprop vendor.audio.record.in 5setprop vendor.audio.record 5

 

 

5.清除旧数据(如需重新测试):

  •  
  •  
cat /dev/null > /data/misc/audioserver/debug.pcmcat /dev/null > /data/misc/audioserver/debug_in.pcm

之后,使用Audacity 工具打开 PCM 文件,观察音频波形。正常波形应平稳、无明显失真,而异常波形常表现为波峰波谷被截断(多因声音放大过度导致数据不完整),据此可进一步优化音频处理参数。

正常波形:Android不正常的波形,表现为失真、有杂音:Android

四、总结:故障排查的核心思路

 

此次平板蓝牙语音故障的解决,遵循了问题定位 分层调试 验证优化” 的核心思路。在实际排查中,需注重从上层功能到底层硬件的逐层拆解,既要关注代码逻辑的完整性,也要重视硬件驱动的稳定性。同时,借助终端指令、专业工具(如 Audacity)进行数据验证,能让问题排查更精准、高效。

 

 

未来,我们也将持续优化平板的蓝牙功能,针对可能出现的兼容性、稳定性问题提前做好预案,为用户提供更流畅、更可靠的使用体验。如果大家在使用过程中遇到类似问题,可参考本文的排查思路,也欢迎在评论区分享你的经验与疑问!

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分