最近在项目上遇到一个问题,也不能说是最近项目上的问题了,是之前一直存在的问题,但是对项目没什么影响,所以我就不怎么理会,直到最近,同事说这个杂音已经影响到了项目的开发,所以今天花了一天时间整理了下问题,不断的修改测试中,终于搞完了。

说个题外话,年前招了一个帅哥有了新的发展,离开了我们,我内心非常不舍,说不舍有点牵强,他特别喜欢踢足球⚽,平时交集不是特别多。但是他在技术上真的也是我学习的榜样,我喜欢看他对事情认真的样子,总结一个文档和技术也非常有条理,在面对新的问题和技术难点的时候,他总是能找到解决的办法。在这点上,我觉得自己确实从他身上吸收到了好的东西。

然后,他现在去做的也是音频相关的,希望他在新的岗位,新的企业能发展得更好。

之前音频相关的文章

音频系统,Alsa 里面的buff 是怎么计算的?

为什么需要超过48k的采样音频?

我在MTK平台下调试音频ALSA

音频几个重要的参数

openwrt 音频开发

(干货)Ai音箱和Linux音频驱动小谈

Android 音频数据流分析之程序员干架产品经理

Alsa里面恶心的DAPM

1、问题

正常使用tinycap录音,在音频的开始位置会有一段杂波,这段杂波让人看起来会非常不爽。

2、排查过程

先是排查了硬件,我担心是硬件的GPIO口模式不正确,这个也是同事提醒的,后面检查了下,发现这个GPIO口是特殊口,这个GPIO口就是干这个事情的,所以说没有模式正确不正确,它就只有这个功能。

然后检查了上电,因为DMIC有一个供电,之前的文章写过,我担心供电时间过慢导致,后面修改了代码让DMIC持续供电,不过测试几次录音的时候问题还是存在,所以排除了这个问题。

还有就是DMIC的特性了,查看了DMIC的上电特性,DMIC有一个上电的时间,也就是这个时间影响了稳定。

如下图

后面跟思必驰的技术沟通,跟他讨论了这个问题,他也说到他们在其他项目中也遇到过,解决的办法就是写0。

3、解决

上面已经说了解决办法了,就是在开始录音的时候写0,但是在哪里写成了问题,如果应用直接写0就好了,但是我不能直接修改应用的代码。所以只能在内核里面做手脚。

在HAL搞这个事情可能会标准化一些。

先是确定了读音频的函数,流程是

snd_pcm_capture_ioctl1()
->snd_pcm_lib_read()
-->snd_pcm_lib_read_transfer()

修改的patch如下

