常用工具:QPST, QACT, QDV
步骤:
0,手机拨打电话*cctpad#,调试模式,打开调试口;另外在设置中确认usb debug打开(默认是打开的)。
1,打开QPST configuration,连接service;
2,打开QDV,setup->hardware, map rptfile, 选择当前项目的vajra.rpt;
菜单,new text window,右键,edit subscription,选择name,选择一个需要监视的属性(电话说话的音量、录音机录入的音量是TX,电话听筒音量、录音机播放的音量是RX——这里的R和T均是从使用者的角度出发,而非机器)
3,使机器 【通过你想调试的方式】 播放/录入 声音。观察监视值的变化。
4,到voccal_M4000E.c中搜索该值,定位到某(几)个值。
重复上述步骤,在第4部中逐渐锁定某个值,然后可以对其修改了。
使用工具QACT2.0(qualcomm audio calibration tool), 打开multimedia M4000\audio\audiocal\data\audio_cal.xml进行调试,音量大小在选项Gains中。
注意,数据修改之后立刻被写入手机(左下角出现data set to target successfully),但此时声音并不会立刻改变,需要在手机上切换一下发声模式,再换回来,才能看到效果,比如:手机正在外放音乐,此时修改了SND_DEVICE_HFK,这时声音不会立刻变化;此时可以先切换到电话,使用听筒,然后再外放音乐,这时就可以听到变化。
再例如,
1、使用3502WG样机进行耳机通话时听到背景音,修改:AGC FILTER -> VOC_SERVICE_UMTS & SND_DEVICE_HEADSET -> rx_agc_exp_thres(对应voccal_M3502WGICS.c中的3512行,voc_pcm_on_chip_1_cal_umts下的【#nodefined TFFA】编译开关下的agc_param数组第三项),从0x780增加为0x1100
注意第二级第一项应选择VOC_SERVICE_UMTS,若选了VOC_SERVICE_CDMA则修改后无反应。
2、使用3502WG样机进行耳机通话,听对方的声音太大声,修改:Gains -> VOC_SERVICE_UMTS & SND_DEVICE_HEADSET -> codec_rx_gain(对应voccal_M3502WGICS.c中的3417行,voc_pcm_on_chip_1_cal_umts下的【#nodefined TFFA】编译开关下的codec_rx_gain) 从0x7f62 减为0x3000.
3、使用3502WG样机进行耳机通话,对方能听到他自己的回音,修改Enhanced Echo Canceller -> VOC_SERVICE_UMTS & SND_DEVICE_HEADSET & SND_METHOD_VOICE & VOC_EC_HEADSET -> ec_params[1] -> instance1 -> DENS_NL_atten(对应.C中的367行,voc_cal_adv_ec_params_headset数组下的DENS_NL_atten), 200增加为600。
4、使用3502WG样机进行免提通话,听对方声音,断断续续。修改AGC_FILTER -> VOC_SERVICE_UMTS & SND_DEVICE_SPEAKER_PHONE & SND_METHOD_VOICE -> agc_param -> rx_agc_compr_thres(对应.C中第5254行,voc_pcm_on_chip_speaker_cal_umts数组下的【#nodefined T_FFA】编译开关下的agc_param,数组第五项)。0x1b0c 改为 0x0780.这个改动是不对的,因为rx_agc_compr_thres的减小会大大减小免提时听到对方的声音。应该将rx_agc_exp_thres降低。
5、分别使用3502WG样机进行免提和听筒通话,对方听到己方的声音较小声。
听筒:修改Gains -> VOC_SERVICE_UMTS & SND_DEVICE_HANDSET & SND_METHOD_VOICE -> codec_tx_gain(对应代码在1363行,数组voc_pcm_on_chip_0_cal_umts_qrd下的codec_tx_gain)。0x4000 改为 0x5000。
免提:修改Gains -> VOC_SERVICE_UMTS & SND_DEVICE_SPEAKER_PHONE & SND_METHOD_VOICE -> codec_tx_gain(对应代码在5158行,voc_pcm_on_chip_speaker_cal_umts下,编译开关no T_FFA下的codec_tx_gain) 。0x3ff0改为0x5000。
-------------------------------------------------------------
5月14日,针对上述修改后出现的问题再次修改
1、耳机仍有背景音,且己方和对方都听得到,3511行3512行,rx 1100 -> 1500, tx 780 -> 1500
2、免提通话听对方声音断断续续,上次改错了地方,导致免提听对方声音变小,5252行,compr_thres 0x780 改回 0x1b0c ,exp_thres 4000 -> 1500
3、免提,对方和己方听到的声音仍稍小声,5158行,dtmf_tx_gain 1000 ->4000; rx 3000 -> 4000
4、听筒通话,明显回音,326行,(EC type:ESEC) NL 200 -> 600
5、免提回音,449行,NL 200 -> 600
6、after all,三种模式的:
底噪音消除:(3511行-headset,5253行-speaker,1459行-handset)除了hand rx 1600,其它都是1500;注意第一行第三项才是rx,第二行第三项是tx的,即消除对方听到的底噪音
回音消除:(speaker 449行, handset 326行, headset 367行)DENS_NL_atten:600.
音量:handset-1363行:
0x4000, /* tx_gain */
0x1000, /* dtmf_tx_gain */
0x5000, /* codec_tx_gain */
0x4000, /* codec_rx_gain */
0x0515, /* codec_st_gain */
headset-3417行:
(voc_pcm_on_chip_1_cal_umts)
0x8f47, /* tx_gain */
0x1000, /* dtmf_tx_gain */
0x656e, /* codec_tx_gain */
0x3000, /* codec_rx_gain */
0x0, /* codec_st_gain */
speaker-5158行:
0xbc51, /* tx_gain */
0x4000, /* dtmf_tx_gain */
0x5000, /* codec_tx_gain */
0x4000, /* codec_rx_gain */
0x0000, /* codec_st_gain */
即 voc_pcm_on_chip_speaker_cal_umts{ ... else ...
蓝牙耳机-7215行:
VOC_EC_VER_ECNS, /* ec_version */
VOC_EC_BT, /* ec_mode */
VOC_NS_ON, /* ns_enable */
0x4000, /* tx_gain */
0x1000, /* dtmf_tx_gain */
0x4000, /* codec_tx_gain */
0x4000, /* codec_rx_gain */
0x0000, /* codec_st_gain */
修改之后保存,这将修改被打开的.XML文件,比较前后的文件,发现voc_pcm_on_chip_0_cal_cdma标签下的几个子标签被修改,于是定位到voccal_M4000E.c中的voc_pcm_on_chip_0_cal_cdma标签,在该源文件用全字搜索即可。然后修改该标签下的配置值。
--------------------------------------------------------
android2.3升级为android4.0,音频参数调试(以M3502WG为例)
参考代码:android2.3(chocolate)上的multimedia/audio/audiocal/sku3/voccal_sku3_H3501.c
目标代码:android4.0(milk)上的multimedia/audio/vocoder/src/voccal_M3502WGICS.c
下面是需要修改的结构:
voc_cal_adv_ec_params_handset
voc_cal_adv_ec_params_headset
voc_cal_adv_ec_params_speaker
voc_pcm_on_chip_0_cal_umts_qrd
voc_pcm_on_chip_1_cal_umts_qrd
voc_pcm_on_chip_speaker_cal_umts_qrd
另外,移植的时候注意/* agc_param */在2.3版本中有17个数组元素,在4.0中只有14个,省略掉了前三个,所以拷贝过来的时候要删掉前三个。
-------------------------------------------------
有时,在步骤4中,搜索到的值多达上百个,这样很难定位。我的解决办法是写一个perl脚本,用1~n个自然数逐个替换这些数值相等的变量,然后烧进手机,再查看我需要调试的那个值变为多少,现在这个值在代码中是唯一的,于是可以准确定位到代码中的某个变量。用这种方法,1次烧写就可以准确定位在代码中有无数相同值的变量。
使用递增正整数逐个替换某关键字的perl脚本如下:
#!/usr/bin/env perl
# program: find specific text in a file, and replace the key number with incremental number from 1.
# Specially, if one line contains more than one key number, they will be replaced with a same number.
# Made by: Daiyyr
# date: 2013/05/13
use 5.10.1;
use strict;
use warnings;
use POSIX qw(strftime);
my $key;
my $fname;
sub replace{
my $count = 1;
my $changed = 0;
open(FILE, "+<$fname") || die("open file failed: $fname\n");
while(my $line=<FILE>){
while($line =~ s/$key/$count/ && $key != $count){ #这里不能用if,因为一行中若存在多个key,语句s//只会替换第一个key
$changed = 1;
}
if($key == $count){
$changed = 1;
}
if($changed){
print DEST $line;
$count++;
}
else{
print DEST $line;
}
$changed = 0;
}
close(FILE) || die("close file failed: $fname\n");
}
print "input your file name:\n";
$fname = <STDIN>;
chomp($fname);
print "input your key word number:\n";
$key = <STDIN>;
chomp($key);
open(DEST, ">${fname}_changed") || die("open file failed: ${fname}_changed\n");
&replace();
close(DEST) || die("close file failed: ${fname}_changed\n");