Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【FAQ】全志V853芯片 如何解决开启启动时amixer控件的自动配置问题?

    其它全志芯片讨论区
    v853 faq 技术支持
    1
    1
    250
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 8 last edited by

      问题

      客户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;
          }
      }
      
      1 Reply Last reply Reply Quote Share 0
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2022 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策