Page 1 / 31 :  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Next › »

Current filter: »mpd« (Click tag to exclude it or click a conjunction to switch them.)

May 24, 2024

古いRaspberry PiをRoon、Mpd、UPnPとかで使おうとしたら

さて先日、Ras Pi 3b+をroon bridgeにしたのだけど、これにmpd、upmpdcliをインストールする前に、まずは、かなり旧式になったRaspberry Pi B+で何かできないかと考えた。B+はいくつか残っていて、使えるものなら使いたい。
そんなことを考えたせいで、あれこれといじることになった。

以下、顛末の記録。
このエントリーは長い。やたら長い。
自分でもどうかと思うが、備忘録だからある程度仕方ない。

というわけで、mpdなど諸々のインストールをどうするか。
mpd
https://www.musicpd.org/download.html

https://www.musicpd.org/news/2023/12/mpd-0-23-15-released/
mesonが要る。
https://www.musicpd.org/news/2018/10/mpd-0-20-23-released/
こっちは要らない。

libmpdclient https://www.musicpd.org/news/2023/12/libmpdclient-2-22-released/
こっちはmesonが要る。
https://www.musicpd.org/news/2021/11/libmpdclient-2-20-released/
こっちは要らない。

それから、 upmpdcli https://www.lesbonscomptes.com/upmpdcli/
https://www.lesbonscomptes.com/upmpdcli/pages/downloads.html
https://www.lesbonscomptes.com/upmpdcli/pages/upmpdcli-manual.html#UPMPDCLI-BUILDING
こちらも最新はmeson。
autotoolsでインストール出来るのは前のバージョンだ。

piCore、Tiny Coreでは、インストールしたソフトウェアをtczファイルという形式に固めて格納する。mesonでインストールすると、それがやりにくいのだ。
2019年にはそうだった。
今はどうなっているだろう。
最新でやってみるか、mesonでやろう。ということで、やってみるということだ。

まず、普段使用のPCにlibmpdclient-2.22をダウンロード。
https://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.22.tar.xz
展開し、README.rstを確認。必要な環境を確認。

You need:
- a C99 compliant compiler (e.g. gcc)
- `Meson 0.56 `__ and `Ninja `__
Run ``meson``:
meson setup output
Compile and install::
ninja -C output
ninja -C output install

