在使用树莓派作为专用数播设备之前,我常用PC上的HQPlayer、Mac上的Audirvana两个音乐播放器,通过USB接DAC解码播放。HQPlayer的声音非常清澈透亮,让人有一种一见钟情、相见恨晚的感觉,而Audirvana的功能更强一些,单纯从重播效果来说,个人认为二者不能不说是Windows、MacOS下最佳的音乐播放软件了。另外,Windows下还有一个非常小众的音乐播放软件叫做Bughead,日本人开发的,重播效果也非常非常棒,但就是操作界面有点难懂,后面有机会给大家分享吧。

      采用树莓派专用音乐播放的主要原因是:PC、MAC还要同时运行各种网络、办公类的应用软件,运行软件多、高速BT下载或进行大IO操作时,一定会对相关音乐播放进程产生影响,特别是播放SACD、高码率文件或启用高码率重采用功能时,偶尔产生的断续严重影响体验,而树莓派专用音乐播放设备是非常纯净的Linux系统,它只负责数字音频文件的读取、播放这个唯一的任务,没有其他干扰,稳定可信且重播效果也非常优秀。

      通常,我在烧制一个新的MoOde系统后(其他如Archphile播放系统也是如此),第一件事就是对其Linux系统做一些优化。下面就给大家介绍一个Github上非常好用的优化脚本。

      硬件:树莓派3B

      系统:MoOde 6.4。其底层OS采用了树莓派官方的Raspbian 10.1。MoOde最新版本为7.0,重采样率最高已经达到32bit/768kbps,也许是心理作用,从个人听感来说,老版本感觉更加清澈,新版本高重采样率听起来反而有些混浊无力。

pi@192.168.0.183's password: 
Kernel 4.19.71-rt24-v8_191114r3 #1, Raspbian 10.1, moOde 6.4.0 2019-11-24
                          ____     __   
              __ _  ___  / __ \___/ /__ 
             /  ' \/ _ \/ /_/ / _  / -_)
            /_/_/_/\___/\____/\_,_/\__/ 
                                          
                 moOde audio player 
                (C) 2014 Tim Curtis


      我们先看一下/boot/cmdline.txt文件中isolcpus参数的设置(linux内核参数isolcpus的作用是隔离一定数量的CPU,使其独立于内核的平衡调度算法,也就是内核本身不会将进程分配到被隔离的CPU上运行,之后用户可将指定的进程绑定到被隔离的CPU上运行,让进程独占CPU,使其实时性得到一定程度的提高)。树莓派3B是4核CPU,编号为0、1、2、3,该文件中的『isolcpus=2,3』说明已将2、3号CPU预留给了应用进程使用。记下这个设置,因为将要介绍的这个优化脚本中的一个指令与此有冲突,需要更新,否则系统启动将挂死。

pi@moode:/boot$ more cmdline.txt 
root=/dev/mmcblk0p2 rootfstype=ext4 fsck.repair=yes rootwait dwc_otg.dma_enable=1 dwc_otg.fiq_enable=1 dwc_otg.fiq_fix_enable=1 dwc_otg.fiq_fsm
_enable=1 dwc_otg.fiq_fsm_mask=0xf dwc_otg.lpm_enable=0 dwc_otg.fiq_fsm_mask=0x3 dwc_otg.nak_holdoff=1 net.ifnames=0 audit=0 selinux=0 isolcpus
=2,3 processor.max_cstate=0 panic=10 irqaffinity=0-1 idle=poll nohz_full=2,3 rcu_nocbs=2,3 rcu_nocb_poll


      Github上该优化脚本的项目名称:Arch-LInux-Audio-RPi

      第一步:从GitHub上克隆项目源代码到默认用户pi的个人目录下,进入Arch-Linux-Audio-RPi/目录查看一下相关文件,其中,basic-install.sh是安装脚本,remove.sh是移除脚本,核心优化脚本是Sound.sh,sound.service用于将Sound.sh安装为系统服务,在每次系统启动阶段自动运行Sound.sh脚本进行优化。

pi@moode:~$ git clone https://github.com/dynobot/Arch-Linux-Audio-RPi.git
Cloning into 'Arch-Linux-Audio-RPi'...
remote: Enumerating objects: 156, done.
remote: Counting objects: 100% (156/156), done.
remote: Compressing objects: 100% (153/153), done.
remote: Total 668 (delta 85), reused 0 (delta 0), pack-reused 512
Receiving objects: 100% (668/668), 259.34 KiB | 21.00 KiB/s, done.
Resolving deltas: 100% (386/386), done.
pi@moode:~$ cd Arch-Linux-Audio-RPi/
pi@moode:~/Arch-Linux-Audio-RPi$ ls
basic-install.sh  _config.yml  images  limits.conf  README.md  remove.sh  
sound.service  Sound.sh  sysctl.conf


      第二步:对basic-install.sh、Sound.sh两个脚本进行一下简单修改。

      1、对于Sound.sh脚本修改。取消下面代码块第12、13行的注释。第12行,用于提升mpd(Linux下的Music Player Daemon服务)进程的实时进程优先级(chrt是用来操纵进程的实时属性,0-99范围内为实时进程,也叫做实时进程优先级,而100-139内是非实时进程)。该优化改善效果将非常明显,丝毫没有留滞感,就好像卡座按下Play键就能立即播放一样,但在播放高码率文件时,WEB播放器界面操作流畅度偶尔会产生一些影响。第13行,原指令是指定1号CPU处理mpd进程,这就和cmdline.txt中CPU隔离参数设置不一致了,应改为2。

