1.Android+alsa音频体系大体结构:

从alsa的角度由下往上看:linux中有alsa驱动层,其中,/sound/core/pcm_native.c文件中的snd_pcm_f_ops是alsa驱动层对alsa_lib层的接口;Android中有alsa_lib层(在donut/external/alsa_lib目录下)和alsa应用层;

从Android的角度由下往上看:首先是cpp库层,然后是框架层,最后是java应用层。库层分3个部分:首先是硬件接口层AudioHardwareInterface,其派生类负责调用alsa_lib接口,形成read、write等虚函数;其次是音频环层AudioFlinger,利用多态的性质调用硬件接口层AudioHardwareInterface派生类的read、write等虚函数并最终管理read和write两个线程。最后,是媒体录音MediaRecorder和媒体播放层MediaPlayer。进入或激活read/write线程,实现录音放音功能。

2.Android中音频配置文件问题:

配置文件/system/etc/asound.conf其实是alsa体系留的一手。alsa体系提供了这样一种机制:应用层直接改变音频codec的寄存器,具体而言:linux驱动中创建snd_kcontrol_new控制结构,并关联到codec寄存器,asound.conf文件通过控制结构名字,就能关联到寄存器,从而改变寄存器的值。asound.conf文件主要用来做Android音频的路由控制:不同路由可以设置多个寄存器的不同配置组合,形成不同的音频通道,从而当路由改变时,底层codec通道随之改变。

3.Android中音频采样频率、通道数问题:

Android向下强制设定:播放时,双声道(立体声),采样频率为44.1kHz,当SD卡中音频文件是单声道或者频率不是44.1kHz时,Android会自动处理,使得送给驱动的数据流是双声道44.1kHz录音时,单声道,采样频率固定为8kHz,因为手机上生成的一般是amr或者3gpp压缩格式,文件要尽量小,便于彩信等应用的传输。对做音频驱动的同志来说就很好了,只需要悉心配置好两种频率

4.音频无声:

通用codec芯片wm9714、alc5620之类的都有回环模式loopback,可以先用loopback模式把mic的录音送到spk,有声音说明芯片大部分逻辑很正常;

接着,应该调通控制接口,能IIC读写codec寄存器;

最后再调试I2S、ac97等数字接口。

在dma中断中添加打印可以让数据流一目了然。

5.音频效果不好:

通常是频率问题,记住DAC、ADC的频率必须设置好,他们一般由codec芯片中PLL分频产生。有些芯片要求把ADC、DAC等模块上电后,才能设置其频率,否则无效,但是能写入,这是极容易忽视的一个问题。削顶失真,调小音量可以解决。

更多相关文章

  1. 游戏音频-详解MediaPlayer,SoundPool利弊
  2. 简单的音频播放功能MediaPlayer使用中所遇到的坑。
  3. 转:ANDROID音频系统散记之四:4.0音频系统HAL初探
  4. android 两个视频同时播放音频冲突的解决
  5. Android(安卓)音频FFT提取分析
  6. Android(安卓)CPU scaling
  7. [Android(安卓)Traffic] 调整定时更新的频率(C2DM与退避算法)
  8. android driver开发常见的英文缩写
  9. Android(安卓)获取音频焦点工具类

随机推荐

  1. go中的数据结构-接口interface(详解)
  2. go defer(go延迟函数)介绍
  3. golang cap是什么意思
  4. go get命令详解
  5. go语言结构体详解
  6. go语言中go build和go install的区别
  7. Go语言两种版本的Hello world你会吗
  8. go语言中接口的使用
  9. GoLang中协程图文详解
  10. 用Go语言编写一个简单的WebSocket推送服