暗无天日

=============>DarkSun的个人博客

OrangePiPC2升级Armbian后无法发声的解决方案

症状

某一次在对OrangePiPC2进行系统升级后,提示内核已更新,需要进行重启。

然而在重启后发现播放音乐不再有声音了。

排查过程

  1. 怀疑是不是音量被调成0了,因此运行 alsamixer,发现提示 This sound device does not have any controls.

    screenshot-01.png

  2. 注意到现在这张声卡是hdmi的,按下 F6 选择其他声卡,可以发现还有一张 H3 Audio Codec 声卡

    screenshot-02.png

  3. 而选择 H3 Audio Codec 声卡可以看到熟悉的音量控制界面

    screenshot-03.png

  4. 大致可以推测出,由于我的音响是接到 H3 Audio Codec 上的,而alsa默认声卡变成了 hdmi 从而导致了播放音乐没有声音
  5. 将ALSA默认声卡修改为 H3 Audio Codec, 步骤为:

    查看声卡极其对应的编号

    cat /proc/asound/cards
    echo 或者
    aplay -l | awk -F \: '/,/{print $2}' | awk '{print $1}' | uniq
    
     0 [allwinnerhdmi  ]: allwinner_hdmi - allwinner,hdmi
                          allwinner,hdmi
     1 [Codec          ]: H3_Audio_Codec - H3 Audio Codec
                          H3 Audio Codec
    或者
    allwinnerhdmi
    Codec
    

    可以看到我想要的默认声卡名为 Codec,其编号为1,那么创建文件 /etc/asound.conf 填入下面内容

    pcm.!default {
        type hw
        card 1
    }
    
    ctl.!default {
        type hw           
        card 1
    }
    

    其中的 1 就是声卡对应的编号

  6. 再次播放音乐,就可以正常发声了。

另一种解决方法

其实还有另一种解决方法就是控制声卡module的载入顺序,让 H3 Audio Codec 声卡成为第一顺位的声卡就行了. 方法如下:

  1. 查看加载的声卡驱动

    lsmod |grep snd
    
    snd_soc_hdmi_codec     16384  1
    snd_soc_simple_card    16384  0
    snd_soc_simple_card_utils    16384  1 snd_soc_simple_card
    snd_soc_core          155648  6 sun4i_i2s,sun8i_codec_analog,snd_soc_hdmi_codec,sun4i_codec,snd_soc_simple_card_utils,snd_soc_simple_card
    snd_pcm_dmaengine      16384  1 snd_soc_core
    snd_pcm               106496  4 sun4i_i2s,snd_soc_hdmi_codec,snd_soc_core,snd_pcm_dmaengine
    snd_timer              32768  1 snd_pcm
    

    你会发现查出来了好多module,但只有两个module是不被别人引用的: snd_soc_hdmi_codecsnd_soc_simple_card.

    可以推测出 snd_soc_hdmi_codec 对应的是 hdmi 声卡, snd_soc_simple_card 对应的是 H3 Audio Codec 声卡

  2. 创建 /etc/modprobe.d/alsa-base.conf 文件,填入下面内容

    options snd_soc_hdmi_codec index=-1
    options snd_soc_simple_card index=-2