次にmpd。
https://www.musicpd.org/download/mpd/0.23/mpd-0.23.15.tar.xz
README.mdを確認。
For basic installation instructions
[read the manual](https://www.musicpd.org/doc/user/install.html).
ネット上の説明を読めということらしいので、読む。

In any case, you need:
a C++17 compiler (e.g. GCC 8 or clang 7)
Meson 0.56.0 and Ninja
Boost 1.58
pkg-config

次、upmpdcli。
https://www.lesbonscomptes.com/upmpdcli/pages/upmpdcli-manual.html#UPMPDCLI-BUILDING

For building from source, you will need a C++ compiler with C++17 support, and the development packages for the supporting libraries: libcurl, libmicrohttpd, libmpdclient, and possibly expat, depending on configuration options.
Also the Python modules for streaming service support use the python3-requests package, so you may need to install it (it is only needed at run time).
Older releases of the packages used the GNU autotools for building. Newer releases (and current git code) use meson and ninja. The change releases were libnpupnp 6.1.2, libupnpp 0.26.3 and upmpdcli 1.8.10.

(グーグル翻訳)
ソースからビルドするには、C++17 をサポートする C++ コンパイラーと、構成オプションに応じてサポート ライブラリ (libcurl、libmicrohttpd、libmpdclient、および場合によっては expat) の開発パッケージが必要です。 また、ストリーミング サービス サポート用の Python モジュールは python3-requests パッケージを使用するため、インストールする必要がある場合があります (実行時のみ必要です)。 パッケージの古いリリースでは、ビルドに GNU オートツールを使用していました。新しいリリース (および現在の git コード) では、meson と ninja が使用されます。変更リリースは、libnpupnp 6.1.2、libupnpp 0.26.3、および upmpdcli 1.8.10 でした。

必要な環境がある程度分かったところで、下記からpiCoreのイメージをダウンロード。Ras Pi b+なので、armv6。
http://tinycorelinux.net/14.x/armv6/releases/RPi/
http://tinycorelinux.net/14.x/armv6/releases/RPi/piCore-14.1.0.zip

リポジトリは下記。
http://tinycorelinux.net/14.x/armv6/tcz/

imgファイルをmicroSDに焼いて、cmdline.txt にhost=pC141bpと追記、config.txtを編集しイヤホンジャックを止めて、ラズパイに刺して電源を入れる。無事、起動した。
sshでログインし、filetool.sh -bでsshの鍵を保存する。
パーティションを拡張。2Gも足しとけばよかろう。

libmpdcliantの要求で、gcc、etcをインストール。
ついでに、どうせ要るであろうsquashfs-toolsもインストール。
tce-load -wi gcc.tcz gcc_libs.tcz gcc_libs-dev.tcz gcc_base-dev.tcz meson.tcz ninja.tcz squashfs-tools.tcz

mpdの要求で以下、インストールだ。
tce-load -wi boost-dev.tcz boost.tcz pkg-config.tcz

upmpdcli,以下、インストール。
tce-load -wi curl.tcz curl-dev.tcz libmicrohttpd.tcz libmicrohttpd-dev.tcz expat2.tcz expat2.tcz expat2-dev.tcz

加えて、PPAPで動かすつもりならnmapをインストールする必要がある。
あと、alsa関連も一応。
tce-load -wi nmap.tcz
tce-load -wi alsa-modules-6.1.68-piCore.tcz alsa.tcz alsa-utils.tcz alsa-utils-doc.tcz alsa-utils-locale.tcz alsa-plugins.tcz alsa-plugins-dev.tcz

以上で、準備完了、かな。

インストールは、libmpdclient、upmpdcli、mpd の順序で行う。

libmpdclient

wget https://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.22.tar.xz
tar Jxfv *tar.xz

tc@pC141bp:~$ ls
libmpdclient-2.22/    	libmpdclient-2.22.tar.xz
tc@pC141bp:~$ ls *22
AUTHORS        	README.rst     	libmpdclient.ld	src/
LICENSES/      	doc/           	meson.build    	test/
NEWS           	include/       	meson_options.txt  test.ld
tc@pC141bp:~$
tc@pC141bp:~$ cd *22
tc@pC141bp:~/libmpdclient-2.22$ mkdir ../libmpdclient
tc@pC141bp:~/libmpdclient-2.22$ meson . ../libmpdclient
The Meson build system
Version: 1.1.0
Source dir: /home/tc/libmpdclient-2.22
Build dir: /home/tc/libmpdclient
Build type: native build
Project name: libmpdclient
Project version: 2.22

meson.build:1:0: ERROR: Unable to detect linker for compiler `cc -Wl,--version`
stdout:
stderr: collect2 version 12.2.0
[cannot find ld] -plugin /tmp/tcloop/gcc/usr/local/bin/../lib/gcc/armv7l-unknown-linux-gnueabihf/12.2.0/liblto_plugin.so   # ( snip ) #
collect2: fatal error: cannot find 'ld'
compilation terminated.

A full log can be found at /home/tc/libmpdclient/meson-logs/meson-log.txt
WARNING: Running the setup command as `meson [options]` instead of `meson setup [options]` is ambiguous and deprecated.
tc@pC141bp:~/libmpdclient-2.22$

エラーを吐いて止まってしまった。何が足りないんだ。
ldってなに。
https://stackoverflow.com/questions/35970824/gcc-collect2-fatal-error-cannot-find-ld
これを参考にする。
tc@pC141bp:~/libmpdclient-2.22$ export PATH=$PATH:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin
これは効果なし。
gcc入ってるから要らないと思ったけど、clang入れてみるか。

tce-load -wi clang.tcz

これで、意外にたくさんのtczファイルが追加インストールされる。
出来るかな。

tc@pC141bp:~/libmpdclient-2.22$ meson . ../libmpdclient
The Meson build system
Version: 1.1.0
Source dir: /home/tc/libmpdclient-2.22
Build dir: /home/tc/libmpdclient
Build type: native build
Project name: libmpdclient
Project version: 2.22
C compiler for the host machine: cc (gcc 12.2.0 "cc (piCore) 12.2.0")
C linker for the host machine: cc ld.bfd 2.39
Host machine cpu family: arm
Host machine cpu: armv6l
Checking for function "strndup" : YES
Checking for function "getaddrinfo" : YES
Configuring config.h using configuration
Compiler for C supports arguments -Wcast-align: YES
Compiler for C supports arguments -Wcast-qual: YES
Compiler for C supports arguments -Wdouble-promotion: YES
Compiler for C supports arguments -Wfloat-equal: YES
Compiler for C supports arguments -Wmissing-declarations: YES
Compiler for C supports arguments -Wmissing-noreturn: YES
Compiler for C supports arguments -Wmissing-format-attribute: YES
Compiler for C supports arguments -Wmissing-prototypes: YES
Compiler for C supports arguments -Wno-deprecated-declarations: YES
Compiler for C supports arguments -Wpointer-arith: YES
Compiler for C supports arguments -Wredundant-decls: YES
Compiler for C supports arguments -Wshadow: YES
Compiler for C supports arguments -Wstrict-prototypes: YES
Compiler for C supports arguments -Wundef: YES
Compiler for C supports arguments -Wunused: YES
Compiler for C supports arguments -Wwrite-strings: YES
Compiler for C supports arguments -Wunreachable-code-aggressive: NO
Compiler for C supports link arguments -Wl,--version-script=/home/tc/libmpdclient-2.22/test.ld: YES
Configuring version.h using configuration
Build targets in project: 2

Found ninja-1.10.0 at /usr/local/bin/ninja
WARNING: Running the setup command as `meson [options]` instead of `meson setup [options]` is ambiguous and deprecated.
tc@pC141bp:~/libmpdclient-2.22$

警告出てるけどいけたかな。clang、要るんだな。では、ninjaでビルド、インストールだ。

tc@pC141bp:~/libmpdclient-2.22$ ninja -C ../libmpdclient
ninja: Entering directory `../libmpdclient'
[60/60] Linking target example
tc@pC141bp:~/libmpdclient-2.22$

tc@pC141bp:~/libmpdclient-2.22$ sudo ninja -C ../libmpdclient install
ninja: Entering directory `../libmpdclient'
[0/1] Installing files.
Installing libmpdclient.so.2.22 to /usr/local/lib
Installing /home/tc/libmpdclient-2.22/include/mpd/async.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/audio_format.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/client.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/capabilities.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/compiler.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/connection.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/database.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/directory.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/entity.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/error.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/fingerprint.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/idle.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/list.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/mixer.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/mount.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/neighbor.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/parser.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/partition.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/password.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/player.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/playlist.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/position.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/protocol.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/queue.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/recv.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/replay_gain.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/response.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/send.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/status.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/stats.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/tag.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/output.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/pair.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/search.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/socket.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/song.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/sticker.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/settings.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/message.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/binary.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/albumart.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/include/mpd/readpicture.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient/include/mpd/version.h to /usr/local/include/mpd/
Installing /home/tc/libmpdclient-2.22/AUTHORS to /usr/local/share/doc/libmpdclient
Installing /home/tc/libmpdclient-2.22/LICENSES/BSD-2-Clause.txt to /usr/local/share/doc/libmpdclient
Installing /home/tc/libmpdclient-2.22/LICENSES/BSD-3-Clause.txt to /usr/local/share/doc/libmpdclient
Installing /home/tc/libmpdclient-2.22/NEWS to /usr/local/share/doc/libmpdclient
Installing /home/tc/libmpdclient-2.22/README.rst to /usr/local/share/doc/libmpdclient
Installing /home/tc/libmpdclient/meson-private/libmpdclient.pc to /usr/local/lib/pkgconfig
Installing symlink pointing to libmpdclient.so.2.22 to /usr/local/lib/libmpdclient.so.2
Installing symlink pointing to libmpdclient.so.2 to /usr/local/lib/libmpdclient.so
tc@pC141bp:~/libmpdclient-2.22$

おおおおおお、、、どうすべこれ。
よく見たら、

/usr/local/lib/libmpdclient.so.2.22
/usr/local/include/mpd/
/usr/local/share/doc/libmpdclient/
/usr/local/lib/pkgconfig/libmpdclient.pc
/usr/local/lib/libmpdclient.so.2
/usr/local/lib/libmpdclient.so

以上を、取りまとめたら、いいらしい、のかな。めんどくさいなあ、、、

tc@pC141bp:~$ cd
tc@pC141bp:~$ mkdir libmpdclientx
tc@pC141bp:~$ mkdir libmpdclientx/usr
tc@pC141bp:~$ mkdir libmpdclientx/usr/local
tc@pC141bp:~$ mkdir libmpdclientx/usr/local/lib
tc@pC141bp:~$ mkdir libmpdclientx/usr/local/include
tc@pC141bp:~$ mkdir libmpdclientx/usr/local/share
tc@pC141bp:~$ cp -R /usr/local/lib/libmpdclient.so.2.22 libmpdclientx/usr/local/lib
tc@pC141bp:~$ cp -R /usr/local/include/mpd libmpdclientx/usr/local/include
tc@pC141bp:~$ mkdir libmpdclientx/usr/local/share/doc
tc@pC141bp:~$ cp -R /usr/local/share/doc/libmpdclient libmpdclientx/usr/local/share/doc
tc@pC141bp:~$ cp -R /usr/local/lib/libmpdclient.so.2 libmpdclientx/usr/local/lib
tc@pC141bp:~$ cp -R /usr/local/lib/libmpdclient.so libmpdclientx/usr/local/lib
tc@pC141bp:~$
tc@pC141bp:~$ mksquashfs libmpdclientx libmpdclient-2.22.tcz
Parallel mksquashfs: Using 1 processor
Creating 4.0 filesystem on libmpdclient-2.22.tcz, block size 4096.
[=========================================================-] 187/187 100%

Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 4096
    compressed data, compressed metadata, compressed fragments,
    no xattrs, compressed ids
    duplicates are removed
Filesystem size 203.33 Kbytes (0.20 Mbytes)
    32.18% of uncompressed filesystem size (631.84 Kbytes)
Inode table size 1014 bytes (0.99 Kbytes)
    39.56% of uncompressed inode table size (2563 bytes)
Directory table size 701 bytes (0.68 Kbytes)
    63.10% of uncompressed directory table size (1111 bytes)
Number of duplicate files found 0
Number of inodes 60
Number of files 49
Number of fragments 17
Number of symbolic links 2
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 9
Number of hard-links 0
Number of ids (unique uids + gids) 2
Number of uids 1
    tc (1001)
Number of gids 1
    staff (50)
tc@pC141bp:~$ md5sum libmpdclient-2.22.tcz > libmpdclient-2.22.tcz.md5.txt
tc@pC141bp:~$ ls
libmpdclient/              	libmpdclient-2.22.tcz
libmpdclient-2.22/         	libmpdclient-2.22.tcz.md5.txt
libmpdclient-2.22.tar.xz   	libmpdclientx/
tc@pC141bp:~$
tc@pC141bp:~$ ls /mnt/*2/tce
mydata.tgz  onboot.lst  ondemand/   optional/
tc@pC141bp:~$ sudo mv *tcz* /mnt/*2/tce/optional
tc@pC141bp:~$ sudo vi /mnt/*2/tce/onboot.lst
(# libmpdclient-2.22.tcz 書き込み)
tc@pC141bp:~$
tc@pC141bp:~$ ls
libmpdclient/         	libmpdclient-2.22.tar.xz
libmpdclient-2.22/    	libmpdclientx/
tc@pC141bp:~$ rm -rf lib*
tc@pC141bp:~$ filetool.sh -b

libmpdclient、インストール終了。手間がかかる。2019年のときとやり方は変わらん。
まあいい、次はupmpdcliだ。

upmpdcli

え、、、え?!、Deezer Plugin、ってなに!
2021年、upmpdcli 1.5.9からDeezerに対応したようだ。
Qobuz、Tidalはもう少し古くて、Upmpdcli 1.2.0からのようだ。2017年より以前のことだ。Spotifyのプラグインはない。
python3-requests パッケージが要るって、これのことか。
どうやって使うのだろう。
https://www.lesbonscomptes.com/upmpdcli/pages/upmpdcli-manual.html#UPMPDCLI-MS-STR
上記の記載によると、昨年秋にDeezerは使えなくなったとのこと。なんとまあ。

まあいい、とりあえず、以下、順次インストールする。

libnpupnp-6.1.2.tar.gz
libupnpp-0.26.4.tar.gz
upmpdcli-1.8.11.tar.gz

まず、libnpupnp


tc@pC141bp:~$ wget https://www.lesbonscomptes.com/upmpdcli/downloads/libnpupnp-6.1.2.tar.gz
Connecting to www.lesbonscomptes.com (62.210.16.61:443)
saving to 'libnpupnp-6.1.2.tar.gz'
libnpupnp-6.1.2.tar. 100% |*********************************************************************|  436k  0:00:00 ETA
'libnpupnp-6.1.2.tar.gz' saved
tc@pC141bp:~$ tar xf lib*
tc@pC141bp:~$ ls
libnpupnp-6.1.2/    	libnpupnp-6.1.2.tar.gz
tc@pC141bp:~$ vi .ash_h*
tc@pC141bp:~$ cd *2
tc@pC141bp:~/libnpupnp-6.1.2$ mkdir ../libnpupnpx
tc@pC141bp:~/libnpupnp-6.1.2$ meson setup . ../libnpupnpx
The Meson build system
Version: 1.1.0
Source dir: /home/tc/libnpupnp-6.1.2
Build dir: /home/tc/libnpupnpx
Build type: native build
Project name: libnpupnp
Project version: 6.1.2
C++ compiler for the host machine: c++ (gcc 12.2.0 "c++ (piCore) 12.2.0")
C++ linker for the host machine: c++ ld.bfd 2.39
Host machine cpu family: arm
Host machine cpu: armv6l
Run-time dependency threads found: YES
Found pkg-config: /usr/local/bin/pkg-config (0.29.2)
Run-time dependency libcurl found: YES 8.0.1
Run-time dependency libmicrohttpd found: YES 0.9.70
Run-time dependency expat found: YES 2.5.0
Compiler for C++ supports arguments -Wno-deprecated-declarations: YES
Compiler for C++ supports arguments /D_CRT_SECURE_NO_WARNINGS: NO
Compiler for C++ supports arguments /wd4251: NO
Configuring upnpconfig.h using configuration
Configuring autoconfig.h using configuration
Build targets in project: 1

Found ninja-1.10.0 at /usr/local/bin/ninja
tc@pC141bp:~/libnpupnp-6.1.2$
tc@pC141bp:~/libnpupnp-6.1.2$ ninja -C ../libnpupnpx
ninja: Entering directory `../libnpupnpx'
#
# ( snip なんかごちゃごちゃいろいろが表示され1時間ぐらいかかる )
#
[28/28] Linking target libnpupnp.so.13
tc@pC141bp:~/libnpupnp-6.1.2$ sudo ninja -C ../libnpupnpx install
ninja: Entering directory `../libnpupnpx'
[0/1] Installing files.
Installing libnpupnp.so.13 to /usr/local/lib
Installing /home/tc/libnpupnp-6.1.2/inc/netif.h to /usr/local/include/npupnp/
Installing /home/tc/libnpupnp-6.1.2/inc/upnpdebug.h to /usr/local/include/npupnp/
Installing /home/tc/libnpupnp-6.1.2/inc/upnpdescription.h to /usr/local/include/npupnp/
Installing /home/tc/libnpupnp-6.1.2/inc/UpnpGlobal.h to /usr/local/include/npupnp/
Installing /home/tc/libnpupnp-6.1.2/inc/upnp.h to /usr/local/include/npupnp/
Installing /home/tc/libnpupnp-6.1.2/inc/upnptools.h to /usr/local/include/npupnp/
Installing /home/tc/libnpupnpx/upnpconfig.h to /usr/local/include/npupnp/
Installing /home/tc/libnpupnpx/meson-private/libnpupnp.pc to /usr/local/lib/pkgconfig
Installing symlink pointing to libnpupnp.so.13 to /usr/local/lib/libnpupnp.so
tc@pC141bp:~/libnpupnp-6.1.2$

さて。

/usr/local/lib/libnpupnp.so.13
/usr/local/include/npupnp/
/usr/local/lib/pkgconfig/libnpupnp.pc
/usr/local/lib/libnpupnp.so

以上、まとめたらいい(しかし、symlinkとか気にせず機械的にやってるけど大丈夫なのかな)。

tc@pC141bp:~$ mkdir libnpupnp
tc@pC141bp:~$ mkdir libnpupnp/usr
tc@pC141bp:~$ mkdir libnpupnp/usr/local
tc@pC141bp:~$ mkdir libnpupnp/usr/local/lib
tc@pC141bp:~$ mkdir libnpupnp/usr/local/lib/pkgconfig
tc@pC141bp:~$ cp -R /usr/local/lib/libnpupnp.so.13 libnpupnp/usr/local/lib
tc@pC141bp:~$ cp -R /usr/local/lib/pkgconfig/libnpupnp.pc libnpupnp/usr/local/lib/pkgconfig
tc@pC141bp:~$ cp -R /usr/local/lib/libnpupnp.so libnpupnp/usr/local/lib
tc@pC141bp:~$ mkdir libnpupnp/usr/local/include
tc@pC141bp:~$ cp -R /usr/local/include/npupnp libnpupnp/usr/local/include
tc@pC141bp:~$
tc@pC141bp:~$ mksquashfs libnpupnp libnpupnp-6.1.2.tcz
Parallel mksquashfs: Using 1 processor
Creating 4.0 filesystem on libnpupnp-6.1.2.tcz, block size 4096.
[===================================================================|] 1718/1718 100%

Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 4096
    compressed data, compressed metadata, compressed fragments,
    no xattrs, compressed ids
    duplicates are removed
Filesystem size 2731.54 Kbytes (2.67 Mbytes)
    39.84% of uncompressed filesystem size (6856.43 Kbytes)
Inode table size 3572 bytes (3.49 Kbytes)
    48.21% of uncompressed inode table size (7409 bytes)
Directory table size 232 bytes (0.23 Kbytes)
    64.09% of uncompressed directory table size (362 bytes)
Number of duplicate files found 0
Number of inodes 17
Number of files 9
Number of fragments 2
Number of symbolic links 1
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 7
Number of hard-links 0
Number of ids (unique uids + gids) 2
Number of uids 1
    tc (1001)
Number of gids 1
    staff (50)
tc@pC141bp:~$ md5sum libnpupnp-6.1.2.tcz > libnpupnp-6.1.2.tcz.md5.txt
tc@pC141bp:~$ ls
libnpupnp/               	libnpupnp-6.1.2.tcz
libnpupnp-6.1.2/         	libnpupnp-6.1.2.tcz.md5.txt
libnpupnp-6.1.2.tar.gz   	libnpupnpx/
tc@pC141bp:~$ sudo mv *tcz* /mnt/*2/tce/optional
tc@pC141bp:~$ sudo vi /mnt/*2/tce/onboot.lst
(# libnpupnp-6.1.2.tcz 書き込み)
tc@pC141bp:~$ rm -rf lib*
tc@pC141bp:~$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz Done.
tc@pC141bp:~$

次、libupnpp。

tc@pC141bp:~$ wget https://www.lesbonscomptes.com/upmpdcli/downloads/libupnpp-0.26.4.tar.gz
Connecting to www.lesbonscomptes.com (62.210.16.61:443)
saving to 'libupnpp-0.26.4.tar.gz'
libupnpp-0.26.4.tar. 100% |************************************************************|  123k  0:00:00 ETA
'libupnpp-0.26.4.tar.gz' saved
tc@pC141bp:~$ tar xf lib*
tc@pC141bp:~$ ls
libupnpp-0.26.4/    	libupnpp-0.26.4.tar.gz
tc@pC141bp:~$ cd *4
tc@pC141bp:~/libupnpp-0.26.4$ mkdir ../libupnpp
tc@pC141bp:~/libupnpp-0.26.4$ meson setup . ../libupnpp
The Meson build system
Version: 1.1.0
Source dir: /home/tc/libupnpp-0.26.4
Build dir: /home/tc/libupnpp
Build type: native build
Project name: libupnpp
Project version: 0.26.4
C++ compiler for the host machine: c++ (gcc 12.2.0 "c++ (piCore) 12.2.0")
C++ linker for the host machine: c++ ld.bfd 2.39
Host machine cpu family: arm
Host machine cpu: armv6l
Run-time dependency threads found: YES
Found pkg-config: /usr/local/bin/pkg-config (0.29.2)
Run-time dependency libnpupnp found: YES 6.1.2
Run-time dependency libcurl found: YES 8.0.1
Run-time dependency expat found: YES 2.5.0
Compiler for C++ supports arguments -Wno-deprecated-declarations: YES
Compiler for C++ supports arguments /D_CRT_SECURE_NO_WARNINGS: NO
Compiler for C++ supports arguments /wd4251: NO
Configuring config.h using configuration
Build targets in project: 2

Found ninja-1.10.0 at /usr/local/bin/ninja
tc@pC141bp:~/libupnpp-0.26.4$

tc@pC141bp:~/libupnpp-0.26.4$ ninja -C ../libupnpp
ninja: Entering directory `../libupnpp'
[32/35] Compiling C++ object libupnpp.so.16.p/libupnpp_smallut.cpp.o
In file included from /tmp/tcloop/gcc/usr/local/include/c++/12.2.0/vector:70,
             	from /tmp/tcloop/gcc/usr/local/include/c++/12.2.0/functional:62,
             	from ../libupnpp-0.26.4/libupnpp/smallut.h:25,
             	from ../libupnpp-0.26.4/libupnpp/smallut.cpp:18:
/tmp/tcloop/gcc/usr/local/include/c++/12.2.0/bits/vector.tcc: In member function 'void std::vector<_Tp, _Alloc>::_M_realloc_insert(iterator, _Args&& ...) [with _Args = {long long int&, long long int&}; _Tp = std::pair; _Alloc = std::allocator >]':
/tmp/tcloop/gcc/usr/local/include/c++/12.2.0/bits/vector.tcc:439:7: note: parameter passing for argument of type 'std::vector >::iterator' changed in GCC 7.1
  439 |   	vector<_Tp, _Alloc>::
  	|   	^~~~~~~~~~~~~~~~~~~
In member function 'std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {long long int&, long long int&}; _Tp = std::pair; _Alloc = std::allocator >]',
	inlined from 'bool MedocUtils::parseHTTPRanges(const std::string&, std::vector >&)' at ../libupnpp-0.26.4/libupnpp/smallut.cpp:1136:29:
/tmp/tcloop/gcc/usr/local/include/c++/12.2.0/bits/vector.tcc:123:28: note: parameter passing for argument of type '__gnu_cxx::__normal_iterator*, std::vector > >' changed in GCC 7.1
  123 |       	_M_realloc_insert(end(), std::forward<_Args>(__args)...);
  	|       	~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[35/35] Linking target libupnpp.so.16
tc@pC141bp:~/libupnpp-0.26.4$
tc@pC141bp:~/libupnpp-0.26.4$ sudo ninja -C ../libupnpp install
ninja: Entering directory `../libupnpp'
[0/1] Installing files.
Installing libupnpp.so.16 to /usr/local/lib
Installing /home/tc/libupnpp-0.26.4/libupnpp/base64.hxx to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/log.h to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/log.hxx to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/soaphelp.hxx to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/upnpavutils.hxx to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/upnperrcodes.hxx to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/upnppexports.hxx to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/upnpplib.hxx to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/upnpputils.hxx to /usr/local/include/libupnpp/
Installing /home/tc/libupnpp-0.26.4/libupnpp/device/device.hxx to /usr/local/include/libupnpp/device/
Installing /home/tc/libupnpp-0.26.4/libupnpp/device/service.hxx to /usr/local/include/libupnpp/device/
Installing /home/tc/libupnpp-0.26.4/libupnpp/device/vdir.hxx to /usr/local/include/libupnpp/device/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/avtransport.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/cdircontent.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/cdirectory.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/conman.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/description.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/device.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/discovery.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/linnsongcast.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/mediarenderer.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/mediaserver.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/ohinfo.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/ohplaylist.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/ohproduct.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/ohradio.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/ohreceiver.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/ohsender.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/ohtime.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/ohvolume.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/renderingcontrol.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/service.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp-0.26.4/libupnpp/control/typedservice.hxx to /usr/local/include/libupnpp/control/
Installing /home/tc/libupnpp/meson-private/libupnpp.pc to /usr/local/lib/pkgconfig
Installing symlink pointing to libupnpp.so.16 to /usr/local/lib/libupnpp.so
tc@pC141bp:~/libupnpp-0.26.4$

ここでは、色々あるように見えるけど、

/usr/local/lib/libupnpp.so.16
/usr/local/include/libupnpp/
/usr/local/lib/pkgconfig/libupnpp.pc
/usr/local/lib/libupnpp.so

以上をまとめたらいい。

tc@pC141bp:~/libupnpp-0.26.4$ cd
tc@pC141bp:~$ mkdir libupnppx
tc@pC141bp:~$ mkdir libupnppx/usr
tc@pC141bp:~$ mkdir libupnppx/usr/local
tc@pC141bp:~$ mkdir libupnppx/usr/local/lib
tc@pC141bp:~$ mkdir libupnppx/usr/local/include
tc@pC141bp:~$ cp -R /usr/local/lib/libupnpp.so.16 libupnppx/usr/local/lib
tc@pC141bp:~$ cp -R /usr/local/lib/libupnpp.so libupnppx/usr/local/lib
tc@pC141bp:~$ mkdir libupnppx/usr/local/lib/pkgconfig
tc@pC141bp:~$ cp -R /usr/local/lib/pkgconfig/libupnpp.pc libupnppx/usr/local/lib/pkgconfig
tc@pC141bp:~$ cp -R /usr/local/include/libupnpp libupnppx/usr/local/include
tc@pC141bp:~$ mksquashfs libupnppx libupnpp-0.26.4.tcz
Parallel mksquashfs: Using 1 processor
Creating 4.0 filesystem on libupnpp-0.26.4.tcz, block size 4096.
[=================================================================|] 4731/4731 100%

Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 4096
    compressed data, compressed metadata, compressed fragments,
    no xattrs, compressed ids
    duplicates are removed
Filesystem size 8134.72 Kbytes (7.94 Mbytes)
    43.11% of uncompressed filesystem size (18867.71 Kbytes)
Inode table size 9406 bytes (9.19 Kbytes)
    46.36% of uncompressed inode table size (20288 bytes)
Directory table size 549 bytes (0.54 Kbytes)
    55.51% of uncompressed directory table size (989 bytes)
Number of duplicate files found 0
Number of inodes 45
Number of files 35
Number of fragments 16
Number of symbolic links 1
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 9
Number of hard-links 0
Number of ids (unique uids + gids) 2
Number of uids 1
    tc (1001)
Number of gids 1
    staff (50)
tc@pC141bp:~$ md5sum libupnpp-0.26.4.tcz > libupnpp-0.26.4.tcz.md5.txt
tc@pC141bp:~$
tc@pC141bp:~$ sudo mv *tcz* /mnt/*2/tce/optional
tc@pC141bp:~$ sudo vi /mnt/*2/tce/onboot.lst
(# libupnpp-0.26.4.tcz 書き込み)
tc@pC141bp:~$ rm -rf lib*
tc@pC141bp:~$ filetool.sh -b

次、upmpdcli。

tc@pC141bp:~$ wget https://www.lesbonscomptes.com/upmpdcli/downloads/upmpdcli-1.8.11.tar.gz
Connecting to www.lesbonscomptes.com (62.210.16.61:443)
saving to 'upmpdcli-1.8.11.tar.gz'
upmpdcli-1.8.11.tar. 100% |*******************************************************************|  614k  0:00:00 ETA
'upmpdcli-1.8.11.tar.gz' saved
tc@pC141bp:~$ tar xf upmpdcli*
tc@pC141bp:~$ cd *11
tc@pC141bp:~/upmpdcli-1.8.11$ mkdir ../upmpdcli
tc@pC141bp:~/upmpdcli-1.8.11$ meson setup . ../upmpdcli
The Meson build system
Version: 1.1.0
Source dir: /home/tc/upmpdcli-1.8.11
Build dir: /home/tc/upmpdcli
Build type: native build
Project name: upmpdcli
Project version: 1.8.11
C++ compiler for the host machine: c++ (gcc 12.2.0 "c++ (piCore) 12.2.0")
C++ linker for the host machine: c++ ld.bfd 2.39
Host machine cpu family: arm
Host machine cpu: armv6l
Found pkg-config: /usr/local/bin/pkg-config (0.29.2)
Run-time dependency libupnpp found: YES 0.26.4
Run-time dependency libcurl found: YES 8.0.1
Run-time dependency libmicrohttpd found: YES 0.9.70
Did not find CMake 'cmake'
Found CMake: NO
Run-time dependency jsoncpp found: NO (tried pkgconfig)

meson.build:22:8: ERROR: Dependency "jsoncpp" not found, tried pkgconfig

A full log can be found at /home/tc/upmpdcli/meson-logs/meson-log.txt
tc@pC141bp:~/upmpdcli-1.8.11$

え、cmakeがない、jsoncppがないとな。要るのか。
これでどうか。
tc@pC141bp:~/upmpdcli-1.8.11$ tce-load -wi cmake.tcz json-c.tcz json-c-dev.tcz
エラー。
jsoncppがないと。

json-glib.tcz json-glib-dev.tczもインストール。
tc@pC141bp:/etc/sysconfig/tcedir$ tce-load -wi json-glib-dev.tcz json-glib-dev.tcz
無理でした。
/home/tc/upmpdcli/meson-logs/meson-log.txt というのを読む。

CMake binary for 1 is not cached
CMake binary missing from cross or native file, or env var undefined.
Trying a default CMake fallback at cmake
Found CMake: /usr/local/bin/cmake (3.23.1)
# ( snip ) #
Preliminary CMake check failed. Aborting.
Run-time dependency jsoncpp found: NO (tried pkgconfig and cmake)

meson.build:22:8: ERROR: Dependency "jsoncpp" not found, tried pkgconfig and cmake

いろいろ悪足掻きして追加してみる。
tc@pC141bp:/etc/sysconfig/tcedir$ tce-load -wi json-glib-dev.tcz json-glib-doc.tcz json-glib-gir.tcz json-glib-locale.tcz
これでも無理。エラー、ついには環境依存との表示が出る。

実際、「jsoncpp」はTiny Coreだとリポジトリにtczがあるけど、piCoreには用意されていない。
今、メインシステムで使っているmpdサーバー(Tiny Core OS)にupmpdcliをインストールした時にも、jsoncppが足りなくて、後からインストールしたのだ。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20210321a.htm
upmpdcliのサイトにはjsoncppについて書いてないように思うが、皆、どうしてるんだろう。

そういうわけで、Ras Pi b+にupmpdcliをインストールする試みは行き詰まった。
jsoncppをソースからインストールとなってくるといよいよハードルが高く、根負けした。

以上で、撤退である。

inter mission

upmpdcliをインストールするには「jsoncpp」というライブラリが必要になる。
aarch64のリポジトリにはtczファイルが用意されているが、armv6、armv7、armv7lには用意されていない。つまり、Ras Pi 3B以下の機種へのインストールは、容易には出来ないということだ。

そういうわけで、とりあえず、b+をPPAP Back Endにしてみた。
しかし、ノイズが入ったり音が切れたりで、快適には使えない。B+ってこうだったっけ。昔はB2で運用してたんだっけか。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180301a.htm
昔のエントリーによると、period-sizeとbuffer-sizeを上げたらB+でもBack Endで使えるようだ。

やっぱり、3b+を使わないといけないかな、と思ったら、3b+のpiCore、aarch64のリポジトリにはnmap.tczがない。3b+以上の機種をPPAPで使うとしたら、ソースからインストールする必要がある。
いろいろ制約が多い。
そういれば、そういうこともあって、apu2に移行したような記憶が、、、どうだったかな。

さて、ということは、Roon BridgeとPPAP Back Endを一体にできるのは、うちにあるRas Piだと2bしかない、ということになる。
B+はRoon Bridgをインストールできない。
3b+はUPnP化、Roon Bridge化は出来たとしても、nmapをインストールできない。つまりmpdサーバーの3b+からUSBでDACに出力することになる。それで運用というのもありだけど、作るのが大変な割に、音質は期待できない気がする。

実は今回、Roon (RAAT)とPPAPの音質を比較したいというのが、当初の目的だった。そのためには、Roon Bridgeとncat、両方を動かせる機械を作りたい。同一の機械じゃないと比較ができない。
本当は、Roon ROCKとRoon Ready対応の製品じゃないと、Roonの真価は分からないのかもしれないが、まあ、やってみたいということだ。

Raspberry Pi 2b

そういうわけで、、、Ras Pi 2bに手を入れていく。

http://tinycorelinux.net/14.x/armv7/releases/RPi/
http://tinycorelinux.net/14.x/armv7/releases/RPi/piCore-14.1.0.zip

zipをダウンロードし解凍。
imgファイルをmicroSDに焼いて、cmdline.txt にhost=pC141b2と追記、config.txtを編集しイヤホンジャックを止めて、ラズパイに刺して電源を入れる。

ab@fedora-pb650g1:~$ ssh tc@192.168.1.77
The authenticity of host '192.168.1.77 (192.168.1.77)' can't be established.
ED25519 key fingerprint is SHA256:QNgN5WKnnJhaFEsBAPWo1JOBLBVZtZRl+rVWl0BiduE.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.77' (ED25519) to the list of known hosts.
tc@192.168.1.77's password:
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)       	www.tinycorelinux.net

tc@pC141b2:~$
tc@pC141b2:~$ sudo fdisk -u /dev/mmcblk0

The number of cylinders for this disk is set to 120576.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p
Disk /dev/mmcblk0: 3768 MB, 3951034368 bytes, 7716864 sectors
120576 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes

Device   	Boot StartCHS	EndCHS    	StartLBA 	EndLBA	Sectors  Size Id Type
/dev/mmcblk0p1	128,0,1 	1023,3,16     	8192 	139263 	131072 64.0M  c Win95 FAT32 (LBA)
/dev/mmcblk0p2	1023,3,16   1023,3,16   	139264 	172031  	32768 16.0M 83 Linux

Command (m for help): d
Partition number (1-4): 2

Command (m for help): n
Partition type
   p   primary partition (1-4)
   e   extended
p
Partition number (1-4): 2
First sector (16-7716863, default 16): 139264
Last sector or +size{,K,M,G,T} (139264-7716863, default 7716863): +2G

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table
fdisk: WARNING: rereading partition table failed, kernel still uses old table: Device or resource busy
tc@pC141b2:~$
tc@pC141b2:~$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz Done.
tc@pC141b2:~$ sudo reboot

tc@pC141b2:~$ Connection to 192.168.1.77 closed by remote host.
Connection to 192.168.1.77 closed.
ab@fedora-pb650g1:~$ ssh tc@192.168.1.77
tc@192.168.1.77's password:
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)       	www.tinycorelinux.net

tc@pC141b2:~$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mmcblk0p2 is mounted on /mnt/mmcblk0p2; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p2 is now 524288 (4k) blocks long.

tc@pC141b2:~$

2bのRoon Bridgeは「Roon Bridge (armv7hf)」を使用。
前回エントリーに記載した手順で環境構築、インストールしていく。

tc@pC141b2:~$ tce-load -wi alsa.tcz alsa-utils.tcz alsa-plugins.tcz bash-dev.tcz bash.tcz curl.tcz

tc@pC141b2:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Audio [USB HiRes Audio], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
tc@pC141b2:~$

Pegasus DACを認識出来ている。

tc@pC141b2:~$ wget https://download.roonlabs.net/builds/RoonBridge_linuxarmv7hf.tar.bz2
Connecting to download.roonlabs.net (172.67.14.113:443)
saving to 'RoonBridge_linuxarmv7hf.tar.bz2'
RoonBridge_linuxarmv 100% |*************************************************************| 15.4M  0:00:00 ETA
'RoonBridge_linuxarmv7hf.tar.bz2' saved
tc@pC141b2:~$ tar jxf Roon*
tc@pC141b2:~$ ls
RoonBridge/                  	RoonBridge_linuxarmv7hf.tar.bz2
tc@pC141b2:~$
tc@pC141b2:~$ sudo RoonBridge/check.sh

Checking to see if RoonBridge can run on this machine

	Checking for Binary Compatibility                        	[   OK   ]
	Checking for ALSA Libraries                              	[   OK   ]

STATUS: SUCCESS

tc@pC141b2:~$ rm Roon*bz2
rm: remove 'RoonBridge_linuxarmv7hf.tar.bz2'? y
tc@pC141b2:~$

tc@pC141b2:~$ sudo vi /opt/bootlocal.sh
# ( write : /home/tc/RoonBridge/start.sh start )

tc@pC141b2:~$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz Done.
tc@pC141b2:~$ sudo reboot
tc@pC141b2:~$ Connection to 192.168.1.77 closed by remote host.
Connection to 192.168.1.77 closed.
ab@fedora-pb650g1:~$ ssh tc@192.168.1.77
tc@192.168.1.77's password:
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)       	www.tinycorelinux.net

tc@pC141b2:~$ pstree
init-+-bootlocal.sh---start.sh---mono-sgen-+-2*[mono-sgen]
 	|                                 	`-processreaper
 	|-sh
 	|-sshd---sshd---sshd---sh---pstree
 	|-udevd---2*[udevd]
 	`-udhcpc
tc@pC141b2:~$

Roon Bridge化、成功。タブレット端末のRoonアプリ上で、Roon Bridgeとして認識されている。音も出た。

続いて、PPAP Back-End化。

tc@pC141b2:~$ tce-load -wi nmap.tcz alsa-modules-6.1.68-piCore-v7.tcz alsa.tcz alsa-utils.tcz alsa-utils-locale.tcz
alsa-modules-6.1.68-piCore-v7 is already installed!
alsa is already installed!
alsa-utils is already installed!

# ( snip )

nmap、インストールした。
ここで試しにコマンドを打ってみる。

tc@pC141b2:~$ /usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=64 --buffer-size=512 -t raw -f cd"
/usr/local/bin/ncat: error while loading shared libraries:: cannot open shared object file: No such file or directory
tc@pC141b2:~$

libssl.so.1.1がないと言って、蹴られる。
http://tinycorelinux.net/14.x/armv7/tcz/
リポジトリを確認。openssl-1.1.1.tczというのがあるのでインストール。

tc@pC141b2:~$ tce-load -wi openssl-1.1.1.tcz
Downloading: openssl-1.1.1.tcz
Connecting to repo.tinycorelinux.net (128.127.66.77:80)
saving to 'openssl-1.1.1.tcz'
openssl-1.1.1.tcz	100% |***************************************************************| 1172k  0:00:00 ETA
'openssl-1.1.1.tcz' saved
openssl-1.1.1.tcz: OK
tc@pC141b2:~$
tc@pC141b2:~$ /usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=64 --buffer-size=512 -t raw -f cd"
^C
tc@pC141b2:~$

tc@pC141b2:~$ vi /opt/bootlocal.sh
( write : /usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=256 --buffer-size=512 -t raw -f S32_LE -r44100 -c2" )

tc@pC141b2:~$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz Done.
tc@pC141b2:~$
tc@pC141b2:~$ sudo reboot
tc@pC141b2:~$ Connection to 192.168.1.77 closed by remote host.
Connection to 192.168.1.77 closed.
ab@fedora-pb650g1:~$ ssh tc@192.168.1.77
tc@192.168.1.77's password:
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)       	www.tinycorelinux.net

tc@pC141b2:~$

音は出るだろうか。、、、なんでか、動かない。mpdからの送信を受け付けないようで、ncmpcppで「paused」と表示される。
tc@pC141b2:~$ tce-load -wi openssl-dev.tcz alsa-plugins-dev.tcz
無効。
Roon Bridgeも動かない。
ということは、同一機械での併用は出来ないのか。
PPAPのコマンドを止めたら、Roon Bridgeは動くようになった。alsa出力を奪い合うんだろうか。
その割には、Roonを止めてもPPAPは動かない。
何しろ、うまくいかない。

しかたない。
Raspberry Pi 2bでRoon BridgeとPPAP併用は止めることにする。

Raspberry Pi 3b+

さて、3b+に、mpdとupmpdcliをインストールして、PCトランスポートとして動かしてみることにした。音質への配慮は2の次だ。UPnPPPAPは使わない。基本、アップサンプリングもしない(高度な処理はRas Piには負担が大きいからだ)。

まず、piCoreをダウンロード。3B+を使うことにするので、下記から落とす。バージョンは14.1。
http://tinycorelinux.net/14.x/aarch64/
http://tinycorelinux.net/14.x/aarch64/releases/RPi/piCore64-14.1.0.zip
imgファイルをmicroSDに焼いて、cmdline.txt にhost=pC141b3pと追記、config.txtを編集しイヤホンジャックを止めて、ラズパイに刺して起動。さすがに長いので、環境構築のコマンドは羅列で済ます。

sudo fdisk -u /dev/mmcblk0
filetool.sh -b
sudo resize2fs /dev/mmcblk0p2
tce-load -wi gcc.tcz gcc_libs.tcz gcc_libs-dev.tcz gcc_base-dev.tcz meson.tcz ninja.tcz squashfs-tools.tcz
tce-load -wi boost-dev.tcz boost.tcz pkg-config.tcz clang.tcz curl.tcz curl-dev.tcz libmicrohttpd.tcz expat2.tcz expat2.tcz expat2-dev.tcz
tce-load -wi alsa.tcz alsa-utils.tcz alsa-utils-locale.tcz alsa-plugins.tcz alsa-plugins-dev.tcz
tce-load -wi jsoncpp.tcz jsoncpp-dev.tcz

ここで問題が発覚。upmpdcliのインストールに必要な、libmicrohttpd がリポジトリにない。
ソースからインストールしないといけない。無しではいけないかな。
面倒だなあ、、、止めよう。

Raspberry Pi 2b again

2bを、2台にしよう。

Roon Bridgeは既に作ってある。
だから、ここではPPAP Back-Endを作る。

http://tinycorelinux.net/14.x/armv7/releases/RPi/piCore-14.1.0.zip
zipをダウンロードし解凍。
imgファイルをmicroSDに焼いて、cmdline.txt にhost=pC141b2-ppapBEと追記、config.txtを編集しイヤホンジャックを止めて、ラズパイに刺して電源を入れる。

ab@fedora-pb650g1:~$ ssh tc@192.168.1.77

# ( snip )

tc@192.168.1.77's password:
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)       	www.tinycorelinux.net

tc@pC141b2-ppapBE:~$ sudo fdisk -u /dev/mmcblk0

# ( snip )

The partition table has been altered.
Calling ioctl() to re-read partition table
fdisk: WARNING: rereading partition table failed, kernel still uses old table: Device or resource busy
tc@pC141b2-ppapBE:~$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz Done.
tc@pC141b2-ppapBE:~$ sudo reboot
tc@pC141b2-ppapBE:~$ Connection to 192.168.1.77 closed by remote host.
Connection to 192.168.1.77 closed.

ab@fedora-pb650g1:~$ ssh tc@192.168.1.77
tc@192.168.1.77's password:
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)       	www.tinycorelinux.net

tc@pC141b2-ppapBE:~$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mmcblk0p2 is mounted on /mnt/mmcblk0p2; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p2 is now 51200 (4k) blocks long.

tc@pC141b2-ppapBE:~$ tce-load -wi nmap.tcz alsa.tcz alsa-utils.tcz

# ( snip )

tc@pC141b2-ppapBE:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Audio [USB HiRes Audio], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
tc@pC141b2-ppapBE:~$
tc@pC141b2-ppapBE:~$ vi /opt/bootlocal.sh

# ( write : /usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=256 --buffer-size=1024 -t raw -f S32_LE -r44100 -c2" )

tc@pC141b2-ppapBE:~$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz Done.
tc@pC141b2-ppapBE:~$ sudo reboot

tc@pC141b2-ppapBE:~$ tce-load -wi openssl-1.1.1.tcz
tc@pC141b2-ppapBE:~$ sudo reboot

うっかりしてopenssl-1.1.1.tczを入れ忘れて、後からインストール。そうしたらちゃんと機能した。

結末

そんなわけで、うちではRaspberry Pi 2b が2台、メインシステムに加わった。Roon BridgeとPPAP Back-Endだ。
ちょっと、あれこれ賑やか過ぎる。そのうち、なんとかしよう。

あれこれやる合間に、久しぶりにRas Pi B+ / piCore7でmpdサーバーを作った。サブシステムに使う。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180103a.htm
上記の過去エントリーの作り方だと、うまくいかない。
リポジトリからgcc.tczとか諸々多数のライブラリをインストールすることになっているんだけど、今、現在の時点で、gcc.tczはダウンロードできない状態になっている。リポジトリ側の都合らしい。
mpdのインストール、リポジトリからするなら、gccとか余計なライブラリは要らない。
以下、自分用構築メモ備忘録、最小限。

http://tinycorelinux.net/7.x/armv6/releases/RPi/piCore-7.0.zip

dtparam=i2c=off,spi=off,i2s=on,i2c_vc=off
dtoverlay=hifiberry-dac

filetool.sh -b
vi /opt/.filetool.lst

vi /opt/bootlocal.sh

mkdir /mnt/music
mkdir /mnt/music/ariel
mkdir /mnt/music/titan
mkdir /mnt/music/x
touch /mnt/music/x/dummy.cue
chmod -R 777 /mnt/music

tce-load -wi alsa.tcz alsa-config.tcz alsa-doc.tcz alsa-dev.tcz alsaequal.tcz alsa-locale.tcz libcdio-dev.tcz libcdio.tcz curl.tcz curl-dev.tcz libsamplerate.tcz

tce-load -wi flac-dev.tcz flac.tcz libcue.tcz libcue-dev.tcz libmad.tcz mpg123.tcz lame-dev.tcz lame-doc.tcz lame.tcz faad2-dev.tcz faad2-doc.tcz faad2.tcz

tce-load -wi libmpdclient-dev.tcz libmpdclient-doc.tcz libmpdclient.tcz mpd-doc.tcz mpd.tcz

tce-load -wi libnfsidmap.tcz libnfsidmap-dev.tcz

vi .mpdconf

music_directory   "/mnt/music"
playlist_directory   "~/.mpd/playlists"
db_file   "~/.mpd/database"
log_file   "~/.mpd/log"
pid_file   "~/.mpd/pid"
state_file   "~/.mpd/state"
sticker_file   "~/.mpd/sticker.sql"
auto_update   "no"
#auto_update_depth "3"

audio_output {
type   "alsa"
name   "My ALSA Device"
device   "hw:0,0"   # optional
mixer_type   "software"   # optional
## mixer_device    "default"   # optional
## mixer_control   "PCM"   # optional
## mixer_index   "0"   # optional
}
# samplerate_converter   "Fastest Sinc Interpolator"
# audio_buffer_size   "8192"
# buffer_before_play   "20%"
# audio_output_format   "192000:24:2"

filesystem_charset   "UTF-8"
id3v1_encoding   "UTF-8"


mkdir .mpd
mkdir .mpd/playlists


vi .ashrc

# alias ariel="sudo mount -t nfs 192.168.1.120:/ariel /mnt/music/ariel"
# alias titan="sudo mount -t nfs 192.168.1.80:/titan /mnt/music/titan"

alias ariel="sudo mount -o addr=192.168.1.120,nolock -t nfs 192.168.1.120:/ariel /mnt/music/ariel"
alias titan="sudo mount -o addr=192.168.1.80,nolock -t nfs 192.168.1.80:/titan /mnt/music/titan"
Posted at 21:54 in audio_diary | WriteBacks (0) | Edit Tagged as: , , ,

Apr 28, 2024

Logitech Media ServerのUPnP pluginとmpdの設定を見直した

とりあえず、今現在の最終設定をキャプチャ。mpd.confの設定なんて、本気で弄ったの何年ぶりだろう。

上がLMSのUPnPプラグイン、下がmpdだ。
ちなみに、LMSサーバーは、Mac mini 2010 mid、OSはFedora 39。
mpdサーバーは、HP Probook 450 G9 (CPU:i7-1255U)、OSはTiny Core 64 14.0。

問題になったのが、下記の音源。これが、ギャップレス再生しない。音が途切れる。
https://deezer.page.link/JWaU5YtNL56SjPmy7
スリープ マックス・リヒター
204曲 8時間24分 2015/09/04

うちのシステムでは、ストリーミングの音源によって処理しやすい、しにくいがあるらしく、特定の音源、特定の場所でノイズが乗るとか途切れるとかすることがある。libsamplerateでアップサンプリングするので、サーバーへの負荷が高いのが影響しているかもしれない。

そうした音源でも、このたびLMSサーバーが、HP 2570p(一部壊れかけ)のDaphileからMac miniのFedoraに変更になって、ちゃんと聴けるようになったのがいくつか確認出来ている。だから環境は良くなっているはずなんだけど、上記音源はギャップレス再生すら出来ない。
あろうことか、曲の途中で止まって飛んだりノイズが入ったりもする。
mpdの負荷を減らすためにアップサンプリングを止めるというのも考えられるが、この音源のためだけにそんなことをする気になれない。
試しにmpdの負荷が少なくなるようにアップサンプリングの設定を「best」から「fastest」に変えてみたけど、改善しない。

そんな状況で、うまく再生出来たのは、WiiM miniだった。
つまり、LMSサーバー、mpdサーバーを経由しなければ、支障なく鳴らせる(とはいえ、長時間になったらどうなるか分からないけど。音源8時間全部を鳴らしたわけではない)。

ストリーミングだと音切れ、ノイズが出るけど、ダウンロードした音源だと出ないということがある。そこで、ダウンロードしてみた。
https://www.prestomusic.com/classical/products/8518548--sleep
Max Richter: Sleep
FLAC(CD quality, 44.1 kHz, 16 bit)
204トラックで8時間半。発売は2018年。Deezerのストリーミングに使われているのと同じだと思う。
NASに保存して鳴らしてみたら、ストリーミングよりはずっとましだけど、たまに途切れる。NAS音源でこんなのは初めてだ。

上記よりも早く2015年に、CD、Blu-ray Audioと同時に発売となっているハイレゾ音源もある。ハイレゾを買うとCD同等の音源やmp3などダウンロードできるようだ。
https://www.prestomusic.com/classical/products/8079217--max-richter-sleep-8-hour-version
Max Richter: Sleep (8 hour version)
Hi-Res FLAC (lossless, 96 kHz, 24 bit)
全部で31トラック。これは、204トラックだと音楽が切れるところが繋がっているので、ストリーミング音源と再生時の条件が異なる。

この音源を何とかしようと、UPnPプラグインとmpd.confの設定変更で対応した。

UPnPプラグインのほうは、HTTP mode を「no length」、Cashe を「memory」、Streaming options の Delayを「0」に。
Audio format to UPnP player で、Transcode を「none」。

mpdは、audio_buffer_size を「65536」(KiBなので、64MiBということになる)。
buffer_before_play を「80%」。

このあたりが肝かな。うちで手応えがあるのがこの辺ということだ。
いつからか分からないが、mpdで「buffer_before_play」を100%に設定出来なくなっている。80%が最大値だ。バージョンは0.20.20。
audio_buffer_sizeの最大値は「131071」。128MiB未満ということだ。

audio_buffer_sizeを大きくしたときの問題は、音を出すときに出音に時間がかかることだ。再生ボタンをクリックして音が出るまでの時間が長くなる。
128MiBにしたらストリーミング音源の再生開始に30~40秒。ちなみにNAS音源の再生だと、そこまでの時間はかからないが、20秒ほど。
mpdサーバーでtopを動かしてmpdの状況を見てみると、挙動にかなり余裕があるようだ。なのに、曲の途中で止まる。音が途切れたら、再会するのに10数秒かかったりする。うーん、、、 ということで64MiBにして様子を見ている。

64MiBだと、かなりいける。
しかしそれでも、音切れが皆無にはならない。
他の音源は問題ないんだがなあ、、、他音源の音は、以前より良くなった気がする。

ここまでやってなんだけど、案外、Deezerサーバー側の問題なのかも、と思ったり、LMSサーバーの性能を上げたら解決したりしないかな、などと考えている。
しかし問題になるのはこの音源だけだし、当面、これでいいかなと思っている。

Posted at 13:53 in audio_diary | WriteBacks (0) | Edit Tagged as: ,

Nov 10, 2023

mpdサーバーに銅メッシュを仕込んでみる(17日、追記)

最近、オーディオサーバーのノイズ対策に、筐体内に銅メッシュを仕込むというのを試みている。

まずPPAP Back-End、Middle-Endときて、Daphileサーバー2台に仕込んだ。
次に、mpdサーバーに仕込む。
mpdサーバーはPPAP Frontであり、UPnPレンダラーでもある。うちではそういう構成で運用している。

まず、テスト用mpdサーバー。
機種は、Hp Elitebook 820 G2。中古のノートPCだ。OSはTiny Core 64 11.1。
仕込み中の写真は撮り忘れた。
銅メッシュはキーボードの裏側に置ければ良かったんだけど、分解の手間が多い。本体の底面側を開けるのは簡単なので、そこに絶縁用の藁半紙と一緒に設置した。GNDはファンの縁の地金に銅メッシュを押し付けて取ることに。
気になるのは、銅メッシュの設置位置が筐体の空気吸入孔に重なるので、冷却機能に影響しないかということ。あまり温度が上がるようなら、設置場所を再検討しないといけない。

前回エントリーと同様の方法で、温度を確認した。
3秒ごとの数値を5分間計測しtxtファイルに打ち出し、それを集計し電卓等を使って平均値を出す。

tc@box:~$ watch -t -n 3 cat /sys/class/thermal/thermal_zone0/temp > temp.txt
[ab@fedora1 Documents]$ awk '{sum+=$1}END{print sum}' temp.txt

44438 (min:44000 max:45000)

音を出していないときの温度は、若干、上がった。風通しが悪いからか、、、

次に、音楽を鳴らしてどうなるか確認した。
ちなみに前エントリー以降、温度計測に際して音源に使っているのは下記CD box、1枚目CDのリッピングflacファイル。NAS音源だ。
Quator Danel - Shostakovich - The Complete String Quartets
https://www.discogs.com/release/8599892

Fastest、192kHz
47926 (min:47000 max:50000)

Fastest、768kHz
51383 (min:48000 max:58000)

Medium、768kHz
57876 (min:51000 max:65000)

Best、192kHz
56093 (min:53000 max:62000)

銅メッシュをつける前と比べたら、若干温度は下がっているのかな。どうだろう。

音質はどうなのか。
Medium、768kHzで鳴らす。
ぐっと、良くなった、気がする。何より色合いが濃くなって力強くなった。以前のテスト系 Medium 768kHzは、メイン系のBest 384kHzと比べたら、良く言えばスマートでモニター的だが線が細い印象だったんだけど、厚みが出てきた。

NAS音源でメイン系と比較してみる。libsamplerateの設定が違うので、音は違う。しかし差異はかなり小さくなった気がする。ブラインドでの聞き分けは、僕には出来ないだろう。

ストリーミング音源はどうだろうか。上述した音源は、Deezerにもある。
以前より、ずっと良くなっていると感じる。
NAS音源との比較では、差はある。比較したらNASの方がキレが良くて生命力が強いのだ。若干、情報量も多いような気がする。しかし、以前よりも差は減った。ブラインドで当てるのは、かなり聞き慣れた音源でないと難しそうだ。

テスト系とメイン系で、ストリーミング音源再生を比較してみる。
設定が違うので音も若干違うが、NAS音源のときと同様、音色の濃さがほぼ同等になった。
テスト系の音は、以前はクールで淡白な感触だった。それが銅メッシュを組み込んでからは、熱を帯びて鳴るようになっている。音色がメイン系に近付いて、色合いが濃くなったような感じだ。同時に、余音のような、音と音の間を埋めるような音が、より明瞭にリアルになった感触がある。
なんというか、これだけ聴いていたら、ストリーミングだけで何が不満なのか、という感じに鳴っている。

ここでテスト系とメイン系、mpdの設定を同じにして比較してみる。
メイン系をテスト系に合わせて、Medium 768kHzに。これはテスト系サーバーにとっては相当重く、メイン系サーバーにとっては比較的軽い操作だ。
音源はストリーミング。
温度だけ見たら、テスト系は20℃近く、メイン系は15℃弱ぐらい上がるようだ。
音は、メイン系の方に余裕があるようで僅かに反応が早い。ブラインドでは分からないんじゃないかな。
以前は、ここまで僅差ではなかった。それでも、この微妙な差は、もしかしたら重要な感じで、響きの美しさはメイン系の方が僅かに良いのかな。

ストリーミング音源使用時の温度。
前述のCDリッピング音源と同じ作品の、Deezer音源を使用した。下記が結果。

Fastest、192kHz
49952 (min:49000 max:51000)
Fastest、768kHz
53644 (min:51000 max:61000)
Medium、768kHz
60738 (min:53000 max:68000)
Best、192kHz
57295 (min:52000 max:63000)

やはり、温度は上がっている。UPnPの負担が増えているので当然か。
そういえば、銅メッシュなしのとき、ストリーミングでどうだったか、記録してないな、、、
銅メッシュを外して、ストリーミングで鳴らしてみた。結果は下記。

Fastest、192kHz
47786 (min:47000 max:49000)
Fastest、768kHz
53748 (min:51000 max:62000)
Medium、768kHz
60738 (min:53000 max:69000)
Best、192kHz
58291 (min:54000 max:64000)

温度はメッシュを付けているときよりも低いときがある。前回エントリーで挙げた、NAS音源を鳴らしていたときよりも低いときもある。銅メッシュで温度が下がるというのが、怪しくなってきた。筐体の蓋を開閉した直後に測ったせいかもしれないが、関係ないかもしれない。本当はもっと繰り返しデータを取るべきなんだろうが、そこまで取り組む根気はない。

銅メッシュを外すと、音は良くも悪くもクールになる。奥行、深みは少ないが、これはこれで、そんなに悪くはない。すっきりしていて涼しくて淡麗だ。しかし比較し評価するなら、メッシュがあるほうがいい。
温度を表にしておく。

無音 Fastest、192kHz Fastest、768kHz Medium、768kHz Best、192kHz
NAS 44000 47267 53019 59670 58452
Deezer 47786 53748 60738 58291
NAS (Cu+) 44438 47926 51383 57876 56093
Deezer (Cu+) 49952 53644 60738 57295

さて、次はメイン系mpdサーバーの処理だ。

他のサーバーに比べたら新しい。
機種は、Hp Probook 450 G9。OSはTiny Core 64 14.0。
作業に入る前に、銅メッシュなしの状態で温度のデータを取る。
mpdの設定は、Best、384kHzで固定。そのかわり、音を出してるときのデータは、4回取る。

音を出していないとき
47000 (min:47000 max:47000)

NAS音源
70896 (min:69000 max:73000)
71262 (min:64000 max:75000)
71705 (min:65000 max:75000)
71514 (min:70000 max:74000)

ストリーミング音源
71442 (min:66000 max:75000)
71252 (min:68000 max:74000)
71292 (min:69000 max:74000)
71609 (min:68000 max:74000)

以上、時系列。
NAS音源を鳴らし始めて3分後からデータをとり始めたけど、ちょっと早いのかもしれない。10分ぐらい待った方がよさそうだ(テスト系のときは数10分後から測り始めている)。

意外だったのは、テスト系ではストリーミング音源で温度が上がる傾向があったのに、メイン系では上がらないことだ。NASとストリーミングの音質の差と温度の差に相関関係がありそうだと思っていたのだけど。

いや、考えてみたら上流のデジタルデータを受け付けているmpdサーバーで、データが同じなのに(まあ、調べたわけじゃないけど、同じだと思うんだよね、、)、上流のサーバーが違ったら発熱量が違うほうが、本当はいけないのだ。
でもそこは、ジッターの差によって、負荷が違うのだろうと想像していた。
メイン系は新しい機種で性能も上で、処理能力が大きいので温度差が出ないのだろうか。

テスト系の音を聴き直してみる。設定は、Medium、384kHz。
たしかにNASとストリーミングでは音質に差があり、聴き比べたら、テスト系よりもメイン系の方が音質差は少ない。しかし少ないながらも、音質の差はあるのだ。CPUの温度には現れないレベルということなのだろうか。
そして、驚いたこと。
テスト系より、メイン系の方が、音が乾いて聴こえるのだ。テスト系の方が生々しい気がする。

テスト系を768kHzで鳴らしてみる。音の雰囲気が変わり、こうなると、メイン系との比較が出来なくなった。

メイン系に銅メッシュを仕込む。
筐体の底板を開けるのは比較的簡単。銅メッシュを仕込む隙間もある。
しかし、簡単にGNDがとれない。丸形端子をネジ止めできたらいいんだけど、意外に適当な使えるネジがない。銅メッシュにケーブルを半田付けし、その先の丸形端子を筐体の地金にテープで貼ることにした。
こんな感じ。

電源を入れ、しばし放置して温度を測る。

音を出していないとき
46000 (min:46000 max:46000)

NAS音源
70991 (min:69000 max:74000)
71154 (min:64000 max:74000)
72029 (min:70000 max:75000)
71775 (min:64000 max:74000)

ストリーミング音源
71775 (min:62000 max:75000)
70706 (min:56000 max:74000)
72010 (min:64000 max:75000)
72282 (min:71000 max:74000)

銅メッシュを設置する前より、温度はむしろ、上がっているかな。
音質はどうなのかというと、あんまりぱっとしない。良い方に変化した感じはしない。しかし、それより問題があって、なんだかサーバー自体が安定しない感じがするということだ。Daphileからのコントロールが不安定な感じ。
なにしろ、上手く行っていない。

温度が上がるのは良くない。
銅メッシュのサイズが大きすぎて冷却が上手くいっていないのかもしれないと考えて、メッシュの量を半分にして、やや小ぶりに、薄くした。細い針金を編んでいるので、切れ端から銅線がこぼれないように注意が必要だ(コンピューターに入れるので、切れ端が変なところに紛れ込んではまずいと思う)。

音はむしろ、そのほうが良いようだ。
硬い感じがとれて色彩感も出てきた。

温度を再計測。

音を出していないとき
47000 (min:47000 max:47000)

NAS音源
72375 (min:70000 max:75000)
71825 (min:67000 max:75000)
71571 (min:70000 max:74000)
71867 (min:64000 max:75000)

ストリーミング音源
71896 (min:69000 max:76000)
71328 (min:64000 max:74000)
72049 (min:69000 max:75000)
71961 (min:66000 max:75000)

温度は、あんまり、変わらない。
音はというと、それでも、どうにもすぐれない。
いくつか音源を聴くうちに、濁りがあるように感じられてきた。ベールのように霞みが掛かっている。そのせいか、見え方が違ってくる。遠くまでとどかないのだ。
副作用の方が強い。
銅メッシュを外す。
見通しの良い、以前の音が戻ってきた。

しかし、こうなってくると、テスト系の音も慎重に評価しないといけない。
何らかの歪みが、逆に心地良く聴こえているのかもしれない。GNDにものをつなぐときには注意が必要だ。しばしば反応は鋭敏でいいことばかりではない。
それにしても、2台の違いはどこから生じているのだろう。

ともあれ、しばらく、様子を見ていく。

17日、追記。さて、現状のシステムを聴き続けているのだけど。
なんというか、悪くない。

懸念したテスト系の音質悪化はない。こんなならいいかな、という感じで、メイン系mpdサーバーで生じたような不具合は感じられない。メイン系はもとのまま、変わらない状態で機能している。
音の安定感はある。

そういうわけで、引き続き様子を見ていく。

Posted at 23:28 in audio_diary | WriteBacks (0) | Edit Tagged as: , , ,

Oct 31, 2023

アップサンプリングの設定を変えてmpdサーバーの負荷を減らしてみる

現在のうちの環境では、Daphileでmpdサーバーに送るDeezerの音は、同じCD水準のデータでもNAS音源の音には及ばない。

前回のエントリーで、ストリーミング音源はupmpdcliがボトルネックになっていると考えたら、mpdサーバーへの対策が有効ではないか、銅メッシュをmpdサーバーのノイズ対策に使えば負荷が減るのではないか、と考えた。
ここでふと、mpdの負荷を減らしたいなら、アップサンプリングしなければいいんじゃないか、と思い付いた。

Daphileからmpdに送られるのは44.1kHz/16bitのPCMだ。それを何もせずPPAPで送れば、どう聴こえるだろう。
mpdサーバーの負担は減ると思う。
過去に試したときは、アップサンプリングした方が良かった。
今はどうだろう、ストリーミング、いや、UPnP音源だったら、どうなのか。

もともと、僕がアップサンプリングを使うようになったのは、コンピューターをオーディオに使い始めた頃に、SRC2496という機器を使ってアップコンバートして鳴らしていたことがある。これは音が良くなった。あと、壊れかけたNASの音源は、mpdによる非力なアップサンプリングでも音が良くなった。

こうしたことから、ジッターが多い環境では、アップサンプリングしたほうが音が良いのではないか、という仮説を思い付いた。なんでアップサンプリングで音が良くなるんだろう、というところから考え始めている。
つまり、そうした現実の理由付けとして考え始めた仮説だ。

そのうち、アップサンプリングと一言で言ってもいろんな手法があり、音も違うことが分かった。
手法で音が違うということは、DACに入力されるデータが異なっているということだ。
そして、DACチップ内でアップサンプリングするという知識も得る。

アップサンプリングによる音質改善の根拠は、DACチップ自体でアップサンプリング(オーバーサンプリング)するより、良質なアップサンプリングが出来る高スペックのPC等で代行したほうが良いという説明に、比重が移った。
というか、世の中でそういう説明が見られるようになった。
SRC(libsamplerate)などを使って良質なアップサンプリングを行うと音が良くなるのはなぜなのか、という問いの答えが、DACチップはナイキスト定理通りの理想的なDA変換が出来ないのでオーバーサンプリングして精度を高めるより他なく、DACへのデジタル入力前に、より良質なアップサンプリングを行うことが可能なら、そのほうがDA変換の精度が上がるから、ということに現在はなっている。
というのが僕の理解。

音の情報量自体はCDで充分だが、DA再生で充分な精度を出すには技術的限界があるから、理論だけで固めた理想論では済まない。だから高品質なアルゴリズムでアップサンプリングすることが有効ということだ。
精度が要らないなら、この限りではない。精度が出てなくても良い音はざらにある。精度が出ていさえすれば良いというものでもない。

そういうわけでアップサンプリングの品質は重要だと思うけど、ジッターを如何にして減らすかも同時に重要だ。
以前は、アップサンプリングすることでジッターの影響を少なく出来るのではと考えていたけど、今はそれだけで事足りるとは考えない。
ジッター対策は音色に効いてくる気がする。
というか、映画に例えてみると、サンプリング周波数やビット深度がフィルムの大きさ、つまり情報量に影響し、ジッター対策はピントに効いてくるとでもいうか、出てくる音の鮮度、色彩感、陰影に影響する。
両方を高めるのが、今のデジタルオーディオで高音質を得る近道だと思う。

正攻法は、安定して高精度なクロックだ。
しかしクロックを生かすには、ノイズや電源の対策が必須になる。ノイズや電源の上でクロック素子が動いているからだ。当然、デジタル信号そのものも、それらの上で動いている。デジタルで01だと言っても実体は電圧変動なのだから、ノイズや電源の影響を受けないわけがない。その影響こそがジッターということだ。

話が広がりすぎか。話を戻す。
何が言いたいのかというと、アップサンプリングを止めることで、音質は低下する。
しかしmpdサーバーの負担、仕事量が減るので、ジッターの減少、音質の向上に繋がるのではないか、ということ。

逆も言えることで、アップサンプリングを行えば音質は向上する。
しかしmpdサーバーの負担、仕事量が増えるので、ジッターの増加、音質の低下に繋がる。

では、どうすれば一番良い音になるのか、良好なバランスとなるのはどんな設定なのか、という考え方だ。
実際に聴いてみて、確かめるしか術はない。

さて。
うちでは2台のmpdサーバーが動いていて、1台はメイン使用で384kHzへのアップサンプリング用、もう1台はテスト用兼768kHzへのアップサンプリング用になっている。なんでわざわざ2台なのかというと、そのほうが設定切り替えの手間がないからだ。
PPAP Back-Endで両方の設定に対応するコマンドが動いていて、どちらのFrontからでも直ぐに音を出すことが出来る。
Back-Endでtopを打つとこんな感じ。

Mem: 93208K used, 3936688K free, 18376K shrd, 5560K buff, 34180K cached
CPU:  0.0% usr  0.0% sys  0.0% nic 99.9% idle  0.0% io  0.0% irq  0.0% sirq
Load average: 0.00 0.00 0.00 2/109 1319
  PID  PPID USER 	STAT   VSZ %VSZ CPU %CPU COMMAND
 1318  1290 tc   	R 	4016  0.1   0  0.0 top
 1208  1092 root 	S	15484  0.3   0  0.0 /usr/local/bin/ncat -kl 4400 -e /usr/local/bin/aplay -D hw:0,0 -M --period-size=2048 --buffer-size=16384 -t raw -f S32_LE -r384000 -c2
 1242 	1 tc   	S	15484  0.3   1  0.0 /usr/local/bin/ncat -kl 4444 -e /usr/local/bin/aplay -D hw:0,0 -M --period-size=4096 --buffer-size=32768 -t raw -f S32_LE -r768000 -c2
 1286  1202 root 	S 	5872  0.1   0  0.0 sshd: tc [priv]

まず、テスト用サーバーの設定をいじって、アップサンプリング無しの音を出すことにした。
mpdサーバー(Front)をアップサンプリングしない設定に変更。
Back-Endでは、上記のtop表示だったら「kill 1242」で、テスト用のデータを受信するコマンドを止める。
改めて以下、コマンドを打つ。

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=64 --buffer-size=512 -t raw -f cd" &
うまくいかない。
音が出るまで時間が掛かり、音が出始めた後のコントロール、音量の調整や再生停止などの操作にすごく時間がかかる。数十秒もかかる。768kHzのデータの方が重そうなのに何でなのか、考えるうちに、もしかしたら、バッファーの設定が影響しているのではと思い付いた。

メインサーバーからのデータを受けるコマンドはrootで起動。テスト用サーバーからのはtc(ログインユーザー)で起動している。
コマンドは2つだが、aplay自体は、もともとひとつだ。

音源がCD同等だと、バッファーの数値はずっと小さくなる。音源データが小さいのでコマンドの設定もそれに合わせている。
しかしメイン用の方はもともと、大きい数値がバッファーに振られている。
多分、テスト用からの音源を鳴らしている時も、メイン用のコマンドが同時に動いているから、バッファーの設定がそっちのまま、大きいままなのではないか。
CD相等の音源にとって、それは過剰なバッファーとなる。
結果、操作に対する反応が遅くなる。mpdサーバーの出音を止めても、バッファーに溜まったデータが切れるまで、暫く音が出続けるのだろう。それが20秒前後にもなる。

どうするか。
そもそもの目的、サーバーの負荷を落とすということなら、アップサンプリングの「質」の設定を落とせばいいという考えもある。
テストサーバーのlibsamplerateの設定は「Medium」なので「Fastest」にしたら負荷は下がる。
そしてメインの384kHzに近い値で低めに設定したら、バッファー数値の影響は回避できないだろうか。
ままよ、やってみた。

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=1024 --buffer-size=8192 -t raw -f S32_LE -r192000 -c2" &

これだと反応の遅れは数秒で、使用に耐える。
音色は良い。
768kHzよりも艶っぽい気がする。
しかし情報量は少なくなる。音像間で分離していた空間が、グラデーションで埋まる。まあ、768kHzと192kHzでは、デジタルデータの情報量は4倍の差があるので、仕方がない。768kHzは良くも悪くもモニター的になる。これは、どちらがいいのかという話になりそう。
テスト用といいながら僕が768kHzで鳴らす環境を維持しているのは、これはこれで捨てがたい面があるからだ。

しかし192kHzだと、USB-HDD音源とストリーミング音源の音の差は、かなり縮まったような気がする。
いや、ほんまかいな、と自分でも思うけど、たぶん縮まってるんじゃないかな(でも、こういうときの自分ってあてにならないんだよな、、)。
Fastest、192kHzの設定だけで比較したら、もうストリーミング中心でいいかもと思うかもしれない。

Back-Endで、メイン用の設定のほうを見直すという方法論もある。
大きいバッファーを小さく出来たら、テスト系への影響を小さく出来るのではないか。

そもそもなぜ、「--period-size=2048 --buffer-size=16384」という設定になっているのか、記憶にない。
たぶん、アップサンプリングするmpdサーバーの増大したバッファーの設定に、合わせて増やしただけだと思うのだ。
減らせるかもしれない。
とりあえず、「--period-size=512 --buffer-size=2048」まで減らした。
問題なく音は出ている。あらー、、、

この状態で、テスト系のアップサンプリングをやめて、まともに使えるかどうか、試してみる。
音の出方は、以前よりは良くなった。
しかし、不安定だ。途切れやすい。
mpdサーバーの方を調整。「audio_buffer_size」を増量、"2048"に。多少は安定したが、再生停止に10秒程かかる。
なんでかわからんが、mpdが音源データをどんどん先走って取り込んでいるようなのだ。Daphileなどのインターフェイスで見ると、曲の時間表示が実際よりもどんどん先に進んでいく。
これでは困る。

結局、多少はアップサンプリングしないと安定しないという、よくわからない状態で、今回はけりをつけることにした。
libsamplerateは「Fastest」、負荷軽減優先だ。
サンプリング周波数は、とりあえず192kHz。
テスト系を受けるBack-Endの設定は「--period-size=256 --buffer-size=2048」に、今はしている。
なんだか、あちこちバランス取りながらの設定で、詰めきれないままのことが今までにもよくあったような気がする。

気のせいかもしれないけど、Fastest、192kHzは、昔よりも良い音が出ている気がする。
ノイズ対策などを経て、ジッターが減っている分、改善があるのかもしれない。
USB-HDD音源とストリーミング音源の音の差も、Fastest、192kHzだったら前述したとおり、差異が少ない。なんとなく、バランスがいい音という印象で安心感がある気がする。

もともと、差異が少なければいいというものではない。
ストリーミングの音を底上げするにはどうしたらいいか、というところから始まった話だ。
しかしここに来て、設定による音の違いは無視できないような気がしている。ノイズ対策が落ち着いたら、どのような設定でどのような音になるのか、ゆっくり時間がある時に、確認したいと思うが、設定の要素が多いので、比較すると言っても単純な話ではない。
大仕事になる。あんまり突っ込んだことはしないかもしれない。

最後にちょっと、温度の比較(CPUだと思うんだけど、はっきりしない)。
テスト用サーバーでコマンドを打って確認してみた。

tc@box:~$ cat /sys/class/thermal/thermal_zone0/temp
44000

こんな感じ。
ただ、今回確認してみて、音を出している時の温度は、かなり変動することが分かった。負荷が多いときは上がるのだろう。

データ取得のために下記コマンドを使用。
5分間のデータを取得する。

tc@box:~$ watch -t -n 3 cat /sys/class/thermal/thermal_zone0/temp > temp.txt

数値だけ得られるならよかったんだけど、行頭に余計な文字列が付くのが残念。
このファイルを、普段使いのノートPCに移して、エディタで要らない文字列を削除して、下記のコマンドで数値を合計して、電卓で平均を計算する(小数点以下は四捨五入した)。
せっかくLinux使ってるんだから、もう少しスマートにやれそうだけど、スキルがない。

[ab@fedora1 Documents]$ awk '{sum+=$1}END{print sum}' temp.txt
44000

Fastest、192kHz
47267 (min:47000 max:48000)

Fastest、768kHz
53019 (min:47000 max:58000)

Medium、768kHz
59670 (min:51000 max:65000)

一番上は音を出していないとき、続いて、それぞれの設定で音を出したときの温度だ。
アップサンプリングの設定、負荷の違いで大きく温度が違うのが分かる。
驚いたのは、音を出していないときの温度は、ずっと44000で5分間一定だったこと。そういうものなんだろうか。あと、負荷が少ないと温度の変動も小さい。

メイン用サーバーは、Best、384kHzの設定で固定している。こっちも少し測ってみた。
データは載せないが、テスト用よりも若干温度が高いようだ。

早々に追記だけど、テスト用サーバー下記設定でデータを取ってみた。
アップサンプリングの周波数が低いと、温度の変動が少ないのかな。負荷の大きさとの関連は小さいのか。どうなんだろう。

Best、192kHz
58452 (min:57000 max:62000)
Posted at 14:55 in audio_diary | WriteBacks (0) | Edit Tagged as: , , , ,

May 24, 2023

HP Probook 450 G9, mpd, libsamplerateで高品質アップサンプリングを試みる(6月1日、4日、追記)

前回のエントリーでは、TC64-11.1 mpdサーバーをHP Probook 450 G9で動かした。
どこまでやれるか試しているのだが、ここで問題がある。

カタログ上、450 G9のCPUは最高4.9GHzで動く筈だが、3.7GHzまででしか動いてくれない。
インテルのCPUにはターボ・ブースト・テクノロジーというのがあって、負荷がかかると自動的にクロック周波数を上げるのだけど、それが充分に機能してない?ようなのだ。
原因が分からない。

ネット上で調べたところ、原因として考えられるのは、熱の問題、電力の問題、BIOSのバグ、これらは該当しないだろう。
あと、AVX2、AVX-512のような遅いSIMDがクロックを下げるとか。
これはよく分からない。アクティブなコアが増加するとクロック周波数の上昇率が下がるということらしいが、mpdサーバーで動いているプロセスは少ない。
ほとんどのコアは仕事をしてないようにすら見えるので、これも違う気がする。

うちのmpdサーバー EliteBook 820 G2の状況をメモ。

tc@box:~$ grep MHz /proc/cpuinfo
cpu MHz		: 2886.755
cpu MHz		: 2831.833
cpu MHz		: 2697.611
cpu MHz		: 2694.282

tc@box:~$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
powersave
powersave
powersave
powersave

tc@box:~$ grep 'model name' /proc/cpuinfo
model name	: Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz
model name	: Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz
model name	: Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz
model name	: Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz
tc@box:~$ 

powersaveで動いている。
CPUは2.30GHzだが、動くときには2.8GHz以上で動いている。i5-5300Uのターボ・ブースト利用時の最大周波数は2.90 GHzであり、ブーストが機能している。
(powersaveでもブーストは効くんだね)

そういうわけで、Probook 450 G9のi7-1255Uでターボ・ブーストが機能しない?のが残念な状況だ。
正直、買って試してみないと分からないな、というのはあったので想定内といえばそうなんだけど、820 G2で動いてるんだから多分いけるだろう、と甘い判断をしたわけだ。、、

Probook 450 G9をmpdサーバーとして動かしてみたときの状況。

tc@box:~$ grep MHz /proc/cpuinfo
cpu MHz		: 2608.375
cpu MHz		: 2643.276
cpu MHz		: 3700.000
cpu MHz		: 3700.000
cpu MHz		: 820.543
cpu MHz		: 1357.115
cpu MHz		: 2889.705
cpu MHz		: 1141.198
cpu MHz		: 2205.000
cpu MHz		: 2569.790
cpu MHz		: 1859.254
cpu MHz		: 888.040

tc@box:~$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
powersave
*snip*

tc@box:~$ grep 'model name' /proc/cpuinfo
model name	: 12th Gen Intel(R) Core(TM) i7-1255U
*snip*

tc@box:~$ 

こんな感じで3.7GHzが上限になっている様だ。なんでかねえ、、、

https://www.intel.co.jp/content/www/jp/ja/products/sku/226259/intel-core-i71255u-processor-12m-cache-up-to-4-70-ghz/specifications.html
インテル® Core™ i7-1255U プロセッサー

上記のインテルのサイトによると、
Performance-coresの数 2、Efficient-coresの数 8
Performance-core最大ターボ・フリークエンシー 4.70 GHz
Efficient-core のターボ・ブースト利用時の最大フリークエンシー 3.50 GHz
とある。

https://xtech.nikkei.com/atcl/nxt/column/18/02268/111800001/
最新のインテルCPU、第12世代Coreシリーズは何が違うのか
日経クロステック 2022.12.12

上記記事によると第12世代のインテルCPU、つまりi7-1255Uは、PコアとEコア、2種類のコアを積んでいると。
高い性能が必要な処理はPコア、負荷は低いが常時実行するような処理はEコアが向いているそうだ。
性能を重視した従来のCPUコアがPコアであり、性能よりも電力効率を重視したのがEコアで物理的サイズはPコアの4分の1と。
そんな構造なので、スレッドごとの処理を適切なコアに割り振る「スレッド・ディレクター」というのがCPUに組み込まれていて、負荷が高い処理はPコアに振り分けされるらしい。

実際、topでの挙動を見ると、mpdの処理は専ら「CPU0」と「CPU2」、2つのスレッドが代りばんこに受け持っているようだ。CPU0~3がPコアのスレッドなのかな。
これは、4つのスレッド全てでリレーする、820 G2のi5-5300Uの挙動とは異なる。
しかしそれなら、4GHz以上で動いてもいいと思うのだが、、、

ネット上を調べていたら、CPUの動作クロックを設定する「cpufreq」というツールがあり、Tiny Core 11では「cpupower.tcz」という形でリポジトリ上にあるらしいということが分かった。
インストール。

tc@box:~$ cpupower
Usage:	cpupower [-c|--cpu cpulist ]  []
Supported commands are:
	frequency-info
	frequency-set
	idle-info
	idle-set
	set
	info
	monitor
	help

Not all commands can make use of the -c cpulist option.

Use 'cpupower help ' for getting help for above commands.

tc@box:~$ cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 400 MHz - 4.70 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 400 MHz and 4.70 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 405 MHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes
tc@box:~$ 

tc@box:~$ sudo cpupower frequency-set -g performance
Setting cpu: 0
Setting cpu: 1
Setting cpu: 2
Setting cpu: 3
Setting cpu: 4
Setting cpu: 5
Setting cpu: 6
Setting cpu: 7
Setting cpu: 8
Setting cpu: 9
Setting cpu: 10
Setting cpu: 11

tc@box:~$ cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 400 MHz - 4.70 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 400 MHz and 4.70 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 657 MHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes
tc@box:~$ 

tc@box:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance

「powersave」を「performance」に変更。
これで、CPUがパフォーマンス優先にセットされた。

これでどうかというと、やはり、3.7GHzまで。
どうしたものかな、と思いながら使っていたら、ときに3.7GHzより少し上が出る。コンスタントには出ない。しかし、どうやら出せないわけじゃないんだろうなと。

そこで、BIOS関係で節電に関する設定を調整してみることにした。

ネット上に公開されているHPのマニュアルから引用。
HP PC Commercial BIOS (UEFI) Setup
Administration Guide
For Commercial Platforms using HP BIOSphere Gen 7-9 2020 -2022

5.9 Power Management Options Menu
Runtime Power Management When checked, enables the processor to run at lower frequencies (P-states) when higher performance is not needed. When unchecked, the processor always runs at maximum frequency.
Extended Idle Power States When checked, enables the processor to rest in lower power states (C-states) when idle.
Power Control When checked, enables the notebook to support power management applications such as IPM+ that help enterprises reduce power costs by intelligently managing the battery usage of the notebook.
Battery Health Manager Sets charging policy based on optimizing for battery life or for battery duration. The possible settings are:
• Maximize my battery health
• Let HP manage my battery charging

しかし設定できる項目が少ない。こんなもんなのかなあ。
ネット上の日本語マニュアルは古いので英語の方を読む。日本語版には書いてないようなことが書いてある。

とりあえず、下記のように設定してみた。

Runtime Power Management on → off
Extended Idle Power States on
Power Control on → off
Battery Health Manager Let HP → Maximize

設定変えたら、ほとんど動いていなかったEコアたちが一斉に動きだし、音が途切れるように。
Pコアに重要な仕事を降るということをしなくなったようだ。
変更した設定を戻していく。
Power Controlを「on」に。

Pコアに仕事を降るようになった?ようだが、それでも音が途切れる。

tc@box:~$ cpupower frequency-info
analyzing CPU 0:
  no or unknown cpufreq driver is active on this CPU
  CPUs which run at the same hardware frequency: Not Available
  CPUs which need to have their frequency coordinated by software: Not Available
  maximum transition latency:  Cannot determine or is not supported.
Not Available
  available cpufreq governors: Not Available
  Unable to determine current policy
  current CPU frequency: Unable to call hardware
  current CPU frequency:  Unable to call to kernel
  boost state support:
    Supported: no
    Active: no
tc@box:~$ 

tc@box:~$ grep MHz /proc/cpuinfo
cpu MHz		: 841.518
cpu MHz		: 1462.869
cpu MHz		: 1700.000
cpu MHz		: 1703.346
cpu MHz		: 634.992
cpu MHz		: 1034.485
cpu MHz		: 1013.223
cpu MHz		: 1197.852
cpu MHz		: 1119.194
cpu MHz		: 977.032
cpu MHz		: 1196.461
cpu MHz		: 1198.542
tc@box:~$ 

なんか、すごく上手くいってないっぽい。IntelのCPUだという認識が出来ていない。
クロック周波数も上がっていない。

Runtime Power Managementを「on」に戻す。
Power Controlを「off」に。
これで、まともに音が出るようになった。

tc@box:~$ cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 400 MHz - 4.70 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 400 MHz and 4.70 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency: Unable to call hardware
  current CPU frequency: 966 MHz (asserted by call to kernel)
  boost state support:
    Supported: yes
    Active: yes

tc@box:~$ sudo cpupower frequency-set -g performance
Setting cpu: 0
Setting cpu: 1
*snip*

tc@box:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance
tc@box:~$ 

これで700kHz台を出そうとしたが、やはり10秒ほどでぶちぶち途切れる。
300kHz台だと問題なく音が出る。
音が出ているときのCPUのクロック周波数の上限は3.7GHz付近で変わらない。
まともに音が出ていないときは、クロック周波数も上がっていない、ということがある。ここの辺り挙動が謎だ。

ちょっと気になったのが、BIOSの説明書に出てきた「IPM+」というもの。
電源管理を行うソフトらしい。
Windowsで起動したら設定できるらしいので、セキュリティブートを有効にしてWindowsを起動し確認してみたら、インストールされていないようだったので、ほっとくことにする。

結局、BIOSの電源関係はあまり関係ないように思われた。

もしかして、Tiny Core OSの問題?とも思ったりもするが、調べてもはっきりしないし、確信もない。

この件は、当面、保留である。

そういうわけで、HP Probook 450 G9 mpdサーバーは、libsamplerateの設定を「Best Sinc Interpolator」、アップサンプリング設定を384kHzで動かしている。

そこそこ余裕を持って動いているように見える。
というのは、topで見るとmpdを担当するCPU0、CPU2、2つのスレッドがともに休んでいる時間がそこそこ見えるからだ。
比較したら、820 G2でMedium、768kHzで動かす方がもっと余裕がある挙動で動く。
Bestの設定は、やはり相当、重いのだと思う。

音はそれに見合うものがあると思うのだけど、音質の確認は流し聴きだけで、十分にはしていない。
音源によってはリアリティがMedium、768kHzより高いと思う。
Medium、768kHzと、Best、192kHzだと、どっちがいいかは好みにもよるかも、みたいな感じだった。これらも真剣に比較しないまま今に至ってるんだけど、Best、384kHzは、それらの水準を超えると思う。

今後、余裕がある時に確認していこうと思う。
課題はいろいろ残っているけど、無理せず、焦らず、という感じ。

6月1日、追記。
なぜCPUのクロック周波数が3.7GHzまでしか上がらないのか。
結論からいうと、Tiny Core OSが原因だった。
TC64-11.1のカーネルは5.4.3。これが古かったのだ。

TC64-14のカーネルは6.1.2。「corepure64」と「vmlinuz64」をコピー&ペーストで入れ替え、mpdサーバーのOSをバージョンアップしてみた。こういうやり方はソフトが上手く動く保証がないけど、簡単に出来る。動けば恩の字だ。

mpdはちゃんと動いた。
CPUも、4.7GHzで機能した。新しいCPUだから新しいカーネルが必要だったのだろう。

しかしlibsamplerate、Bestの設定を使った700kHz台へのアップサンプリングは、音が途切れて無理だった。
実際、300kHz台で鳴らした時点で、なんとなく予想はしていた。3.7GHzでなんとかなるレベルだから、700kHz台で動かすなら最低でも5GHz以上が必要じゃないかと思った。それでも無理かもしれない。

今回のOSのバージョンアップで問題だったのは、sshが使えなくなったことだ。mpdサーバー本体のキーボードから操作せざるを得なくて少し面倒だった。しかし、そう複雑なことはしてないので出来たという感じ。
sshが使えるようだったらサーバーを入れ替えたかもしれない。今回はそうはせず今までのまま、TC64-11.1で運用継続だ。入れ替えは暇が出来たらということになる。

6月4日、追記。
sshは、openssh.tczをTC14のリポジトリから再インストールしたらつながるようになった。
そういうわけで、めでたくサーバーは入れ替えた。今のところ、問題ないように見える。CPUも4.7GHz近くで動いている。

May 18, 2023

最新ノートPCで起動できるTiny Core 64 mpdサーバーを過去の資産の切り貼りで作る

今月は、TC64関係のエントリーを2つ上げている。
HP Probook 450 G9で起動できるTC64-14を作るところまでこぎつけた。
今回は、450 G9でmpdサーバーを動かそう、というものだ。

動かすといったって、いちからmpdなどなどをインストールしてサーバーを構築しようというのではない。けっこう大仕事なので、そこまでする余裕はない。
現在、使っているTC64-11.1 mpdサーバーと同じものを、450 G9で動かそうということだ。

もちろん、そのままでは起動できない。
ブートローダーが新しいBIOSである「UEFI」に対応してないからだ。
しかし、Tiny Core Linuxというのは、かなり融通無碍なディストリビューションだ。
タイトルにあるように、過去の資産を使って、動くものを設えようというのが今回の話。
そんなに長い話にならない。

準備するのは、
1) インストールするためのUSBメモリ、1つ。
2) 現在のPCオーディオシステムに使っているmpdサーバーTC64-11.1のイメージファイル。
3) 先日作った450 G9で起動できるTC64-14のイメージファイル。

さて、手順だ。

上記の2)、3)を日常使いのPC(うちのOSはFedora)上に準備する。
(今回の場合、2)は過去にバックアップしたimgファイルがある。3)も先日作ったのをパーティションイメージとして保存している。)

USBメモリを日常使いのPCに刺し、インストールするパーティションを作る。
mpdサーバーのimgファイルの大きさは500MB強なので、1GBもあれば十分以上。
使うソフトはユーティリティの「ディスク」。
ファイルシステムは「FAT」を選択。
パーティションが出来た時点で、自動的にシステム上にマウントされファイルブラウザに表示される。ここにmpdサーバーをインストールしていく。

次に、mpdサーバーTC64-11.1のイメージファイルを「ディスクイメージマウンター」でマウントする。ファイルブラウザ上に表示されたimgファイルアイコンを右クリックで、メニューからアプリ選択するので手軽で簡単だ。
マウントしたmpdサーバーTC64-11.1のボリュームから、「tce」フォルダをコピー、USBメモリの1GBのボリュームにペーストする。

次に、TC64-14のイメージファイルを同様にしてマウントする。
マウントしたTC64-14のボリュームから、「EFI」フォルダと「syslinux.cfg」をコピー、USBメモリの1GBのボリュームにペーストする。

以上で出来上がりだ。
450 G9でブートできる。

こういうコピー&ペーストでOSインストールする方法は、Tiny Coreの入門書に書いてある。
http://tinycorelinux.net/book.html

過去にこうしたやり方は何回か試みたことがあったんだけど、なぜかついぞ上手くいったことが無かった。
だから今回、これで動くようなので、僕自身がびっくりしている。
(ファイルシステムに無頓着だったから上手くいかなかったのかもしれない)

そのうち、暇が出来たら使ってみようと思う。
しかし、使えるのかな、これ、、、

(使えました、、取り敢えずBest Sinc Interpolatorで384kHz、この音はいいかもしれない、、、)

Posted at 21:51 in audio_diary | WriteBacks (0) | Edit Tagged as: ,

May 10, 2022

DVDドライブで聴くCDの音が良いような

うちではCDを聴くのにノートPCにUSB接続したDVDドライブを使っている。
ノートPCといってもTiny Core 64 / mpdをインストールしたPPAPフロントエンドだ。つまり音の出口はうちのメインシステム。
普段、CDはリッピングしてflacにしてNASに置いて鳴らしているんだけど、リッピングができていないときにDVDドライブを使って直接にCDから聴いている。

しかし使い始めた当初から、なんだかこれが音が良いような気がすると思っていた。
ブラインドで分かるとは思えないし、プラセボだろうと思っていたんだけど、その割には何時の間にかリッピング前にCDで聴いてみるということが増えてきた。単にリッピングが面倒だからという説明で納得していていいのか、、、そんなことを考えるようになった。

そういうわけで、ちょっと踏み込んで考えてみようという気持ちになったということだ。
差異があるのはPPAP Frontサーバーだ。
様相を表にしてみる。
mpdがどのように動いているのか、比較する。

strage plugininput plugindecorder pluginoutput plugin
Daphile / UPnPcurlcurlpcmpipe
NAS / TCP IPlocalfileflacpipe
CD Drive / USBudiskscdio_paranoiapcmpipe

mpdの前段の処理が三者三様で異なっていることが分かる。
plugin以外の要素も加えて図にする。

Dophile / UPnP

UPnPを使うときはupmpdcliが同時に動いている。topでみたらVSZ %VSZが大きくて、仮想メモリを1.5GBぐらい確保しているようだ。何に使っているのか分からないけど。
DaphileにUPnPのサーバーとコントロールポイントを宛てているのは、Daphileのコントローラーであるウェブブラウザがコントロールポイントというのはどうもしっくりこなかったからだ。ウェブブラウザとDaphileがUPnPでつながっているわけではないと思うので。
スマホアプリのSqueezerとか使ってコントロールする場合はどうなのかな、あれもUPnPとは違うのではなかったかと思うのだけど。

NAS / TCP IP

NASから鳴らす場合はnfsが働いているんだけど、昔の経験ではNASのマウントはけっこう重い。甘っちょろいNASはマウントの負担で動かなくなることがある。
UPnPを使う場合よりは図面がすっきりしている。

CD Drive / USB

USB DVD/CDドライブを使う場合は、cdio、dbusあたりが働くのではないかと思うんだけど、よく分からない。しかし何が動いてるにせよ、アドレスの処理とかの負担が少ない分、たぶんLANを通すより軽いのではないだろうか。
mpcは軽いクライアントで殆ど無視できると思うので、LANはPPAP Middle Endへの出力にほぼ専念できるのではないか。

これだけ違ったら、音の良し悪しの判断はともかく、音が違っていたとしてもおかしくないということかな。、、、
いや、音が違っておかしくないということはない。
なぜ違うんだろうというのは疑問として残る。

同じデジタル音源で同じ再生機器であっても、OSで音が違う、再生ソフトで音が違うというのは、しばしば聞く話だ。
しかしデジタル信号としては同じものだ。
(うちはmpdでアップサンプリングするので厳密にいつも同じなのかと問われたら同じ計算してるとしたら同じ結果になるんじゃないかなとしか答えられないんだけど、ビットパーフェクトで鳴らす場合にも実際にそういうことであるわけで)

同じ信号でも音が違うというのは、アナログレコードだったら当たり前のことだと思ってしまう。
しかし、アナログ的に厳密に同じ環境にして鳴らした場合、音の聴き分けは難しいのではないだろうか。
デジタルのCDは、最初は同じCDは同じ音がすると言われた。
アナログはちょっとしたことで変わるけどデジタル信号は01で変わらないからと。
現実、そうは聞こえないと言ったら、機械が悪いとか聞く者の耳が悪いとか言われたものだ。

実際のところ、撲なんかは今でも、同じデジタル信号で同じ音がしないことに、どこか納得できない気分を抱えている。これは何なのか。若い頃に、デジタルは同じ音がしないはずが無いということを叩き込まれたせいなのか?

なんというかな、、、
あれだけ「同じ音だ」と言っていた人達は、今は何処で何をしているのか。
理屈は分からないけど同じ音がするはずがないんだよ、だってデジタル信号といったって電気っていうのはアナログな存在だからね、などと言っても、僕は何だかそれでは気が済まない。

そう、実際にすっかり同じ音が出るようにした上で、「ほら、ここまでのことをしないとデジタルで同じ音は出ないんだよ。あなたたちが言ってたことってすごく底が浅くていい加減で視野狭窄で考えも研究も足りなかったってことが分かったかい?」というふうに言ってやりたいのだと思う。
まあ、無理なんだけど。
デジタルだから同じなんて言ってたけど、今思えば底が浅くていい加減で視野狭窄で考えも研究も足りなかったと思う、と言ってるオーディオ関係者を見たことが無いので、そんな気分になるのかな。

今の状況は「コンポが良くないから音が同じにならないのだ」で済んでしまう。
ソフトで音が変わるなんて、どこかおかしい機械をお使いなんですね、とか。
それって昔と同じじゃんね?

いったいなにをうだうだいってるのか。
要するに、アプリだプラグインだを通すうちに音が変わるのは現実としてあっても理屈が伴っていなくて気持ちが悪いと言いたいのだろう。
ジッターが違うんだろうだけではいまいち足りない気がする。
アプリの違いによって、どのようなジッターが生まれ、どのようにして音に影響するのか、それが説明されないと分からない。

ここらはアナログ的な何かだろう。
というかデジタルな問題ではない。
ソフトウェアが動くことでコンピューターの中でアナログ的な何かが生じているはずだ。瞬間的にではなく、音に影響するぐらい持続的に生じていて、それがソフトウェアによって異なり、デジタル音声データに乗っかって転送され、DA変換の何処かに影響する。
そう考えないと、現実に起きていることの説明がつかない。
だってデジタル信号としては同じなのだから。
僕が思い付くのは、プラグインの動作に周期的に継続して現れる01の並びがあって、これに伴う周期的な電圧変動がクロックを揺らし周期的なジッターとなる、これがデジタル信号に乗って伝送される、周期的な変動だから音に乗る、とか。

まあ、僕なんかが出来るのはこんなふうに取り留めなく妄想じみた思考をすることばかりで、現実には研究できる人にしっかりやってもらうしかないわけだけど。
なんか、今回は要するに愚痴みたいな感じになった。どうなってんだろう。おかしいなあ、、、

Posted at 10:42 in audio_diary | WriteBacks (0) | Edit Tagged as: , , ,

Oct 31, 2021

カーステレオにRas Pi2+piCore7+MPD+i2s DAC (追記 10月31日、11月03日)

早々に追記。
このエントリーに書かれていることは、再現性がない。
何がどうなっているのやら、、、

もはや自分でもどうやって作ったのかわからないので、バックアップをGoogleに上げておく。
うちのHDDが飛んだりしたら紛失してしまうことになるので。
どうなってるのか見たいという人がおられたら、好きなようにしてくださればいいと思う。

https://drive.google.com/file/d/13eVisGZTRs3syI9z7cQ-2pC7SebC2f0Z/view?usp=sharing

うちのカーステレオ用音楽プレーヤーとして使っているBlackberry Bold 9000が最近あやうい。
というのは、内蔵電池が膨れてきている。
そのせいで本体の蓋が閉まらない。それでも使えて音も出るけど、じきに使えなくなるだろう。

交換用の電池は一応ネット上で売っているけど、何時売られなくなるか分からないし、過去には使ったら本体を壊した電池もあった。別の意味で危ういのだ。博打である。

当時、本体が壊れたので、普通の音楽プレーヤーで代替になれる製品を探したんだけど、試聴できた範囲ではいいのがなかった。音が良くないのと、操作性が良くないのと。
音が良いのになると高価になる。Bold 9000の中古が8千円で手に入るのに、数万以上で使いにくいプレーヤーを買う選択枝はなかった。

9000は物理キーから触覚で操作できるので、カーステレオ用として非常に使い易い。
必要となれば、ボタン1つで鳴っている音楽の曲名なども液晶画面に表示出来る。曲のランダム再生も、本体の電源を入れて諸々の操作で5秒以内で音楽が流れ出す。物理キーとトラックボール、いちいち目で見て確認しなくても出来てしまう。

しかし今や、9000は中古も売ってない。
あと、入手してもOSのバージョンアップが出来ないかもしれない。昔はなんとかしてやっつけたが、やり方を正確には覚えていないのだ(うちのサイトに備忘録があるんだけど、殆ど役に立たなかったんだよね、、)。
使い易くするにはバージョンアップしないといけないんだけど、これが出来ないかもしれないとなれば、、、

そういうわけで、代替機を作ることにした。
引き出しの奥で眠っているRaspberry Pi 2と、i2s DAC、piCore7 + MPD 0.19.9、追加投資はバッテリーぐらいで、なんとかしようというのだ。
少々梃子摺って、問題もないではないが、なんとかなった。

11月3日、書き忘れていたのに気付いたので追記。Raspberry Pi 2には無線機能がないので、USB HiFi アダプターにバッファローのWLI-UC-GNMを使っている。10年前の機材だ。
https://kakaku.com/item/K0000115107/

コンセプトはこんな感じで。

1.車のRCA入力端子につなぐ
2.電源オン・オフはコード(USBケーブル)の接続で行う
3.操作はWiFiでスマートフォンから行う(piCoreをAPモードで動かす)
4.USBメモリに収めた音源をランダム再生する

うちの車は、運転席左後ろの収納ボックス内にカーステレオのRCA入力端子が付いている。
9000は、専用のケーブルを自作して、イヤホン端子からRCA端子につないでいた。
ふつうのケーブルだと太すぎて、9000本体を収納ボックスから出せないのだ。出せなかったら操作できない。収納ボックスの蓋を開きっぱなしにしていたら運転の邪魔になる。そんなわけで、極細のRCA-イヤホン端子のケーブルが必要になったということだ。
Ras Piはスマホから操作するので、収納ボックス内に置いてかまわない。i2s DACと普通のRCAケーブルでつなげばいいということになる。

piCoreは電源コード抜去で電源を落としても大丈夫なOSなので、今回はなんとしてでも使うことにした。
車から降りるときにプレーヤーをシャットダウンする必要があるんだけど、raspbianベースのOS(例えばVolumioなど)だと、OSにログインしてシャットダウンの操作をしなければならない。手順を踏んでシャットダウンしないとOSが壊れるからだ。
その場で電源を落とせるほうが使い易い。piCoreはこういった用途に適している。

音声再生の操作はスマホからWiFiでアクセスして行う。
piCoreを所謂APモードで起動するのだが、過去に何回か手を付けたけど、分からなくて途中で投げてばかりだった。ネット上にはpiCoreでやってるケースは見つけられなかった。Raspbianベースで同様のことをやってる作例はあるのだけど、それでも随分参考になった。

操作性は、9000と比べたら低下している。
WiFiでRas Piとつなげて(これはスマホに自動設定できるけど)、MPDクライアントを起動し、音楽フォルダを選択してプレイリストに登録して再生、ランダム設定、、、
画面を見ながらじゃないとできないことがあれこれとある。たぶん操作に慣れても30秒はかかるのではないか。
あとアートワークを表示しない。これはMPD 0.19の仕様上、仕方がないのだけど。

うだうだ書いてきたけど、実際に行った建付けは右往左往だったけど、出来た結果を整頓して分かりやすく備忘録にしておこう。

参考にさせていただいたサイトは下記。多謝。他にも参考にしたけど忘れた。

https://itmedia.co.jp/news/articles/2008/14/news042.html
https://qiita.com/JhonnyBravo/items/5df2d9b2fcb142b6a67c
https://katona.hatenadiary.org/entry/20071101/p2
http://flac.aki.gs/bony/?page_id=1085
https://wiki.archlinux.jp/index.php/Music_Player_Daemon
http://kitatokyo2013.blogspot.com/2014/02/picoreplayerip.html
http://soramimi.jp/raspberrypi/mpd/
https://qiita.com/hoto17296/items/2e638fa28597b18505cd
https://gadget-live.net/raspberry-pi-self-made-router/
https://raspida.com/wifi4raspbian
https://herb.h.kobe-u.ac.jp/raspiinfo/raspiAP.html
https://armadillo.atmark-techno.com/blog/615/1830

piCore7はここからダウンロードした。
http://tinycorelinux.net/7.x/armv7/releases/RPi2/

piCore7を使う理由は、MPDのインストールが楽だから。
うちで余っているRas PiはB+と初期型の2なので、B+だったらarmv6、初期型2だったらarmv7となる。
3B+も1台予備があるんだけど、piCore7は対応していない。新しいバージョンのpiCoreだとMPDをソースからインストールしないといけないので、けっこうな手間なのだ。

ダウンロードしたイメージをマイクロSDカードに焼いて、i2s DACの設定を書き込み、Ras Piに刺して家庭内有線LANにつないで起動。パーティションを拡張。
ここら詳細は過去のエントリーを参照のこと。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180103a.html
piCore7にmpdをインストールする方法

今回、完成後のonboot.lstは下記。

mc.tcz
openssh.tcz
wifi.tcz
firmware-rtlwifi.tcz
firmware-ralinkwifi.tcz
usbutils.tcz
net-usb-4.1.13-piCore_v7+.tcz
net-usb-4.1.20-piCore_v7+.tcz
hostapd.tcz
dnsmasq-doc.tcz
dnsmasq.tcz
rfkill.tcz
libmpdclient.tcz
libmpdclient-dev.tcz
mpd.tcz
alsa.tcz
alsa-config.tcz
alsa-dev.tcz

このリストにあるtczを、tceでインストールしていけば、関連のライブラリ等も含めて同等のものが出来る筈だ。
mc.tczとopenssh.tczは最初からインストールされている。それ以降のtczをインストールしていけばいい。
MPDをインストールしたらalsa関連も一緒にされるものと思い込んでいたら、されなかったので最後に追加でインストールしている。実際にi2s出力で必要かどうかは分からないが、一応入れている。

APモード関連

まずAPモードの設定から。

起動時にAPとなるRas PiのIPアドレスを固定するには、/opt/bootsync.shに「wlan0.sh」の設定をしておく必要がある。
下記、記載。

/home/tc/wlan0.sh &

/home/tc/wlan0.sh に、wlan0の設定を記述する。
下記の記載で、RasPi-APが「192.168.2.1」になる。

pkill udhcpc
ifconfig wlan0 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255 up
route add default gw 192.168.2.1
echo nameserver 192.168.2.1 > /home/tc/resolv.conf

/home/tc/resolv.conf に下記記載。
(このファイルを削除したら、有線LANにつながらなくなる。どういう挙動なのかよく分からないが、、、)

nameserver 192.168.2.1

USB無線LANアダプターを刺して、認識しているかどうかを確認。

tc@box:~$ lsusb
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
Bus 001 Device 005: ID 0bda:0109 Realtek Semiconductor Corp. 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
tc@box:~$ 

ハードの認識はしている。しかし設定をしていない段階では認識していても動いていない。
/opt/bootlocal.sh にiwconfigでスイッチを入れるように設定。

iwconfig wlan0 power on

bootlocal.sh には、hostapd起動の設定も記載。
今回は、tcディレクトリに置いた設定ファイルをhostapdで読み込むようにする。

hostapd /home/tc/hostapd.conf -B

tcディレクトリに置いた設定ファイル、/home/tc/hostapd.confには、下記を記載。

interface=wlan0
ssid=RasPi-AP
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=abcdefghijkl
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

細々したことはよく分からないんだけど、無線LAN(wlan0)を「ssid=RasPi-AP」で動かす設定。
wpa_passphraseは、スマートフォンからRasPi-APネットワークにログインするためのパスワードだ。

dnsmasqでDHCPの設定。
/home/tc/dnsmasq.conf に下記記載している。

interface=wlan0
dhcp-range=192.168.2.2,192.168.2.99,255.255.255.0,24h

udhcpcのdefault.scriptが何処にあるのか探したら、/usr/share/udhcpc/default.scriptが見つかった。中をみたら「RESOLV_CONF="/etc/resolv.conf"」と。
今回はtcディレクトリにresolv.confを置いているので、それを設定してやらないといけないのかな。
/home/tc/udhcpc.script を設定。「RESOLV_CONF="/etc/resolv.conf"」の記述を「RESOLV_CONF="/home/tc/resolv.conf"」に書き換えて設置、、、

実はこの辺り、、、なんでこんなことしたのか記憶がない。何を参考にしたのかもよく分からない。
しかし、/home/tc/udhcpc.scriptを外したらうまく動かなくなる。無線は動いてログインできるんだけど、有線LANがつながらなくなる(まあ、有線LANはカーステレオ使用には無用なんだけど、使える方がメンテしやすい)。なので、何かしているんだとは思うんだけど、、、

よく分からないところもあるが、これでRas PiのAPモードが動く。
APモードなんだけど、同時に有線LANの方も稼働しているので、LANケーブルをつなげばそっちからの設定変更やMPDクライアントでのアクセスも可能だ。
しかし、dnsmasq、udhcpc周りには問題があって(設定がおかしいからだと思うが、、、)、APからクライアントにアドレスが配布されない。クライアント側のスマートフォンで固定IPにすれば運用上の支障はないので、当面このままで使うつもり。

MPDの設定

MPDは、Ras Pi起動と同時に自動起動させる。
これがなぜか、今までのうちでのやり方で上手くいかなかった。ネット上にはrootでは起動しないと書いてあったり(そうなの?!、、、)。
なので、/home/tc/.profile の末尾にコマンドを記載することで起動させるようにした。

/usr/local/bin/mpd /home/tc/.mpdconf

mpd.confは/home/tc/.mpdconfで設定。下記の通り。

music_directory "/mnt/music"
# playlist_directory "/mnt/music/mp/mpd/playlists"
playlist_directory "/home/tc/.mpd/playlists"

log_file "/home/tc/.mpd/log"
pid_file "/home/tc/.mpd/pid"
state_file "/home/tc/.mpd/state"
sticker_file "/home/tc/.mpd/sticker.sql"

db_file "/usr/local/share/mpd/database"

auto_update "yes"
#auto_update_depth "3"

audio_output {
 type "alsa"
 name "My ALSA Device"
 device "hw:0,0" # optional
 mixer_type "software" # optional
## mixer_device "default" # optional
## mixer_control "PCM" # optional
## mixer_index "0" # optional
}

samplerate_converter "Fastest Sinc Interpolator"
audio_buffer_size "8192"
buffer_before_play "20%"
audio_output_format "192000:24:2"

filesystem_charset "UTF-8"
id3v1_encoding "UTF-8"

カーオーディオの使用でライブラリを保存する操作は基本的にはしないので、MPD起動と同時にライブラリのアップデートを行うように設定。
auto_update "yes"
データベースファイルをMPD起動と同時に作るので、filetool.sh -bに記載されていない場所に設定した(これは工程作業の都合で使用上には関係ないけど)。
db_file "/usr/local/share/mpd/database"

/opt/bootlocal.sh に下記記載し、OS起動時に/mnt/musicやデータベースファイルを置くディレクトリなどを作る。
音源となるUSBメモリ/マイクロSD+USBアダプターをOS起動時に認識、マウントポイント「mp」にマウントさせる。

mkdir /usr/local/share/mpd
chmod -R 777 /usr/local/share/mpd

mkdir /mnt/music
mkdir /mnt/music/mp
mkdir /mnt/music/ram
touch /mnt/music/ram/dummy.cue
chmod -R 777 /mnt/music

mount -w /dev/sda1 /mnt/music/mp

以上で、MPD関連の設定は完了。

スマートフォンの設定

インストールと設定を終えたRas Piは、電源を入れて起動したらAPモードで動いている。MPDも自動的に起動し音源データを読み込みライブラリを形成し、クライアントからの指示があれば音声再生が可能な状態になっている。

MPDクライアントを動かすスマートフォン(当方はAndroid 11)を設定する。

WiFiからアクセスポイントRasPi-APを選択。
前述したとおり、Ras Piの方から自動的にIPアドレスを振ってくれない。
Ras PiのDHCPサーバーが問題なく動いていればスマートフォンに自動的にアドレスを振ってくれるはずなんだけど、これが機能していないのだ。

できないものは仕方がないので、スマートフォンのほうでIPアドレスを設定。IPアドレス固定で設定する。
APモードのRas Piが「192.168.2.1」でネットマスクはnetmask 255.255.255.0 なので「192.168.2.xxx(xxxは2から254の間の任意の数でいける筈)」でスマートフォンを設定。
インターネットに繋がりませんと警告?が出るけど、繋げなくてもいいということで設定する。
これで接続、MPDクライアントから操作ができるようになる。

うちではM.A.L.P.を使っているけど、クライアントソフトによって設定や使い方は違うと思うので、これ以降は省略。

そんなこんなで、取り敢えずRaspberry Piベースでカーオーディオ用のポータブルMPDプレーヤーが出来上がった。
音の方は、試しに車のシガーソケットからUSB電源をとって試聴したところ充分過ぎる音が出たので(シガーソケットでこの音か?と驚いた)、問題があるとか何とかは置いといて速やかに日常使用に移行させようという感じ。
接続が問題かな、RCAケーブルとか電源ケーブルをどうするかとか。
当初はバッテリー駆動するつもりだったが、シガーソケットから電源をとれるようにすることも検討している。

DHCPの問題は、今後あせらずに対処していこうと思う。

Jul 06, 2021

pulseaudioでMQAデータを転送再生する

以前のエントリーで、pulseaudio経由の音声信号伝達について書いていた。
現在は、ras pi2とM500(USB-DAC)をつないでシステム化している。piCore7にalsaとpulseaudioだけ組み込んだ簡素なサーバーだ。
Youtubeなどの再生に使うんだけど、実はもうひとつ他に目的があって、MQA再生環境が必要な時にM500を使おうと考えていた。

今回、普段使いのノートPCでmpdを動かして、MQAデータをpulseaudio出力しpulseaudioサーバーに転送、M500で再生したところ、MQAを認識し再生した。
MQAはpulseaudio経由で転送することも可能なことが分かった。

大したことはしていない。
ノートPC(OSはFedora)の.mpdconfに下記のようにpulseaudio出力を設定、サーバーのipアドレスを設定し、mpdでMQAファイルを再生しただけだ。

audio_output {
        type            "pulse"
        name            "My Pulse Output"
##      server          "remote_server"         # optional
      server          "192.168.1.77"
##      sink            "remote_server_sink"    # optional
}

MQAの音は、綺麗だと思う。
うちではメインの音源は主にCD相当のデータをlibsamplerateでアップサンプリングして鳴らしていて、これはこれで高音質なんだけど、なんというか、MQAの音には無理がない軽やかさがある。スムーズで余裕があり歌心がある鳴り方をする。

MQA対応のハードというのは「オーダーメイドの服」みたいな理解を僕はしていて、つまり、MQA音源とハードウェアがあつらえた服のように合っている、というイメージだ。
従来のPCM再生はハードウェアがPCM音源に合わせないといけないが、限界があるというイメージ。
MQAはハードウェアの合わせ方が予め決まっていて、ハード側がそれに沿って合わせるように作られているので、PCMの限界を越えるというイメージ。
うちでやっているPCM768kHzへのアップサンプリングは音源をハードに合わせる努力であって、だから良質な仕立て(libsamplerate)が必要なんだけど、確かに音質改善があって楽音の情報量としても多いけど、何処かしら頑張ってる音という感触がある。これはハードのスペック向上によって改善するのかもしれないけど。
MQAの音は、そういう野暮ったさがない。スマートな音がする。

今回はpulseaudioで転送したけど、一般的なUPnPでも転送は可能だと思う。そもそも、UPnPで転送してMQAだと読めなくなるようなら、使いものになってない筈だ。
うちではUPnPで転送するなら、転送先にmpd、upmpdcliをインストールしないといけない。他にUPnPレンダラーの作り方を知らないからだ。
そうそうMQAは使わないし、当面は現在のシステムでいいと思っているけど。

Posted at 10:46 in audio_diary | WriteBacks (0) | Edit Tagged as: , ,

May 04, 2021

mpdでCD再生に対応する(2022.03.29./.08.16./2025.04.08. 追記)

今回は備忘録。
うちのメインシステムにはCDプレーヤーがない。
でも、リッピングする前に聴きたいと思うこともある。そこを何とか出来ないかということ。

参考にした記事はこちら。
海上忍のラズパイ・オーディオ通信(10)ラズパイ・オーディオで音楽CDのダイレクト再生に挑戦!果たして使い物になるか?
https://www.phileweb.com/review/article/201602/12/1965.html

この記事にもあるけど、トラックの選曲が出来ないのでリッピングしたほうが便利に使えるしCDドライブがうるさいので、限局的な使用に留まるだろうとは思った。けどまあ、使えるようにしたよ、ということで。これはこれで楽しい。

今はテスト環境で運用中。
sshでサーバにログインし「mpc」でCDをmpdのプレイリストに登録して鳴らしている。CDからmpdが768kHzにアップサンプリングし、PPAPでメインシステムに送る。
リップしたファイルより音がいい?
これは、多分に気のせいだと思う。ブラインドでは区別不能だ。

手順をごく簡単に書いておく。Googleにアップしたアップサンプリングサーバーを加工する。
まず、tceでCD関係のtcz、以下をインストール。

libcdio.tcz
libcdio-dev.tcz
libcdio-paranoia.tcz
libcdio-paranoia-dev.tcz

続いて、mpdを再インストールする必要がある。
mpdがcdio-paranoiaに対応していないからだ

tc@box:~$ mpd -V
Music Player Daemon 0.20.20

Protocols:
 file:// http:// https:// alsa://

まず、インストールされているのをアンインストールする。
/mnt/sda1/tce/optional にあるmpd関係を削除。
続いて、/mnt/sda1/tce/onboot.lstのmpdの記載を#でコメントアウト(今回、行削除せずコメントアウトでも問題ないことを確認した)。
これで再インストール行程に入れる。

sudo ntpclient -s -c 1 -h ntp.nict.jp
wget https://www.musicpd.org/download/mpd/0.20/mpd-0.20.20.tar.xz
xz -dv mpd-0.20*
tar -xf mpd-0.20*
ls
cd mpd-0.20*
./configure --enable-pipe-output --enable-cdio_paranoia-input
make
mkdir ../mpd
sudo make DESTDIR=../mpd install

cd
mksquashfs mpd mpd-0.20.20.tcz
md5sum mpd-0.20.20.tcz > mpd-0.20.20.tcz.md5.txt
sudo mv *tcz* /mnt/*1/tce/optional
sudo vi /mnt/*1/tce/onboot.lst
sudo rm -rf mpd*

これで、mpdがCD-DAに対応。

tc@box:~$ mpd -V
Music Player Daemon 0.20.20

Protocols:
 file:// http:// https:// cdda:// alsa://

.mpdconfにcd入力対応の設定したのを書き忘れていたので追記。
下記記載している。

input {
    plugin "cdio_paranoia"
    speed "1"
}

2022.03.29. 追記。
上記の設定だと、ときにCDの読み込みが間に合わず音が途切れる。
speed "4" ぐらいにしておいた方がいいようだ。音質への影響はないように思う。

2022.08.16. 追記。
音が途切れるのはスピードの問題ではないようだ。
ドライブが正確に読み取れていないかもしれないと判断した時に、再読み込みを行うかどうかを設定できるようなんだけど、デフォルトはどうやら、しっかり読み込む設定になっているようで、繰り返し読み込むことで、音が途切れるらしい。
下記のように設定を書き換えたら、音が途切れなくなった。

input {
    plugin "cdio_paranoia"
    speed "4"
## mode "overlap"
mode "disable"
}

overlapという設定も出来るけど、これでも音が途切れる。読み込み速度を例えば32倍など設定し早くしても、再読み込みするほうが時間がかかるものらしい。

参考にmpdのマニュアルのアドレスと引用。

Music Player Daemon 0.24~git documentation » Plugin reference
cdio_paranoia
https://mpd.readthedocs.io/en/latest/plugins.html#cdio-paranoia

Setting

Description

default_byte_order little_endian|big_endian

If the CD drive does not specify a byte order, MPD assumes it is the CPU’s native byte order. This setting allows overriding this.

speed N

Request CDParanoia cap the extraction speed to Nx normal CD audio rotation speed, keeping the drive quiet.

mode disable|overlap|full

Set the paranoia mode; disable means no fixups, overlap performs overlapped reads, and full enables all options.

skip yes|no

If set to no, then never skip failed reads.

2025.04.08. 追記。

今更の追記になるが、音が途切れる原因は cdio_paranoia の設定ではなく、audio_buffer_size、buffer_before_play の問題と判明した。これらの現在の設定は下記の通り。環境によって調整が必要な可能性がある。

audio_output_format   "384000:32:2"
audio_buffer_size   "32768"
buffer_before_play   "75%"

input {
    plugin "cdio_paranoia"
    speed "4"
## mode "overlap"
mode "disable"
skip "yes"
}

操作は「mpc」から行う必要があるので、インストール。
当初は最新のバージョン0.33をインストールしようとしたが、例によってmesonを使うので慣れないので0.28にした。

wget https://www.musicpd.org/download/mpc/0/mpc-0.28.tar.xz
xz -dv mpc*
tar -xf mpc-0.28*
cd mpc-0.28
ls
./configure
make
mkdir ../mpc
sudo make DESTDIR=../mpc install

cd
mksquashfs mpc mpc-0.28.tcz
md5sum mpc-0.28.tcz > mpc-0.28.tcz.md5.txt
sudo mv *tcz* /mnt/*1/tce/optional
sudo vi /mnt/*1/tce/onboot.lst
sudo rm -rf mpc*

これでインストール完了。
使うには、CDドライブを表すデバイスファイルのパーミッション変更が必要とのこと。
/opt/bootlocal.sh にコマンド追記し、OS起動時に変更するように設定しておく。

sudo vi /opt/bootlocal.sh

chmod 666 /dev/sr0

filetool.sh -b
sudo reboot

設定保存し、再起動。これでCDから音を出すことができる。
CDドライブが2つ以上ある時はどうなるかは検証していない。

CDをドライブにセットしsshから「mpc add cdda://」と打つことで、CDをmpdのプレイリストに登録。
続いて「mpc play」で、音が出る。
CD1枚が1つのファイルとして認識されるので不便だけど、通しで聴くとか、それでもいいならという感じ。

音量調整や再生停止程度のことはmpcで出来る。「mpc volume 70」「mpc stop」こんな感じ。
下記、操作説明書のアドレス。

mpc 0.34 documentation
https://www.musicpd.org/doc/mpc/html/

Posted at 21:30 in audio_diary | WriteBacks (0) | Edit Tagged as: , ,

Apr 19, 2021

イメージファイルをアップするにあたって、うちのセットからの変更点

先日、Google Driveにうちで使っているアップサンプリングサーバーをイメージ化したものをアップした。
Phile Webで記事にしている。

UPnPレンダラー兼アップサンプリングサーバーのディスクイメージをアップしました
https://community.phileweb.com/mypage/entry/5010/20210418/67519/

https://drive.google.com/file/d/1eZ-ijekRj-ond1OIa7aZXgLxjWYbsIPy/view?usp=sharing

うちのシステムそのままだと不便だろうと思ったので、アップする前にいくつか改造を施した。
それらの点についてメモしておく。

1)OSブート時にmpd、upmpdcliが自動的に起動するようにした

うちではmpd、upmpdcliはsshでログインして起動するようにしている。 これを、OS boot時に同時に起動させるようにした。

sudo vi /opt/bootlocal.sh

mpd /home/tc/.mpdconf
adduser upmpdcli -H -D
upmpdcli -D -c /home/tc/.upmpdcliconf


vi .upmpdcliconf

mpdhost = localhost
logfilename = /home/tc/.upmpdcli.log
loglevel = 2
friendlyname = MPD-SRC
mpdport = 6600

これで、mpdはrootで起動する。 upmpdcliはrootでは起動できない仕様なので、ユーザーupmpdcliをboot時に作成し、これを依り代に起動させる。

うちのシステムでは何故こうしていないかというと、mpdがrootで起動していたら「mpd --kill」コマンドが効かないからだ。 mpd.confを書き換え設定変更することが多かったので、たびたびmpdを止める必要があった。いちいちps打ってプロセスidを確認してsudo killとか、面倒でやっていられない。 だから自動起動は不採用になった。

upmpdcliについては、そうした問題はないので採用してもいいんだけど、mpd起動のついでにupmpdcliもコマンド1発で起こせるので、ほったらかしになっているという感じ。この際だから、うちでも使うことにするかもしれない。

2)alsa出力設定を2つにした

mpd.confでalsa出力を設定している。 古いノートPCや、現在のうちのアップサンプリングサーバーでは問題なかったんだけど、新しいノートPC(といっても、10年近く前に発売だけど)でbootしたとき、BIOS設定でPCのサウンドカードをオフにしただけでは音が出ないことがあった。 aplay -lで確認したら、0,0ではなく1,0がUSB-DACに振られている。

tc@box:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: IncRAL2496UT1 [RATOC Systems, Inc.RAL-2496UT1_], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
tc@box:~$ 

BIOSでPCのサウンドカードをオンにしたままでPC起動したら、PCのサウンドカードが1,0、USB-DACが2,0になった。 つまり0,0が振られないのだ。

tc@box:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: PCH [HDA Intel PCH], device 0: ALC3228 Analog [ALC3228 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: IncRAL2496UT1 [RATOC Systems, Inc.RAL-2496UT1_], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
tc@box:~$

なぜこんな仕様になっているのか分からないけど、alsaを設定するのには困る。

対策が見つからなかったので、0,0と1,0、両方にalsa出力するようにmpd.confに記載した。 BIOSでオンボード音声をオフにして、USB-DACひとつだけ繋いだ状態なら、0,0か1,0、どちらかに引っかかって音声出力できるのではないだろうか。 うちにあるいくつかのPCで試した限りでは、問題なく機能した。 こんな感じ。

vi .mpdconf


audio_output {
 type   "alsa"
 name   "My ALSA Device 0"
 device "plughw:0,0"
}
audio_output {
 type   "alsa"
 name   "My ALSA Device 1"
 device "plughw:1,0"
}

3)alsa出力先サウンドカードの設定を変更しフォーマット変更に対応させた

alsaの出力先は、mpd.confで一般的には下記のように記載することが多い。

device "hw:1,0"

以前のエントリーで書いたが「hw:0,0」のような記載だと、mpd.confで指定されたフォーマットに出力が固定される。 うちではそれでいいが、他者が使う想定だと、個々のUSB-DACに設定を合わせないといけない。それには、mpd.confの書き換え、保存という手順が必要で、sshでログインして、viを使わないといけない、なんていうのは扱いにくいだろう。

device "plughw:0,0"

そこで、「plughw:0,0」に設定記載を変更した。 この記載だったら、USB-DACが対応しているフォーマットを、alsaが読み取って調整してくれる。DACが対応している最上限のフォーマットに自動的に合わせるはずだ。 mpd.confに書かれている768/32がセットが対応する上限設定ということになる。

Posted at 21:14 in audio_diary | WriteBacks (0) | Edit Tagged as: , , , ,

Apr 18, 2021

UPnPレンダラー兼アップサンプリングサーバーのディスクイメージをアップした

下記内容の日記をPhile webにアップした。
https://community.phileweb.com/mypage/entry/5010/20210418/67519/

このたび思う処あり、ディスクイメージをGoogleにアップしました。
どなたでも使っていただいて結構です。

https://drive.google.com/file/d/1eZ-ijekRj-ond1OIa7aZXgLxjWYbsIPy/view?usp=sharing

イメージについて説明します。

1)セット内容とコンセプト:
linux OS(Tiny Core Pure64 11.1)ベースで作成しています。
有線LAN経由でUPnP/DLNAサーバーから信号受信。mpd、upmpdcli、libsamplerate(SRC)で処理し、alsa経由でUSB-DACに出力することを想定しています。
この際にUSB-DACから処理できるフォーマットを読み取り、アップサンプリングします。例えばUSB-DACが対応しているフォーマットの上限が384/32だった場合、そのフォーマットにアップサンプリングしてDACに送るということです。768/32までのアップサンプリングに対応しています。

つまり、このセットはlibsamplerateによるアップサンプリングの音を聴くためのシステムということです。
libsamplerateは以前はmpdのデフォルトとされていましたが、情報処理の負担が大きい割りにメリットが少ないと考えられたようで、最近はSoXによるアップサンプリングが主流です。
しかし、libsamplerateのほうがより正確な音声情報処理が行われ、44.1/16のデータからでもハイレゾファイルと同等の再生音が得られます。特に300、700kHz台で優位性が得られると考えています。処理の負荷は高いので、PCに要求されるスペックは高くなります。700kHz以上にアップサンプリングする場合、DDR3以上のメモリを積んだPCが必要です。

2)使用方法:
イメージをusbメモリ等のストレージに書き込み起動ディスクとします。
Tiny Core Pure64ベースなので、AMD64、Intel64のPCで使用できます。
有線LANにつないでください。無線は対応できていません。

PC起動に際し、BIOSでPC自体のサウンドボードをオフにしてください。こうすることでUSB-DACがalsaから最優先の出力先に選択され、細かい設定をssh経由で行う必要がなくなる筈です。
セットを書き込んだストレージから起動するようにBIOSを設定してください。
無事に起動したら、UPnP/DLNAのコントローラーから「MPD-SRC」を選択し音声出力できる状態になります。

3)その他の機能:
sshでログインし設定など変更可能です。パスは「tc」です。
pulseaudioサーバー、PPAPフロントとして機能させることができます。

04.20. 追記です。-------------
sshでログインに際して、ユーザーは「tc」です。書き忘れていました。
Tiny Core Pure64ベースのセットで、扱い方はTiny Coreそのものです。
mpd.confは、/home/tc/.mpdconfで設定しています。
追記終わり。-------------

出来れば使っていただいた所感を、この記事のコメントで教えていただければ有難いです。
何分にも、このような試みは私自身初めてでもありlinuxのスキルも限られているため、トラブル等のフォローはできないと思いますので、自己責任でお使いください。質問等には可能な限り返信させていただきますが、出来ない場合もありますのでご容赦ください。

以上、宜しくお願いいたします。

思う処あって、ということなんだけど、実際、迷ったけどアップしてみることにした。
どんな反応があるかは分からないが。

うちではlibsamplerate(SRC)なしではオーディオシステム自体が成り立たないというような重要なコーデックであるにも関わらず、世間では意味が無いとされている。世間と書いたが、少なくともpulseaudio界隈ではそうなっている。なるようになるしかないのかもしれないが、意味が無いということはないということを井の中の蛙のようなうちのサイトで書いてるだけではダメかなと思うことがあり、、、まあ、なるようになるだろうということで、イメージをアップしてみたということだ。

僕自身が井の中の蛙だということがある。
他のオーディオファイル諸氏の音を聴いたことがない。うちの音を聴いてもらったことがない。
コロナ禍でいよいよ困難になった。イメージでもアップして試してもらうしかないじゃないか。

そういうわけで、宜しければ使ってみてください。
レスはphile webか、twitter( https://twitter.com/flyingnote)で受け付けます。

Mar 21, 2021

DaphileとTiny CoreでDeezer hifiを768kHzにアップサンプリングする(ついでにPPAPで飛ばす - たびたび追記あり)

前回に引き続き、UPnPでデータを飛ばしてレンダラーに組み込んだlibsamplerateでアップサンプリングするプラン。
DebianやFedoraなどではリポジトリから読み込みが出来る様なんだけど(訂正。今のFedoraではソースからのインストールが必要。リポジトリからのインストールが出来たのはv30、31の頃のようだ)、今回は、Tiny Core Pure 64での試み。ソースからのインストールが必要になる。
これが本丸だ。
相当梃子摺るかと思ったが、案外順調にできてしまった。順調と言ってもPulseaudioと比べたら、だけど。
以下、経過を記載しておく。

今回、打ち込んだコマンド等、過程の詳細な記載は省略した。要点だけ書いている。
いつもはこまごまと書くんだけど、長くなりすぎるので。

Daphileの操作画面キャプチャ画像。
右下にTiny Coreのmpdがレンダラーに選択されているのが見える。MPD-90というのはipアドレスだ。
Daphileサーバーはcompaq 6730bに戻している。有線LANに繋がらない2570pは返品、返金となった。

tiny core レンダラー

準備

最初からTiny Core Pure 64を組んでいくのは面倒なので、以前にmpdを組み込み、Pulseaudioを組み込みして、昨年10月にバックアップしたイメージを使う。
ストリーミング音源をpulseaudioで転送しアップサンプリング再生する(10月15日、追記)
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20201011a.htm

ハードはapu2c4。
以前はこれで768kHzへのアップサンプリング再生をしていたけど、最近は使っていなかった。
apu2c4で768kHzへのアップサンプリングに取り組む
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20181208a.htm

SDカードにイメージを書き込み、apu2c4に刺して起動。 sshでログイン。

まず、upmpdcliの説明サイトから引用。

Upmpdcli and associated libraries downloads
https://www.lesbonscomptes.com/upmpdcli/upmpdcli-manual.html#UPMPDCLI-PACKAGES

For building from source, you will need a C++ compiler with full C++11 support, and the development packages for the supporting libraries: libcurl, libmicrohttpd, libmpdclient, and libexpat.
Also the Python modules for streaming service support use the python-requests package, so you may need to install it (it is only needed at run time).
If you are using the source from the git repository, you will also need the autoconf, automake, libtool trio. Use the autogen.sh script to set things up.

この説明サイトは膨大で目が回りそうだけど、今回は要所だけ読んでなんとかした。
ライブラリとして、「libcurl, libmicrohttpd, libmpdclient, and libexpat」が必要と書いている。あと、python-requests、「autoconf, automake, libtool trio(トリオなんだ)」が要るような。

Tiny Coreの状況を確認。
curl expat2 expat2-devは既にインストールされている。
tceで、以下インストール。

# tce
curl-dev.tcz libmicrohttpd.tcz libmicrohttpd-dev.tcz

libmpdclientはリポジトリにtczがないので、ソースからインストール。
最新のはインストールにmeson-ninjaを使う。
敢えて面倒な事はしたくなかったので、以前のバージョンを選択。

wget https://www.musicpd.org/download/libmpdclient/2/libmpdclient-2.11.tar.xz

# tce
doxygen automake

doxygenがないよ、と指摘される。そうだったっけ?
一応、確認したらautomakeもない。既にインストールされてるとばかり思っていた、、、
更に、作業の前には時計を合わせておかないと、エラーになるので合わせる。

sudo ntpclient -s -c 1 -h ntp.nict.jp

./configure、makeの過程で以下警告あり。今回は気にせず進む。

/home/tc/libmpdclient-2.11/include/mpd/connection.h:98: warning: explicit link request to 'MPD_HOST' could not be resolved
/home/tc/libmpdclient-2.11/include/mpd/connection.h:98: warning: explicit link request to 'MPD_PORT' could not be resolved
/home/tc/libmpdclient-2.11/include/mpd/connection.h:99: warning: explicit link request to 'MPD_TIMEOUT' could not be resolved

sudo make DESTDIR=../libmpdclient install

libtool:   error: '../libmpdclient/usr/local/lib' must be an absolute directory name

sudo make DESTDIR=/home/tc/libmpdclient install

make installから、tczファイルを作って、/mnt/*/tce/optionalに保存する。
ここらへんで、python-requestsをインストールしとく(インストールし忘れていた)。

# tce
python3.6-requests.tcz

upmpdcliをインストール

下記のソースコード配布ページからソースをダウンロード。

Upmpdcli and associated libraries downloads
https://www.lesbonscomptes.com/upmpdcli/pages/downloads.html

Current version (tar files):

libnpupnp-4.1.1.tar.gz
libupnpp-0.21.0.tar.gz
upmpdcli-1.5.11.tar.gz
sc2mpd-1.1.8.tar.gz

順次、インストールしていく。
sc2mpdはOpenHome関連で、うちの環境とは関係ないのでインストールしていない(後でインストールしとけば良かったかなと思ったけど、動く環境作る方が優先なので)。
これらのソース、あちこちファイル読んでもインストールの手法が見つからない。
./configure、make、make--install、tcz保存、通常の流れでインストールできる。

wget https://www.lesbonscomptes.com/upmpdcli/downloads/libnpupnp-4.1.1.tar.gz
./configure
make

checking whether build environment is sane... configure: error: newly created file is older than distributed files!

時計を合わせるのを忘れたらこんな警告が出る。

sudo ntpclient -s -c 1 -h ntp.nict.jp

順次、インストール。

wget https://www.lesbonscomptes.com/upmpdcli/downloads/libupnpp-0.21.0.tar.gz

wget https://www.lesbonscomptes.com/upmpdcli/downloads/upmpdcli-1.5.11.tar.gz

途中で足りないライブラリがあると指摘され下記インストールしている。

# tce
jsoncpp-dev.tcz

mpdを再インストール

さて、これで動くかというと動かない。下記、mpdの状況を確認。

tc@box:~$ mpd -V
Music Player Daemon 0.20.20

Database plugins:
 simple


pi@volumio:~$ mpd -V
Music Player Daemon 0.19.1

Database plugins:
 simple proxy upnp

Storage plugins:
 local smbclient nfs

Neighbor plugins:
 smbclient upnp

Tiny CoreとVolumio 1.55のmpdの状況を比較。
使えるプラグインの表示が違う。Tiny Coreのほうはupnpの表示がない。
再インストールだ。

sudo ntpclient -s -c 1 -h ntp.nict.jp

wget https://www.musicpd.org/download/mpd/0.20/mpd-0.20.20.tar.xz

./configure --enable-pipe-output

mpdインストールのいつもの工程で再インストールしたが、それだけでは動かなかった。
./configureのオプション指定を変える。

./configure --enable-pipe-output --enable-upnp

configure: error: UPnP client support: libupnp not found

# tce
libupnp.tcz libupnp-dev.tcz

なんと、、ここでlibupnpがないと指摘された。
実は、tczリポジトリにはupnp関係のtczは沢山あって、でも何が要るやら分からなかったのでインストールしてなかったのだ。
tceでインストール。
その後は順調に進んで、インストールできた。

tc@box:~$ mpd -V
Music Player Daemon 0.20.20

Database plugins:
 simple proxy upnp

Storage plugins:
 local curl

Neighbor plugins:
 upnp

インストール終了時点 概要

インストール終了時点でのonboot.lstは下記の通り。

sudo vi /mnt/*1/tce/onboot.lst

openssh.tcz
i2c-5.4.3-tinycore64.tcz
alsa-modules-5.4.3-tinycore64.tcz
alsa.tcz
gcc.tcz
boost-1.65-dev.tcz
pkg-config.tcz
bison.tcz
autoconf.tcz
libtool-dev.tcz
bc.tcz
cmake.tcz
compiletc.tcz
squashfs-tools.tcz
ntpclient.tcz
libsamplerate.tcz
libsamplerate-dev.tcz
lame.tcz
lame-dev.tcz
libmad.tcz
libmad-dev.tcz
nfs-utils.tcz
nmap.tcz
libcap-dev.tcz
alsa-plugins-dev.tcz
alsa-config.tcz
alsa-dev.tcz
gudev-lib.tcz
dbus-dev.tcz
pulseaudio-13.0.tcz
libmicrohttpd.tcz
libmicrohttpd-dev.tcz
curl-dev.tcz
doxygen.tcz
automake.tcz
libmpdclient-2.11.tcz
python3.6-requests.tcz
libnpupnp-4.1.1.tcz
libupnpp-0.21.0.tcz
jsoncpp-dev.tcz
upmpdcli-1.5.11.tcz
libupnp.tcz
libupnp-dev.tcz
mpd-0.20.20.tcz

upmpdcliを動かす

mpdを起動(うちではssh経由で起動するのがデフォルト)。
DaphileにUpNPレンダラーとして認識されたら、ウェブブラウザ操作画面のプレーヤー表示部に出てくるはずなんだけど、出て来ない。
upmpdcliがインストールしただけでは動いてないので、起動しないといけない。

Upmpdcli
https://www.lesbonscomptes.com/upmpdcli/upmpdcli-manual.html

In most situations, upmpdcli will be run as follows:

upmpdcli -D -c /etc/upmpdcli.conf

The -D option tells upmpdcli to fork and run in background. The -c option specifies a configuration file. See the upmpdcli(1) manual page for more information about the command line.

マニュアル、膨大なんだけど。
わけが分からないと言いながらあれこれ、、、

tc@box:~$ upmpdcli --help
upmpdcli: usage:
-c configfile 	 configuration file to use
-h host    	 specify host MPD is running on
-p port     	 specify MPD port
-d logfilename	 debug messages to
-l loglevel	  log level (0-6)
-D    	 run as a daemon
-f friendlyname	 define device displayed name
-q 0|1	 if set, we own the mpd queue, else avoid clearing it whenever we feel like it
-i iface    	 specify network interface name to be used for UPnP
-P upport    	 specify port number to be used for UPnP
-O 0|1	 decide if we run and export the OpenHome services
-v      	print version info
-m <0|1|2|3|4> media server mode (default, multidev|only renderer|only media|embedded|multidev)

Upmpdcli 1.5.11 libupnpp 0.21.0
tc@box:~$ 

試行錯誤するうちに、こんなんが表示された(実は --help 以外でも、例えば --x とかでも表示される)。
ここから起動コマンドを考える。

upmpdcli -D -m 1 -f MPD-90 -d /home/tc/.upmpdcli.log -l 2 -O 0

sshから上記コマンドでupmpdcliを起動。
出来ました!
Daphileにupnpレンダラーとして認識された。これで、音が出る筈。
本当は、upmpdcli.confで設定して運用するほうがスマートなんだけど、当面はこれで動かすことにする。

upmpdcli.confの原本は下記に保存されている。コピーして使えばいいのだろうか。
まだ使い方が分からない。
/usr/local/share/upmpdcli/upmpdcli.conf-dist

PPAPで音を出す

実はこのTiny Core Pure 64、もともとのイメージファイルがPPAP Frontとして機能するように作られている。
768kHzにアップサンプリングして、PPAP Back-Endに送る設定がこの時点で既に出来ている。

USB DACを繋いでmpd.conf再設定とか面倒だったので、いきなりそれで使ってみることにした。
PPAP環境は常日頃から使っていて出来ているので、Daphileから音を出す操作をしたら、そのままPPAPシステムに繋がる筈ということだ。
こんなイメージ。

daphile-tiny core-ppap

音は出ました。

Frontの状況。

CPU0: 45.8% usr  3.5% sys  0.0% nic 50.0% idle  0.0% io  0.0% irq  0.5% sirq
CPU1: 10.7% usr  3.3% sys  0.0% nic 85.9% idle  0.0% io  0.0% irq  0.0% sirq
CPU2:  9.9% usr  2.5% sys  0.0% nic 87.5% idle  0.0% io  0.0% irq  0.0% sirq
CPU3: 43.7% usr  0.3% sys  0.0% nic 55.2% idle  0.0% io  0.0% irq  0.5% sirq
Load average: 1.09 0.97 0.56 3/386 3852
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
 6776     1 tc       S     507m 12.8   0 26.5 mpd
 2841  6776 tc       S    16480  0.4   2  1.4 /usr/local/bin/ncat 192.168.1.89 4400
 3637  6742 tc       R     4016  0.1   1  0.2 top
15901     1 tc       S    1743m 44.2   3  0.1 upmpdcli -D -m 3 -f MPD-90 -d /home/tc/.upmpdcli.log -l 2 -O 0

Back-Endの状況。

tc@box:~$ cat /proc/asound/card*/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 768000 (768000/1)
period_size: 4096
buffer_size: 32768
tc@box:~$ 

Mem: 103904K used, 3925992K free, 18384K shrd, 5676K buff, 34188K cached
CPU:  0.2% usr  2.1% sys  0.0% nic 97.1% idle  0.0% io  0.0% irq  0.5% sirq
Load average: 0.06 0.04 0.00 3/113 17254
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
17204  1213 root     S    15484  0.3   3  1.0 /usr/local/bin/ncat -kl 4400 -e /usr/local/bin/aplay -D hw:0,0 -M --period-size=4096 --buffer-size=32768 -t raw -f S32_LE -r768000 -c2
17205 17204 root     S     4608  0.1   1  0.5 /usr/local/bin/aplay -D hw:0,0 -M --period-size=4096 --buffer-size=32768 -t raw -f S32_LE -r768000 -c2
   30     2 root     IW       0  0.0   1  0.1 [kworker/1:1-eve]
17254 17226 tc       R     4016  0.1   2  0.0 top
 1213  1094 root     S    15484  0.3   1  0.0 /usr/local/bin/ncat -kl 4400 -e /usr/local/bin/aplay -D hw:0,0 -M --period-size=4096 --buffer-size=32768 -t raw -f S32_LE -r768000 -c2
17222  1211 root     S     5872  0.1   0  0.0 sshd: tc [priv]

音の方は、NASの音に比べてDaphileからのほうが固いような気がする。NASが絹のような感触だとしたら、Daphileからのほうはガラスのような感触というか。
そもそもアップサンプリングサーバーがHP Elitebookとapu2c4で違う機械だとか状況が違うので、音も違うのが当たり前だと思う。

もう少しだけソフトだったらいいかなと思うけど、768kHzじゃないと出ない音が出ている。
運用しながら調整していきたい。

24日、追記。
apu2c4で768kHzは、限界を超えるということを忘れていた。
以前は705.6kHzで主に運用していた。

今回、しばらくして音が途切れ始めたので705.6kHzで運用開始し始めている。
Raspberry Pi 3B+をBack-Endにしている。
何とかなる筈だけど、どうだろうか。

更に追記、3B+、700kHz台のBack-Endには力不足だ。
さあ、どうすっかね、、、

27日、追記。
現状、PPAPは難しいのでapu2c4から384kHzでUSB DACに出力している。
悪くはないけど、物足りない。若干、pulseaudioからの方が良く聴こえるのはハードの差によるものだろうか。

31日、追記。
apu2c4とras pi3B+では無理なのでハード変更。
現在はHP Elitebook 820G2とapu2c4の組み合わせにしている。
820G2はスペック自体は問題ないんだけど、なんだかbiosが危なっかしいんだよね、簡単に入れなくて操作を繰り返すことがある。中古だしなあ、、、あんまり困るようなら買い替えるかも。

音の方は、これですっかり安定した。
CD品質相当のストリーミング音源を、768kHzにアップサンプリング、PPAP再生出来るようになった。
NAS音源と比較したら若干軽い音色だけど(これはハード的な違いによるものかな?)、同等の音が出ている。

Aug 25, 2020

引き続き、hwとplughwについて

まずはちょっとしたメモから。

前回エントリーで出て来たコマンド「cat /proc/asound/card0/stream0」なんだけど。
ふだんpiCore7とi2s DACでusbメモリの音源を鳴らしているシステムで、試しに打ってみた結果が以下。

tc@box:~$ cat /proc/asound/card0/stream0
cat: can't open '/proc/asound/card0/stream0': No such file or directory
tc@box:~$

No such file or directory、、、
usb出力だとusb DACのデータが表示されたけど、i2s出力だとそれがない。考えてみたら、i2sだと出力先デバイスを特定するデータを扱う必要がないのだろう。
出力自体のデータは、下記のように確認できる。.mpdconfの設定は24/96だ。

tc@box:~$ cat /proc/asound/card0/pcm0p/sub0/hw_params
access: RW_INTERLEAVED
format: S24_LE
subformat: STD
channels: 2
rate: 96000 (96000/1)
period_size: 12000
buffer_size: 48000
tc@box:~$

2年前のエントリーで、USB出力は48kHzにリサンプリングされるがi2s出力はされずに設定どおりに出力されるようだ、という記載がある。出力先が何なのかを気にしないのだから、48kHzにリサンプリングする理由がない。
つまり今更だけど、i2s出力とUSB出力はalsaの動き方が違うということだ。

ここで、.mpdconfのaudio_output_format設定を変えて、出力のファイルフォーマットがどうなるかを確認してみた。
「96000:24:2」のとき出力はS24_LE、「44100:16:2」のときS16_LE、「192:32:2」のときS32_LEになった。
audio_output_formatをコメントアウトしたら、出力は44100でS24_LE。あれ?っと思ったけど、よく考えたら、このシステムではmp3を再生していたんだった。CDリッピングのflacデータを再生したら、S16_LEになった。
mp3って、S24_LEになるのかね、、、いろいろ謎がある。

前回エントリーの話では、「-D hw:0,0」を設定したらファイルフォーマットを厳密に設定しないといけないけど、「-D plughw:0,0」は緩いのではないか?ということだった。
今回は、実際のところどうなのか、やってみようということだ。
うちでは珍しくもないけど、長々だらだらとしたエントリーになった。

テスト用環境として、Raspberry Piを2台使って、usb出力のPPAP環境を作る。
Frontに、Ras pi2、mpd 0.19.19、libsamplerateを使用。
Back-endに、Ras piB+。
OSはともにpiCore7。
USB DACはいくつか手持ちがあるけど、何を使うか、、、ちょっと古いが、取り敢えずRATOCのRAL-2496ut1を使うことにした。
これにオーディオテクニカのAT-SP150 bkというデスクトップ用のパワードスピーカーをつないで出力した。
ファイルフォーマットやBack-Endのコマンドを変えながら、音が出るかどうかのデータをとってみる。

Back-endのRas piB+にsshでログインし確認すると以下の通り。

tc@box:~$ cat /proc/asound/card0/stream0
RATOC Systems,Inc. RAL-2496UT1 USB-Transport at usb-20980000.usb-1.4, full spee : USB Audio

Playback:
  Status: Stop
  Interface 1
    Altset 1
    Format: S16_LE
    Channels: 2
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000
  Interface 1
    Altset 2
    Format: S24_3LE
    Channels: 2
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000
tc@box:~$

ほほう、、、面白い。
ADI-2 DACなんかS32_LEしか出ないのに。S16_LEとS24_3LEが表示されている。

Frontの.mpdconfはこんな感じ。

samplerate_converter "Fastest Sinc Interpolator"
audio_buffer_size "8192"
buffer_before_play "20%"
audio_output_format "192000:32:2"

audio_output {
type "pipe"
name "ppappipe"
always_on "yes"
command "/usr/local/bin/ncat 192.168.1.18 4444"
}

2496ut1は24/96までのDACなので、192/32はオーバースペックだ。
しかし、ここでBack-endのコマンドを下記のように設定。

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"

音を出してみる。
Back-endの出力はこんな感じに。

tc@box:~$ cat /proc/asound/card*/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S24_3LE
subformat: STD
channels: 2
rate: 96000 (96000/1)
period_size: 256
buffer_size: 2048
tc@box:~$

音はちゃんと出ている。
Frontの設定「192/32」が、「24/96」にリサンプリングされている。Back-endの「-f S24_LE -r192000」という設定も、どこにいったのかという感じ。 ちなみにBack-endの構成はこんな感じ。

tc@box:~$ df
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   391.1M      9.4M    381.6M   2% /
tmpfs                   217.3M         0    217.3M   0% /dev/shm
/dev/mmcblk0p2           43.7M     13.1M     28.2M  32% /mnt/mmcblk0p2
/dev/loop0                1.1M      1.1M         0 100% /tmp/tcloop/mc
/dev/loop1                1.9M      1.9M         0 100% /tmp/tcloop/openssh
/dev/loop2                4.9M      4.9M         0 100% /tmp/tcloop/nmap
/dev/loop3              768.0K    768.0K         0 100% /tmp/tcloop/alsa-modules-4.1.13-piCore+
/dev/loop4              256.0K    256.0K         0 100% /tmp/tcloop/alsa
/dev/loop5                1.1M      1.1M         0 100% /tmp/tcloop/glib2
/dev/loop6               68.0K     68.0K         0 100% /tmp/tcloop/libssh2
/dev/loop7              256.0K    256.0K         0 100% /tmp/tcloop/ncurses
/dev/loop8                1.5M      1.5M         0 100% /tmp/tcloop/openssl
/dev/loop9              292.0K    292.0K         0 100% /tmp/tcloop/libnl
/dev/loop10             128.0K    128.0K         0 100% /tmp/tcloop/libpcap
/dev/loop11             128.0K    128.0K         0 100% /tmp/tcloop/lua-lib
/dev/loop12             384.0K    384.0K         0 100% /tmp/tcloop/libasound
/dev/loop13              28.0K     28.0K         0 100% /tmp/tcloop/gamin
/dev/loop14              36.0K     36.0K         0 100% /tmp/tcloop/libelf
/dev/loop15             256.0K    256.0K         0 100% /tmp/tcloop/pcre
/dev/loop16             384.0K    384.0K         0 100% /tmp/tcloop/libgcrypt
/dev/loop17             128.0K    128.0K         0 100% /tmp/tcloop/libusb
/dev/loop18              36.0K     36.0K         0 100% /tmp/tcloop/bzip2-lib
/dev/loop19             128.0K    128.0K         0 100% /tmp/tcloop/libgpg-error
/dev/loop20             128.0K    128.0K         0 100% /tmp/tcloop/libudev
tc@box:~$

alsa.tcz、alsa-modules-4.1.13-piCore+.tcz、libasound.tczだけで、リサンプリングしてるんだろうか?
まあ、ダウンサンプリングに関してはひとつ飛ばしするだけでいいっちゃいいもんなあ、、、
フォーマットはS32_LEだった?のが、S24_3LEに変換されているけど、これってRas piB+的に簡単なのだろうか、、、

設定を変えてみる。
Back-endのコマンドのオプション設定が「-D plughw:0,0」だったのを「-D hw:0,0」に。
さらに「-f S24_3LE -r96000」、つまり2496ut1で使えるはずの設定記載にする。

Back-end :
/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_3LE -r96000 -c2"

Front :
samplerate_converter "Fastest Sinc Interpolator"
audio_buffer_size "8192"
buffer_before_play "20%"
audio_output_format "96000:24:2"

audio_output {
type "pipe"
name "ppappipe"
always_on "yes"
command "/usr/local/bin/ncat 192.168.1.18 4444"
}

音は出た、、、盛大なホワイトノイズが。はっきりしないけど、S24_3LEがいけないのではと思う。
S24_3LEをS24_LEにしたら、「Paused」で音が出ない。
そういうことなんだね。
じゃあ、もうひとつの使えるはずの設定「S16_LE」にしてみる。

Back-end :
/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S16_LE -r96000 -c2"

Front :
samplerate_converter "Fastest Sinc Interpolator"
audio_buffer_size "8192"
buffer_before_play "20%"
audio_output_format "96000:16:2"

audio_output {
type "pipe"
name "ppappipe"
always_on "yes"
command "/usr/local/bin/ncat 192.168.1.18 4444"
}
tc@box:~$ cat /proc/asound/card*/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 96000 (96000/1)
period_size: 512
buffer_size: 4096
tc@box:~$

mpdは動いている。Back-endも信号を受け入れているようだ、、、でも、音が出ない。、、、
じゃあ、、、ここで「-D hw:0,0」だったのを「-D plughw:0,0」に変えてみるか、、、同じ、、、いや、、、出てる?音量が小さい、、、
設定を「-D hw:0,0」に戻す。
ボリュームを上げると、普通に音が出ていたのが分かった。音量が大きく違ったのだ。
S16_LEだと音量が下がるのか?、いや、、、むしろこっちのほうが適正な音量だ。先刻、鳴っていた音量が大き過ぎたのだ。

これは、一筋縄には行かないな、、、

こんな感じでだらだらやってても大変だ。データを取るのに変数は、、、

1) Front : .mpdconf / audio_output_format (44100, 48000, 88200, 96000, 19200 : 16, 24, 32)
2) Back-end : aplay -D (hw:0,0 or plughw:0,0)
3) Back-end : aplay -f (S16_LE, S24_3LE, S24_LE, S32_LE)
4) Back-end : aplay -r (44100, 48000, 88200, 96000, 19200)

