Raspberry Pi + Rune Audio ::: Một trải nghiệm nghe nhạc mới

linh0983

Well-Known Member
BirdgePi : 2 input và 1 output

ReciverPi : 4 input và 1 output


So sánh giữa ReciverPi và BirdgePi , ReciverPi ngon hơn mình chơi DSD256 bình thường qua i2s lvds bác Minh a . ReciverPi có chức năng set ưu tiên input auto vẫn xịn hơn BirdgePi . o_O

Cvvwfa.jpg


Chỉ phiền là chế cho nó mạch (màu trắng) chuyển input i2s lvds dùng cho Amanero (hoặc Xmos) như trên a . Mấy đường ống đồng bác Minh cho tuyệt vời hihi . :oops:
 
Chỉnh sửa lần cuối:

Thanhvo31

Well-Known Member
RoPieeeXL Pi 4 - ropi4.local
https://drive.google.com/file/d/1RSAWN4Jc4r4zk0o90UD8lhUlYccqBGMb/view?usp=sharing
- Tích hợp MinimServer
- Tích hợp mount 28k track (Cloud)
- Tích hơp Linux-Audio-Adjustments

----MinimServer đã scan-----------
Folder: /mnt/MUSIC/SELECTED
Cài MinimWatch vào Windows/MAC để add thêm các folder chứa nhạc sau, các bác add hết scan liên tục tầm 18h, add ít scan cho nhanh.
Chỉ muốn scan NAS local thì không cần add vô MinimWatch.
Lưu ý: add thêm folder vào, MinimWatch bấm ReStart để update, không bấm Rescan.

--- chưa scan--------------------
/mnt/MUSIC/DEEZER1
/mnt/MUSIC/DEEZER2
/mnt/MUSIC/DEEZER3
/mnt/MUSIC/TIDAL1
/mnt/MUSIC/TIDAL2
/mnt/MUSIC/TIDAL3

MinimServer lấy nhạc từ Cloud truyền đến RoPi, 2 trong 1 thiết bị, phone dùng BubbleUPnP điều khiển play, tắt wifi phone nó vẫn play hết list tiếp. Chạy nhẹ nhàng, CPU là 46 độ.


RoPieeeXL Pi 3 - ropi.local

https://drive.google.com/file/d/1W_Rt5EXUtM----MsctV9odiR5Bo4Bqku/view?usp=sharing

- MinimServer đã scan mớ folder trên
- Mình không nhớ scan xong chưa, nếu chưa xong thì icon MinimWatch sẽ hiện màu vàng, khi nào chuyển sang xanh các thiết bị khác mới nhìn thấy/play được.

Mong bản Pi4 của bác mãi.
Giờ Roon Core bị toi, có cách nào gỡ Roon bridge trên RopieeXL đi không nhỉ? Hôm trước mình cài đè Roon Bridge từ Roonlab vào rồi gỡ đi mà nó corrupt luôn, không kết nối được nữa
 

toi511

Well-Known Member
BirdgePi : 2 input và 1 ouput

ReciverPi : 4 input và 1 output


So sánh giữa ReciverPi và BirdgePi , ReciverPi ngon hơn mình chơi DSD256 bình thường qua i2s lvds bác Minh a . ReciverPi có chức năng set ưu tiên input auto vẫn xịn hơn BirdgePi . o_O

Cvvwfa.jpg


Chỉ phiền là chế cho nó mạch (màu trắng) chuyển input i2s lvsd dùng cho Amanero (hoặc Xmos) như trên a . Mấy đường ống đồng bác Minh cho tuyệt vời hihi . :oops:
Bridge bán rồi hả bác.
 

linh0983

Well-Known Member
BridgePi bán rồi hả bác.
Nó còn chưa sản xuất bác ơi . BridgePi chỉ là cái adapter chuyển dùng cổng usb (Amanero hoặc Xmos) thôi bác a . Nếu dùng Pi để chơi DSD lúc đó ko chọn output là i2s dac hat mà chọn usb output của Pi . Mình ko chơi DSD từ usb của Pi mà chơi từ PCmini qua Amanero vào ReciverPi + FifoPi + TransportPi . Tóm lại BridgePi là một phần của ReciverPi a . :rolleyes:
 
Chỉnh sửa lần cuối:

mtminh

Well-Known Member
Bác Phước ơi. Sáng nay siêng lướt qua forum IAN mới thấy có vài vấn đề:
Ian gây hiểu nhầm DSD/PCM ở ngõ HDMI lvds :confused: :mad:

Thường HDMI lvds dù chuẩn A hay B, phải có đường Auto ở Pin 15 high (DSD) hay low (PCM).
Mình nhầm là có sẵn. DDC Singxer SU làm rất tốt, đầy đủ.

Ian không công bố rõ ràng. FifoPi, FifoQ2, HDMI Pi và TransportPi, dù bán ra đã lâu.
Không lập trình, thiết kế có đường auto switch này.

Chip ESS có block nhận biết tín hiệu DoP là DSD, chip AKM mù tịt. Dù đã mở DoP decoder cho FifoPi.

Ngày 15/06/2020, Ian mới hé lộ có để dành pin: J9 của TransportPi và J8 của HDMIPi transmitter, nối với pin 15 HDMI lvds.
---
Bo DDC Amanero hay Xmox của bác. có cung cấp level cho SW DSD/PCM. Nhưng J8, và J9 nằm clean side đã cách ly, không dùng được. Nên phải đưa thủ công 3.3v sạch vào 2 chân này

Bản FifoPi Q3 mới cung cấp đường auto switch DSD/PCM đã được cách ly này, để nối vào J8, J9.

