三星平台 android audio 架构探讨点滴积累之一
来源:互联网 发布:网络架构师英语怎么说 编辑:程序博客网 时间:2024/05/01 18:48
android整体audio包括android层和底层ASLA驱动。
最近开始调3G 通话功能继而开始接触android 音频架构,之前调试声卡的时候也有过接触,不过那些都相对比较简单,基本上只需要修改audio path, 也就是修改audio_codec.h, 该文件定义了各种情况下的音频数据流程。其中有个结构体定义,如下:
typedef struct AudioMixer_tag {
const char *ctl;
const int val;
} AudioMixer;
具体定义格式如下:
3G 语音分为两种,一种是模拟语音,一种是PCM数字语音,采用不同的语音数据,硬件电路是不同的。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}};
模拟语音比较简单,可以直接把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命令实现的,但没有源码具体实现还不清楚。
--------------------------------未完待续--------------------------------------
- 三星平台 android audio 架构探讨点滴积累之一
- 三星平台 android audio 架构探讨点滴积累之二
- android 点滴积累
- Android开发点滴积累
- android点滴积累
- 转载Android Audio架构
- Android Audio架构
- Android Audio 架构分析
- 点滴积累
- 点滴积累
- 点滴积累
- 点滴积累
- 点滴积累
- 点滴积累
- android 开发错误点滴积累--Asset资源管理
- Android初学点滴积累(操作篇)
- Android初学点滴积累(操作篇)
- android audio整体架构分析
- 编写C#程序让其在Win7 下以管理员权限运行
- 大一结束
- cookie的添加与获取
- IP组播的简单例子
- struts实现零配置
- 三星平台 android audio 架构探讨点滴积累之一
- 上下文切换
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
- DG broker使用dgmgrl配置及start fast failover
- 开启otl的64位长整数支持
- 树(二)二叉树递归和非递归遍历
- 企业如何通过软件实施汽车配件管理
- java resteasy restful webservice教程(六):实现文件下载功能实例文章来源:爱上123 原文地址:http://www.ishang123.com/jishubowen/
- Hibernate Tools的使用