変数が4つもある、、、
1)は、44100, 96000, 19200 : 16, 24, 32、ぐらい?
2)aplay -Dオプションは、hwとplughw。
3)はS16_LE、S24_3LE、S24_LE、4)は44100, 96000, 19200ぐらいに絞ろうか、、、
総当たりでやったら、162とおりの組み合わせ。、、、やって出来ないこともないけど、なかなか終わりそうにないな。

さらに絞る。
1)は、44100, 96000 : 16, 24。
2)aplay -Dオプションは、hwとplughw。
3)はS16_LE、S24_LE、4)は44100, 96000。1)の設定に数値を合わせる。
これで、8とおり。
削り過ぎか?、もうちょっと、他の設定もしてみようか、、、以下、結果。


hw

plughw

front:44.1/16
(b-e:-f S16_LE -r44100)

ok

ok

front:96/16
(b-e:-f S16_LE -r96000)

ok

ok

front:44.1/24
(b-e:-f S24_LE -r44100)

paused

ok (format: S24_3LE)

front:96/24
(b-e:-f S24_LE -r96000)

paused

ok (format: S24_3LE)

front:44.1/24
(b-e:-f S24_3LE -r44100)

white noise
(format: S24_3LE rate: 44100)

white noise
(format: S24_3LE rate: 44100)