Theo mình BridgePi + Amanero không giải quyết được nếu dùng HDMI lvds out put. Vì nó không nằm clean side. Lại tiếp tục dùng công tắc cung cấp 3.3v sạch cho J8,J9.
------------------------------
--- Chế độ native DSD để play được DSD 128 và cao hơn mà không dùng bo amaner, xmos làm cầu nối trung gian. Xuất qua cổng HDMI lvds out

1. OS thì volumio và moode vì không dùng ,không biết đã patch lên 384Khz chưa.
Vì đặc tính OS, nên muốn có I2S native DSD, mượn drive sound card Audiophonics I-Sabre ES9028Q2M hay hifiberry DAC+ Pro ... (theo forum)

2. Dùng Rune OS, bản Janui 05 hay 06. Chắc chắn đã patch chạy được 384Khz
Cho chọn DSD native, không cần mượn driver sound card khác. Lý thuyết có thể lên đến DSD256 (88.2 x 4=352.8Khz)

3. Bo FifoPi không convert ra DoP và đèn Blue DSD trên FifoPi sáng

4. Cung cấp 3.3v sạch cho J8, J9. Để chip giải mã ESS, AKM nhận biết đó là tín hiệu native dsd.

PS:
Bữa nào làm thử bác Phước. Giờ đang test so sánh music server chạy trên ropiee, smpd, dietpi, raspbian_stretch9_xenomai3.0.8 theo chân anh Hải và anh quatmo mà tai loạn cào cào lên rồi.
 
Chỉnh sửa lần cuối:

quatmo

Well-Known Member
RoPieeeXL Pi 4 - ropi4.local
https://drive.google.com/file/d/1RSAWN4Jc4r4zk0o90UD8lhUlYccqBGMb/view?usp=sharing
- Tích hợp MinimServer
- Tích hợp mount 28k track (Cloud)
- Tích hơp Linux-Audio-Adjustments

----MinimServer đã scan-----------
Folder: /mnt/MUSIC/SELECTED
Cài MinimWatch vào Windows/MAC để add thêm các folder chứa nhạc sau, các bác add hết scan liên tục tầm 18h, add ít scan cho nhanh.
Chỉ muốn scan NAS local thì không cần add vô MinimWatch.
Lưu ý: add thêm folder vào, MinimWatch bấm ReStart để update, không bấm Rescan.

--- chưa scan--------------------
/mnt/MUSIC/DEEZER1
/mnt/MUSIC/DEEZER2
/mnt/MUSIC/DEEZER3
/mnt/MUSIC/TIDAL1
/mnt/MUSIC/TIDAL2
/mnt/MUSIC/TIDAL3

MinimServer lấy nhạc từ Cloud truyền đến RoPi, 2 trong 1 thiết bị, phone dùng BubbleUPnP điều khiển play, tắt wifi phone nó vẫn play hết list tiếp. Chạy nhẹ nhàng, CPU là 46 độ.


RoPieeeXL Pi 3 - ropi.local

https://drive.google.com/file/d/1W_Rt5EXUtM----MsctV9odiR5Bo4Bqku/view?usp=sharing

- MinimServer đã scan mớ folder trên
- Mình không nhớ scan xong chưa, nếu chưa xong thì icon MinimWatch sẽ hiện màu vàng, khi nào chuyển sang xanh các thiết bị khác mới nhìn thấy/play được.


Các bác dùng MinimServer khi nó đã scan xong thì vào tool MinimWatch setting giá trị starupScan từ full thành false để không cho nó tự động scan mỗi khi khởi động

Làm như vậy bật máy là có thể truy xuất nghe ngay không cần đợi scan.

2020-06-27-01_49_31-Greenshot-image-editor.png


Chúc các bác tận hưởng âm nhạc trên Pi một cách đơn giản nhất, bật điện thoai/table bấm là nghe. Chả cần quan tâm Roon hết hạn hay phải bật máy tính mở màn hình chọn nhạc...

Tuy không đủ hêt các loại nhạc nhưng tầm 2000 album tạm để nghe miệt mài rồi. Cần thêm thì nghe từ các nguồn khác đến Ropi bằng App BubbleUpnP...
 
Chỉnh sửa lần cuối:

tml3nr

Moderator
.... Giờ đang test so sánh music server chạy trên ropiee, smpd, dietpi, raspbian_stretch9_xenomai3.0.8 theo chân anh Hải và anh quatmo mà tai loạn cào cào lên rồi.
Anh @mtminh, @linh0983, @quatmo, @TuanQuynhAudio, @Thanhvo31 ... và cả nhà.

Em test sơ qua thấy bản raspbian_stretch9_xenomai3.0.8 này cực kỳ hấp dẫn. Latency thấp hơn bản smpd 0.9.6 và audio-linux rất nhiều.

Từ khi em dùng nó chạy upnp server âm thanh hay hơn nghe tidal online Chromecast. Âm thanh nhẹ nhàng và rất tinh tế .

Em nghĩ là bản này rất thích hợp để làm một OS all-in-one. Nó gốc raspbian nên mình dễ thêm thắt các thứ.

Giao diện web thì mình bám theo mympd là tốt đời đẹp đạo. Nếu cần thì thêm một tab cho các settings. Cái này anh @quatmo lo dư sức :rolleyes:

Check sau khi dọn dẹp sơ bộ OS và tắt bớt một số services:

xenomai-sysinfo-v3.png

Check service status:

xenomai-sstatus.png

htop mod:

htop-mod.png

Em dựa trên ý tưởng của anh @mtminh, và cóp nhặt thêm một số script trên web để làm ra vài cái file để check thông số. Em xin up lên cho các anh góp ý và sử dụng.

