android整体audio包括android层和底层ASLA驱动。

最近开始调3G 通话功能继而开始接触android 音频架构,之前调试声卡的时候也有过接触,不过那些都相对比较简单,基本上只需要修改audio path, 也就是修改audio_codec.h, 该文件定义了各种情况下的音频数据流程。其中有个结构体定义,如下:

typedef struct AudioMixer_tag {
const char *ctl;
const int val;
} AudioMixer;

具体定义格式如下:

onst AudioMixer device_out_SPK [] = { //playback_speaker //path { "AIF1DACL Source" , 0 }, //Left DAC receive left channel { "AIF1DACR Source" , 1 }, //Right DAC receive right channel { "AIF1DAC Mux" , 0 }, //AIF1DAC, select AIF1DACDAT { "DAC1L Mixer AIF1.1 Switch" , 1 }, //AIF1DAC1L --> DAC1L Mixer { "DAC1R Mixer AIF1.1 Switch" , 1 }, //AIF1DAC1R --> DAC1R Mixer { "SPKL DAC1 Switch" , 1 }, //DAC1L --> SPKL { "SPKR DAC1 Switch" , 1 }, //DAC1R --> SPKR { "SPKL Boost SPKL Switch" , 1 }, //SPKL --> SPKL Boost { "SPKR Boost SPKR Switch" , 1 }, //SPKR --> SPKR Bootst //gain { "Headphone Switch" , 0 }, //HPOUT PGA mute { "Speaker Mode" , 0 }, //Class D { "Speaker ZC Switch" , 0 }, //disable ZC { "Speaker Volume" , 60 }, //SPK volume, +3dB { "Speaker Boost Volume" , 4 }, //2.0x boost, +6.0dB { "Speaker Mixer Volume" , 3 }, //SPK Mixer Volume 0dB { "Speaker Switch" , 1 }, //SPK OUTPUT PGA unmute { "DAC1 Volume" , 96 }, //DAC1 Volume, 0dB { "DAC1 Switch" , 1 }, //DAC1 Switch, unmute { "AIF1DAC1 Volume" , 96 }, //AIF1DAC1 Input Volume, 0dB { NULL , 0 } };

3G 语音分为两种,一种是模拟语音,一种是PCM数字语音,采用不同的语音数据,硬件电路是不同的。

模拟语音比较简单,可以直接把MIC,SPEAKER设备接到3G 模块,也可以把模拟输出接入到声卡设备,以便更精细的管理。如果采用PCM数字语音需要声卡设备或CPU 的PCM 接口支持 slave mode 。刚开始调试以为模拟音频比较简单就采用这种方式调试,但是调到后面发现音量调整是个问题,音频数据不经过CPU 无法控制音量。在分析了android 音频流程代码发现,android的音量调节是不涉及硬件的,完全是通过mixer 实现的。关于android音量调整可以参考该文章《android音量设置from top to bottom》:http://blog.csdn.net/kld2009/article/details/8865680,这位仁兄写的很详细。

既然如此想要调整音量必须要通过硬件调整3G 模块音量输出的大小,后来尝试了这种方法,不过发现效果不怎么好,在设置界面调整音量发现反应有点延迟,可能方法或代码的问题,就是在java调整音量的地方读写底层一个文件,底层根据文件的变化读写3G 模块寄存器调整音量。

在看AUDIO HAL层代码的时候发现三星调整音量不是通过上述两种方法,它是通过SECRILD库文件实现,如下:

openClientRILD = (HRilClient (*)(void))
dlsym(mSecRilLibHandle, "OpenClient_RILD");
disconnectRILD = (int (*)(HRilClient))
dlsym(mSecRilLibHandle, "Disconnect_RILD");
closeClientRILD = (int (*)(HRilClient))
dlsym(mSecRilLibHandle, "CloseClient_RILD");
isConnectedRILD = (int (*)(HRilClient))
dlsym(mSecRilLibHandle, "isConnected_RILD");
connectRILD = (int (*)(HRilClient))
dlsym(mSecRilLibHandle, "Connect_RILD");
setCallVolume = (int (*)(HRilClient, SoundType, int))
dlsym(mSecRilLibHandle, "SetCallVolume");
setCallAudioPath = (int (*)(HRilClient, AudioPath))
dlsym(mSecRilLibHandle, "SetCallAudioPath");
setCallClockSync = (int (*)(HRilClient, SoundClockCondition))
dlsym(mSecRilLibHandle, "SetCallClockSync");


通过调用这些设置调整3G 模块的语音设置,应该是通过AT命令实现的,但没有源码具体实现还不清楚。

--------------------------------未完待续--------------------------------------


更多相关文章

  1. Android来电铃声默认设置的实现方法与怎么设置语音来电的默认铃
  2. Android语音识别方法
  3. Android音量调节AudioManager
  4. Android(安卓)铃声和音量的获取程序
  5. Android(安卓)源码修改按键长按响应间隔
  6. 调整Android音量等级及默认音量
  7. Android: 系统默认音量
  8. android 布局xml中 android:fitsSystemWindows="true"的作用
  9. android调整checkbox的大小

随机推荐

  1. android 本地化和国际化
  2. android xml操作
  3. android列表为空时提示语
  4. Android逐帧动画的实现
  5. android 权限库,拿来就能用
  6. android检查sqlite数据库中是否存在某个
  7. android gmail send email
  8. Android关于图片处理,更改图片灰度
  9. 【转】android常用组件
  10. Android检测电源状态