front:96/24
(b-e:-f S24_3LE -r96000)

white noise
(format: S24_3LE rate: 96000)

white noise
(format: S24_3LE rate: 96000)


front:192/24
(b-e:-f S24_LE -r192000)

paused

ok (format: S24_3LE rate: 96000)

front:192/32
(b-e:-f S24_LE -r192000)

paused

?ok? loud?
(format: S24_3LE rate: 96000)

front:176.4/24
(b-e:-f S24_LE -r192000)

paused

?ok?
(format: S24_3LE rate: 96000)

front:176.4/24
(b-e:-f S24_LE -r176400)

paused

?ok?
(format: S24_3LE rate: 96000)

こんなところかなあ、、、、
やはり、aplay -Dオプションで「hw:0,0」を設定すると、ファイルフォーマットをきちんと合わせないと音が出ない。
2496ut1の場合、24bitのフォーマットの扱いが難しい。
Back-endで「S24_3LE」と設定したら、正確な設定のはずなのに、ノイズで音声が聞けなくなる。むしろ「S24_LE」に設定した方が、「plughw」で問題なく音声を鳴らせる分、随分ましだということになる。これは10年ほど前にも問題視されていた事らしくて、alsaはS24_3LEを扱えないという話がネット上に残っているようだ。最近の機械はS32_LEをサポートしている機種がほとんどのようで、こうした問題はなくなったらしい。