Mình chỉ cần tạo file trong /usr/bin/ rồi set 755 là chạy được.

/urs/bin/sysinfo (v3)

Mã:
#!/bin/bash

#####################################
# sysinfo v3
#####################################

# cpustatus
#
# Prints the current state of the CPU like temperature, voltage and speed.
# The temperature is reported in degrees Celsius (C) while
# the CPU speed is calculated in megahertz (MHz).

function convert_to_MHz {
  let value=$1/1000
  echo "$value"
}

function calculate_overvolts {
  # We can safely ignore the integer
  # part of the decimal argument
  # since it's not realistic to run the Pi
  # at voltages higher than 1.99 V
  let overvolts=${1#*.}-20
  echo "$overvolts"
}

temp=$(/opt/vc/bin/vcgencmd measure_temp)
temp=${temp:5:4}

volts=$(/opt/vc/bin/vcgencmd measure_volts)
volts=${volts:5:4}

if [ $volts != "1.20" ]; then
  overvolts=$(calculate_overvolts $volts)
fi

freq=$(vcgencmd measure_clock arm)
freq=${freq:14:6}
freq=$(convert_to_MHz $freq)

rfreq=$(/opt/vc/bin/vcgencmd get_config int | grep -E "(sdram_freq)")
rfreq=${rfreq:11:3}

tv=$(/opt/vc/bin/tvservice -s)
tv=${tv:16:9}

#governor=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)

echo "-- System info --"
system=$(uname -snrm)
printf "$system\n"

model=$(tr -d '\0' < /proc/device-tree/model)
printf "$model\n"
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
      printf "IP: %s\n" "$_IP"
fi

echo ""
echo "-- CPU info --"
echo "Temperature:  $temp C"
echo -n "Voltage:  $volts V"
[ $overvolts ] && echo " (+0.$overvolts overvolt)" || echo -e "\r"
echo "Current CPU:  $freq MHz"
echo "Current SDRAM:  $rfreq MHz"
echo ""
#echo "Governor:  $governor"
echo "-- More info --"
echo "HDMI Status:  $tv"
echo ""
# for mem in gpu arm ; do echo -e "$mem:\t$(/opt/vc/bin/vcgencmd get_mem $mem)" ; done
/opt/vc/bin/vcgencmd get_mem gpu
/opt/vc/bin/vcgencmd get_mem arm
echo ""
for id in sdram_c sdram_i sdram_p ; do echo -e "$id: $(/opt/vc/bin/vcgencmd measure_volts $id)" ; done
echo ""
for id in core h264 isp v3d ; do echo -e "$id:\t$(/opt/vc/bin/vcgencmd measure_clock $id)" ; done
echo ""
for id in uart pwm emmc pixel vec hdmi dpi ; do echo -e "$id:\t$(/opt/vc/bin/vcgencmd measure_clock $id)" ; done
echo ""
echo "-- System Latency --"
cat /sys/block/mmcblk0/queue/scheduler; cat /proc/sys/vm/swappiness; cat /proc/sys/kernel/sched_latency_ns; cat /proc/sys/kernel/sched_rt_period_us; cat /proc/sys/kernel/sched_rt_runtime_us; cat /proc/sys/kernel/sched_autogroup_enabled; cat /proc/sys/kernel/sched_rr_timeslice_ms; cat /proc/sys/kernel/sched_min_granularity_ns; cat /proc/sys/kernel/sched_wakeup_granularity_ns
echo ""
echo "-- Network Buffers Size --"
for nmem in rmem_max wmem_max ; do echo -e "$nmem:\t$(cat /proc/sys/net/core/$nmem)" ; done

exit 0

/urs/bin/sstatus

Mã:
#!/bin/bash
echo ""
echo "-- Services Enabled --"
echo ""
systemctl list-unit-files --state=enabled
echo ""
echo "-- Services Running --"
echo ""
systemctl list-units --all --state=running
echo ""
exit
 
Chỉnh sửa lần cuối:

TuanQuynhAudio

Well-Known Member
@tml3nr: Thằng SMPD cũng dùng xenomai trên bản Raspbian đó. Smpd thì chỉ có tập trung mpd, airplay và lược hết tất cả những thứ không cần thiết. Để kết hợp All-In-one vẫn phải đánh đổi chất lượng âm thanh.
 

Thanhvo31

Well-Known Member
@tml3nr: Thằng SMPD cũng dùng xenomai trên bản Raspbian đó. Smpd thì chỉ có tập trung mpd, airplay và lược hết tất cả những thứ không cần thiết. Để kết hợp All-In-one vẫn phải đánh đổi chất lượng âm thanh.

Nó dùng Linux From Scratch bác ạ
Lại có bản 1.0.5
symphonic-mpd RPi4 Edition (64bit)
1f51f.png
Download v1.0.4 Image ZIP (277MB)
SD image for Raspberry Pi 4.
Please be careful about the voltage drop when diverting the power supply of Pi3.

  • Version: 1.0.5
  • Release date: 2020-06-26 (Online update is now available)
  • Kernel version: 4.19.86 SMP PREEMPT (Xenomai 3.1.0)
  • SHA1: 4905AA658DCCB7E698A091E943C0CDEC8A31CD06
symphonic-mpd RPi3 Edition (32bit)
0039-20e3.png
Download v0.9.6 Image ZIP (293MB)・・・Installation procedure

  • Version: 0.9.6
  • Release date: 2020-03-01
  • Kernel version: 4.14.52 SMP PREEMPT (Xenomai 3.0.7)
  • SHA1: 1C1E67ADD984892D34632B10E654796A2A965236
 

tml3nr

Moderator
@tml3nr: Thằng SMPD cũng dùng xenomai trên bản Raspbian đó. Smpd thì chỉ có tập trung mpd, airplay và lược hết tất cả những thứ không cần thiết. Để kết hợp All-In-one vẫn phải đánh đổi chất lượng âm thanh.
Mình làm sẵn các service nhưng chỉ start những cái nào đang dùng thôi ạ. Nếu như không học được theo cách tắt tự động như smpd thì mình làm nút tắt trên giao diện web cũng được.

Em nghĩ đa số mọi người chỉ cần dùng các thứ sau: mpd / upnp renderer - openhome tidal / spotify connect / roon bridge.

Bản smpd rất tuyệt vời. Em không nghĩ mình làm hơn được. Nhưng do ông Nhật quá chú tâm đến i2s, bỏ qua usb và build quá gọn (remove gần hết các kernel modules) nên mình rất khó thêm bớt.

Tắt các service khác khi không dùng một cách tự động, chủ yếu là bằng cách dùng event như sau ạ:

http://www.hdvietnam.com/posts/10043155/
 
Chỉnh sửa lần cuối:

tml3nr

Moderator
Với em rune của ngày xưa vẫn là huyền thoại anh ạ. Họ cầu toàn và chăm chút đến cực đoan ở tất cả các mặt.

File orion_optimize.sh là đỉnh cao của sự tinh tế trong setup.

Đa phần các ông dev thật ra không nghe kỹ lắm về âm thanh. Như ông dynobot lẫy lừng hay ông janui thâm sâu, khi em nói đến việc tắt bớt service cho tiếng hay hơn. Mấy ổng không tin :D

Nhờ anh @mtminh và anh @TuanQuynhAudio khai sáng. Em hiểu được 99% ý nghĩa file này, và gần như nắm được hết các cách optimize âm thanh trong các OS cho pi từ trước đến nay. Nhưng áp dụng vào một OS cụ thể như thế nào cho hợp lý là một việc rất khó, vì phải nghe ra được tác động và sự kết hợp của những settings.

Chỉ có anh @mtminh là có khả năng nghe ra và định được hướng đi :rolleyes:

orion_optimize.sh

Mã:
#!/bin/bash
#
# Copyright (C) 2013-2014 RuneAudio Team
# http://www.runeaudio.com
#
# RuneUI
# copyright (C) 2013-2014 - Andrea Coiutti (aka ACX) & Simone De Gregori (aka Orion)
#
# RuneOS
# copyright (C) 2013-2014 - Carmelo San Giovanni (aka Um3ggh1U) & Simone De Gregori (aka Orion)
#
# RuneAudio website and logo
# copyright (C) 2013-2014 - ACX webdesign (Andrea Coiutti)
#
# This Program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# This Program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with RuneAudio; see the file COPYING. If not, see
# <http://www.gnu.org/licenses/gpl-3.0.txt>.
#
# file: command/orion_optimize.sh
# version: 1.2
#
#
#####################################
# Orion RuneAudio Optimize script v1.0 #
######################################
ver="1.0"

####################
# common functions #
####################
mpdprio_nice () {
count=1
for pid in $(pgrep -w mpd);
do
if ((count == 3))
then
echo "### Set priority for: mpd-player thread ###";
renice -15 $pid;
fi
if ((count == 4))
then
echo "### Set priority for: mpd-output thread ###";
renice -20 $pid;
fi
if ((count == 5))
then
echo "### Set priority for: mpd-decoder thread ###";
renice -18 $pid;
fi
count=$((count+1))
done
}

mpdprio_default () {
count=1
for pid in $(pgrep -w mpd);
do
if ((count == 3))
then
echo "### Set priority for: mpd-player thread ###";
renice 20 $pid;
fi
if ((count == 4))
then
echo "### Set priority for: mpd-output thread ###";
renice 20 $pid;
fi
if ((count == 5))
then
echo "### Set priority for: mpd-decoder thread ###";
renice 20 $pid;
fi
count=$((count+1))
done
}

# set cifsd priority
cifsprio () {
local "${@}"
if (( -n ${pid}))
then
echo "### Set priority for: cifsd ###"
renice ${prio} ${pid}
fi
}

# adjust Kernel scheduler latency based on Architecture
modKschedLatency () {
local "${@}"
# RaspberryPi
if ((${hw} == "01"))
then
echo ${s01} > /proc/sys/kernel/sched_latency_ns
echo "sched_latency_ns = "${s01}
sndusb_profile nrpacks=${u01}
echo "USB nrpacks="${u01}
echo -n performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
fi
# CuBox
if ((${hw} == "02"))
then
echo ${s02} > /proc/sys/kernel/sched_latency_ns
echo "sched_latency_ns = "${s02}
sndusb_profile nrpacks=${u02}
echo "USB nrpacks="${u02}
fi
# UDOO
if ((${hw} == "03"))
then
echo ${s03} > /proc/sys/kernel/sched_latency_ns
echo "sched_latency_ns = "${s03}
sndusb_profile nrpacks=${u03}
echo "USB nrpacks="${u03}
fi
# BeagleBoneBlack
if ((${hw} == "04"))
then
echo ${s04} > /proc/sys/kernel/sched_latency_ns
echo "sched_latency_ns = "${s04}
sndusb_profile nrpacks=${u04}
echo "USB nrpacks="${u04}
fi
}

sndusb_profile() {
local "${@}"
mpc pause > /dev/null 2>&1
sleep 0.3
modprobe -r snd-usb-audio
echo "options snd-usb-audio nrpacks=${nrpacks}" > /etc/modprobe.d/modprobe.conf
modprobe snd-usb-audio
sleep 0.5
mpc play > /dev/null 2>&1
mpc pause > /dev/null 2>&1
mpc play > /dev/null 2>&1
}

##################
# common startup #
##################
#if [ "$PID" != null ]; then
#echo "Set priority for: cifsd"
#renice -20 $PID
#fi
cifsprio pid=$(pidof cifsd)
echo "Set normal priority for: rune_SY_wrk.php"
renice 20 $(pgrep rune_SY_wrk.php)
echo "Set normal priority for: smbd"
renice 19 $(pidof smbd)
echo "Set normal priority for: nmbd"
renice 19 $(pidof nmbd)

##################
# sound profiles #
##################

# default
if [ "$1" == "default" ]; then
ifconfig eth0 mtu 1500
ifconfig eth0 txqueuelen 1000
echo 60 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=6000000 s02=6000000 s03=6000000 s04=6000000 u01=8 u02=8 u03=8 u04=8
mpdprio_defalut
echo "flush DEFAULT sound profile"
fi

# default
if [ "$1" == "RuneAudio" ]; then
ifconfig eth0 mtu 1500
ifconfig eth0 txqueuelen 1000
echo 0 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=1500000 s02=4500000 s03=4500000 s04=4500000 u01=3 u02=3 u03=3 u04=3
mpdprio_nice
echo "flush MOD1 RuneAudio sound profile"
fi

# mod1
if [ "$1" == "ACX" ]; then
ifconfig eth0 mtu 1500
ifconfig eth0 txqueuelen 4000
echo 0 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=850000 s02=3500075 s03=3500075 s04=3500075 u01=2 u02=2 u03=2 u04=2
mpdprio_default
echo "flush MOD2 (ACX)"
fi

# mod2
if [ "$1" == "Orion" ]; then
ifconfig eth0 mtu 1000
echo 20 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=500000 s02=500000 s03=500000 s04=1000000 u01=1 u02=1 u03=1 u04=1
sleep 2
mpdprio_default
echo "flush MOD3 (Orion)"
fi

# mod3
if [ "$1" == "OrionV2" ]; then
ifconfig eth0 mtu 1000
ifconfig eth0 txqueuelen 4000
echo 0 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=120000 s02=2000000 s03=2000000 s04=2000000 u01=2 u02=2 u03=2 u04=2
sleep 2
mpdprio_nice
echo "flush MOD4 (OrionV2)"
fi

# mod4
if [ "$1" == "Um3ggh1U" ]; then
ifconfig eth0 mtu 1500
ifconfig eth0 txqueuelen 1000
echo 0 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=500000 s02=3700000 s03=3700000 s04=3700000 u01=3 u02=3 u03=3 u04=3
mpdprio_default
echo "flush MOD5 (Um3ggh1U) sound profile "
fi

# dev
if [ "$1" == "dev" ]; then
echo "flush DEV sound profile 'fake'"
fi

if [ "$1" == "" ]; then
echo "Orion Optimize Script v$ver"
echo "Usage: $0 {default|RuneAudio|ACX|Orion|OrionV2|Um3ggh1U} {architectureID}"
exit 1
fi
 
Chỉnh sửa lần cuối:

tml3nr

Moderator
Nó dùng Linux From Scratch bác ạ
Lại có bản 1.0.5
symphonic-mpd RPi4 Edition (64bit)
1f51f.png
Download v1.0.4 Image ZIP (277MB)
SD image for Raspberry Pi 4.
Please be careful about the voltage drop when diverting the power supply of Pi3.

  • Version: 1.0.5
  • Release date: 2020-06-26 (Online update is now available)
  • Kernel version: 4.19.86 SMP PREEMPT (Xenomai 3.1.0)
  • SHA1: 4905AA658DCCB7E698A091E943C0CDEC8A31CD06
symphonic-mpd RPi3 Edition (32bit)
0039-20e3.png
Download v0.9.6 Image ZIP (293MB)・・・Installation procedure

  • Version: 0.9.6
  • Release date: 2020-03-01
  • Kernel version: 4.14.52 SMP PREEMPT (Xenomai 3.0.7)
  • SHA1: 1C1E67ADD984892D34632B10E654796A2A965236
Bản 0.9.6 ông papalius xác nhận là nền raspbian anh ạ. Bản 1.0.x mới built từ Linux From Scratch.

https://www.diyaudio.com/forums/pc-based/355137-symphonic-mpd-16.html#post6236836

papalius đã viết:
Hi chauphuong,

v0.9.6(RPi3) is based on Raspbian.
Try apt-get to install upnpdcli.

I don't know if any additional configuration is needed or not.
If it doesn't work, ask again.
I'll try to find out if any members are using UPnP with v0.9.6 (RPi3).
 

quatmo

Well-Known Member
Anh @mtminh, @linh0983, @quatmo, @TuanQuynhAudio, @Thanhvo31 ... và cả nhà.

Em test sơ qua thấy bản raspbian_stretch9_xenomai3.0.8 này cực kỳ hấp dẫn. Latency thấp hơn bản smpd 0.9.6 và audio-linux rất nhiều.

Từ khi em dùng nó chạy upnp server âm thanh hay hơn nghe tidal online Chromecast. Âm thanh nhẹ nhàng và rất tinh tế .

Em nghĩ là bản này rất thích hợp để làm một OS all-in-one. Nó gốc raspbian nên mình dễ thêm thắt các thứ.

Giao diện web thì mình bám theo mympd là tốt đời đẹp đạo. Nếu cần thì thêm một tab cho các settings. Cái này anh @quatmo lo dư sức :rolleyes:

Check sau khi dọn dẹp sơ bộ OS và tắt bớt một số services:

xenomai-sysinfo.png

Check service status:

xenomai-sstatus.png

htop mod:

htop-mod.png

Latency test:

Mã:
pi@raspberrypi:~ $ sudo cyclictest  -l 10000 -m -Sp98 -i100 -d0
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.08 0.03 0.01 2/124 649

T: 0 (  645) P:98 I:100 C:  9788 Min:  23 Act:  49 Avg:  53 Max:  421
T: 1 (  646) P:98 I:100 C:  10000 Min:  24 Act:  41 Avg:  49 Max:  294
T: 2 (  647) P:98 I:100 C:  9778 Min:  34 Act:  42 Avg:  41 Max:  172
T: 3 (  648) P:98 I:100 C:  8920 Min:  22 Act:  49 Avg:  52 Max:  267

Em dựa trên ý tưởng của anh @mtminh, và cóp nhặt thêm một số script trên web để làm ra vài cái file để check thông số. Em xin up lên cho các anh góp ý và sử dụng.

Mình chỉ cần tạo file trong /usr/bin/ rồi set 755 là chạy được.

/urs/bin/sysinfo

Mã:
#!/bin/bash
# cpustatus
#
# Prints the current state of the CPU like temperature, voltage and speed.
# The temperature is reported in degrees Celsius (C) while
# the CPU speed is calculated in megahertz (MHz).

function convert_to_MHz {
  let value=$1/1000
  echo "$value"
}

function calculate_overvolts {
  # We can safely ignore the integer
  # part of the decimal argument
  # since it's not realistic to run the Pi
  # at voltages higher than 1.99 V
  let overvolts=${1#*.}-20
  echo "$overvolts"
}

temp=$(/opt/vc/bin/vcgencmd measure_temp)
temp=${temp:5:4}

volts=$(/opt/vc/bin/vcgencmd measure_volts)
volts=${volts:5:4}

if [ $volts != "1.20" ]; then
  overvolts=$(calculate_overvolts $volts)
fi

freq=$(vcgencmd measure_clock arm)
freq=${freq:14:6}
freq=$(convert_to_MHz $freq)

#governor=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)

echo "-- System info --"
system=$(uname -snrm)
printf "$system\n"

model=$(tr -d '\0' < /proc/device-tree/model)
printf "$model\n"
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
    printf "IP: %s\n" "$_IP"
fi

echo ""
echo "-- CPU info --"
echo "Temperature:  $temp C"
echo -n "Voltage:  $volts V"
[ $overvolts ] && echo " (+0.$overvolts overvolt)" || echo -e "\r"
echo "Current CPU:  $freq MHz"
#echo "Governor:  $governor"
echo ""
echo "-- More info --"
/opt/vc/bin/vcgencmd get_mem gpu
/opt/vc/bin/vcgencmd get_mem arm
/opt/vc/bin/vcgencmd get_config int | grep -E "(sdram_freq)"
echo ""
for id in sdram_c sdram_i sdram_p ; do echo -e "$id: $(/opt/vc/bin/vcgencmd measure_volts $id)" ; done
echo ""
for id in core h264 isp v3d ; do echo -e "$id:\t$(/opt/vc/bin/vcgencmd measure_clock $id)" ; done
echo ""
for id in uart pwm emmc pixel vec hdmi dpi ; do echo -e "$id:\t$(/opt/vc/bin/vcgencmd measure_clock $id)" ; done
echo ""
/opt/vc/bin/tvservice -s ; echo
cat /sys/block/mmcblk0/queue/scheduler; cat /proc/sys/vm/swappiness; cat /proc/sys/kernel/sched_latency_ns; cat /proc/sys/kernel/sched_rt_period_us; cat /proc/sys/kernel/sched_rt_runtime_us; cat /proc/sys/kernel/sched_autogroup_enabled; cat /proc/sys/kernel/sched_rr_timeslice_ms; cat /proc/sys/kernel/sched_min_granularity_ns; cat /proc/sys/kernel/sched_wakeup_granularity_ns

exit 0

/urs/bin/sstatus

Mã:
#!/bin/bash
echo ""
echo "-- List Unit Files --"
echo ""
systemctl list-unit-files --state=enabled
echo ""
echo "-- Service Running --"
echo ""
systemctl list-units --all --state=running
echo ""
exit


Hấp dẫn bác ơi!
Về MPD mình cho là không làm phần giao diện hiện cover, album... vì chính việc render nhiều hình ảnh, truy xuất nhiều trong database db ra web Ui làm nặng gánh OS, mà render MPD add ít album vào thì không có ý nghĩa, bỏ qua MPD UI là hay nhất, để phần render đó cho thiết bị remote lo.
 

Thanhvo31

Well-Known Member
Với em rune của ngày xưa vẫn là huyền thoại anh ạ. Họ cầu toàn và chăm chút đến cực đoan ở tất cả các mặt.

File orion_optimize.sh là đỉnh cao của sự tinh tế trong setup.

Đa phần các ông dev thật ra không nghe kỹ lắm về âm thanh. Như ông dynobot lẫy lừng hay ông janui thâm sâu, khi em nói đến việc tắt bớt service cho tiếng hay hơn. Mấy ổng không tin :D

Nhờ anh @mtminh và anh @TuanQuynhAudio khai sáng. Em hiểu được 99% ý nghĩa file này, và gần như nắm được hết các cách optimize âm thanh trong các OS cho pi từ trước đến nay. Nhưng áp dụng vào một OS cụ thể như thế nào cho hợp lý là một việc rất khó, vì phải nghe ra được tác động và sự kết hợp của những settings.

Chỉ có anh @mtminh là có khả năng nghe ra và định được hướng đi :rolleyes:

orion_optimize.sh

Mã:
#!/bin/bash
#
# Copyright (C) 2013-2014 RuneAudio Team
# http://www.runeaudio.com
#
# RuneUI
# copyright (C) 2013-2014 - Andrea Coiutti (aka ACX) & Simone De Gregori (aka Orion)
#
# RuneOS
# copyright (C) 2013-2014 - Carmelo San Giovanni (aka Um3ggh1U) & Simone De Gregori (aka Orion)
#
# RuneAudio website and logo
# copyright (C) 2013-2014 - ACX webdesign (Andrea Coiutti)
#
# This Program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# This Program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with RuneAudio; see the file COPYING. If not, see
# <http://www.gnu.org/licenses/gpl-3.0.txt>.
#
# file: command/orion_optimize.sh
# version: 1.2
#
#
#####################################
# Orion RuneAudio Optimize script v1.0 #
######################################
ver="1.0"

####################
# common functions #
####################
mpdprio_nice () {
count=1
for pid in $(pgrep -w mpd);
do
if ((count == 3))
then
echo "### Set priority for: mpd-player thread ###";
renice -15 $pid;
fi
if ((count == 4))
then
echo "### Set priority for: mpd-output thread ###";
renice -20 $pid;
fi
if ((count == 5))
then
echo "### Set priority for: mpd-decoder thread ###";
renice -18 $pid;
fi
count=$((count+1))
done
}

mpdprio_default () {
count=1
for pid in $(pgrep -w mpd);
do
if ((count == 3))
then
echo "### Set priority for: mpd-player thread ###";
renice 20 $pid;
fi
if ((count == 4))
then
echo "### Set priority for: mpd-output thread ###";
renice 20 $pid;
fi
if ((count == 5))
then
echo "### Set priority for: mpd-decoder thread ###";
renice 20 $pid;
fi
count=$((count+1))
done
}

# set cifsd priority
cifsprio () {
local "${@}"
if (( -n ${pid}))
then
echo "### Set priority for: cifsd ###"
renice ${prio} ${pid}
fi
}

# adjust Kernel scheduler latency based on Architecture
modKschedLatency () {
local "${@}"
# RaspberryPi
if ((${hw} == "01"))
then
echo ${s01} > /proc/sys/kernel/sched_latency_ns
echo "sched_latency_ns = "${s01}
sndusb_profile nrpacks=${u01}
echo "USB nrpacks="${u01}
echo -n performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
fi
# CuBox
if ((${hw} == "02"))
then
echo ${s02} > /proc/sys/kernel/sched_latency_ns
echo "sched_latency_ns = "${s02}
sndusb_profile nrpacks=${u02}
echo "USB nrpacks="${u02}
fi
# UDOO
if ((${hw} == "03"))
then
echo ${s03} > /proc/sys/kernel/sched_latency_ns
echo "sched_latency_ns = "${s03}
sndusb_profile nrpacks=${u03}
echo "USB nrpacks="${u03}
fi
# BeagleBoneBlack
if ((${hw} == "04"))
then
echo ${s04} > /proc/sys/kernel/sched_latency_ns
echo "sched_latency_ns = "${s04}
sndusb_profile nrpacks=${u04}
echo "USB nrpacks="${u04}
fi
}

sndusb_profile() {
local "${@}"
mpc pause > /dev/null 2>&1
sleep 0.3
modprobe -r snd-usb-audio
echo "options snd-usb-audio nrpacks=${nrpacks}" > /etc/modprobe.d/modprobe.conf
modprobe snd-usb-audio
sleep 0.5
mpc play > /dev/null 2>&1
mpc pause > /dev/null 2>&1
mpc play > /dev/null 2>&1
}

##################
# common startup #
##################
#if [ "$PID" != null ]; then
#echo "Set priority for: cifsd"
#renice -20 $PID
#fi
cifsprio pid=$(pidof cifsd)
echo "Set normal priority for: rune_SY_wrk.php"
renice 20 $(pgrep rune_SY_wrk.php)
echo "Set normal priority for: smbd"
renice 19 $(pidof smbd)
echo "Set normal priority for: nmbd"
renice 19 $(pidof nmbd)

##################
# sound profiles #
##################

# default
if [ "$1" == "default" ]; then
ifconfig eth0 mtu 1500
ifconfig eth0 txqueuelen 1000
echo 60 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=6000000 s02=6000000 s03=6000000 s04=6000000 u01=8 u02=8 u03=8 u04=8
mpdprio_defalut
echo "flush DEFAULT sound profile"
fi

# default
if [ "$1" == "RuneAudio" ]; then
ifconfig eth0 mtu 1500
ifconfig eth0 txqueuelen 1000
echo 0 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=1500000 s02=4500000 s03=4500000 s04=4500000 u01=3 u02=3 u03=3 u04=3
mpdprio_nice
echo "flush MOD1 RuneAudio sound profile"
fi

# mod1
if [ "$1" == "ACX" ]; then
ifconfig eth0 mtu 1500
ifconfig eth0 txqueuelen 4000
echo 0 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=850000 s02=3500075 s03=3500075 s04=3500075 u01=2 u02=2 u03=2 u04=2
mpdprio_default
echo "flush MOD2 (ACX)"
fi

# mod2
if [ "$1" == "Orion" ]; then
ifconfig eth0 mtu 1000
echo 20 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=500000 s02=500000 s03=500000 s04=1000000 u01=1 u02=1 u03=1 u04=1
sleep 2
mpdprio_default
echo "flush MOD3 (Orion)"
fi

# mod3
if [ "$1" == "OrionV2" ]; then
ifconfig eth0 mtu 1000
ifconfig eth0 txqueuelen 4000
echo 0 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=120000 s02=2000000 s03=2000000 s04=2000000 u01=2 u02=2 u03=2 u04=2
sleep 2
mpdprio_nice
echo "flush MOD4 (OrionV2)"
fi

# mod4
if [ "$1" == "Um3ggh1U" ]; then
ifconfig eth0 mtu 1500
ifconfig eth0 txqueuelen 1000
echo 0 > /proc/sys/vm/swappiness
modKschedLatency hw=$2 s01=500000 s02=3700000 s03=3700000 s04=3700000 u01=3 u02=3 u03=3 u04=3
mpdprio_default
echo "flush MOD5 (Um3ggh1U) sound profile "
fi

# dev
if [ "$1" == "dev" ]; then
echo "flush DEV sound profile 'fake'"
fi

if [ "$1" == "" ]; then
echo "Orion Optimize Script v$ver"
echo "Usage: $0 {default|RuneAudio|ACX|Orion|OrionV2|Um3ggh1U} {architectureID}"
exit 1
fi

thú thực là mình cũng có võ vẽ qua về lập trình, cũng dùng chút code VBA cho công việc nhưng món kernel này hại não quá. Mới lại tai cũng bùng nhùng, tâm trạng thất thường nên chắc chỉ cóp bết của các bác về được thôi.
tuy vậy em vẫn test nhiệt tình.

Nhờ bác thông não mình mới biết tới NICE/RENICE, swap, MTU, txq

Để mình note lại

https://www.tecmint.com/set-linux-process-priority-using-nice-and-renice-commands/
https://vpssim.vn/497-huong-dan-dieu-chinh-swappiness-de-nang-cao-hieu-suat-cho-vps.html
https://linuxhint.com/understanding_vm_swappiness/
http://www.microhowto.info/howto/change_the_mtu_of_a_network_interface.html
https://www.cyberciti.biz/faq/gentoo-centos-rhel-debian-fedora-increasing-txqueuelen/

Mã:
 symphonic-mpd

version : smpd pi4 edition v1.0.5
model   : Raspberry Pi 4 Model B Rev 1.1
kernel  : Linux 4.19.86-v8 #105 SMP PREEMPT Fri Jun 26 15:21:25 JST 2020
temp    : 52.4'C
root [ ~ ]# ps -eo pid,ppid,ni,comm
  PID  PPID  NI COMMAND
    1     0   0 systemd
    2     0   0 kthreadd
    3     2 -20 rcu_gp
    4     2 -20 rcu_par_gp
    5     2   0 kworker/0:0-mm_percpu_wq
    6     2 -20 kworker/0:0H
    8     2 -20 mm_percpu_wq
    9     2   - ksoftirqd/0
   10     2   0 rcu_preempt
   11     2   0 rcu_sched
   12     2   0 rcu_bh
   13     2   - migration/0
   14     2   - cpuhp/0
   15     2   - cpuhp/1
   16     2   - migration/1
   17     2   0 ksoftirqd/1
   18     2   0 kworker/1:0-mm_percpu_wq
   19     2 -20 kworker/1:0H
   20     2   - cpuhp/2
   21     2   - migration/2
   22     2   - ksoftirqd/2
   23     2   0 kworker/2:0-mm_percpu_wq
   24     2 -20 kworker/2:0H
   25     2   - cpuhp/3
   26     2   - migration/3
   27     2   - ksoftirqd/3
   30     2   0 kdevtmpfs
   31     2 -20 netns
   32     2   0 rcu_tasks_kthre
   33     2   0 oom_reaper
   34     2 -20 writeback
   35     2 -20 crypto
   36     2 -20 kblockd
   37     2   - watchdogd
   39     2   0 rtdm_fd
   40     2   0 kswapd0
   68     2 -20 DWC Notificatio
   69     2 -19 vchiq-slot/0
   70     2 -19 vchiq-recy/0
   71     2 -20 vchiq-sync/0
   73     2   - irq/21-brcmstb_
   74     2   - irq/22-mmc0
   75     2 -20 mmc_complete
   76     2 -20 kworker/3:1H-mmc_complete
   77     2   0 jbd2/mmcblk0p2-
   78     2 -20 ext4-rsv-conver
   79     2   0 kworker/0:1-mm_percpu_wq
   80     2   0 kworker/1:1-mm_percpu_wq
   81     2   0 kworker/2:1-mm_percpu_wq
   93     2 -20 kworker/3:2H-mmc_complete
  101     1   0 rngd
  103     1   0 systemd-journal
  122     2   0 kworker/u8:2-events_unbound
  136     1   0 systemd-udevd
  152     1   0 systemd-network
  163     1   0 systemd-timesyn
  168     1   0 dbus-daemon
  170     1   0 sshd
  175     1   0 mpd
  177     1   0 upmpdcli
  212     1   0 shairport-sync
  314     1   0 ympd
  331     2 -20 cifsiod
  332     2 -20 cifsoplockd
  333     2   - cifsd
  382     1   - aplay-rt
  434     2   0 kworker/3:1-cifsiod
  443   175   0 cat
  456     2   0 kworker/u8:1-events_unbound
  502     2   0 vchiq-keep/0
  566     2   0 kworker/3:2-events_power_efficient
  570   170   0 sshd
  573   570   0 bash
  595   573   0 ps
 
Chỉnh sửa lần cuối:
Bên trên