pi@moode:~/Arch-Linux-Audio-RPi$ more Sound.sh

#!/bin/bash

#Reduce Audio thread latency
chrt -f -p 54 $(pgrep ksoftirqd/0)
chrt -f -p 54 $(pgrep ksoftirqd/1)
chrt -f -p 54 $(pgrep ksoftirqd/2)
chrt -f -p 54 $(pgrep ksoftirqd/3)

#Uncomment for MPD Affinity and Priority
chrt -f -p 81 $(pidof mpd) //修改取消注释
taskset -c -p 2 $(pidof mpd) //-p 1 修改为 -p 2

#SPDIF HAT and WiFi users Uncomment to turn off power to [Ethernet and USB] ports
#echo 0x0 > /sys/devices/platform/soc/3f980000.usb/buspower

#Tuning Kernel I/O schedulers
echo bfq > /sys/block/mmcblk0/queue/scheduler
echo 1 > /sys/block/mmcblk0/queue/iosched/low_latency

#Reduce operating system latency
echo 1000000 > /proc/sys/kernel/sched_latency_ns
echo 100000 > /proc/sys/kernel/sched_min_granularity_ns
echo 25000 > /proc/sys/kernel/sched_wakeup_granularity_ns

exit

      
      2、对于basic-install.sh的修改。见下面代码块的14、34行,原始代码是用wget指令从Github联网下载相关脚本,因为之前相关文件我们都已经克隆到本地目录,这里改为cp拷贝指令即可,而联机远程下载时还很可能报错。

pi@moode:~/Arch-Linux-Audio-RPi$ vi basic-install.sh 
#!/bin/bash

border()
{
    local title="| $1 |"
    local edge=${title//?/-}
    echo -e "${edge}\e[34m\n${title}\n${edge}"
    sleep 3
}

border 'Downloading Sound File'
sleep 1
cp Sound.sh -O /usr/bin/Sound.sh // 修改
chmod 755 /usr/bin/Sound.sh

border 'Increasing Sound Group Priority'
sleep 1
[[ -f /etc/security/limits.conf ]] && mv /etc/security/limits.conf /etc/security/limits.conf.bak
echo '#New Limits' > /etc/security/limits.conf
echo '@audio - rtprio 99' >> /etc/security/limits.conf
echo '@audio - memlock 512000' >> /etc/security/limits.conf
echo '@audio - nice -20' >> /etc/security/limits.conf

border 'Improving Network Latency'
sleep 1
echo "#New Network Latency" > /etc/sysctl.d/network-latency.conf
echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.d/network-latency.conf
echo 'net.core.wmem_max = 16777216' >> /etc/sysctl.d/network-latency.conf


border 'Creating System Service'
sleep 1
cp sound.service -O /etc/systemd/system/sound.service //修改
systemctl enable sound.service

border 'Cleaning Up'
sleep 3
#rm basic-install.sh //注释此行,保留安装文件
border 'Rebooting System Enjoy the Music'
sleep 3

reboot


      第三步:执行安装脚本,执行完成后MoOde系统将完成重启。

pi@moode:~/Arch-Linux-Audio-RPi$ chmod 755 basic-install.sh 
pi@moode:~/Arch-Linux-Audio-RPi$ ./basic-install.sh 


      效果验证

      1、重启后查看/etc/security/limits.conf文件,相关优化参数已经添加。

pi@moode:~/Arch-Linux-Audio-RPi$ more /etc/security/limits.conf
#New Limits
@audio - rtprio 99
@audio - memlock 512000
@audio - nice -20


      2、通过MoOde WEB播放器界面播放音乐后,登录系统,用top指令查看mpd进程的实时调度优先级已是最高,且独占2号CPU。

top - 00:56:00 up  1:12,  1 user,  load average: 1.96, 1.97, 1.97
Tasks: 152 total,   1 running, 151 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  2.5 sy,  0.0 ni, 97.0 id,  0.0 wa,  0.0 hi,  0.5 si,  0.0 st
%Cpu1  :  0.0 us,  2.7 sy,  0.0 ni, 97.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 64.6 us,  2.4 sy,  0.0 ni, 33.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  3.0 us,  0.0 sy,  0.0 ni, 97.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem : 31.2/970.0    [||||||||||||||||||||||||||||||||                                                                    ]
MiB Swap:  0.0/0.0      [                                                                                                    ]

  PID USER      PR  NI    VIRT    SHR    RES S nTH  %CPU P  %MEM     TIME+ COMMAND                                                            
  808 mpd      -71 -20  519.7m  21.9m  37.2m S   7  69.6 2   3.8  49:00.37 mpd                                                                
   78 root     -51   0    0.0m   0.0m   0.0m S   1   9.8 1   0.0   6:52.75 irq/41-dwc_otg_                                                    
 8963 pi        20   0   20.6m   2.8m   3.4m R   1   1.5 0   0.4   0:00.17 top                                                                
   11 root      -2   0    0.0m   0.0m   0.0m S   1   0.5 0   0.0   0:18.64 ktimersoftd/0  

 

      Arch-Linux-Audio链接:https://github.com/dynobot/Arch-Linux-Audio-RPi