入力が176.4kHzや192kHzのフォーマットでも、plughwで設定したら音を出すことができるのには、正直驚いた。
ただ、ダウンサンプリングされてしまうけど。
といっても、dmixがインストールされていないからだと思うけど、48kHzにはならない。
176.4kHzは2分の1の88.2kHzになるのかと思ったら、96kHzにダウンサンプリングされた。そのせいかどうか分からないけど、高音がきつくうるさい感じに聴こえた。同じダウンサンプリングされるのでも、192kHzからのほうが聴きやすく自然な感触に感じた。192/32で音が大きくなるのは、理由がわからない。

本当は、S32_LEをサポートしている新しいDACだとどうなのか、確認したほうがいいんだろうけど、息切れ気味。
このぐらいにしておこうと思う。

Posted at 20:12 in audio_diary | WriteBacks (0) | Edit Tagged as: , ,

Aug 15, 2020

PPAP back-Endの設定を考え直す(hwとplughw)(8月20日追記)

修理から戻ってきたアンプは好調で、クールな音を聴かせてくれている。
今回はアンプとは関係ない。
ずいぶん前に、PPAP back-Endの「aplay」の設定が釈然としないという話をアップした。
あちこちネット上を徘徊して調べて音が出るようにはしたんだけど、今回はそれをもう少し解明してみた。
aplayコマンドのオプション設定「-D hw:0,0」と「-D plughw:0,0」についての備忘録みたいなものなんだけど、このエントリーだけ読んでも、何が何だか分からないという人が多いような気がする。

