【FAQ】全志V853芯片 如何解决开启启动时amixer控件的自动配置问题?
-
问题
客户tina-v853-perf1板开机后,使用aplay, arecord等工具播放或采集音频失败。或者app直接调用snd_pcm_open()打开pcm设备,
原因分析
没有配置amixer控件建立通路,比较关键的控件是“MIC1 Switch”,必须配置为1,以打开通路。
解决办法
在开机启动时自动配置好amixer控件,避免用户自己手动配置amixer控件。有几种方式可选。
- 在开机启动的脚本rc.final中,配置amixer控件。
amixer cset name='MIC1 Switch' 1
但是如果在编译固件时没有编译alsa-utils,那么固件中没有amixer,就不能使用这种方式了。
- 在alsa配置文件asound.conf中使用hooks插件。
tina-v853的perf1工程,asound.conf的路径是:target/allwinner/v853-perf1/busybox-init-base-files/etc/asound.conf。
pcm.CaptureMic { type hooks slave.pcm "hw:0,0" hooks.0 { type ctl_elems hook_args [ { name "MIC1 Switch" preserve true optional true value 1 } ] } }
如上代码,如果app打开的节点是pcm.CaptureMic,那么在asound.conf中定义它为hooks类型,然后把需要配置的amixer控件作为参数写进结构体中。这样在这个node被打开时,就调用一些hook函数,配置hooks里面指定的amixer控件。
关于hooks类型的插件的说明,可以参考 https://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html 的"Plugin: hooks"。
- 在代码中打开amixer控件并配置。
tina-v853-perf1使用的是这种方式,所以需初始化mpp平台后,amixer控件才被配置好。
for (elem = snd_mixer_first_elem(mixer->handle); elem; elem = snd_mixer_elem_next(elem)) { snd_mixer_selem_get_id(elem, sid); //snd_mixer_selem_set_playback_volume_range(elem, AUDIO_VOLUME_MIN, AUDIO_VOLUME_MAX); //snd_mixer_selem_set_capture_volume_range(elem, AUDIO_VOLUME_MIN, AUDIO_VOLUME_MAX); // open lineout and mic switch const char *elem_name = snd_mixer_selem_get_name(elem); alogv("alsa_elem:%s",elem_name); if ( !strcmp(elem_name, AUDIO_ADC_MIC1_SWITCH) ) { snd_mixer_selem_set_playback_switch(elem, 0, 1); } else if ( !strcmp(elem_name, AUDIO_ADC_MIC2_SWITCH) ) { snd_mixer_selem_set_playback_switch(elem, 0, 0);// disable mic2 by default } else if(!strcmp(elem_name, AUDIO_LINEIN_SWITCH)) { snd_mixer_selem_set_playback_switch(elem, 0, 0); } else if (!strcmp(elem_name, AUDIO_LINEOUT_VOL)) { // lineout volume. 0x1f~0x02 : 0dB~-43.5dB, 1.5dB/step. 27 : -6dB. // user had better not change this ctrls, nor will cause wave distort! long vol_val = 27; snd_mixer_selem_set_playback_volume(elem, 0, vol_val); alogd("set playback vol_val to value: %ld", vol_val); aoVolume = 100*vol_val/AUDIO_VOLUME_MAX; if (aiDevEnable) { aioDebugUpdataFlag |= aoVolumeFlag; } } else if (!strcmp(elem_name, AUDIO_LINEOUT_SWITCH)) { snd_mixer_selem_set_playback_switch(elem, 0, 1); } else if (!strcmp(elem_name, AUDIO_LINEOUT_MUX)) { snd_mixer_selem_set_enum_item(elem, 0, 1); // increase play volume when amplifier differential input } else if(!strcmp(elem_name, AUDIO_PA_SWITCH)){ snd_mixer_selem_set_playback_switch(elem, 0, 1); aoPALevel = 0; } }
-
-
-
-
-
-
-
-
-
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号