2021-09-13

MTK audio note -01

adb shell cat sys/devices/virtual/misc/mtgpio/pin 查看GPIO管脚信息
adb shell cat /sys/class/misc/mtgpio/pin 查看GPIO管脚信息
adb shell cat /proc/interrupts 查看中断信息
/sys/bus/cpu/devices 查看机器cpu 信息
打印kernel函数dump GPIO值:
int mt_set_gpio_mode(unsigned long pin, unsigned long mode)
{
if (mode >= GPIO_MODE_MAX) {
GPIOERR(“Parameter mode error: %d\n”, (int)mode);
return -ERINVAL;
}

if ((pin & 0xff) == GPIO24) {
printk(“mt_set_gpio_mode::pin = %lu , mode = %lu --------”,pin, mode);
dump_stack();
}
return MT_GPIO_OPS_SET(pin, set_mode, mode);
}

修改system/core/init/device.cpp加上一段代碼以創建/dev/snd
} else if(!strncmp(uevent->subsystem, “sound”, 5)) {
base = “/dev/snd/”;
make_dir(base, 0755);

EQ英文全称Equaliser,中文也就是均衡器的意思。它的基本作用是通过对声音某一个或多个频段进行增益或衰减,从而达到调整音色的目的。
EQ通常包括以下三个参数:Frequency,频率――这是用于设定你要进行调整的频率点的参数;Gain,增益――用于调整在你设定好的F值上进行增益或衰减的参数;Quantize――用于设定你要进行增益或衰减的频段“宽度”的参数。在这里,要注意是:当你设定的Q值越小的时候,你所处理的频段就越宽,而当你设定的Q值越大的时候,你所处理的频段就越窄。

pcm.c 操作的文件是pcmC%uD%u%c
主要使用Linux提供的open/close/ioctl/mmap
主要函数pcm_open/pcm_close/pcm_is_ready/pcm_read/pcm_write

mixer.c 操作的文件是controlC%
设置mixer control
主要函数mixer_ctl_set_enum_by_string mixer_ctl_set_value
像打开audio patch、设置pga音量都是都通过Control Interface

查看系统支持多少核数
root@NOBLEX:/ # cat sys/devices/system/cpu/present

手机放音乐时连接音箱, 将音箱音量调到最大时,音乐会自动暂停
原因是:HPL上信号过大导致EINT拉高产生了耳机拨出讯号,所以音乐会自动暂停掉

耳机accdet dts配置:
&accdet {
accdet-mic-vol = <7>;
headset-mode-setting = <0x500 0x500 1 0x3F0 0x800 0x800 0x200>;
accdet-plugout-debounce = <20>;
/1:ACC mode, 2:low cost without in bias, 6:low cost with in bias/
<0x500 0x500 1 0x3F0 0x800 0x800 0x200>这几个值分别表示的是什么?
struct headset_mode_settings {
int pwm_width; /pwm frequence/
int pwm_thresh; /pwm duty/
int fall_delay; /falling stable time/
int rise_delay; /rising stable time/
int debounce0; /hook switch or double check debounce/
int debounce1; /mic bias debounce/
int debounce3; /plug out debounce/
};

adb shell echo 8 8 8 8 > /proc/sys/kernel/printk //开启 kernel log的 printk 打印
CONFIG_LOG_BUF_SHIFT=19 //将这个宏变量改为19后,可以抓取从0秒 开始记录的kernel log,默认值是17

adb shell getprop |grep number 可以查看手机 烧写的软件版本
手机连接USB,pc端输入adb devices查询设备串号,三台机器的序列号都是一样的, 需要开启下面的这个宏
CONFIG_MTK_USB_UNIQUE_SERIAL=yes

e-fuse ROM里初始都是1,当且仅能一次把1改成0。可以这么理解ROM的数据只能写一次,通常用于保护关键数据,出厂时写入一次,以后每次都是读取
e-fuse 是烧写在 机器的CPU里,这样的话 能保证 手机不被其他 用户刷机
样机如果烧录了efuse则必须烧录签名版本,如果样机未烧录efuse,烧录版本是否签名无影响

有些手机因为结构原因没有把loopback plug dongle识别成mic耳机, 会导致 “Audio Loopback Latency Test”项测试结果值小于0.6,测试不通过。

frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
Android 6.0 上修改播放音乐从听筒发出
audio_devices_t AudioPolicyManager::getDeviceForStrategy(routing_strategy strategy,
bool fromCache, audio_output_flags_t flags)
{
audio_devices_t Device;
if(strategy == STRATEGY_MEDIA)
{
Device = AUDIO_DEVICE_OUT_EARPIECE;
ALOGD("getDeviceForStrategy() from AUDIO_DEVICE_OUT_EARPIECE ");
return Device;
}

编译后清除 之前的编译环境,便于下次重新编译
git checkout – .
git clean -xdf

从提供的register来看,异常时,AUDENC_ANA_CON0 = 0x583说明input选择的是耳机的,所以导致UL无声

kernel-3.10/drivers/misc/mediatek/gpio/mt6735/mt_gpio_debug.c//打印GPIO
static ssize_t mt_gpio_dump_regs(char *buf, ssize_t bufLen)
{}

vi out/target/product/xxx6753_65u_m0/obj/KERNEL_OBJ/arch/arm64/boot/dts/cust.dtsi
//查看编译后的 i2c配置情况

checkAndSetVolume() 函数却没有执行 也不会有音量变化的

在构造AudioTrack对象的时候,传入了CallbackWrapper作为audiotrack的callback
当audiotrack需要数据的时候,就会调用此函数
void MediaPlayerService::AudioOutput::CallbackWrapper()
audiotrack启动后就会周期性的调用 回调函数从解码器获取数据

AudioTrack中构造函数的参数
bufferSizeInBytes
这个是最难理解又最重要的一个参数,它配置的是 AudioTrack 内部的音频缓冲区的大小,该缓冲区的值不能低于一帧“音频帧”(Frame)的大小

D AudioALSADeviceConfigManager: ApplyDeviceTurnonSequenceByName() DeviceName = builtin_Mic_DualMic descriptor->DeviceStatusCounte = 6
descriptor->DeviceStatusCounte = 6这里有异常 mic不能正常打开

可以把双麦克风消噪强度降低提升speech quality

连接蓝牙耳机通话时,从蓝牙耳机切换到听筒
D/BTIF_HF_SERVER(20553): disconnect_audio
D/AudioALSASpeechPhoneCallController( 289): routing(), bt_device_on = 0, sample_rate = 16000

accdet_custom.c中
16 #if defined(CONFIG_AUDIO_SUPPORT)
17 static struct headset_mode_settings cust_headset_settings = {
18 0x500, 0x200, 1, 0x3f0, 0x800, 0x800, 0x200
19 };
20 #else
21 static struct headset_mode_settings cust_headset_settings = {
22 0x500, 0x500, 1, 0x3f0, 0x800, 0x800, 0x200
23 };
24 #endif

如果将第二项 0x500改成0x200 相当于将MIC 波形改成 PWM,如果第一项和第二项 相等 ,Micbias 一直为高
最后一项 0x200 代表耳机拔出时的 debounce 时间(去抖动),将其转为十进制 除以32768 即为真正的debounce 时间
其他项目的 debounce 时间是0x20

请在accdet.c文件中配置:
#define ACCDET_DEBOUNCE3_PLUG_OUT (0x20) //为了解决拔掉耳机后误报耳机按键消息
原来是#define ACCDET_DEBOUNCE3_PLUG_OUT (0x2030) / 30 msec */

按下 耳机按键,mic脚的电压波形 将会被拉低

耳机图标有显示 说明拔出耳机时 没有产生中断。
函数accdet_setup_eint() 都没有执行,那么accdet_setup_eint内部的中断申请函数request_irq() 肯定也不会执行
这时应关注 dws中 对于GPIO2对应的 EINT:ACCDET 配置是否有异常(配成了其他的GPIO6),需要重新适配 dws
同时需在mk文件中
定义CONFIG_ACCDET_EINT=yes ,CONFIG_ACCDET_EINT_IRQ=no
2021-09-13_第1张图片

当插入耳机按键时,首先是触发了EINT中断,然后再触发ACCDET中断,这2个中断都是PMIC函数中注册
的,属于PMIC端的中断

把耳机mic的mode改为ACC
audio_custom_exp.h 中
#define HEADSET_MIC_MODE (2)
改为
#define HEADSET_MIC_MODE (1)
在打开麦克风降噪的情况下,手机对非稳态噪音(比如使用者身边别人说话的声音)的消除增强,但是对远端的背景噪音消除能力会降低,并且会出现一定的底噪。这些都是MTK消噪算法的一些缺点,属于正常情况

播放出现卡顿时 //系统内存不足或者开启了串口log等影响了系统performance
01-01 08:03:08.428 E/AudioALSAPlaybackHandlerBase( 291): -getHardwareBufferInfo pcm_get_htimestamp fail, ret = -1, pcm_get_error = cannot start channel: Broken pipe

sound/soc/mediatek/mt_soc_audio_v3 目录下
mt_soc_pcm_routing.c AudDrv_Afe.c AudDrv_Ana.c mt_soc_pcm_fm_i2s.c mt_soc_pcm_routing.c

手机/system/etc/目录
audio_device.xml 音频通路切换
audio_effects.conf 音频效果文件
audio_policy.conf 音频配置

没带Smart PA的项目,如何在main log中查看 PA是否有open?
D/AudioALSADeviceConfigManager( 288): cltname = Ext_Speaker_Amp_Switch cltvalue = On
关闭播放时
D/AudioALSADeviceConfigManager( 288): cltname = Ext_Speaker_Amp_Switch cltvalue = Off

在mt6750平台上 调节 耳机,扬声器等音频器件的模拟增益
是AudioALSAGainController.cpp
如void AudioMTKGainController::SetSpeakerGain(int index) 函数 调节外放的模拟增益
void AudioMTKGainController::SetSpeakerGain(uint32_t index)
{
SetHeadPhoneLGain(index); //调节耳机通路上的那个gain
SetHeadPhoneRGain(index);
}

只要外部pa接在耳机声道上,调节增益时都需要调节耳机通路上的那个gain。SetSpeakerGain函数根本作用不到耳机通路,如果外部pa接在内部pa后面,才需要调用SetSpeakerGain函数

在老的 mt6735平台上调节 扬声器等音频器件的模拟增益是
AudioALSAVolumeController.cpp文件
如AudioALSAVolumeController::SetSpeakerGain

MBDRC 分频段的DRC
MTK_BESLOUDNESS_SUPPORT=yes 开启MBDRC
MBDRC(Multi-Band DRC)导致雷霆战机游戏卡顿的原因是:MBDRC运算量大,并且是track base,每个AudioTrack都要进行DRC处理。在雷霆战机游戏的过程中,最多有20多个AudioTrack同时处于active状态并进行MBDRC运算,有可能造成CPU loading过大的情况,导致卡顿

//是否插入耳机扬声器的来电铃声大小不一样
之前手机 来电响铃时 喇叭信号(没有插入耳机时)会进行DRC 处理,而插入耳机时,喇叭信号则不会进行DRC处理,所以插入耳机时 扬声器听起来音量小

D/AudioALSAHardware( 353): = SET_DUMP_AUDIO_DEBUG_INFO(1)
开启Audio pcm log时 点击“Dump Audio Debug Info”后

find * -iname “*.h” |xargs grep -inr “snd_card”
find ./ -name Android.mk -exec grep -l init {} ;
find external/ -name Android.mk -exec grep -l test_name {} ;

device/mediatek/common/audio_param Android6.0 及MT6755平台上音频参数位置

device/mediatek/k50v1_66_cxo_pre/ProjectConfig.mk
ProjectConfig.mk包含诸多版本信息,搜索BRANCH
MTK_BRANCH = alps-mp-m0.mp1 //基线地址

/kernel-3.10/drivers/misc/mediatek/i2c/mt6752/i2c.c
static S32 _i2c_deal_result(mt_i2c *i2c)
598 BUG_ON(data_size > i2c->msg_len); //BUG_ON即让 机器出现KE
上面这个 BUG_ON产生的KE,这个KE表示HW行为读出来的字节数不符合预期值

adb shell getevent -l 耳机按键上报
add device 7: /dev/input/event0
name: “ACCDET”

adb shell getevent |grep /dev/input/event1 查看音量 +/- 按键event
信息

log中看到在通话过程中进来的echo量相当大,导致经过AEC之后UL的语音信号被削得很小了,所以目前是建议您们将免提模式下面的MIC切换为负MIC进行通话。
请将Audio_Customization_Common.h中
#define USE_REFMIC_IN_LOUDSPK (1) //1表示免提打开refmic 免提通话用副麦
audio_custom_exp.h中 和AudioALSACaptureHandlerAEC.cpp中取消宏EXTCODEC_ECHO_REFERENCE_SUPPORT的定义,这样会将AEC参考信号改为MTK平台自带(而不用nxp(smartpa))
#ifndef CONFIG_BSP_AUDIO_SUPPORT
#define EXTCODEC_ECHO_REFERENCE_SUPPORT
#endif

手机灭屏后,关闭了LCD和TP,同时降低了CPU的工作频率,CPU降频后,进入低功耗工作模式,可能会改变播放线程的优先级,导致write audio data丢失,机器可能出现杂音卡顿

抓取数字寄存器reg的adb命令
adb shell cat /sys/kernel/debug/mtksocaudio > D:AFEreg.txt Digital register
抓取模拟寄存器reg的adb 命令
adb shell cat /sys/kernel/debug/mtksocanaaudio > D:PMICreg.txt Analog register

adb shell “echo Setafereg,regaddr,0x18,regvalue,0x9000100a > /sys/kernel/debug/mtksocaudio” //将bit0设为0即关闭i2s0
adb shell “echo Setafereg,regaddr,0x4c,regvalue,0x190a > /sys/kernel/debug/mtksocaudio”//将bit0设为0即关闭i2s3
adb shell “echo Setafereg,regaddr,0x4,regvalue,0x2 > /sys/kernel/debug/mtksocaudio” //soft reset lock
adb shell “echo Setafereg,regaddr,0x18,regvalue,0x9010100a > /sys/kernel/debug/mtksocaudio” //设置bit20 loopback
adb shell “echo Setafereg,regaddr,0x18,regvalue,0x9010100b > /sys/kernel/debug/mtksocaudio” //开启i2s0
adb shell “echo Setafereg,regaddr,0x4c,regvalue,0x190b > /sys/kernel/debug/mtksocaudio”//开启i2s3
adb shell “echo Setafereg,regaddr,0x4,regvalue,0x0 > /sys/kernel/debug/mtksocaudio” //normal unlock

在播放音乐过程中 反复多次插拔USB,可能会存在USB的数据流通过混用的地线串扰到音频接口上造成 播放杂音
可以使用adb命令 抓取Audio pcm log
audio_dump L版本adb命令
adb shell setprop af.track.pcm 1
adb shell setprop af.mixer.end.pcm 1
adb shell setprop af.mixer.pcm 1
adb shell setprop af.mixer.write.pcm 1
adb shell setprop streamout.pcm.dump 1
抓取reg的adb命令
adb shell cat /sys/kernel/debug/mtksocaudio > D:AFEreg
adb shell cat /sys/kernel/debug/mtksocanaaudio > D:PMICreg

当前的耳机模式下面的MIC 模拟增益值设置的是多少?我们从log中看到该值设置在172,所以看到UL的信号偏小,请帮忙将这个值设置在180然后再做相关的测试.
按照以下步驟調整 mic 音量
進入工模 (撥號畫面下輸入 ##3646633##) -> Hardware Testing -> Audio -> Headset Mode -> Type 選 Mic -> 將 Level 3 的 Value 設為 180

AudioFlinger.h中 static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3); 可以修改Standby 时间
standby是由AudioFlinger控制的,一旦满足以下条件后,没有AudioTrack处于活动状态并且已经到达了standbyTime这个时间就进入Standby模式。那么standbyTime=systemTime() + standbyDelay,也就是过了standbyDelay这段时间后,音频系统将进入待机,关闭音频设备
kDefaultStandbyTimeInNsecs 设置过短,导致播放短促音频时AudioTrack还处于活动状态,此刻已经到达了standbyTime这个时间就进入Standby模式,拨号盘会出现卡顿嘶哑的声音。

I AudioPolicyManager: loadAudioPolicyConfig() loaded /system/etc/audio_policy.conf
device/mediatek/k50v1_66_cxo_pre/audio_policy.conf
audio_policy.conf的配置根据底层Audio驱动注册信息来完成,配置好audio_policy.conf,上层便可打开audio_policy.conf中定义的虚拟设备,进而自动选择相应的音频通路。

D AudioALSAStreamManager: +routingOutputDevice(), output_devices: 0x2 => 0x20 //Device routing通路切换的关键词

从UL0到UL1会经过speech enhancement的处理
UL0是数字端能抓取的最接近mic的data,
如果UL0有问题,可能有2种情况:
1.mic hw问题导致送给PMIC的模拟信号就有问题,mic hw也有可能概率出问题;
2.PMIC的问题,这个需要通过register来检查是不是出问题时PMIC有异常;

android L DRC的开启如下:

  1. ProjectConfig.mk
    MTK_BESLOUDNESS_SUPPORT=yes //为yes表示开启了DRC

  2. alps\frameworks\av\services\audioflinger\Android.mk
    #ifeq ($(strip $(MTK_BESLOUDNESS_SUPPORT)),yes)
    LOCAL_CFLAGS += -DMTK_AUDIOMIXER_ENABLE_DRC //需要有这行
    #endif
    连接 AudioTools 工具 ,选择里面的 “DRC” 选项 ,进行读入 参数是否 有效果

  3. 在setting菜单里面的喇叭音量助推器是个动态开关,开了数据会经过DRC处理,关了DRC算法不做任何处理。

ToneGenerator: getToneForRegion, tone 0, region 2, regionTone 0 按下数字0

没有声音是因为没有audiotrack资源可用,需要apk同事帮忙check 上层是否存在没有及时release audiotrack资源的情形。
10-13 09:32:56.090 15238 15315 W AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client
10-13 09:32:56.091 293 293 E AudioMixer: AudioMixer::getTrackName out of available tracks
10-13 09:32:56.091 293 293 E AudioFlinger: no more track names available

tar czvf mediatek.tar.gz mediatek/ 压缩下

来电铃声流程正常,log中有多个进程因为lowmemory被杀,是否是系统内存问题导致的声音卡顿.
<6>[14290.078905]<0> (0)[69:kswapd0]lowmemorykiller: Killing ‘nee.anti.stolen’ (21398), adj 18, score_adj 1000
播放音乐卡顿问题,不仅仅是cpu性能问题,还有emmc的读写瓶颈问题

在下面方法中加上打印语句,这样只要提供复现问题时的mtklog就可以打印 Audio 寄存器信息。
mt_soc_pcm_dl1_i2s0Dl1.c
static int mtk_pcm_I2S0dl1_start(struct snd_pcm_substream *substream)
{
。。。。
Ana_Log_Print(); //在return 0前加上这2行打印寄存器code.
Afe_Log_Print();

return 0;
}

MIC的BIAS电压就是为MIC内部的JFET提供合适的直接偏置电压,麦克里面有个FET管,而这个电压正是为放大管提供偏置电压的.这样的话麦克才能工作

对于短音频,由于MediaTek的HW buffer size比较大,afLatency也会比较大,在AudioTrack中计算的shared buffer size比较大,因此会发生短音频播放不出来的情况。如果要减小HW buffer size,可以降低afLatency的值,减小shared buffer size,可以播放短音频。减小HW buffer size,会增大功耗。

AudioALSAStreamOut.cpp
#ifdef MTK_DYNAMIC_CHANGE_HAL_BUFFER_SIZE
#define LOW_POWER_HAL_BUFFER_SIZE (45056)
#define LOW_LATENCY_HAL_BUFFER_SIZE (8192) Qualcomm可能 才1000左右
#endif

Android平台 统一固定采样率为 SampleRate = 44100
还是要按照MTK的设计, 不要固定采样率.
音乐采样率切换的时候只要正确配置我们PA NXP的采样率就没问题

理论上 FM外放时 采样率为 44100,AudioALSAFMController.cpp中
pAudioALSASampleRateController->setPrimaryStreamOutSampleRate(44100);
如果在device/gionee/gionee6753_66c_m0/audio_policy.conf 将sampling_rates固定为48000
则AudioALSAFMController.cpp 也应该修改pAudioALSASampleRateController->setPrimaryStreamOutSampleRate(480000)
上层与底层的采样率 要保持一致,上层会询问 kernel是否支持44100 或者48000
66 outputs {
67 primary {
68 sampling_rates 48000

增加文件 dump audio pcm
FILE *tmpFd;
tmpFd = fopen("/data/srspre.pcm", “ab+” );
if ( tmpFd < 0 ) {
ALOGE(“No dump file”);
}
else{
fwrite(mMixBuffer, mixBufferSize, 1, tmpFd);
fclose(tmpFd);
}

Mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.c
iWriteReg()中最前面加上g_pstI2Cclient->timing,表示设置I2C的速度
如果不设置,为默认值100K ,比如想将I2C的speed设置为400K,可将g_pstI2Cclient->timing设置为400K
msg.timing = I2C_MASTER_CLOCK 调整i2c传输速率,搜索关键词timing
i2c速率从 100k 提升到 400 k除了软件修改外,也需要硬件 将上拉电阻进行修改,这是因为如果硬件上不做相应适配,会导致I2C 通讯不稳定,影响到划 手势

MTK Audio PCM 工具解析步骤
1.af_mixer_pcm.pcm请使用44.1khz,双声道,32bit播放;

2.af_track_pcm_0xaac6d588.pcm请使用44.1khz,双声道,16bit播放;

3.streamout.pcm.0.AudioALSAPlaybackHandlerNormal.pcm请使用附件"PCM2WAV_Tool.rar"的工具pcm_to_wav_44.1kHz_Q9p23_stereo.exe转成wav播放;
(具体转换方法是将streamout.pcm.0.AudioALSAPlaybackHandlerNormal.pcm直接拖至工具pcm_to_wav_44.1kHz_Q9p23_stereo.exe)

4.streamout.pcm.0.AudioALSAStreamOut.pcm 请使用附件"PCM2WAV_Tool.rar"的工具pcm_to_wav_44.1kHz_32bit_stereo.exe转成wav播放.
(具体转换方法是将streamout.pcm.0.AudioALSAStreamOut.pcm直接拖至工具pcm_to_wav_44.1kHz_32bit_stereo.exe)

D SpeechDriverLAD: SetUplinkMute(), mute_on = 1, old mUplinkMuteOn = 0 在打电话的时候上行mic被静音了

一帧大小=一个采样点字节数 * 声道数

DRC:动态范围控制 (Dynamic range control) 常用于音频输出的柔和压限
DRC(dynamic range compress)动态范围压缩。其作用相当于power limiter来保护负载不被烧坏。当输出的音频信号不是很大的时候,系统会按照原来的设定输出,但是当输出的音频信号过大的时候,为了保护喇叭DRC会将输出信号的幅度进行压缩将其限制在一个范围内。因为输出的音频信号过大会引起削峰,从而引起音频失真,并且损坏喇叭,所以需要有DRC的作用来将输出限制在一定的范围内。在信号很小的时候DRC是不会起作用的,只有当输出信号的功率超过了你设定的DRC门限的时候DRC才会工作。

插入三段耳机后自动关闭micbias,Open 宏ACCDET_LOW_POWER 就可以实现.
在accdet.c文件中有定义宏
#define MICBIAS_DISALBE_TIMER (6*HZ)
修改这个值就可以修改 自动关闭micbias的时间

ACCDET_LOW_POWER
当插入三段耳机6s后自动关闭micbias,达到省电的目的
但是插入四段式 耳机后 mic将无法工作,也无法响应音量+ - 按键

耳机MIC_BIAS1配置为高 mic_bias
修改accdet.c中:
pmic_pwrap_write(ACCDET_PWM_WIDTH, REGISTER_VALUE(cust_headset_settings->pwm_width));
pmic_pwrap_write(ACCDET_PWM_THRESH, REGISTER_VALUE(cust_headset_settings->pwm_thresh));
将pwm_width 和pwm_thresh 设置为相等。

手机插入耳机时有POP音
若复现pop的方法是连续插拔耳机的话,那出现pop音属于目前ACCDET+EINT的已知问题。因为在拔出耳机时,Earbias上10uF大电容上的电并不能快速放掉,若在较短时间内再插入耳机,当插入过程中的耳机左右声道碰到MIC Pin时,就会听到pop noise。对于此问题暂时还没有解法。

如果采用 Smart PA,FM外放 要走Smart PA,ProjectConfig.mk必须要配置成 数字信号
MTK_FM_TX_AUDIO = FM_DIGITAL_OUTPUT
MTK_FM_RX_AUDIO = FM_DIGITAL_INPUT

audio_device.xml中的配置可以在 AudioALSADeviceConfigManager.cpp 进行查看
MTK的 Audio设备加载配置文件 为/system/etc # vim audio_device.xml 有关通路配置都在此文件

音频参数中 CFG_AUDIO_File.h Audio Data Structure definition
#define VER1_AUD_VOLUME_SPH \ 代表不同场景
56,68,84,96,108,120,132,0,0,0,0,0,0,0,0,\ normal mode
44,56,68,80,92,104,116,0,0,0,0,0,0,0,0,\ headset mode
48,60,72,84,96,108,120,0,0,0,0,0,0,0,0,\ Loudspeaker mode
40,52,64,76,88,100,112,0,0,0,0,0,0,0,0 Headset_Loudspeaker mode
status_t AudioALSAVolumeController::initVolumeController()中设置音频参数
AudioMTKPolicyManager.cpp

mic增益 只能更改模拟增益,底层 传输音频数据 都是通过 DMA方式
D/AudioALSAVolumeController( 257): SetLSpeakerGain,DegradedBGain=5

出现无声时
复现问题后 请打开Audio pcm log
出现无声时
手机USB连接电脑 输入如下adb命令
adb shell cat /sys/kernel/debug/mtksocaudio > D:afe_reg.txt
adb shell cat /sys/kernel/debug/mtksocanaaudio > D:pmic_reg.txt

然后在03 04打tone音看有没有声音
adb shell “echo Setafereg,regaddr,0x000001f0,regvalue,0x2c9a19a1 >/sys/kernel/debug/mtksocaudio”
关闭tone音
adb shell “echo Setafereg,regaddr,0x1f0,regvalue,0xF0000000 >/sys/kernel/debug/mtksocaudio”

在I5 I6打tone音看有没有声音
adb shell “echo Setafereg,regaddr,0x000001f0,regvalue,0x349a19a1 >/sys/kernel/debug/mtksocaudio”
关闭tone音
adb shell “echo Setafereg,regaddr,0x1f0,regvalue,0xF0000000 >/sys/kernel/debug/mtksocaudio”

Android 7.0 打开Audio pcm log方法如下:
1. 拨号界面输入“*#446633#”,进入工程模式
2. 选择Hardware Testing --> Audio–>Audio Logger
3. 勾选 Output 和Input 以及下面的AudioMixer ,分别点击确定即可。
4. 保存的log会在/sdcard/mtklog/audio_dump/ 即后缀为.pcm的log

抓音频 VM log的时候,进入工模里面audio-》speech enhancement-》common parameter 中index0改成6,这样抓出来的通话log才是完整的
打开VMlog方法如下:
1、拨号界面输入“*#446633#”,进入工程模式
2、选择Hardware Testing --> Audio–>Specch Logger
3、点击Enable speech log 复选框 选择 “Normal -VM+EPL”
4、点击Dump Specch Debug info按钮,显示成功即可。
5、保存的log会在/sdcard/mtklog/audio_dump/vm_log 即后缀为.vm的log。

通过 VM log 抓取到 AEC的参考信号 方法如下:

  1. 通话前请开启双方机器的 mtk log
  2. *#446633# 进入工程模式-》Hardware Testing -> Audio -> Speech Logger
    勾选 Enable speech log,选择 Normal-VM+EPL,点击Dump Specch Debug info按钮 开启VM log
  3. *#446633# 进入工程模式-》Hardware Testing -> Audio ->Speech Enhancement
    最上面一项请选择common Parameter , 请将第一个选项:Index 0的值从0 改写成 7,并点击最下面的“Set” 按钮使设置生效
    以上三个步骤缺一不可,将双方通话机器进行上述设置,这样才能抓取到 AEC的参考信号

这里写自定义目录标题

  • 欢迎使用Markdown编辑器
    • 新的改变
    • 功能快捷键
    • 合理的创建标题,有助于目录的生成
    • 如何改变文本的样式
    • 插入链接与图片
    • 如何插入一段漂亮的代码片
    • 生成一个适合你的列表
    • 创建一个表格
      • 设定内容居中、居左、居右
      • SmartyPants
    • 创建一个自定义列表
    • 如何创建一个注脚
    • 注释也是必不可少的
    • KaTeX数学公式
    • 新的甘特图功能,丰富你的文章
    • UML 图表
    • FLowchart流程图
    • 导出与导入
      • 导出
      • 导入

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

你可能感兴趣的:(Android,Audio,linux)