8月20日追記。
読み返してみて、いくら自分用の備忘録だからといって「何が何だか分からないという人が多いような気がする」とか「上に挙げたエントリーに書いてある」とかで、背景説明を終わらせてるというのも凄いので、過去の経緯を簡単に追記する。

2年前にpiCoreでPPAPを運用し始めた数か月後、再生データのサンプリング周波数が指定通りのサンプリング周波数にならずに、48kHzに変換されて再生されていたことに気が付いた。
変換されるのはalsa、dmixのデフォルト設定だと思い至り、変換されないようにする方法をネット上で探したところ、aplayのコマンドに「-D hw:0,0」というオプションを追加すればいい、という情報を得た。これを試みたが、何故かmpdが止まって音が出なくなった。
更にネット上を探したところ「-D plughw:0,0」というオプションで再生する方法があるという情報があり、試みたところ、48kHzに変換されることなく指定通りのサンプリング周波数で再生されるようになった。

ちゃんと指定通りに再生されるようになったのは良かったのだけど、当惑したのは「-D plughw:0,0」は一般的には「48kHz/16bitに変換して再生するオプション設定」とされていることだ。
つまり、うちでは通常と全く逆になった。
原因不明で、ずっとその設定で運用していたのだけど。
今回はその原因がやっと分かったというエントリーだ。要は、何処其処が間違ってましたという話である。

