一个hdmi音频问题的debug

问题描述:

在用hdmi做输出时,播放音乐,声音一卡一卡的。

打开logcat可了看:

没次卡时都会打印像下面的log

W/audio_hw_primary( 2194): do_out_standby... 1074415168
I/OMXPlayer( 2194): Stop Player.
W/audio_hw_primary( 2194): card 0, port 0 device 0x2
W/audio_hw_primary( 2194): rate 44100, channel 2 period_size 0xc0

从log看是声卡被不断地切换。

那声卡为什么会切换呢? 根据android的特点,应该是检测到了别的比hdmi优先级更高的设备。怀疑是检测到了headphone插入(因为不可能检测到蓝牙 usb什么的)。

那检测到headphone有什么条件?看原理图:



默认是micbias1应该是高,没插入耳机是gpio6_1和micbias1是连在一起的,gpio6_1为高,当插入耳机时gpio6_1与micbias1分开,gpio6_1为低就检测到耳机插入。

现在耳机没有插入而检测到耳机,那只能是micbias1为低。用示波器量,micbias1会不断地高低高低的变化。


micbias1电源的开启:查看该audio芯片是specf,和两个寄存器有2个。最终发现会在下面函数关掉其中一个:

static int rt3261_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
{

....

case SND_SOC_BIAS_STANDBY:
snd_soc_update_bits(codec, RT3261_PWR_ANLG2,
RT3261_PWR_MB1 | RT3261_PWR_MB2, 0); //这里把micbias1的电源关掉了。

...

但为什么会进这里?

android启动时默认会打开primary的audio设备(本机为rt3261),但是如果没有声音输出会然设备进入standby模式。

在用hdmi做输出时,打开hdmi音频那rt3261就进入standby,关micbias1电源,系统误以为检测到headphone,切换到rt3261打开micbias1,以为headphone拔出,就再切换到hdmi。这样声音就一卡一卡的了。


你可能感兴趣的:(android,system)