解决android录音失真BUG && Android上的alsa

      在6410+WM9714的ANDROID平台上测试MIC IN录音功能,出现一个BUG。在该平台声音播放是完全正常的,但是录音后再播放刚录的声音,会有失真,同样的录音文件在电脑上播放也一样,说明是录音问题。后来通过打印9714的寄存器,发现录音频率是8000HZ,放音频率是44100HZ,这时基本上可以确定是由这个不匹配引起的。
我在android代码里:AudioHardwareALSA.cpp文件中的函数中设定采样率,如下:
AudioStreamInALSA::AudioStreamInALSA(AudioHardwareALSA *parent) :mParent(parent)
{
static StreamDefaults _defaults = {
....................
sampleRate : AudioRecord::DEFAULT_SAMPLE_RATE,
....................
};
}
设定了:static const int DEFAULT_SAMPLE_RATE = 44100;
但是重烧程序后结果仍然是一样,采样率还是8000,似乎被其他地方把值覆盖了。后来我试着把所有的采样率8000的地方全都改成44100,结果仍然一样是8000。到底是不是采样率的原因引起的呢?

      之后用arecord命令来录音,前提是不能进入android,否则音频设备会被占用。结果录得的声音播放时仍然是同样的效果,当时估计这问题应该跟android上层没有什么大的关系。后来别人有试通过将播放速度加快一倍,就得到的正常的播放音,但问题是仍然不知从何处来解决这个问题。

      后来经过台湾同事的挖掘,改动录音MIC IN的DMA SIZE解决了此次问题。改动列出如下,原因尚待分析。

static struct s3c24xx_pcm_dma_params s3c6400_ac97_mic_mono_in = {
 .client  = &s3c6400_dma_client_micin,
 .channel = DMACH_AC97_MIC_IN,
 .dma_addr = S3C6400_PA_AC97 + S3C_AC97_MIC_DATA,
 .dma_size = 2,///4
};

该参数最终在s3c24xx_pcm_hw_params中修改DMA配置所用。

==============Android上的alsa=========================

(1)Android pcm编程介绍:http://blog.chinaunix.net/uid-29640991-id-5145033.html

实现开机铃声,在播放开机画面的时候,audio hal层还没有初始化,意味着只能直接操作PCM用来播放音频,直接利用pcm接口来进行处理。

(2)用tinyalsa调试:https://blog.csdn.net/kangear/article/details/38139669

(3)硬件架构和软件架构的简化模型

(3)MTK上的音频框架https://blog.csdn.net/shell812/article/details/73467010

提供给应用的功能接口有:AudioTrack与AudioRecord两个类,分别是播放与录音的功能接口。这两个功能接口会通过AudioSystem调用AudioFlinger。AudioFlinger对管控着所有的Buf与播放,同时AudioFlinger也受AudioSystem管理,其中的管理策略来自于AudioPolicy.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值