piCore7でppap (piped pcm audio play)を試みる
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180301a.htm
PPAP Back-EndのUSB出力が48kHzになっていたので修正した
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180523a.htm
piCore7で作るPPAP Back-End
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180527a.htm

これらのエントリーでBack-Endの作り方を書いている。
ちょっとBack-Endとして機能させるためのコマンドを引用する。

下記は24/192のデータを受ける場合。
192kHzがaplayで扱うことができるサンプリング周波数の上限なので、PPAPの上限も192kHzになる。

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"

当時、PPAP back-EndのUSB出力が48kHzになっていたのに気付かず使っていて、分かった時にはずいぶん驚いた。
上記のようにコマンドに「-D plughw:0,0」を加えることで、なんとか修正して設定どおりのサンプリング周波数で出力されるようにしたが、どうなってるんだろうと思ったまま、そのままになっていた(どうしてどうなってるんだろうと思ったのかは、上に挙げたエントリーに書いてある)。

アンプの調子もいいことでありがたいことだなあ、などと思ううちに、ふと脈絡なく思い出し、改めて調べ始めた。
以下、資料。実際は他にもあちこち見てまわったんだけど、省略。

PCM - MultimediaWiki
https://wiki.multimedia.cx/index.php/PCM
みみず工房本館 10センチの穴
http://mimizukobo.sakura.ne.jp/articles/articles007.html
Auraliti PK90の新機能とLinuxのインテジャーモード: Music TO GO!
http://vaiopocket.seesaa.net/article/223714988.html
ALSAでbit perfect再生するには ナカタの Digital Wonder Land
http://www.nakata-jp.org/computer/howto/audio/alsa.html