diff --git a/kernel-4.4/include/sound/pcm.h b/kernel-4.4/include/sound/pcm.h
old mode 100644
new mode 100755
index b0be092799..ecaca74273
--- a/kernel-4.4/include/sound/pcm.h
+++ b/kernel-4.4/include/sound/pcm.h
@@ -460,6 +460,7 @@ struct snd_pcm_substream {/* -- assigned files -- */void *file;int ref_count;
+       int once_f;/*weiqifa modify*/atomic_t mmap_count;unsigned int f_flags;void (*pcm_release)(struct snd_pcm_substream *);
diff --git a/kernel-4.4/sound/core/pcm_lib.c b/kernel-4.4/sound/core/pcm_lib.c
old mode 100644
new mode 100755
index 17e69848d3..8a057f1445
--- a/kernel-4.4/sound/core/pcm_lib.c
+++ b/kernel-4.4/sound/core/pcm_lib.c
@@ -2220,6 +2220,11 @@ static int snd_pcm_lib_read_transfer(struct snd_pcm_substream *substream,return err;} else {char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff);
+               if(substream->once_f < 1)
+               {
+                       memset(hwbuf,0,frames_to_bytes(runtime, frames));
+                       substream->once_f++;
+               }if (copy_to_user(buf, hwbuf, frames_to_bytes(runtime, frames)))return -EFAULT;}
diff --git a/kernel-4.4/sound/core/pcm_native.c b/kernel-4.4/sound/core/pcm_native.c
old mode 100644
new mode 100755
index 3de88974ee..0ead670a38
--- a/kernel-4.4/sound/core/pcm_native.c
+++ b/kernel-4.4/sound/core/pcm_native.c
@@ -2229,6 +2229,7 @@ static void pcm_release_private(struct snd_pcm_substream *substream)void snd_pcm_release_substream(struct snd_pcm_substream *substream){
+       substream->once_f = 0;substream->ref_count--;if (substream->ref_count > 0)return;
@@ -2277,6 +2278,7 @@ int snd_pcm_open_substream(struct snd_pcm *pcm, int stream,goto error;substream->hw_opened = 1;
+       substream->once_f = 0;err = snd_pcm_hw_constraints_complete(substream);if (err < 0) {

里面写0的帧大小需要调试一下,这是我最后测试出来的结果。

修改后录音得到的音频频谱图如下

从之前的文章知道计算公式,从这里反推断mute写0的时间

跟上面截图看到的时间差不多。

完美~ 下班

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

干货,记一次解决录音杂音问题相关推荐

  1. 记一次 解决 vue 兼容ie11 的问题

    记一次 解决 vue 兼容ie11 的问题 参考文章: (1)记一次 解决 vue 兼容ie11 的问题 (2)https://www.cnblogs.com/qq735675958/p/117757 ...

  2. android 嘶嘶 录音 电流音_线程安全引起的录音杂音电流音问题

    前段时间写了一个录音模块,需求是:『录音的时候实时语音转文字,实时计算音量大小,实时进行 MP3 转码保存为文件』 首先进行需求分析,确定技术方案: 使用 AudioRecord 进行录音,实时获取原 ...

  3. path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...

    前言: 笔者不过是一个刚立下flag要学习Python的小白, (这也是笔者的第一篇网文.知乎文,如果没用,求轻虐), 为此还冲动傻傻地配了一台2019款13寸的MacBook Pro. 电脑配置(作 ...

  4. 杂学第十篇:这几天,在毕业论文调整格式中踩过的坑,满满的干货助你快速解决格式调整的烦恼

    以下内容,来自我的公众号. 你是来看论文格式,还是来看我奄奄一息的爱情?? 这几天,为了我的论文,殚精竭虑.历经生死.悲欢离合.甚至错了一个重要的节日,真是赔了夫人还好没折兵.看来我要多哄哄我家那美若 ...

  5. java专业编码_java编码中的坑(记一次解决编码BUG的经历) - 贪吃蛇学院-专业IT技术平台...

    1.2016年11月15日(周二),我被经理外派出差渝北金开大道,任务:解决那边的一个数据库乱码异常 2.那边的负责人描述:数据库原是utf8编码,他为了兼容emoji表情,改为utf8mb4,之后出 ...

  6. 记一次解决 quill(vue-quill-editor) 编辑器中莫名多出一行“pbr/p”的过程...

    问题描述: 在使用 vue-quill-editor 富文本编辑器过程中,加载已有的富文本数据到编辑器,经常会出现编辑器中莫名其妙多出一段换行内容 <p><br></p& ...

  7. oracle查看数据库是否恢复成功_记一次解决docker下oracle数据库故障事例

    一.问题背景: 某个项目的线上环境oracle数据库挂了,同事急匆匆来找我救火.我简单咨询了一些基本情况:线上环境,docker部署,已正常运行半年.由于宿主机的根目录硬盘空间不够,运维的同事想把or ...

  8. .net千万级数据导出_记一次解决docker下oracle数据库故障事例

    一.问题背景: 某个项目的线上环境oracle数据库挂了,同事急匆匆来找我救火.我简单咨询了一些基本情况:线上环境,docker部署,已正常运行半年.由于宿主机的根目录硬盘空间不够,运维的同事想把or ...

  9. android 记一次解决键盘遮挡问题

    文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者 ...

最新文章

  1. 广州企业“掘金”物联网蓝海
  2. linux系统运维面试题
  3. 【Linux】17.Ubuntu16.04 系统添加网关和DNS的两种方式
  4. 计算机组成原理--主存储器
  5. 搜索算法(二)--DFS/BFS求解炸弹人问题(JAVA )
  6. Python爬虫连载16-OCR工具Tesseract、Scrapt初步
  7. tif 高程_Global Mapper中80坐标系高程DEM与kml文件叠加实例
  8. JS中的立即执行函数
  9. 心有所鼠,鼠年快乐~
  10. 触感啥意思_苹果手机系统触感反馈是什么意思
  11. 二维离散沃尔什变换及matlab实现
  12. CodeForces - 1526C2
  13. AWS GWLB集成FortiGate防火墙
  14. iOS逆向-微信自动添加好友
  15. 什么是显示器支架,显示器支架有啥优势
  16. 深度关注 | 元宇宙如何改写人类社会生活
  17. Imagine-快速的图片压缩工具
  18. 从区块链到DAG(五)--DAG项目介绍IOTA和Obyte
  19. English-全国英语翻译证书
  20. python gdal 重采样_Python遥感影像重采样

热门文章

  1. 微软老兵 Antoine LeBlond 将正式离职
  2. 工具使用——印象(汇总)
  3. 【Pascal's Triangle II 】cpp
  4. 【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ
  5. 搭建nginx流媒体服务器(支持HLS)
  6. ACM中java快速入门
  7. Jsp用于交换数据的4个map结构
  8. public static void main(String[] args)的理解
  9. ajax同步和异步的区别_同步电机和异步电机区别
  10. Hbase2.0版本安装教程