まず、みみず工房から引用。
2011年、9年も前の記事だ。原発のことも書かれていたりする。
この頃はうちではまだlinuxは使っていなかった。AirMac ExpressでPCオーディオをやっていた。

Computer Audiophileの[New mpd feature = cleaner signal](http://www.computeraudiophile.com/content/New-mpd-feature-cleaner-signal)という記事の情報によると、24-bit USB DAC に対する音質改善のため、mpdの改良が行われています。この記事はMPDの音質に関する大変興味深いやりとりがあり参考になります。例えば以下のような書き込みがあります。 S24_3LEハードでmpd.confのaudio_outputの「hw:n,n」を「plughw:n,n」と変えると(「hw:n,n」の行をコメントアウトしても同じ)、wavファイルは再生できるようなるのですが、音質は悪化します。これは上記の記事にあるように「plughw:n,n」を指定するとビットレートが48000、16ビットに固定されて、余分なフォーマット変換が入ってしまうためです。

2年前にうちで起きたのと同じようなことが書いてある。
ただ、音質が悪化したとは感じなかった。PPAPによる改善のほうが上回ったのだと思う。

早々に追記。
読みかえしてみて、「同じような事が書いてある」というのは大きな誤解を招くと思った。同じ事というのは「データが48kHzに変換される」ということだけで、plughwについては、うちではplughwを使うことで変換を回避したのだから、引用している内容とは真逆である。この、定説とは逆になったということが2年前からの疑問だったのだ。
あまりに記述が大雑把だったので加筆訂正する。

アドレスが書かれてあるComputer Audiophileのスレッドにも興味深い記載があった。

S24_3LE is a 24-bit format also known as "packed 24-bit". All 24-bit USB DACs only support S24_3LE. Since mpd didn't support this format before, it converted everything to a 32-bit format and then ALSA was needed to convert that 32-bit format to S24_3LE for a 24-bit USB DAC. That's why I could never get mpd to send audio straight to the Wavelength Proton with hw:0,0. I had to use plughw:0,0 instead because that allowed ALSA to make the conversion. hw:0,0 sends the audio straight to the DAC without any conversion. No other mpd.conf configuration is necessary besides specifying hw:0,0.

Music TO GO!から引用。こっちも2011年。

ALSAではDACなどのデバイス(ALSAでいうcard)に対してデータを送るときにいくつかのインターフェース(転送モードみたいなもの)を指定します。たとえばhwとplughwです。hwを使用した場合はDACにたいしてデータの改変なく(つまりダイレクトに)データを送出します。その代わりDACで扱えるデータのタイプをプログラム(再生ソフト)側で気にする必要があります。plughwを指定したときはALSAシステム側でなんらかの処理の後にデバイスに送出されます。たとえばデバイスが扱えないデータタイプを変換してくれますのでプログラムから見るともっと手軽です。
(中略)
この「ALSAのインテジャーモード」を使用するさいにはダイレクトに送るわけですから上に書いたようにhwインターフェースを使用する必要があります。問題はWAVを再生したときにここでエラーがおこると言うことです。
解決策としては上のCAスレッドにあるようにplughwを介してデータをいったん整数から小数点形式に変換するとエラーを回避することができます。つまりplughwインターフェースを介することによってWAVも問題なく再生できますが、先に書いたhwでの「ALSAインテジャーモード」のダイレクトアクセスのメリットは消失してしまいます。

ALSAでbit perfect再生するには、から引用。

非bit perfect再生
aplayを使用してわざわざ非bit perfect再生することもないと思いますが, 念のために書いておきます。 サウンドカードが対応していないサンプリング周波数やビット長のデータを、 無理やり再生することができます。 Bit perfect再生する時のhwパラメータをplughwに置き換えます。
hostname:~> aplay -D plughw:0,0 sample.wav
aplayの制限
aplayは、試験用に作られたプログラムのようで,制限があります。 特に,オーディオ再生として使用する場合の一番の制限は、 再生ファイルのデータフォーマットと、 デバイスのデータフォーマットが一致していなければならないことです。 デバイスが24bit linear PCM little endianだった場合, 再生するファイルも24bti linear PCM little endianでなければなりません。 ファイルが16bit だったり、big endianだったりすると、 この例ではbit perfect再生してくれません。 ここは注意してください。

次に、うちのサイトから引用。

以前に使っていた、
/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"
というようなコマンドだと、前述の通り音が出ない。alsa-dev.tcz alsa-doc.tcz alsaequal.tcz alsa-locale.tcz、、まあ、どれが働くのかわからないけど、これらがインストールされていたらdmixが働いて48kHzに変換された上で、音が出る。

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"
だったら「paused」が表示されて音が出ないんだけど、alsa-dev.tcz alsa-doc.tcz alsaequal.tcz alsa-locale.tczを追加インストールしても、「paused」で音が出なかった。「-D hw:0,0」はあちこちでdmixによるリサンプリングをさせない設定とされているんだけど、どうもpiCore7ではうまく機能しない。

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"
これだったら、こちらの求めるように機能して音が出る。どこかでそうなるように設定されているのかもしれないけど、よく分からない。
現状、変換せずに音が出てくれたらいい、という感じだ。

上記の引用は読むだけでは分かりにくいと思ったので表にして8月20日追記した。


alsa-modules-4.1.13-piCore_v7+.tcz alsa.tcz
(最低限のalsaインストール。dmix使用不可)

(以下tcz追加しdmix使用可能)
alsa-dev.tcz alsa-doc.tcz alsaequal.tcz alsa-locale.tcz

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"

paused

dmixが48kHz/16bitに変換し再生

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"

paused

paused

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"

サンプリング周波数を変換せず再生

未確認

なんだか、ちょっと見えてきたような感じ。
2年前の僕はpiCoreのせいにしてるけど、実はデータフォーマット設定が合っていなかったから音が出なかった可能性がありそうだ。「S24_LE」とかコマンドに書き込んでるけど、24bitだからこれかな、みたいな感じで記述していて、理解してないままなのだ。endianのことなんて考慮していない。
というか、調べたけど全く分からなかったので考慮を放棄したというのがあるんだけど。

当時はnano iDSD LEや、fireface UCXをCCモードで使っていた。
CCモードなんて基本的にiPad用だ。どういうフォーマットなのだろう、、、

DACが受け取れないフォーマットだったら「paused」で音が出ないということはあり得るだろう。
受け取れなかったのを「plughw」設定でなんとかして、音が出るようになっていたのかもしれない。plughwは、必ずしもサンプリング周波数やビット深度を変えるというものではなくて、データ伝送先が受け取れられるように擦り合わせるという設定なのかも。
dmixがあったら48kHzに変換されるというのも、たぶん、あったらそうするのであって、なかったらなかったで他の何らかの伝送できるフォーマットで送るようになっているのではないか。

もしかして、過去のエントリーの記録に痕跡が残ってないかしら、、、

、、、、、みつけた、、、、、

そんなこんなで、fireface UCXにCCモード上限の96kHzで入力できるようになった。
バックエンドで「cat /proc/asound/card*/pcm0p/sub0/hw_params」を打つと「96000」と表示される。

tc@box:~$ cat /proc/asound/card*/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 96000 (96000/1)
period_size: 256
buffer_size: 2048
tc@box:~$ 

あんた、format: S32_LE、ってはっきり出てますやん!コマンドは「S24_LE」だったんとちゃいますのん?その何処見とるか分からん目は節穴どすか!

なにか脳内で聞こえた気がしたけど気にしない。PCM - MultimediaWikiから引用。Google翻訳も併記する。

Integer Or Floating Point
Most PCM formats encode samples using integers. However, some applications which demand higher precision will store and process PCM samples using floating point numbers.
Floating-point PCM samples (32- or 64-bit in size) are zero-centred and varies in the interval [-1.0, 1.0], thus signed values.

整数または浮動小数点
ほとんどのPCM形式は、整数を使用してサンプルをエンコードします。 ただし、より高い精度を必要とする一部のアプリケーションでは、浮動小数点数を使用してPCMサンプルを保存および処理します。
浮動小数点PCMサンプル(サイズが32ビットまたは64ビット)はゼロ中心であり、間隔[-1.0、1.0]で変化するため、符号付きの値になります。

浮動小数点PCMサンプルは32bitか64bitと書いてある。
Music TO GO!の「plughwを介してデータをいったん整数から小数点形式に変換するとエラーを回避することができます」という記載と、うちでS24_LEだった筈のデータがS32_LEに変換されて聴けるようになったのと、整合性があるように思われる。

こうなると、現在メインで使っているADI-2 DACはどうなってるんだろう?と気になってくる。
現在はapu2、tiny Core pure64でPPAP Back-Endを運用している。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20200320a.htm
700kHz台でPPAP(22日、4月7日追記)

サウンドカードが対応しているデータフォーマットの詳細を確認できるコマンドがあるとのことで、sshでapu2にログインし使ってみる。

tc@box:~$ cat /proc/asound/card0/stream0
RME ADI-2 DAC (52973504) at usb-0000:00:10.0-1, high speed : USB Audio

Playback:
  Status: Stop
  Interface 1
    Altset 1
    Format: S32_LE
    Channels: 2
    Endpoint: 2 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000
    Data packet interval: 125 us
    Bits: 32

Capture:
  Status: Stop
  Interface 2
    Altset 1
    Format: S32_LE
    Channels: 2
    Endpoint: 1 IN (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000
    Data packet interval: 125 us
    Bits: 32

Capture:って、、ADI-2 DACにはADCの機能がある?と何処かで読んだ記憶があるのだけど、こういう表示になるのね。
DAC機能のほうはPlaybackの項目に書かれている。Format: S32_LE、ということだ。

今迄使っていたコマンド(bootlocal.shに書き込んである)は下記の通り。plughwを使っている。
/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=2048 --buffer-size=32768 -t raw -f S32_LE -r768000 -c2"
偶然、S32_LEになっている。
これは、768kHz/32bitにアップサンプリングするから、ぐらいの考えで書いたものだ。
これを下記のようにhw使用に書き換えて再起動してみる。

/usr/local/bin/ncat -kl 4400 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=4096 --buffer-size=32768 -t raw -f S32_LE -r768000 -c2"

全く問題なく音は出た。
なんということか。
音質には差がない。いや、多少、固い音か?、気のせいかな、区別は付かない。
しかし、これでビットパーフェクト、なのかな?
アップサンプリングしてるから今更ビットパーフェクトとか関係ないけど、アップサンプリングしたデータを正確に伝送しているということなんだろうか。

それにしても、僕はapu2をPPAPで使用開始するにあたって、44.1、96、192、384と、24bitとかで試してきているのだ。その際に、S24_LEとかS16_LEとか、書いてたような気がする。問題なく音が出ていたのは、plughwで設定していたからだ、ということになる?
もしかしたら、plughwのほうが気軽に扱いやすい設定方法という一面もあるのだろうか。

しかしとりあえず、夏が終わる前に宿題が一つ片付いて、よかったかなと思っている。

Posted at 22:49 in audio_diary | WriteBacks (0) | Edit Tagged as: , ,
Page 1 / 31 :  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Next › »