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: »piCore« (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: , , ,

May 09, 2024

Raspberry Pi 3B+をRoon Bridgeにする

今年に入って、いつ頃からか正確には分からないのだけど、piCorePlayerが不調になった。
Deezer音源のMQAを、Daphileから変換せずにDAC(SMSL M500)に送って鳴らすために使っていたんだけど、それが出来なくなった。そして、LMSをDaphileからMac miniに移行しても、動かないままだ。
原因ははっきりしない。
代替をどうするか、Volumio 3、Album Player for Linux(これって、Ras Pi用はpiCorePlayerベースなんだね)を試したが、結局うまくいかなかった。

そういうわけで、roon bridge、mpdとupmpdcliを、最新のpiCoreにインストールすることにした。
piCoreは、piCorePlayerのベースになっているOSだ。うちでは昔から汎用していて、今はサブシステムのRas Pi2、Roon Bridgeに使っている。

まず、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を編集しイヤホンジャックを止めて、i2sを一応生かして、ラズパイに刺して電源を入れる。
無事、起動した。
sshでログインし、filetool.sh -bでsshの鍵を保存する。
以下、パーティションを拡張。2Gも足しとけばよかろう。

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

The number of cylinders for this disk is set to 121008.
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: 3781 MB, 3965190144 bytes, 7744512 sectors
121008 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-7744511, default 16): 139264
Last sector or +size{,K,M,G,T} (139264-7744511, default 7744511): +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@pC141b3p:~$ sudo reboot

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

tc@pC141b3p:~$ 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@pC141b3p:~$

以上で、パーティション拡張終了。

次にntpclient.tczをインストールしようとしたら、リポジトリに置いていない。
http://tinycorelinux.net/14.x/aarch64/tcz/
どういうことかと思ってdateコマンドを打ってみた。

tc@pC141b3p:~$ date
Mon May  6 12:56:11 UTC 2024

どうやらUTCで正確に動いているような。ntpは要らないのかな。

さて、Roon Bridge化する。
https://help.roonlabs.com/portal/en/kb/articles/linux-install

インストーラー使用を推奨ということなんだけどpiCore、Tiny Coreは特殊なのでマニュアルインストールを選択。
libasound2が必要ということだが、説明を読むと、alsaの1.0.27以上が必要と読み替えていいらしい。これはリポジトリにある。
ということでインストール。
関連するソフトも同時に大量にインストールされる。
スクリプトを動かすのにbashが要るので、これもインストールする。ついでになんとなくcurlも入れる。

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

Roonのサイトには、下記3つのRoon Bridgeが用意されている。
Roon Bridge (x64)
Roon Bridge (armv7hf)
Roon Bridge (armv8)

Raspberry Pi 3b+にはarmv8用を使う。piCoreのホームディレクトリにダウンロードし、展開する。

tc@pC141b3p:~$ wget https://download.roonlabs.net/builds/RoonBridge_linuxarmv8.tar.bz2
Connecting to download.roonlabs.net (172.67.14.113:443)
saving to 'RoonBridge_linuxarmv8.tar.bz2'
RoonBridge_linuxarmv 100% |*******************************************************| 17.1M  0:00:00 ETA
'RoonBridge_linuxarmv8.tar.bz2' saved
tc@pC141b3p:~$ tar jxvf RoonBridge_linuxarmv8.tar.bz2
#---- snip

tc@pC141b3p:~$ ls
RoonBridge/                	RoonBridge_linuxarmv8.tar.bz2
tc@pC141b3p:~$ ls RoonBridge
Bridge/   RoonMono/ VERSION   check.sh  start.sh
tc@pC141b3p:~$

チェックスクリプトで使えるかどうか確認する。

tc@pC141b3p:~$ 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@pC141b3p:~$

使えそうだ。

tc@pC141b3p:~$ rm RoonBridge_linuxarmv8.tar.bz2
rm: remove 'RoonBridge_linuxarmv8.tar.bz2'? y
tc@pC141b3p:~$
tc@pC141b3p:~$ sudo vi /opt/bootlocal.sh

ダウンロードしたtar.bz2ファイルはここで削除する。
piCore起動時にRoonBridgeが起動するように、bootlocal.shを編集。下記、追記。

/home/tc/RoonBridge/start.sh start

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

filetool.sh -bで、状況を保存。
RoonBridgeが50MBぐらいあるので、数10秒かかる。しかし、他の置き場がないかといっても難しい。というのは、Roonのアップデートがかかる筈なので、filetool.sh -bで保存できない場所に置いたら後で困るから。
結局、ホームディレクトリがいいだろうということになる。

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

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

pstreeで、mono-sgenと表示されるのがRoonだ。ちゃんと起動している。

しかし、音が出ない。

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

DACは認識しているようだ。

なにがいけないのだろう。alsa-plugins-dev.tcz、alsa-utils-locale.tczもインストールしてみたが、音は出ない。USBケーブルを変えてみたりしたが、関係ない。
サブシステムのRas pi2からは、Roonで音が出ている。3b+との違いは、i2sかUSBか、ということだ。
でも、そんなところが関係するかね、、、

DACを替えてみる。M500からADI-2 DACに。
音、出るじゃん。
M500も、apu2からのUSB出力を受けたら音が出るのだ。なぜか、Ras Pi3b+からだと音が出ない。

pegasusはどうだろう。

tc@pC141b3p:~$ aplay -l
aplay: device_list:277: no soundcards found...
tc@pC141b3p:~$

USB端子を挿しても、認識していない。
スイッチをオン・オフしてみる、、、認識した。音も出る。

tc@pC141b3p:~$ 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@pC141b3p:~$

DACの名前が出ていない。まあ、中華DACだもんね。
M500もスイッチをオン・オフしてみる。
piCoreが落ちた。
再起動だ。
音が出た。USBってのはいろいろと微妙だね。

しかし、取り敢えずこれで、3b+をRoon Bridgeにすることに成功した。MQAサンプラーCDからリッピングしたMQAを再生できる。
RoonはDeezerには対応していないので、次は、これにmpdを組み込んで、UPnPレンダラーにする。そうすればLMSサーバーからDeezerのMQAを送信できる。
それが、いつ頃になるかは、分からないが。

あれ、もしかしたらvolumioもスイッチのオン・オフで使えたのかもしれない。まあ、いいや、piCore運用の方向でいこう。

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

Jun 12, 2022

Ras Pi B+とpiCore13.1でPPAP Back Endを作ってみたけど

現在のpiCoreの状況がどうなってるのかと思って、確認したことを記録しておく。

なんで突然、piCoreなのかというと、ハードの違いで音が変わるということを思ううちに、そういえば以前はRaspberry Piで鳴らしていたっけと思い、そこから、今はどうなってるんだろうということになったということだ。
piCoreの最新は13になっている。
http://tinycorelinux.net/13.x/armv6/releases/RPi/

nmap.tczは、piCore9まで用意されていて、10はpiCore自体が欠番。11、12ではnmap.tczがリポジトリに用意されていなかった。
しかし現在、piCore13ではnmap.tczがリポジトリに用意されている。ということは、piCore9以前か13だったら簡単にPPAP Back Endを作れるということだ。
http://tinycorelinux.net/13.x/armv6/tcz/

ちなみに、mpd.tczが用意されているのはpiCore7まで。
libmpdclient.tczはpiCore9までだ。
一方、Tiny Coreはというと、Tiny Core x86(32bit版OS)のリポジトリにはmpd-minimal.tcz、libmpdclient.tczが昔から今までずっと用意されている。つまり、実は手軽にmpdを扱うにはこれが一番簡単だ。nmap.tczもあるが、mpd-minimalでpipeが使えるかは確認していない。
http://tinycorelinux.net/13.x/x86/

64bit OSであるx86_64のリポジトリには、mpdが無い。
ソースをダウンロードしてインストールする必要がある。

一方、alsaはというと、piCore11からversion 1.2.2になって、音源のサンプリング周波数が768kHzまで通るようになっている。
piCore9だと、alsaはversion 1.1.1。音源が198kHzまでで良ければ、piCore9以前のバージョンでよくて、300kHz以上なら11以降が必要ということになる。
参考:
Changelog between 1.1.9 and 1.2.1 releases / Alsa Project News
https://www.alsa-project.org/wiki/Changes_v1.1.9_v1.2.1

現在、うちでは768kHz/32bitでPPAP方式を使っていて、Back Endで使っているのはTiny Core Pure 64 v11.0。ハードはapu2だ。
piCore13ならば、768kHzが使えるPPAP Back Endに出来る筈、、、
しかし問題は、Raspberry PiはUSBとLANが同じチップで処理されているんだったかな。Ras Pi4とか、新しいハードだと改善されたらしい?けど、うちに残っているB+とか2とかだと、大量のデータを送るのは、うまくいかない可能性がある。というか、B+とか2とか非力なハードで、768kHz/32bitなんて重い音声データを扱えるんだろうか。

しかしRaspberry Pi とpiCoreでPPAP Back End、apu2と比較できるならしてみたいかな。

せっかくなので、まずはRaspberry Pi B+で試してみる。
以下、工程と設定のメモ。

download
http://tinycorelinux.net/13.x/armv6/releases/RPi/piCore-13.1.0.zip

cmdline.txt add
host=pC131bp

config.txt rewrite
dtparam=audio=off

login
ssh tc@192.168.1.xxx

sudo fdisk -u /dev/mmcblk0
p
d
2
n
p
2
(write number - /dev/mmcblk0p2 / start)
+100M
w

filetool.sh -b
sudo reboot

login
ssh tc@192.168.1.xxx

sudo resize2fs /dev/mmcblk0p2

tce-load -wi nmap.tcz alsa-modules-5.10.77-piCore.tcz alsa.tcz alsa-utils.tcz

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

vi /opt/eth0.sh
#!/bin/sh
pkill udhcpc
ifconfig eth0 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255 up
route add default gw 192.168.10.1
# echo nameserver 192.168.10.1 > /etc/resolv.conf

chmod +x /opt/eth0.sh

sudo vi /opt/bootsync.sh
/opt/eth0.sh &

filetool.sh -b
sudo reboot

工程終了。
PPAP Middle Endにつないで起動。
Middle Endからsshでログインして、下記コマンドにてUSB DACの認識を確認する。

cat /proc/asound/card0/stream0

音を出してみる。
音は出た。しかし、ノイズだらけで、音楽を聴くというわけにはいかなかった。

Ras Pi2ではどうなのか。

download
http://tinycorelinux.net/13.x/armv7/releases/RPi/piCore-13.1.0.zip

cmdline.txt add
host=pC131b2

tce-load -wi nmap.tcz alsa-modules-5.10.77-piCore-v7.tcz alsa.tcz alsa-utils.tcz

上記以外の工程は同じ。
音は出た。やはりノイズだらけだが、音楽は聞き取れる。音程は正しいのに再生速度が遅い。これでは使えない。

PPAP Front Endでのアップサンプリングを止める。
Back Endの設定も合わせる。

/usr/local/bin/ncat -kl 4400 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=64 --buffer-size=512 -t raw -f cd"

これでどうか。
まともな音が出る、けど、、、操作へのレスポンスが遅い。
こんなに遅かったっけ、そういえば遅かったかな、、と思うぐらい遅い。
普段、Daphileとmpdで768kHzにアップして聴いてるのと比べても、なんだか遅い気がする。普段使っているシステムは、再生開始の操作をして音が出るまで数秒かかるけど、ボリューム調整への反応は遅くない。それが、Ras Piだと両方とも遅く感じる。 apu2よりもRas Piのほうが遅いハードだからだろうか。
しかし、DaphileとpiCorePlayerの組み合わせだと、そんなに遅く感じない。
もしかしたらLMSやUPnPは、ユーザーがレスポンスが遅いと感じないように作られているのかもしれない。

あれこれ弄るうちに、Daphileシステムの方も不調になってきた。原因不明、、、全システムをリブート。
システム全体の不調が影響したせいかどうか分からないが、音質も敢えてRas Piで聴きたいと思わせるものがない。

今回はここらで撤退することにした。
残念だが致し方なし。

Posted at 16:45 in audio_diary | WriteBacks (0) | Edit Tagged as: , ,

Nov 09, 2021

Raspberry Pi + USB WiFiアダプターで piCore 起動時に自動的に無線LANに接続させる

今回はLinuxの話になる。

前回のエントリーは、Raspberry Pi2をAP化、オーディオプレーヤー化しようとしたところ、なんだかよく分からないことになったという話だったんだけど、未だにどうなってるのか分からない。
とりあえずAP化の詳細は置いといて、初歩的なとこから、家庭内LANに無線でつなぐとこから始めよう、と思ったら、意外に嵌ったので備忘録化しておく。

まず使ったpiCoreは、piCore13.0.3 /armv7。つまりRaspberry Pi B2用の最新版。
うちで余っているRas Piは、B+、B2が多く、無線を使うならUSB WiFiアダプターを使うのが前提となる。入手しやすいのは最近の製品となるので、新しいOSじゃないと対応できないんじゃないかと思ったので、piCore7に拘るのは止めたということだ。

今回、それでもUSB WiFiアダプターはLinuxで使えないことが少なくないことを初めて知った。機材自体をpiCoreで認識できなかったり、Linux対応と書いてあってもドライバーをCDからインストールしないといけないのとかあって、ちょっと手間が掛かりすぎる。
何種類か試したけど、今のところ使えているのは、前回エントリーのBUFFALO WLI-UC-GNM、TP-LinkのTL-WN725N、エレコムのWDC-150SU2MBKだ。
Aigital AC600、Rich AC1200M、BUFFALO WI-U2-433DMSは、現在のところ使えていない。

環境構築のインストールに使ったコマンドは以下のとおり。
hostapd、dnsmasqはまだ使わないけど、今後の使用を考えて入れてある。関連があるtczも同時にインストールされる。

tce-load -wi ntp.tcz
tce-load -wi wifi.tcz firmware-brcmwifi.tcz firmware-ralinkwifi.tcz firmware-rpi-wifi.tcz firmware-rtlwifi.tcz
tce-load -wi wireless-5.10.16-piCore-v7.tcz wireless_tools.tcz
tce-load -wi usbutils.tcz usbutils-doc.tcz libusb-dev.tcz libusb.tcz usb-ids.tcz
tce-load -wi hostapd.tcz dnsmasq-doc.tcz dnsmasq.tcz

あれこれネット上で迷ったが灯台下暗しで、最終的に参考にしたのはtceコマンドで見ることができるwifi.tczの説明書き。

Comments: A console based tiny wifi scan access point tool.
 Select from menu or type sudo wifi.sh
 Creates wifi.db in HOME directory.
 Can auto connect to first db entry with use of -a flag, e.g.,
 /usr/local/bin/wifi.sh -a 2>&1 > /tmp/wifi.log
 Add above to bootlocal or bootsync for quick auto connect.
 When mobile, use menu for select list of APs.
 wpa_supplicant driver is defined by /etc/sysconfig/wifi-wpadrv
 default is wext. Add it to backup if changed.
 Available drivers wext,nl80211

加えて「/usr/local/bin/wifi.sh」に書かれているwifi.shのヘルプ。
これはコマンド「sudo wifi.sh -?」でも見ることができる。

Usage:
 Default select AP from menu and request IP via DHCP.
 -a Auto connect to first wifi.db entry via DHCP.
 -p Select AP from menu and prompt for IP configuration type.
 -w Wait indefinitely until lease is obtained
 -? Displays this help message.

これらを参考にして実際に行った手順を、以下に記録しておく。

まず「/opt/bootlocal.sh」に無線LAN有効化のコマンドを書き込む。これで電源を入れたときに、無線LANが有効になる。

tc@box:~$ vi /opt/bootlocal.sh

ifconfig wlan0 up

設定ファイルを書き換えたので保存のコマンド「filetool.sh -b」を打って保存。
sudo reboot で、再起動。

USB WiFi アダプター(今回はTP-Link TL-WN725N)を刺し、ハード認識確認のコマンドを打つ。

tc@box:~$ lsusb
Protocol spec without prior Class and Subclass spec at line 23179
Bus 001 Device 004: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
Bus 001 Device 003: ID 0424:ec00 Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
tc@box:~$


tc@box:~$ iwconfig
lo  no wireless extensions.

eth0  no wireless extensions.

wlan0 unassociated  ESSID:""  Nickname:""
  Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated 
  Sensitivity:0/0  
  Retry:off RTS thr:off Fragment thr:off
  Power Management:off
  Link Quality:0  Signal level:0  Noise level:0
  Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
  Tx excessive retries:0  Invalid misc:0 Missed beacon:0

tc@box:~$ 
tc@box:~$ ifconfig
eth0  Link encap:Ethernet  HWaddr B8:27:EB:39:F8:15  

      *snip*

lo    Link encap:Local Loopback  

      *snip*

wlan0 Link encap:Ethernet  HWaddr 7C:C2:C6:1B:53:D2  
      UP BROADCAST MULTICAST  MTU:1500  Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tc@box:~$

こんな感じ。機材は認識されているけど、wifi (wlan0)は機能していない。

wifi.tczの説明書きに沿って設定していく。
sudo wifi.sh を打って、WiFiでローカルのLANに接続する。以下、流れを記載。

tc@box:~$ sudo wifi.sh

Select Wifi Network

    ESSID           Enc	Qual	Channel Type		
 1. ssssssssssss    on	  0	  2	WPA
 2. oooooooooooo    on	  0	  5	WPA
 3. AAAAAAAAAAAA    on	  0	 12	WPA

Enter selection ( 1 - 3 ) or (q)uit: 3

Enter password for AAAAAAAAAAAA (8 to 63 characters): zzzzzzzzzzzz
Sending credentials to requested access point AAAAAAAAAAAA..
deleting routers
adding dns 192.168.1.1
tc@box:~$ 

tc@box:~$ ifconfig
eth0  Link encap:Ethernet  HWaddr B8:27:EB:39:F8:15  

      *snip*

lo    Link encap:Local Loopback  

      *snip*

wlan0 Link encap:Ethernet  HWaddr 7C:C2:C6:1B:53:D2  
      inet addr:192.168.1.42  Bcast:192.168.1.255  Mask:255.255.255.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:19 errors:0 dropped:82 overruns:0 frame:0
      TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:89869 (87.7 KiB)  TX bytes:3824 (3.7 KiB)

tc@box:~$ 

こんな感じでLANのアクセスポイントにWiFiで接続できた。
アクセスポイントをセレクトし(上の例だとAAAAAAAAAAAA)、パスワードを入力(上の例だとzzzzzzzzzzzz)、「ifconfig」でIPアドレスを確認すると、wlan0に「192.168.1.42」が振られている。

こうして1回接続することで、接続設定ファイル「wifi.db」が、ホームディレクトリに作られる。このファイルにはアクセスポイントとパスワード、暗号化について記述されている。これを「filetool.sh -b」を打って保存。

wifi.tczの説明書きには、
/usr/local/bin/wifi.sh -a 2>&1 > /tmp/wifi.log
Add above to bootlocal or bootsync for quick auto connect.
とあるのだけど、、、
このコマンドをそのまま使うと、理由は分からないが上手くいかなかった。LANに接続できないままコマンドが指示を出し続け、ログが積み重なるような状況に至る。
そういうわけで、うちではbootlocal.shに下記のようにコマンドを書き込んだ。

tc@box:~$ vi /opt/bootlocal.sh

/usr/local/bin/wifi.sh -a

保存のコマンド「filetool.sh -b」を打って、sudo reboot で、再起動。
これで、Ras Pi電源オン、piCore起動と同時に、wifi.dbに記載されたアクセスポイントに自動的に無線でつながる。

これで、OS起動と同時に自動的に無線LANにつながるpiCore13ができた。といっても、アクセスポイントは予め設定されていて変更するには再設定する必要があるので、いつでも何処でも使えるというのではないけど。あと、USB WiFiアダプターを替えたら設定し直ししないといけないようだ。

ともあれ、これでうちで余っているRaspberry Piを無線でつないで、オーディオ以外でも活用することができるかもしれない。

Posted at 23:11 in pc | 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の問題は、今後あせらずに対処していこうと思う。

May 04, 2020

今更だがpiCore7を復帰させる

いろいろ世の中も生活も面倒な状況が続いている。
仕事柄、休んでばかりもいられない。それでもGWはそこそこ休みがある。休めるだけいい。

前回のエントリーで、PPAP方式で複数のサンプリングパラメータを使い分ける方法を書いた。
だけど、どうもPPAP 192/24、96/24で使っていると、クライアントの操作に音楽再生の追随が5、6秒ほど遅れる。まどろっこしくてストレスになる事がわかった。
最初にncmpcppから再生開始の指示を出すときは直ぐに反応する。しかし音量を調節したら反応するのに5秒ほどかかる。他の曲に変えようとして操作したら、やはりそのぐらい遅延が生じるのだ。

ちなみに、768/32 PPAPでは全くそんなことがない。遅延はあるかないか分からない程度としか感じない。快適そのものだ。
つまり処理能力の問題ではなく、何処かの設定だか何かによるものだと思う。
しかし、どうしたら直せるのかは分からない。

以前に使っていた時はこんなだったっけ?ハードやOSの違いによるのかな?とか思いながら使っていたが、だんだんPPAPではない他の方法を探そうという気持ちになってきた。だって低音質音源への対応に、そんなストレス抱えてちゃいかんでしょ。NASマウントによるmpd再生に回帰することにした。

最初に思いついたのは、raspberry pi2の再利用。
既存の音楽再生用ディストリビューションを利用できる。
lightMPD、Symphonic MPD、、、いや、それはなんというか、大根切るのに日本刀みたいでバランスが悪すぎる。

いっそのこと、VolumioとかMoodeぐらいでいいか、、、
Moodeをダウンロード、、、遅すぎる。昨今の時世のでネットが重いせいか2時間以上かかった上、DL失敗と表示された。
Volumio2は、、、設定がめんどう、、、やっぱりなじめない。
そういえば、以前開発終了していた頃に落としたArchphileがあったな、、NASをマウントしない。sshでログインしていじっても、設定が保存されない。

そんなこんなで、どうしようかと思案するうち、piCore7でいいんじゃないのかと気付く。
うちで使いやすい再生環境を作るとなったとき、簡便で手軽なのはこれが一番だったということを思い出した。

piCore7はmpdがtczファイルで用意されているので、簡単に環境構築ができる。
やり方は過去のエントリーほぼそのままで楽々。備忘録残しておいてよかった。
1時間ほどで完成する。

piCore7にmpdをインストールする方法
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180103a.htm

以前の行程と違うのは、ip固定にしていないのと(最近は固定せずに使うことが増えた。DHCPサーバーまかせだ)、ディスクイメージ拡張の際にmicroSDカードいっぱいには拡張せずに200MBで納めておいたこと。せっかくなのでmpdをインストールしたmicroSDカードからバックアップのディスクイメージを作ることにしたのだ。

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

Command (m for help): p

Disk /dev/mmcblk0: 3965 MB, 3965190144 bytes
3 heads, 8 sectors/track, 322688 cylinders, total 7744512 sectors
Units = sectors of 1 * 512 = 512 bytes

        Device Boot      Start         End      Blocks  Id System
/dev/mmcblk0p1            8192       69631       30720   c Win95 FAT32 (LBA)
/dev/mmcblk0p2           69648       93119       11736  83 Linux

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

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First sector (8-7744511, default 8): 69648
Last sector or +size or +sizeM or +sizeK (69648-7744511, default 7744511): +200M

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@box:~$ sudo reboot

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

tc@box:~$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.42.13 (17-May-2015)
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 195312 (1k) blocks long.

これで220MB強のサイズになった。

mpdインストールの工程が終わって出来たmicroSDカードから「dd」コマンドでバックアップのディスクイメージを作る。
これは普段使いのノートPC、Fedoraでの仕事。
若干余裕を見て、250MB程の大きさで指示する。

[ab@fedora1 ~]$ sudo dd if=/dev/sdb of=~/Downloads/z.img bs=1M count=250 status=progress
255852544 bytes (256 MB, 244 MiB) copied, 8 s, 31.9 MB/s
250+0 レコード入力
250+0 レコード出力
262144000 bytes (262 MB, 250 MiB) copied, 8.2029 s, 32.0 MB/s
[ab@fedora1 ~]$

これで、262.1MBのディスクイメージが出来た。
何かあった時に焼いて使う。
以前に、大きくし過ぎたパーティション(SDカードいっぱいで8GBとか)を縮小してバックアップしようと試みたこともあったんだけど、動作しなくなったり何かと不具合があったので、やっぱり予め小さめに作った上でディスクイメージにした方がいいと考えた。
めったにこういうことはしないので、じきに忘れるので備忘録。

今回はせっかくなのでネットラジオもpiCore7で聴けるようにした。
NASにそれ用のディレクトリ「netradio」を作ってpls形式というネットラジオ用のファイルを置く。
mpdはこれらをプレイリストとして扱うので、ncmpcppで選択して再生指示すれば、ストリーミング再生が可能。
Linnのネットラジオとかを聴いている。
本当はらじるらじるとか聴けるようにしたいんだけど難しい。もっと簡単に聴けたらいいのに。

ただ、ネットラジオ再生中、ときどきncmpcppがエラー音を吐く。
コンポのほうは問題なく再生しているけど、クライアントpcから「ピコッ、、、ピコッ、、、」と音がするのだ。ncmpcppを閉じると消える。起こすとまた鳴り始める。
曲が変わると消えるので、音源由来で何かあるのかもしれないけど、よく分からない。

Ras pi2からの出力について。

usb出力はDACの追加が要るので扱いにくいし、i2s DACでアナログ出力もアンプに受け入れ場所がない。
そういうわけで、hifiberry Digi+で、SPDIF出力することにした。

出力先をSM-SX100やOdeon-liteにしたら、768/32 PPAPとの切り替えの際にSM-SX100の入力セレクターを弄らないといけない。
ずいぶん前からセレクターの反応が悪いので、なるべく触りたくないという事情がある。

ADI-2 DACにはusb、coaxial、optical、3つの入力端子があるんだけど、何れかからの入力があれば自動的に識別して再生してくれる機能がある。つまり、入力切替をDACがやってくれるということだ。
apu2d4からのusb-768/32と、ras pi2-Digi+からのoptical-96/24、両方をADI-2 DACに繋いでおけば、椅子に座ってノートPCからどちらのmpdを鳴らすか指示を出すだけで、ADI-2 DACが入力された音源を再生してくれて、SM-SX100のセレクターは触る必要がない。
問題は両方から同時に入力したらどうなるか分からないってことだけど、これはしないように注意するということで。

そういうわけで、現在はPCトラポは2本立てだ。

システム上流構成図

GWでのんびり過ごしていても、世界は大きく揺れている。
とにかく、暮々もみなさま、御自愛の程を。

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

Oct 21, 2018

ADI-2 DACとpiCoreで、384kHz以上を鳴らしてみる

最近、ADI-2 DACがメインのDACになった。
導入した目的には384khz以上にアップサンプリングして聴くというのがあって、なんとか出来たので、顛末を書いておく。

ADI-2 DACを導入して以降、ras pi 2/ppap/192khzで聴いていた。
普通に384khzで継ぐと、リーン、、、と、薄い金属が震えるような雑音が再生音に乗るのだ。jitteringっていうのかな。多少、プチプチいうノイズもある。ネット上にはADI-2 Proとras pi 2のケースで報告がある。以下引用。

https://www.forum.rme-audio.de/viewtopic.php?id=25703
RME User Forum

Volumio installation was straight-forward but I am getting some jittering (clicks) during the playback.

ADI-2 DACにはWindows用とMac OSX用のドライバが付属していて、これでusb接続を最適化していると思うんだけど、Linux用のドライバはないので、こっちが工夫しないといけない。

一時はras pi 3b+を導入して無線LANでNASマウントしてusb出力したらどうだろうか、などと考えていたんだけど、5ちゃんねるに書き込みがあって、3b+の有線lanが微妙ということらしい。それって、3b以前はどうなんだろうか。
無線lanを使う分には問題ないのかな、、、下記は書き込まれていたリンク。

https://volumio.org/raspberry-pi-3-b-plus-audio-review/
THE NEW RASPBERRY PI 3B+ AUDIO-RELATED REVIEW

As usual, I started playing my “Raspberry killer” track: a 32 bit, 678 kHz .wav file from my NAS. And… What a terrible disappointment: loads of crackles and a whole lot of lost packets.
Tried then with DSD, 24/192 flacs, and even 16/44.1 flacs. All sounded just terrible. So, indeed the new USB BUS did change USB Audio performances, unfortunately, it did for the worst.

Luckily though, I then tried to play the same files from a USB drive (and not from a NAS), and magic happened: spotless playback up to 32\768. Seemed that taking ethernet (I was connected on wired connection) out of the equation did the trick. So connected the PI via wifi and restarted without ethernet: same result, HI-Res Music playback was just perfect to my USB DAC.

しかし、他の解決策も5ちゃんねるにあった。下記、引用する。

ethtool -K eth0 tx-tcp-segmentation off tx-tcp6-segmentation off
(イーサネットチップで行っているパケット処理をオフにしてCPUで行うなうようにする)
パケットロスの発生はドライバのできによるものらしいのでベースのOSでドライバ更新されればvolumioにも反映されるようです(直す気があるかどうかは不明)

上記コマンドによる設定変更は記憶されないのでもしうまくいった場合/etc/rc.d/init.d/localにコマンド書き込んで起動時に自動実行させる必要があります
ギガビットイーサの速度が出ないときの対策なので今回の件にあてはまるかは未知数ですけどね

これは実は、piCore、pi 2用の対策ではないのだけど、
書き込みを参考に、ras pi 2/piCore9で、ethtoolを使ってみた。
他の書き込みによると、moode audioではデフォルトで設定されているらしい。
ethtool -s eth0 speed 100 duplex full というコマンドも対策として上がっていて、3b+だと有効な場合があるようだ。

tce-load -wi ethtool-doc.tcz ethtool.tcz
sudo ethtool -K eth0 tx-tcp-segmentation off tx-tcp6-segmentation off

どうも、自分が何をやってたのか、はっきりしないんだけど、、、
インストールして設定のコマンドを打って、nasマウント/384khzでノイズなしで聴けるようになった。768khzでも、設定前には全く音が出なかったのが、数秒だけど音が出る。残念だけどその後は途切れ途切れになる。
volumio2を試した時は768khzでも音が出たんだけど、プチプチノイズが乗るので使用を諦めた。384khzでもときどきある。piCore9で768khzだと途切れ途切れでプチプチノイズどころではない。反面、384khzだと問題なく聴ける。
この辺、何処をどういじったら違ってくるのか、よく分からない。

音を比較したら、nasマウント/384khzのほうがppap/192khzより少しだけ細やかな音がする。ごちゃっと塊のように聴こえていたオーケストラの弦楽が、ほぐれて滑らかに聴こえてくる感じ。少しだけの変化なんだけど、音楽としては案外大きな違いに感じられる。

しかし、この時点ではppapのras pi 2はethtoolによる設定をしていない。同じ設定をしないと単純な比較はできないと思った。

ethtoolをインストール。
ethtool -k eth0、ethtool eth0 で設定前の状態を確認。
sudo ethtool -K eth0 tx-tcp-segmentation off tx-tcp6-segmentation off で設定、、、
ethtool -k eth0、ethtool eth0 で設定後の状態を確認、、、設定表示に変化なし。
なんなんだろうこれは。。。

実は、nasマウント/384khzのほう、コマンドを打つ前と後で設定表示の変化を確認していなかったことに今更気付く。ということは、コマンドが本当に効いたのかどうか、実は分からないということなのか?
5ちゃんねるの書き込みには設定変更は記憶されないとあるが、どうも、picore9だと、記憶されているような。というのは、リブートしても効果が続いているからだ。
いや、それって、コマンドで設定変更されてないという可能性もあるんじゃないのか。

piCore9を1から焼いて試してみる。
結果から言うと、、、どうも、ethtoolは関係ないらしい。インストールしなくても384khzの音が出ている。
現在の.mpdconfの設定は下記のような感じ。

samplerate_converter                "Fastest Sinc Interpolator"
audio_output_format                 "384000:24:2"

audio_buffer_size "32768"
buffer_before_play "20%"

audio_buffer_size を奢るというのが決め手だったらしい。
そうなのか?おっかしいなあ、、、

11月6日、追記。
日々あれこれと聴いてるうちに、ときどき、チリ、、、チリ、、、とノイズが入ることに気付いた。
まあ、アナログみたいなもんかと思って無視することもできるんだけど、対策を検討、、、
audio_buffer_size "65536"
buffer_before_play "20%"
こんなところで、とりあえず様子を見ている。おさまったように思うんだけどな、、、

さて、改めて、音の方はというと、やはり情報量はnasマウント/384kHzのほうが多い。音の勢いは、ppap/192kHzのほうがあるように聴こえる。この辺り微妙で、でもよく聴くと、ppap/192kHzは微かに音が滲んでいるせいで強く聴こえるということが分かる。nasマウント/384kHzのほうが正確だ。

例えばジョージウィンストンのLinus & Lucyとか聴くと、ppap/192kHzだと「この重いピアノの音は何?」って思うんだけど、nasマウント/384kHzだと「ああ、重い音なんだこれは」と納得がいく感じ。楽器の特性によるものか演奏の仕方によるものか僕には判断が付かないけど、ニュアンスが伝わって音色を理解しやすくなる。
アストラッド・ジルベルトのデビューアルバムも、以前は眠たく甘ったるいだけの声で蓼食う虫も好きずきだと思っていたのが、384kHzにアップサンプリングしたら、表情があるリアルな女性の歌声だと分かるようになった。今回、改めてこの音源の音質について調べて、実は初期のアナログプレスで「VAN GELDER」の刻印があるのが音がいいとされている、ということを初めて知った。正直、以前だったらそんなこと調べる気にもならなかったんだけど。

nasマウントでここまで音の表情が出るんだから相当だと思う。
なんだかノウハウの信憑性に疑問があるが、とりあえず音が出て、その音がいいので、今のところはそれでいこう、という感じ。

ついでに、/mnt/mmcblk0p2/tce/onboot.lst を編集してシステムを軽くしておく。

mc.tcz
openssh.tcz
boost-dev.tcz
libsamplerate-dev.tcz
libsamplerate-doc.tcz
flac-doc.tcz
libcue.tcz
libcue-dev.tcz
icu-dev.tcz
libid3tag-dev.tcz
libmad-dev.tcz
mpg123.tcz
mpg123-dev.tcz
mpg123-doc.tcz
lame-dev.tcz
lame-doc.tcz
libmpdclient-dev.tcz
libmpdclient-doc.tcz
alsa-oss-dev.tcz
alsa-oss-doc.tcz
alsa-plugins-dev.tcz
alsa.tcz
alsa-utils-doc.tcz
alsa-utils-locale.tcz
mpd-0.19.19.tcz

音の変化は、どうなんだろうなあ、、、正直、明らかな変化は感じない。悪くなってはいないと思う。
サンプリング周波数が高くなると変化が目立たなくなるんだろうか。

768kHzではどうなのかという課題がある。

前述のpi 3b+のレビューでは、usbメモリの768khzハイレゾファイル再生に問題なしとある。うちはアップサンプリングするので、それよりも負荷は多い。 しかも、pi 2でどうなのか。LANがボトルネックということなら、RAMメモリ再生でどうなのか。

44.1/16ファイルの768khzアップサンプリング再生を試してみる。「audio_buffer_size」を90000まで上げる。音が出始めるまで数十秒かかり、音が出て数十秒間は再生できた。その後は途切れ途切れで音楽にならない。audio_buffer_sizeが小さい値だと、最初から途切れ途切れになる。
どういうんだろ、libsamplerateでアップサンプリングするのが間に合わないのかな。もしかしたら、SoXだったら上手くいくかもしれない。しかしpiCore9でSoXはリポジトリにsoxr.tczがないので使えない。

オーバークロックしてみるという手があるかも。

arm_freq=1000
core_freq=500
sdram_freq=500
over_voltage=6

こんな設定で鳴らしてみたら、実用にならないのは同じだが、多少マシになった。
ということは、ras pi 3b+のほうが可能性があるということか、、、

さて、piCore7はppap/192kHzが上手くいかなかったから最近は使ってなかったんだけど、オーバークロックしてSoXのアップサンプリングが使える。と思って、やってみたけど、ダメでした。192kHzでもjitteringが乗る。
192khz以上のアップサンプリング音源をADI-2 DACで聴くには、piCore9以降が必要みたいだ。

将来的には、ppapで384kHz以上が使えるようになったら使ってみたいと思う。

あと、Ras pi 3b+を入手して、無線でNASマウントしてみたい。
lanとusbを1チップで処理するras pi 2はusbオーディオでは不利だ。3b+なら無線LANとusbで、入出力の処理を別の経路に振り分けることができる筈だ。前述の3b+のレビューによると無線lanは使えそうだ。
問題は、piCoreがまだ3b+に対応してないこと。対応するのはpiCore10で、現在はベータ版がリリースされている。いろいろ手を入れて使うにはスキルが要る。普段使ってないが、raspbianでいいじゃんという考えもある。piCoreが対応するまでのつなぎには充分かな。余裕ができてからか。

Posted at 09:25 in audio_diary | WriteBacks (0) | Edit Tagged as: , ,

Jun 08, 2018

piCoreのonboot.lstを編集してタスク軽減を目指す

先日、piCore7で作るPPAP Frontというエントリーをアップした。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180529a.htm

その中で、/mnt/mmcblk0p2/tce/onboot.lst を編集することでタスクを減らせるという話を書いた。

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

mc.tcz
openssh.tcz
boost-dev.tcz
libsamplerate-dev.tcz
libsamplerate-doc.tcz
flac-doc.tcz
libcue.tcz
libcue-dev.tcz
libid3tag-dev.tcz
libmad-dev.tcz
mpg123.tcz
lame-dev.tcz
lame-doc.tcz
libmpdclient-dev.tcz
libmpdclient-doc.tcz
mpd-0.19.19.tcz
nmap.tcz

ついにここまで削ったが、ちゃんと音は出ているようだ、、、

tc@box:~$ df
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   833.2M     11.0M    822.2M   1% /
tmpfs                   462.9M         0    462.9M   0% /dev/shm
/dev/mmcblk0p2            3.6G    177.9M      3.3G   5% /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/loop53             512.0K    512.0K         0 100% /tmp/tcloop/sqlite3
/dev/loop54             128.0K    128.0K         0 100% /tmp/tcloop/libudev
192.168.1.80:/titan       2.7T      2.0T    670.6G  76% /mnt/music/nas

55個になった、、、
じゃあ音はどうなのかというと、例によって比較はできてないんだな、、、
これ以上は削るわけにはいかないような気がするし、この手法で出来るのはここらあたりまでかと思う。

今回は音の比較をしたという話だ。
結論から書くけど、音は良くなる。前の状態には戻したくないな、と思う程度の変化はある。

うちにはメインシステムで運用しているRas Pi以外にテスト運用に使うのが数台あってダイニングの本棚の底のほうに隠すかのように置いてある。前のエントリーをアップした時点では、こうした試験運用piCoreで音を出している、という状況だった。
LANの状態は下図のような感じ。

クライアントPCノートでfront1にsshでログイン、onboot.lstを編集してはリブートし、back-end1に音声データを送って試してみた。ある程度までタスクを減らせたのは前述のとおり。
back-end1に繋がってるのは小さいデスクトップ用モニタースピーカーなので音質評価は難しい。

front1から、メインシステムのback-end2にデータを送ってみる。リビングのJBLの4425mk2から音が出る。
まあ、こんなもんかな、、、
ふだんfront2/back-end2で鳴らしているのに比べると、むしろ音は良くない。

これは想定内でもあって、というのは図を見れば分かるんだけど、front1からback-end2への伝送経路はとても長い。
音源データの流れは、
NAS - hub2 - hub0 - hub1 - front1 - hub1 - hub0 - hub2 - hub3 - back-end2
と、こんな感じ。
hub0はルーターとDHCPサーバーも兼ねていて、そこをデータが通過するのも更に条件を悪化させているんじゃないかと思う。
front2からback-end2への流れは、
NAS - hub2 - front2 - hub2 - hub3 - back-end2
こんな感じ。
front以降に通過する段階がずいぶん違う。
この状況だったらonboot.lstを編集していないpiCoreのほうが音がいい。
というかタスク軽減による効果がはっきりしない。

ということで、front1に刺してあるonboot.lst編集済みmicroSDを抜いて、front2に差し替える。両方とも同じRas pi2初期型だから差し替えるだけで問題なく動く。pi2後期型だとどうなのか分からないけど。

編集なしと比べてどうなのか。、、、
微妙に違う。
というか、front1とfront2の大きな差に比べたら、差は少ない。
しかし、少ないとはいえ無視できないレベルの改善はあって、OSが不安定になるとか問題がないようならonboot.lstを編集しタスクを減らしたほうが良さそうだ。

そんなことを考えながら続けてあれこれ聴いてみるうちに、なるほど、これは戻れないかもと思うようになった。
音のリアリティ、SN感が高く細やかで雑味が少なくなる感じ。音場表現もより安定し深みが出て、前後も見易くなるようだ。

今回はPPAP運用の流れでonboot.lstを編集したけど、PPAPで使うかどうかに関係なくpiCoreでmpdの音を改善しようと思ったら試みていい方法だと思う。Ras pi1台でのmpd運用の時でも音質改善する可能性がある。

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

May 29, 2018

piCore7で作るPPAP Front

piCore7でppap (piped pcm audio play)を試みる
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180301a.htm

3月に上記のエントリーを上げて、前回はバックエンドのエントリーを上げた。
フロントのエントリーがないのも、ちょっとね、と思って独立したエントリーにまとめることにした。新しいことはあんまりないんだけど。

課題としては、
フロント化に最小限必要な環境を見つけたい
mpdをOS起動時に自動起動できないか、といったところなんだけど、よく分からないところは分からない。

最初にお断り書き。
このエントリーはRaspberry pi2の使用を前提として書いている。
3以上は所有していないしB+以前の機種で仕事量が多いフロントを受け持たせる気に僕自身はなれないという事があるので。
アップサンプリングとか負担が多い仕事をさせずに動かすならB+とかでも問題ないかもしれないけど、そこはうちではやっていないので分からないところだ。

まず、microSDにpiCoreを焼いて、ras pi2に刺して起動して初期セッティングする。
詳細は、こちらのエントリーを参照のこと。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180103a.htm
piCore7にmpdをインストールする方法

以下、sshでログイン後の流れを.ash_historyファイルからコピペ。

filetool.sh -b
sudo fdisk -u /dev/mmcblk0

sudo resize2fs /dev/mmcblk0p2
vi /opt/eth0.sh
chmod +x /opt/eth0.sh
vi /opt/bootsync.sh
vi /opt/.filetool.lst
filetool.sh -b

ここまでで、基本的な初期セッティングは終了。
バックエンドとほとんど同じだ。
出力をpipe - LAN経由でするのでi2s出力の設定は要らない。ネット上を探したらHAT形式のLAN出力ボードみたいなものもあるみたいなんだけど、、いや、USB出力だったっけ?、、そういうのを使う場合以外は要らないという意味だ。

今回は、先にmpdをダウンロードし解凍し、INSTALLファイルを確認する。
バージョンは0.19.19.

wget https://www.musicpd.org/download/mpd/0.19/mpd-0.19.19.tar.xz
xz -dv mpd-0.19*
tar -xf mpd-0.19*
less mpd-0.19*/INSTALL
Dependencies
------------
gcc 4.7 or later - http://gcc.gnu.org/
clang 3.2 or later - http://clang.llvm.org/
Any other C++11 compliant compiler should also work.

Boost 1.46 - http://www.boost.org/

GLib 2.28 - http://www.gtk.org/
General-purpose utility library.

最低限、これだけは必要ということか。ずっと更に下の方を読んでいくと、他にも必要なものが書いている、、、
取り敢えず、下記をインストールしてみる。

tce-load -wi \
gcc_base-dev.tcz gcc-doc.tcz gcc_libs-dev.tcz gcc_libs.tcz gcc-locale.tcz gcc.tcz \
glib2-dev.tcz glib2-doc.tcz glib2-locale.tcz glib2-python.tcz glib2-dev.tcz \
glibc_add_lib.tcz glibc_apps.tcz glibc_base-dev.tcz glibc_gconv.tcz glibc_i18n_locale.tcz \
glib-networking-dev.tcz glib-networking-locale.tcz glib-networking.tcz \
boost-dev.tcz boost.tcz

tce-load -wi \
flex-dev.tcz flex-doc.tcz flex-locale.tcz flex.tcz \
gdbm-dev.tcz gdbm-doc.tcz gdbm-locale.tcz gdbm.tcz \
bison-dev.tcz bison-doc.tcz bison-locale.tcz bison.tcz

ls /usr/local/tce.installed/

実際には、こうしたコマンドに表記されているもの以外にも関連のあるものがあれやこれやとインストールされる。

次にmpdが使うライブラリやエンコーダーをインストール。
以前はalsa関連はまとめてインストールしていたけど、考えてみたらPPAPのフロントではalsaを使わない。だったらなくても問題ない?ということで、コマンドからalsaを省いてみた。

tce-load -wi \
libsamplerate-dev.tcz libsamplerate-doc.tcz libsamplerate.tcz \
flac-dev.tcz flac.tcz flac-doc.tcz libcue.tcz libcue-dev.tcz \
icu-dev.tcz icu.tcz libid3tag-dev.tcz libid3tag.tcz \
libmad-dev.tcz libmad.tcz mpg123.tcz lame-dev.tcz lame-doc.tcz lame.tcz \
libmpdclient-dev.tcz libmpdclient-doc.tcz libmpdclient.tcz

しかし関連があるということで、alsa-devとalsa-modules-4.1.13-piCore_v7+がインストールされている。

この時点でmpdのコンパイル、インストールを試みたけど失敗。
./configureで、いろいろ足りないみたいなことを言ってくる。
何が足りないのかは、本当はlogを読まないといけないのだけど、、、

手を抜いて、、、下記追加。

tce-load -wi \
binutils-dev.tcz binutils-doc.tcz binutils-locale.tcz binutils.tcz \
ncurses-dev.tcz \
make-doc.tcz make-locale.tcz make.tcz \
automake.tcz autoconf-doc.tcz autoconf.tcz libtool-dev.tcz libtool-doc.tcz \
compile-essentials.tcz squashfs-tools.tcz bash-locale.tcz bash.tcz \
bc-doc.tcz bc.tcz pkg-config-doc.tcz pkg-config.tcz cmake-doc.tcz cmake.tcz

こんなところでどうか。
予めダウンロードして解凍したmpdを、もう一度コンパイル。
コマンドを羅列。

cd mpd-0.19*

./configure --enable-pipe-output
make
mkdir ../mpd
sudo make DESTDIR=../mpd install

寝てる間にmakeさせたので、そこでかかった時間は分からないけど、install過程はスムーズに終了。

cd
mksquashfs mpd mpd-0.19.19.tcz
md5sum mpd-0.19.19.tcz > mpd-0.19.19.tcz.md5.txt
sudo mv *tcz* /mnt/*2/tce/optional
sudo vi /mnt/*2/tce/onboot.lst

~/ディレクトリにmpd-0.19.19.tcz、md5.txtファイルを作って、/mnt/mmcblk0p2/tce/optionalにコピー転送。
onboot.lstを開いて、一番下に「mpd-0.19.19.tcz」を追記。

これでインストール完了。

あとはmpd.conf、mpdの動作環境を作成していく。

cp m*9/doc/mpdconf.example .mpdconf
sudo rm -rf mpd*

vi .mpdconf
mkdir .mpd
mkdir .mpd/playlists

filetool.sh -b

上記ではダウンロードしたのをコピーして、/home/tcに.mpdconfを作っている。
でもコピーじゃなくても、mpdが読める場所に書式に則って作ってあれば構わない。~/.mpdconfはmpdで指定されているデフォルトmpd.conf設定のうちの1つだ。

sudo rm -rf mpd* で、インストールに使った諸々のデータを削除しておく。
これはインストールが終わったら使わなくなる残骸で、残しておくとfiletool.sh -bを打つたび、microSDカードに上書き保存されることになる。システム運用していたら、アップデートしたmpdの音楽データベースをsshからfiletool.sh -bを打って保存する必要が度々あるんだけど、この残骸を予め削除しておいた場合は数秒で終わる。残していたら数分かかる。
使わないデータを長い時間をかけて保存する行程を繰り返す必要はないので。

下記はmpd.confの記載例。
詳細はmpdのUser's Manual等を参照のこと。自分の使いたいように設定する。
https://www.musicpd.org/doc/user/index.html The Music Player Daemon - User's Manual

PPAP(aplay)で扱う事ができるサンプリング周波数の上限は192kHzなので注意。

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"

mixer_type "software" ## hardware, software or none
## replay_gain_handler "none" ## software, mixer or none

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.82 4444"
}

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

上記のmpd.confだと、replay_gain_handlerの設定が読み込めないというエラーでmpdの起動に失敗したので、コメントアウトしている。alsa関連でインストールしていないものが多いので、そのせいだろうか。

上記のmpd.confに合わせてmusic_directoryを設定する必要がある。
bootlocal.shにコマンドを記述しておくとOS起動時に実行される。起動時にmusic_directoryを作って、NASのtitanディレクトリをマウントするように設定。

vi /opt/bootlocal.sh

bootlocal.shに下記を記述。

mkdir /mnt/music
mkdir /mnt/music/nas
mkdir /mnt/music/ram
touch /mnt/music/ram/dummy.cue
chmod -R 777 /mnt/music
mount -o addr=192.168.1.80,nolock -t nfs 192.168.1.80:/titan /mnt/music/nas

設定を忘れず保存すること。

filetool.sh -b

忘れてはいけない、、、最後になってしまったが、nmapをインストールする。


tce-load -wi nmap.tcz

以上で、piCore7のフロント化、完成。

sudo reboot

sudo rebootで再起動すると、NASをマウントした状態になる。
使用に際してはsshで再度ログインして、mpdを起動させる仕様。自動起動にはしていない。mpdを起動させたらあとはmpdクライアントで操作できる。

この状態で「df」コマンドを打つとこんな感じ。

tc@box:~$ df
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   833.2M     11.4M    821.8M   1% /
tmpfs                   462.9M         0    462.9M   0% /dev/shm
/dev/mmcblk0p2            3.6G    177.9M      3.3G   5% /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.4M      4.4M         0 100% /tmp/tcloop/gcc_base-dev

(中略)

/dev/loop137            128.0K    128.0K         0 100% /tmp/tcloop/libudev
/dev/loop138            128.0K    128.0K         0 100% /tmp/tcloop/libtasn1
192.168.1.80:/titan       2.7T      2.0T    670.6G  76% /mnt/music/nas

139個のtczがインストールされて、その多くが待機状態になってるということかと。
ちなみに最初に作ったフロントではどうかというと、

tc@box:~$ df
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   833.2M     11.3M    821.9M   1% /
tmpfs                   462.9M         0    462.9M   0% /dev/shm
/dev/mmcblk0p2            3.6G    187.0M      3.3G   5% /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              896.0K    896.0K         0 100% /tmp/tcloop/nmap-doc

(中略)

/dev/loop155            128.0K    128.0K         0 100% /tmp/tcloop/libtasn1-dev
/dev/loop156            128.0K    128.0K         0 100% /tmp/tcloop/libtasn1
192.168.1.80:/titan       2.7T      2.0T    670.6G  76% /mnt/music/nas

157個。新しい方が20ほど少ない、、、どうなんでしょうなあ、、、

前からちょっと気になっていたことを試すことにする。ひょっとして、onboot.lstを編集したらタスクが減るんじゃないかな。

mc.tcz
openssh.tcz
gcc_base-dev.tcz
gcc-doc.tcz
gcc_libs-dev.tcz
gcc-locale.tcz
glib2-dev.tcz
glib2-doc.tcz
glib2-locale.tcz
glib2-python.tcz
glibc_add_lib.tcz
glibc_apps.tcz
glibc_base-dev.tcz
glibc_gconv.tcz
glibc_i18n_locale.tcz
glib-networking-dev.tcz
glib-networking-locale.tcz
boost-dev.tcz
flex-dev.tcz
flex-doc.tcz
flex-locale.tcz
gdbm-dev.tcz
gdbm-doc.tcz
gdbm-locale.tcz
bison-dev.tcz
bison-doc.tcz
bison-locale.tcz
libsamplerate-dev.tcz
libsamplerate-doc.tcz
flac-doc.tcz
libcue.tcz
libcue-dev.tcz
libid3tag-dev.tcz
libmad-dev.tcz
mpg123.tcz
lame-dev.tcz
lame-doc.tcz
libmpdclient-dev.tcz 
libmpdclient-doc.tcz 
binutils-dev.tcz     
binutils-doc.tcz     
binutils-locale.tcz  
ncurses-dev.tcz      
make-doc.tcz         
make-locale.tcz      
automake.tcz         
autoconf-doc.tcz    
libtool-dev.tcz     
libtool-doc.tcz     
compile-essentials.tcz
squashfs-tools.tcz    
bash-locale.tcz       
bc-doc.tcz            
bc.tcz                
pkg-config-doc.tcz    
pkg-config.tcz        
cmake-doc.tcz         
cmake.tcz             
mpd-0.19.19.tcz       
nmap.tcz              

当初のonboot.lstの記載はこんな感じ。これをrebootを繰り返しながら書き換えていく、、、
どうも、必要となれば引っ張り起こされるtczと、起こされないので最初からリストしておかないといけないtczがあるようだ。

mc.tcz
openssh.tcz
boost-dev.tcz
libsamplerate-dev.tcz
libsamplerate-doc.tcz
flac-doc.tcz
libcue.tcz
libcue-dev.tcz
libid3tag-dev.tcz
libmad-dev.tcz
mpg123.tcz
lame-dev.tcz
lame-doc.tcz
libmpdclient-dev.tcz
libmpdclient-doc.tcz
mpd-0.19.19.tcz
nmap.tcz

ついにここまで削ったが、ちゃんと音は出ているようだ、、、

tc@box:~$ df
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   833.2M     11.0M    822.2M   1% /
tmpfs                   462.9M         0    462.9M   0% /dev/shm
/dev/mmcblk0p2            3.6G    177.9M      3.3G   5% /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/loop53             512.0K    512.0K         0 100% /tmp/tcloop/sqlite3
/dev/loop54             128.0K    128.0K         0 100% /tmp/tcloop/libudev
192.168.1.80:/titan       2.7T      2.0T    670.6G  76% /mnt/music/nas

55個になった、、、
じゃあ音はどうなのかというと、例によって比較はできてないんだな、、、
これ以上は削るわけにはいかないような気がするし、この手法で出来るのはここらあたりまでかと思う。

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

May 27, 2018

piCore7で作るPPAP Back-End (2020.08.16.追記)

piCore7でppap (piped pcm audio play)を試みる
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180301a.htm

piCore7でPPAPバックエンドは恐ろしいほど簡単にできる。
そう思っていたら、後から「こうすれば良かった」とか出てきてるので上記のエントリーに随時加筆訂正を入れていたんだけど、読みにくすぎる。

問題になっているのはバックエンドに関してだけだ。
なので、piCore7 PPAP Back-Endの作り方を、独立したエントリーにまとめることにした。

まず、microSDにpiCoreを焼いて、i2s DACの設定など必要に応じて記載して、ras piに刺して起動する。
詳細は、こちらのエントリーを参照のこと。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180103a.htm
piCore7にmpdをインストールする方法

以下、sshでログイン後の流れを.ash_historyファイルからコピペ。

filetool.sh -b
sudo fdisk -u /dev/mmcblk0
sudo resize2fs /dev/mmcblk0p2
vi /opt/eth0.sh
chmod +x /opt/eth0.sh
vi /opt/bootsync.sh
vi /opt/.filetool.lst
filetool.sh -b

ここまでで、基本的なセッティングを終了。
続いて、nmapとalsaをインストール。

ras pi B+の場合。

tce-load -wi nmap.tcz alsa-modules-4.1.13-piCore+.tcz alsa.tcz

ras pi 2の場合。

tce-load -wi nmap.tcz alsa-modules-4.1.13-piCore_v7+.tcz alsa.tcz

これだけでいいのか、という感じ。

続いて、bootlocal.shを編集。
コマンド設定を書き込んで、piCore起動時にバックエンドとして機能するようにする。

vi /opt/bootlocal.sh

16/44.1のデータを受ける場合は、下記をbootlocal.shに追記する。

/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"

下記は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"

https://linux.die.net/man/1/aplay
aplay(1) - Linux man page

前回のエントリーで書いたけど、piCore7の場合は「-D plughw:0,0」の記載がなかったら、dmixが起動して48kHzにリサンプリングされる。
しかし、alsa-modules-4.1.13-piCore_v7+.tczとalsa.tczしかインストールされてない状態だと、mpdの再生自体が止まるようだ。ncmpcppに「paused」が表示されて、音が出なくなる。これら以外のalsa関連のtczがインストールされていないと、dmix自体が動かないし出力もしないらしい。
dmixがインストールされていないんじゃないかな。
というか、dmixがなかったら音が出ないのか?、、
あれこれインストールするより「-D plughw:0,0」を指定したほうがシンプルだし扱いやすくていいと思う。

この「hw」「plughw」という文字列だけど、どうもあちこちで説明の内容が違う。
環境によって違ってくるのか「aplay -l」で表示されるデバイス名を指定できるという話や、plughwを使うとリサンプリングされるという話もある(えぇー?)。
しかし、うちではplughwを記載したら、確かにフロントから出力したとおりのサンプリング周波数が表示されるんだよね、、、

以前に使っていた、
/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"
これだったら、こちらの求めるように機能して音が出る。どこかでそうなるように設定されているのかもしれないけど、よく分からない。
現状、変換せずに音が出てくれたらいい、という感じだ。

2020.08.16.追記。
上記の「hw」と「plughw」の件について、解決したと思うので昨日にエントリーを挙げた。
PPAP back-Endの設定を考え直す(hwとplughw)
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20200815a.htm

要は、コマンドの書き間違いのせいでエラーが起きていたということ。データのフォーマットの記載が不正確だったので、plughwで記載する必要が生じたらしい。具体的には「S24_LE」というのが間違いだったのではないかと。
おそらく正確な記載は「S32_LE」だったのではないかと思うのだけど、今となっては推測だ。

閑話休題。

忘れないように設定を保存しリブートすれば、PPAP Back-Endとして機能する。

filetool.sh -b
sudo reboot

以下、Ras pi 2で設定して「df」を打った結果。

tc@box:~$ df
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   833.2M      9.5M    823.7M   1% /
tmpfs                   462.9M         0    462.9M   0% /dev/shm
/dev/mmcblk0p2           28.3M     13.1M     13.6M  49% /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_v7+
/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

インストールされたtceの一覧。

tc@box:~$ ls /usr/local/tce.installed/
alsa                            libelf                          libudev                         openssh
alsa-modules-4.1.13-piCore_v7+  libgcrypt                       libusb                          openssl
bzip2-lib                       libgpg-error                    lua-lib                         pcre
gamin                           libnl                           mc
glib2                           libpcap                         ncurses
libasound                       libssh2                         nmap
tc@box:~$ 

piCoreはループバックデバイス機能を使って、インストールしたファイルをイメージであるかのように扱いRAM上に展開する。で、合ってるのかな?
結果、軽量なシステムのはずだけどプロセスが多くなるみたい。
削れるものはあるかもしれないけど、僕のほうでは無理せずにこのまま使っている。

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

Mar 01, 2018

piCore7でppap (piped pcm audio play)を試みる(05.22、2020.08.16、追記)

1月半ばからppapに取り組んでいる。
2月上旬での状況を前回のエントリーに書いたんだけど、その後、体調崩して人生初めての入院したりで、まだ本調子じゃない。
それでもようやく進捗があった。
piCore7をフロント化するのに成功した。

5月29日、追記。
ここにいろいろ追記してきたけど、フロントとバックエンドで別エントリーを立てた。
このエントリーよりは分かり易くまとまってると思うんだけど。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180529a.htm
piCore7で作るPPAP Front
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180527a.htm
piCore7で作るPPAP Back-End

追記。せっかく作ってあったので構成図をアップ。

しかし、そもそも何でpiCore7なのか。
今回、フロントをどうするかはかなり難航した。普段使いのノートPC(Fedora26、27)は簡単にフロント化できたんだけど、アップサンプリングがうまくいかず原因は不明。それもあってRaspberry Pi2のフロント化に臨んだんだけど、これが難しかった。

まず、piCoreはpipeが使えないと来た。
その続きで、ライブラリを追加したりshellを変えてみたり、あれこれ試みたけど失敗続き。

次にRaspbian stretchを試みた。以前はちゃんと動いてmpdのインストールも出来たはずだが、今回これが起動しない。いや、起動しているんだけどdhcpサーバからipアドレスが振られないようで、LANに繋がって来ないのだ。原因不明。昔のjessieも引っ張り出してみたけど同様。

じゃあVolumio2でどうか。なんだか構造がよく分からない。mpd.confをいじったりncmpcppでアクセスして操作しても出音に反映されないことがある。どうなってるんだか、分からない。この際と思ってvolumio1.55でやってみたけど、やはりpipeが壊れてると表示される。

Archphile、、、これもLANに繋がらない。

そうこうして、piCore7に戻ってきたのだ、、、
今回あれこれやるうちに、ようやく気付いた。
piCoreの何がいいって、必ず普通に起動するのだ!

動かないことがあるディストリは、繰り返し試みたり試したりするには向かない。
その点、piCoreは焼くのは一瞬だし起動しないということがないしセッティングも短時間で出来上がる。扱いやすいという点で他の追随を許さないのだ(当家比較)。そういうわけで、ついつい使ってしまうんだと思う。

Front

そういうわけで、piCore7に戻ってきた。ようやくなんとかなったけど、何故なんとかなったのか正確な理由は分からない。
今回の流れを記載していく。.ash_historyファイルからコピペ。

filetool.sh -b
sudo resize2fs /dev/mmcblk0p2
ifconfig
vi /opt/eth0.sh
chmod +x /opt/eth0.sh
vi /opt/bootsync.sh
vi /opt/.filetool.lst
filetool.sh -b

ここまでで、基本的なセッティングを終了。
詳細は、http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180103a.htm こちらのエントリーを参照のこと。
続いて、環境を構築していく。

mpdをインストールするのに必要なコンパイラ等々プログラムをインストール、、、
はっきりしないんだけど、flex、bison、gdbmあたりを追加インストールしたらpipeを使えるようになったような。どれが効いているのかは未確認。

tce-load -wi \
gcc_base-dev.tcz gcc-doc.tcz gcc_libs-dev.tcz gcc_libs.tcz gcc-locale.tcz gcc.tcz \
glib2-dev.tcz glib2-doc.tcz glib2-locale.tcz glib2-python.tcz glib2-dev.tcz \
glibc_add_lib.tcz glibc_apps.tcz glibc_base-dev.tcz glibc_gconv.tcz glibc_i18n_locale.tcz \
glib-networking-dev.tcz glib-networking-locale.tcz glib-networking.tcz \
binutils-dev.tcz binutils-doc.tcz binutils-locale.tcz binutils.tcz \
ncurses-dev.tcz make-doc.tcz make-locale.tcz make.tcz automake.tcz \
autoconf-doc.tcz autoconf.tcz libtool-dev.tcz libtool-doc.tcz \
compile-essentials.tcz squashfs-tools.tcz bash-locale.tcz bash.tcz bc-doc.tcz bc.tcz \
pkg-config-doc.tcz pkg-config.tcz cmake-doc.tcz cmake.tcz

tce-load -wi \
flex-dev.tcz flex-doc.tcz flex-locale.tcz flex.tcz \
gdbm-dev.tcz gdbm-doc.tcz gdbm-locale.tcz gdbm.tcz \
bison-dev.tcz bison-doc.tcz bison-locale.tcz bison.tcz \
python-dev.tcz python-doc.tcz python.tcz boost-dev.tcz boost.tcz \
doxygen-doc.tcz doxygen.tcz pv-doc.tcz pv-locale.tcz pv.tcz \
bash-doc.tcz bash-locale.tcz bash.tcz bc-doc.tcz bc.tcz

次にalsa、nmap、mpdが使うライブラリやエンコーダーをインストール。

tce-load -wi \
alsa.tcz alsa-config.tcz alsa-doc.tcz alsa-dev.tcz alsaequal.tcz \
alsa-locale.tcz alsa-modules-4.1.13-piCore_v7+.tcz alsa-modules-4.1.20-piCore_v7+.tcz \
nmap-doc.tcz nmap.tcz

tce-load -wi \
libsamplerate-dev.tcz libsamplerate-doc.tcz libsamplerate.tcz \
flac-dev.tcz flac.tcz flac-doc.tcz libcue.tcz libcue-dev.tcz \
icu-dev.tcz icu.tcz libid3tag-dev.tcz libid3tag.tcz \
libmad-dev.tcz libmad.tcz mpg123.tcz lame-dev.tcz lame-doc.tcz lame.tcz

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

filetool.sh -b

続いて、mpdをコンパイルしてインストール。今回使ったのはv0.19.19。
コマンドを羅列。

wget https://www.musicpd.org/download/mpd/0.19/mpd-0.19.19.tar.xz
xz -dv mpd-0.19*
tar -xf mpd-0.19*
cd mpd-0.19*
./configure --enable-pipe-output

configureの結果表示を転記してみる。

########### MPD CONFIGURATION ############

Archive support:
	(+bzip2) (-ISO9660) (-ZIP) 
Client support:
	(+IPv6) (+TCP) (+UNIX Domain Sockets) 
Storage support:
	(-NFS) (-SMB) 
File format support:
	(-AAC) (-AdPlug) (+DSD) (-C64 SID) (-FFMPEG) (+FLAC) (-FluidSynth) (-GME) 
	(+libsndfile) (-MikMod) (-MODPLUG) (+MAD) (-MPG123) (-Musepack) 
	(-Opus) (-OggTremor) (+OggVorbis) (-WAVE) (-WavPack) (-WildMidi) 
Other features:
	(+libsamplerate) (-libsoxr) (+libmpdclient) (+inotify) (+SQLite) 
Metadata support:
	(+ID3) 
Playback support:
	(+ALSA) (+FIFO) (+File Recorder) (+HTTP Daemon) (-JACK) 
	(-libao) (+OSS) (-OpenAL) (-OS X) (+Pipeline) 
	(-PulseAudio) (-ROAR) (-SHOUTcast) (-Solaris) (-WinMM) 
Streaming encoder support:
	(+FLAC) (+LAME) (-Shine) (+Ogg Vorbis) (-Opus) (-TwoLAME) (+WAVE) 
Streaming support:
	(-CDIO_PARANOIA) (-CURL) (-SMBCLIENT) (-Soundcloud) 
	(-MMS) 
Event loop:
	epoll

##########################################

Generating files needed for compilation
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating doc/doxygen.conf
config.status: creating systemd/mpd.service
config.status: creating config.h
config.status: executing depfiles commands
MPD is ready for compilation, type "make" to begin.
tc@box:~/mpd-0.19.19$ 

(+Pipeline)と表示されている。以前はここまで出来てもmakeで通らなかった。

make
mkdir ../mpd
sudo make DESTDIR=../mpd install
cd
mksquashfs mpd mpd-0.19.19.tcz
md5sum mpd-0.19.19.tcz > mpd-0.19.19.tcz.md5.txt
sudo mv *tcz* /mnt/*2/tce/optional
sudo vi /mnt/*2/tce/onboot.lst

インストール完了。あとはmpd.conf、mpdの動作環境を作成していく。

cp m*9/doc/mpdconf.example .mpdconf
sudo rm -rf mpd*
vi .mpdconf
mkdir .mpd
mkdir .mpd/playlists

filetool.sh -b

mpd.confの記載例。

4月9日、追記。
下記のmpd.confの記載例で、mixer_typeの設定について書き直した。
というのは、僕はずっとmixer_typeはalsaの設定だと思い込んでいたんだけど、mpdのユーザーマニュアルをよく読んでみたらそうではなかった。alsa以外のaudio_outputにも適用されるということらしい。mpdの更新履歴を読んでみたら、どうもv.0.16でそういう仕様になったようだけど、はっきりしない。
詳細は下記アドレスのUser's Manualを参照のこと。The following table lists the audio_output options valid for all plugins と記載がある。
https://www.musicpd.org/doc/user/config_audio_outputs.html

そのUser's Manualを読んで、replay_gain_handlerも設定しておいたほうがいいんじゃないかなと思われたので書き加えている。

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"

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

mixer_type "software" ## hardware, software or none
replay_gain_handler "none" ## software, mixer or none

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.82 4444"
}

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

上記のmpd.confに合わせてmusic_directoryを設定する例。
piCore起動時にmusic_directoryを作って、NASのtitanディレクトリをマウントするように設定している。

vi /opt/bootlocal.sh

(下記をbootlocal.shに追記)

mkdir /mnt/music
mkdir /mnt/music/nas
mkdir /mnt/music/ram
touch /mnt/music/ram/dummy.cue
chmod -R 777 /mnt/music
mount -o addr=192.168.1.80,nolock -t nfs 192.168.1.80:/titan /mnt/music/nas

これら設定を忘れず保存すること。

filetool.sh -b

以上で、piCore7のフロント化、完成。
ちょっと追記。使用に際してはsshでログインしmpdを起動させる仕様。自動起動にはしていない。

3月13日、追記。
フロントにRas pi2/piCore7を使った場合、アップサンプリングで使えるのは192kHzまでのようだ。300kHz台にすると音が出ない。
普段使いのノートPC、HP 6730b/Fedoraでは98kHzが上限だった。上の数値を設定してもなぜか98kHzで出力された(nano iDSD LEのLEDインジケーターで確認)。
どうなってるのかと調べたけどはっきりしない。
ただ、pipeの容量には上限があるということらしく、OSの実装により上限は異なるということらしい。

Man page of PIPE
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/pipe.7.html

Linux 2.6.35 以降では、パイプの容量のデフォルト値は65536バイトだが、 パイプの容量を参照、設定を fcntl(2) の F_GETPIPE_SZ と F_SETPIPE_SZ 操作を使って行うことができる、とある。これがアップサンプリングに上限がある理由なのかどうか分からないけど、fcntlを使うというのも当方には難しく、これ以上は調べずにいる。

5月28日、解決したので追記。
aplayで扱う事ができるサンプリング周波数の上限が192kHzということだ。

Back-End

5月27日、追記。
ここにいろいろ追記してきたけど、読みにくくなったので別エントリーにした。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180527a.htm
piCore7で作るPPAP Back-End

バックエンドはraspberry pi B+/2、piCore7で組んでいる。
これは初期状態にalsaとnmapしかインストールしていないような状態で、それでもちゃんと動いている。
period-sizeの設定によってCPU使用率がかなり変わるようなので、うちでは256と多めに設定している。そのほうがCPU使用率が下がる。逆にbuffer-sizeは2048と少なめだ。どのくらいがいいのかは確かめていない。

追記。
raspberry pi B+でバックエンドを組んだ場合、USB出力だとプチノイズを生じることに気付いた。
period-sizeやbuffer-sizeの設定を弄る程度では解消しない。
しかし、i2s出力だと問題ないようだ。
USB/LAN周りが脆弱なRas piだと、シングルコアだとデータやタスクの管理に限界があるのかもしれない。piCore以外のディストリでどうかは分からない。

5月26日、追記。
以前にraspberry pi B+でバックエンドを組んだときにUSB出力でプチノイズを生じたのは、dmixで48kHzにリサンプリングする負担が影響していたようだ。これは、alsaのデフォルトで設定されている。
このリサンプリングをしないように設定にしたら、B+でも問題なくUSB出力が出来るようだ。ただし、period-sizeとbuffer-sizeは上げる必要がある。
どうやって設定するかは後述、追記している。

filetool.sh -b
sudo resize2fs /dev/mmcblk0p2
cd /opt
vi eth0.sh
chmod +x eth0.sh
sudo vi bootsync.sh
vi .filetool.lst
filetool.sh -b

( わかりにくいので追記。
ここまでの流れは.ash_historyファイルからのコピペ。
いくつか記録されてないコマンドがあったりする。
詳細は、http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180103a.htm こちらのエントリーを参照のこと。
)

cd

( 追記。
下記のalsa、nmapのインストールコマンドはras pi B+の場合のコマンド。
pi2/3の場合、alsa-modulesの名称が違うので注意を。
 )

tce-load -wi \
nmap-doc.tcz nmap.tcz alsa-config.tcz alsa-dev.tcz alsa-doc.tcz \
alsaequal.tcz alsa-locale.tcz alsa-modules-4.1.13-piCore+.tcz \
alsa-modules-4.1.20-piCore+.tcz alsa.tcz

( 追記。
4月13日の時点でras pi B+に7.xだとnmapのインストールがうまくいかない。
9.xだったら下記でうまくいく。

tce-load -wi \
nmap-doc.tcz nmap.tcz \
alsa-modules-4.9.22-piCore.tcz alsa-plugins-dev.tcz alsa-plugins.tcz \
alsa.tcz alsa-utils-doc.tcz alsa-utils-locale.tcz alsa-utils.tcz

以上、追記した。 )



filetool.sh -b

vi /opt/bootlocal.sh

(下記をbootlocal.shに追記。適宜編集)

# /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 -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=256 --buffer-size=2048 -t raw -f S24_LE -r96000 -c2"
# /usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=256 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"


(追記後、設定を保存)

filetool.sh -b

5月22日、追記。
上記に「 -D plughw:0,0」の記述を書き加えた。
これがないとUSBに出力が自動的に48kHzにリサンプリングされる。
alsaのデフォルトらしい。
i2s出力はリサンプリングされずに出力されるようだ。

2020.06.16.追記。
上記の「-D plughw:0,0」は「-D hw:0,0」が使えなかったために採用した手法だった。なぜ使えなかったのか、-D plughw:0,0が何をしてるのかについて、エントリーをあげたので追記しておく。
PPAP back-Endの設定を考え直す(hwとplughw)
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20200815a.htm

音質評価は未だしていない。追々、余裕があるときに。

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

Feb 05, 2018

ppap (piped pcm audio play)を試みるが、一筋縄に行かない、、、

昨年末、Phile Webのコミュニティで「ppap」というデジタルトランスポート方式が提案された。
Ras Piのような小型ボードPCが2つあれば実装できる。
詳しくは下記サイトを参照。以下、引用。

https://github.com/papalius/symphonic-mpd/wiki/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%81%A8%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%E3%82%92%E7%B9%8B%E3%81%90%E6%8A%80%E8%A1%93(piped-pcm-audio-play)

バックエンドは、ncat を使ってTCP4444ポートで待ち受け、流れてきたraw PCMデータをaplayに横流しします。
ncat・aplay部分のsystemdサービス定義は以下のような感じです。

ExecStart=/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay-1.1.5 -M --period-size=64 --buffer-size=136710 -t raw -f cd"

フロントのmpdは、デコード済みのraw PCMをpipe outputで取り出し、ncatでバックエンドのTCP4444ポートに流し込みます。
mpd.confのaudio_outputはこんな感じです。

audio_output {
  type "pipe"
  name "PIPE"
  always_on "yes"
  command "ncat 192.168.x.x 4444"
}

肝は、DACへの出力にalsaしか使わないということだと思う。

Linux系PCからのデジタルオーディオ出力に一般的に使われてきたmpdが外されている。
データ仲介ソフトとしてncatを使うことで「mpd + alsa」だったものが「alsaだけ」になっているということ。
mpdは「フロント」で音楽データを処理し「バックエンド」のalsaに送る役割、つまり一般的なupnpシステムであれば、dlnaサーバーソフト(例えばminimserverなど)が担ってきた役割を受け持っている、と言っていいのかな。

デジタルトランスポートとしての機能を複数のPCで役割分担させることによって、高音質化を目指す前例はたくさんある。しかしそれはJPLAYだったりupnp/dlnaシステムを使用したものだったりして、僕のニーズには合わないものだった。うちではlinuxでflac + cue sheetが使えないといけないのだ。
他にいくつか、僕なりに試みた方法もあったけど力及ばず満足できる物にならなかった。

当時、いろいろと試みる中で、minimserverを動かしてみたときは下図のような構成。
エントリーにしてアップしている。MinimServerをRaspberry Pi B+で動かしてみた

今回、ppapを知ったとき、過去に求めながら発見できなかったものが提示されていると思った。
これはやってみないといけないと思ったんだけど、あれこれあって、年を越し、月日が過ぎるうちに、なんだか雲行きが怪しくなってきた。本家サイトで公開中断が続いている。気にならないわけじゃないけど、だからといって僕のほうで余裕が出来たにも関わらず自粛?して手を付けないというのもおかしな話なので、手元の機材を弄り始めた、というところ。

僕は変なところで捻くれ者なんだろう、いくつか使えそうなディスクイメージがアップされているにも関らず、手持ちのものから弄っている。慣れないディストリの設定とか頭使ってやる余裕ないなあっていう感じ。老化現象だ。細かい設定とか神経配る気分がさらさら無くなっているのを感じるこの頃で、かなりマイペースだ。

まず、フロント。
試しに普段使いのCompaq 6730b Fedora 26を用意。既にmpdがインストール済み。
これにnmapをインストール。nmapに転送ソフトncatが含まれている。
dnf install nmap
さくっと終わる。
続いてmpd.confに、前述記述を参考にpipeの出力設定を書き込み

audio_output {
        type            "pipe"
        name            "my pipe"
        always_on "yes"
command "ncat 192.168.1.xxx 4444"
}

次にバックエンド。
Ras Pi B+にpiCore7を焼いてi2sDACの設定を書き込み刺して起動。
ip固定など初期設定して、alsaとnmap関連のtczをインストール。
上記のサイトやncat、aplayのネット上のマニュアルを参考に、下記コマンド(いきなりだけどbuffer-sizeは減らしてみた)を打ったらバックエンドは待機状態となる。

/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -M --period-size=64 --buffer-size=512 -t raw -f cd

フロントに戻って、mpdを再起動。
これでpipeからncatを使って音楽データを出力できるようになる。
ncmpcppでコントロール。

若干の試行錯誤はしたけど、比較的すんなり音が出た。
このとき、試しで継いでいたのは小さなパワードスピーカー。
その音を聴くと、なんだか凄そうと感じられるものがある。いつもと違う感というか。
図にしたら、こんな感じ。
minimserverを使ったupnpより、かなりすっきりしている。特にDACの直前が。

さて、sshからバックエンドに打った前記コマンドを、直接そのままバックエンドのbootlocal.shファイルに記載し、リブートしてみる。
バックエンドの起動を確認し、手元の6730bでncmpcppを操作したら、音が出た。
これで、起動後にsshでログインしてコマンドを打ったりしなくても、起動させたらそのままバックエンドとして機能するのを確認した。

次にメインシステムのnano iDSD LEに継いでいるRas Pi 2、piCore7にnmapをインストールして、バックエンドにして同様に音を出してみた。
なかなかいいかもしれない。鮮度が違う気がする(所謂プラセボ効果という奴)。

試験運用は上々。
フロントをRas Pi 2にして運用したい。
ウェブとか見てる普段使いの6730bをオーディオメインシステムのmpdサーバーにするのはどうかと思うので。
下図のような感じに出来れば。

先ほど使ったRas Pi 2、piCore7のmpd.conf設定を書き変える。
これで簡単に出力できるかな、と思ったら、pipeなんて出力は対応してないよ、とアラートが出てmpdが起動しない。
えぇー、、何それ。

fatal_error: line 109: No such audio output plugin: pipe

さて、弱った。
pipeが使えないって意味がわからない。pipeって「|」でしょ?使えないってありなの?linux的に。
本家サイトではvolumio2でもフロントに使えるという話もあり、いっそ使ってみようかとも思ったけど、、、なんか気が進まない。
つうか、volumio1.55もraspbianも、気付いたら1年もまともに触ってないのだ。
volumio2って、どうなってるのって感じ。
pipeについてあれこれと調べる。pipeというのは「pipeline」とも言われ、shellの機能として組み込まれているらしい?ということは分かった。
でも、結局、よくわからないのだった。

mpdをソースからコンパイルする際に指定したら、pipelineを使えるようにできるらしいということは分かった。
いっそ、こんな感じ。
./configure --enable-pipe-output
一見、きれいにconfigureは通るが、makeでエラーになる、、、
config.logを読むも、、、何が何だか分からない。

しかたない、raspbian stretchでやってみるか、、、
結果だけ言うと、pipeを使えるようにインストールはできたけど、いざ音を出そうとしたら「paused」で音が出ない。
/var/log/mpd/mpd.logを確認。

sh: 1: cannot create ncat: Permission denied
Jan 28 04:05 : errno: "my pipe" [pipe] failed to play: Write error on pipe: Broken pipe
Jan 28 04:05 : output: Failed to open audio output

Permission deniedって、どうしたらいいのか。mpdにroot権限あげたらいいのか?
いろいろやってみたけど、サジを投げた。

いっそ駄目元でpiCore6でやってみっか、、、
おお、、、いつの間にか、tczにmpdもdoxygenもboostもあるじゃん、、、
しかし結果はpiCore7と同様。pipe2がない?ということで、ソースからのコンパイルも失敗。

半月が過ぎて、結局、フロントは6730bのFedoraでしかうまくいってない、、、
これで本家もpipe使うのをやめたのかな、、、
、、、Fedoraって、ラズパイで動くかな、、、
Fedora27で用意されてるじゃないですか!Raspberry Pi 2/3で動くディストリが!

まあ、そんなこんなでFedora27をラズパイ2で動かそうとして、なにをどうミスったか、母艦6730bのFedora26をクラッシュさせてしまった。
OS再インストール環境の再構築をして、このエントリーを書いている。
まあ、なんだな、ちょっと休む。
ひどい風邪も引き込んだし、幸田浩子のアベマリアでもBGMにしながら養生しよう、、、

Posted at 05:41 in audio_diary | WriteBacks (0) | Edit Tagged as: , ,

Jan 03, 2018

piCore7にmpdをインストールする方法

このたびサイトのログを眺めていたら、意外にアクセスが多いのが下記のエントリーだと気付いた。
Raspberry Pi でメモリ再生を試みる(piCore7にmpdをインストールする)-いろいろ追記あり

音質向上を追及した多くのディストリビューションが公開されている中で、正直、piCore7にどの程度のニーズがあるのか分からないんだけど、なるべく分かりやすい形に書き直して、まとめておこうと思った。しかし、結果的に長くて分かりにくい。

毎度のことで、今回もあちこちに訂正とか追記、改訂を入れている。 1月9日、sshについて追記訂正した。rebootする前にfiletool.sh -bで鍵を保存してしまえば再ログインで蹴られることはない。こんな当たり前のことに気付くのに1年半かかっているということで、我ながら呆れてしまう。

piCore7をダウンロード。

以下、tiny core linuxのサイト、piCore7関係のソース。

raspberry pi B/B+piCore OShttp://tinycorelinux.net/7.x/armv6/releases/RPi/
TCZhttp://tinycorelinux.net/7.x/armv6/tcz/
raspberry pi 2/3piCore OShttp://tinycorelinux.net/7.x/armv7/releases/RPi2/
TCZhttp://tinycorelinux.net/7.x/armv7/tcz/

piCoreはv.9まであるんだけど、mpdを簡単にインストールできるのはv.7しかない。
v.9用TCZとして用意されているライブラリにはDoxygenはないし、Boostはインストールしてもうまく機能しない。v.7のTCZは機能するようだ。
TCZというのはtiny core linux系のOSで扱いやすいようにソフトウェアやライブラリをパッケージ化したようなもので、基本的にはTCZの一覧表に載っているソフトなら簡単なコマンドを打つだけでインストールできる。ときにソフト間の依存性の関係によっては出来ないこともあったり、前述のようにインストールしたのに使えないこともあったりする。

1月末、追記。数日前に気付いたんだけど、v.6にもmpd.tczが追加されている。 いつの間に、、、記憶違いでなければ、前はなかったと思うんだけど、、、 当方で使ってみるには至っていない。

まず使用するras piに合わせてOSを落とす。
落としたらmicroSDに書き込む。

microSDの準備。

microSDにはPICOREというボリュームができているので、その中のconfig.txtを編集する。
うちではi2s出力とusb出力以外は使わないので、もとからある設定について下記のように記載変更している。HDMIやイヤホン出力を使う場合はこんな設定ではいけないらしいけど、どこをどうしたらどうなるかは調べていない。
dtparam=i2c=off,spi=off,i2s=on,i2c_vc=off

i2sデバイスを使用するなら、そのデバイスに合わせた設定を記載する。
例えばhifiberryのデバイスなら、以下のような感じ。

https://www.hifiberry.com/guides/configuring-linux-3-18-x/

DAC/DAC+ Lightdtoverlay=hifiberry-dac
DAC+ standard/prodtoverlay=hifiberry-dacplus
Digi/Digi+dtoverlay=hifiberry-digi
Amp/Amp+dtoverlay=hifiberry-amp

例えばうちで使っているi2sDACはLINUXCOMのRBD-02+なので「dtoverlay=hifiberry-dac」と書き込む。
http://linuxcom.shop-pro.jp/?pid=79120318

piCore7を起動しsshでログインする。

microSDカードをRaspberry Piに刺して起動する。
余裕のある電源を使うこと。
sshでログイン。userはtc、パスワードはpiCore。
ログインに必要なipアドレスは環境によって変わるのでユーザー各自で確認のこと。ちなみにうちでは、いちいちDNSDHCPサーバーにアクセスして新たに割り振られたipを確認している。
sshでは最初のログインで(yes/no)?と訊かれるので、yesでログインする。

filetool.sh -b について

ログイン直後にfiletool.sh -b コマンドを打つことで、sshの鍵が保存される。

tc@box:~$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz\
Done.
tc@box:~$

piCoreでは、上記タイトルのコマンドで、適宜、変更した設定などを保存しておく必要がある。
全てRAM上で動くOSなので、コマンドを打ってmicroSDに保存するのを忘れていたら、電源を切ると同時に設定していたはずの内容が消失してしまう場合がある。OSを再起動したら設定前の状態、以前に保存した状態に戻っている。
そういう理由で、一通り設定が終了するまでの間にしばしば使用することになるコマンドなので予めここに記述しておく。

filetool.sh -bを打たないまま、下記の行程のパーティション拡張を行なったら、piCore7上にsshの鍵が保存されないので、sshで再ログインしようとした際に蹴られる。もしもそうなったらどうしたらいいかは下の方に記載している。

パーティションディスクイメージを拡張。

以下の流れでパーティションディスクイメージを拡張。もともとは最低限の大きさなので、拡張しないと後で諸々のインストールに支障を生じる。

tc@box:~$ sudo fdisk -u /dev/mmcblk0
Command (m for help): p

Disk /dev/mmcblk0: 7948 MB, 7948206080 bytes
3 heads, 8 sectors/track, 646826 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes

        Device Boot      Start         End      Blocks  Id System
/dev/mmcblk0p1            8192       69631       30720   c Win95 FAT32 (LBA)
/dev/mmcblk0p2           69648       93119       11736  83 Linux

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

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First sector (8-15523839, default 8): 69648
Last sector or +size or +sizeM or +sizeK (69648-15523839, default 15523839): 15523839

上記は、端末画面に表示されたものをそのままコピペしている。
適宜、表記されているpとかdとか2とか、打ち込んでenterキーを押していくと、物事が進行していく。

気を付けないといけないのは、どこからどこまで拡張するか指示するための数字。
Command (m for help): p でパーティションボリュームの状態が表示される。
上記の例では /dev/mmcblk0p2の startが69648、endが93119、ということだけどこれを拡張することになる。
First sectorは、startの69648のまま指示。Last sectorは93119以上にしないといけない。いっぱいに拡張するなら「default 15523839」と表示されているので、15523839と打ち込んで、enterキー。
以降、下記のように続ける。

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@box:~$ 
tc@box:~$ sudo reboot
tc@box:~$ Connection to xxx.xxx.xxx.xxx closed by remote host.
Connection to xxx.xxx.xxx.xxx closed.

ここでリブート。
注意しないといけないのは、パーティション拡張の指示をしたからだと思うんだけど、この時点でsshのkeyが無効になっている。そのままログインしようとしたら撥ねられるので、.ssh/known_hostsに保存されているipアドレス:xxx.xxx.xxx.xxxの行を削除しないといけない。削除したら再度、初回のログインの処理をしていけば、以降はkeyをなくすことはない。

うっかりして、filetool.sh -bコマンドを打ってsshの鍵を保存するのを忘れていた場合、リブートしたらsshの鍵が無効になっている。ログインしようとしたら撥ねられる。そうなったら、sshクライアントとして使ってるパソコンの.ssh/known_hostsに保存されている鍵、ipアドレス:xxx.xxx.xxx.xxxの行を削除する。削除したら、初回ログインと同じ行程でログインできる。
filetool.sh -bコマンドでsshの鍵を保存するのを忘れないこと。

再度、ログインして以降の流れは以下の通り。拡張作業の最終段階。

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

tc@box:~$ 
tc@box:~$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/mmcblk0p2 is mounted on /mnt/mmcblk0p2; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 30
The filesystem on /dev/mmcblk0p2 is now 7727096 (1k) blocks long.
tc@box:~$ 

この流れは http://tinycorelinux.net/7.x/armv6/releases/RPi/README にも書いているが、ちょっと不親切。
コマンドの使い方を調べる必要があった。
うちの記述も分かりやすいとは言えないと思うけど、実際に触ってやってみたら分かるんじゃないかと思う。

filetool.sh -b について

piCoreでは、上記タイトルのコマンドで、適宜、変更した設定などを保存しておく必要がある。
全てRAM上で動くOSなので、コマンドを打ってmicroSDに保存するのを忘れていたら、電源を切ると同時に設定していた内容が消失してしまう。OSを再起動したら設定前の状態、以前に保存した状態に戻っている。
そういう理由で、一通り設定が終了するまでの間にしばしば使用することになるコマンドなので予めここに記述しておく。

ipアドレスを固定。

これも下記のような流れで。
まずifconfigで確認。

tc@box:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr B8:27:EB:36:8A:DF  
          inet addr:192.168.1.116  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:775439 errors:0 dropped:92 overruns:0 frame:0
          TX packets:250166 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1123681152 (1.0 GiB)  TX bytes:24070244 (22.9 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

上記の例では、192.168.1.116となっている。これはDNSDHCPサーバーから割り振られたもので、ネットワークの状況次第でこっちの知らぬ間に変わる可能性がある。うちでは変わられては困るので、固定している。
以下、流れを記載。

eth0.shを作る。
tc@box:~$ cd /opt
tc@box:/opt$ ls
bootlocal.sh  bootsync.sh   shutdown.sh   tcemirror
tc@box:/opt$ vi eth0.sh

/optディレクトリに移動。
ここには設定ファイルを置く場所で、ここにeth0.shを作ることでipを固定できる。
viでファイルを作成。
下記のように記載。

#!/bin/sh
pkill udhcpc
ifconfig eth0 192.168.1.82 netmask 255.255.255.0 broadcast 192.168.1.255 up
route add default gw 192.168.1.1
echo nameserver 192.168.1.1 > /etc/resolv.conf

上記の例では、192.168.1.116だったアドレスを192.168.1.82に変更している。

bootsync.shを編集。

引き続き、流れを記載していく。
chmod +x コマンドで実行権限を変更。
さらに、bootsync.shファイルを編集。

tc@box:/opt$ ls
bootlocal.sh  bootsync.sh   eth0.sh       shutdown.sh   tcemirror
tc@box:/opt$ chmod +x eth0.sh
tc@box:/opt$ ls -aFl
total 28
drwxrwsr-x    3 root     staff          200 Jun  4 12:46 ./
drwxr-xr-x   17 root     root           380 Jan  1  1970 ../
-rw-rw-r--    1 tc       staff          403 Jun  4 10:53 .filetool.lst
-rw-rw-r--    1 root     staff          145 Dec 31  2014 .xfiletool.lst
-rwxrwxr-x    1 root     staff          360 Jan 20  2015 bootlocal.sh*
-rwxrwxr-x    1 root     staff          272 Dec 31  2014 bootsync.sh*
-rwxr-xr-x    1 tc       staff          179 Jun  4 12:46 eth0.sh*
-rwxrwxr-x    1 root     staff          613 Dec 31  2014 shutdown.sh*
-rw-rw-r--    1 root     staff           31 Dec 31  2014 tcemirror

tc@box:/opt$ sudo vi bootsync.sh

bootsync.shに「/opt/eth0.sh &」の一行を下記のように書き加える。
起動時にeth0.shに記載した設定を読み込んでくれる。

#!/bin/sh
# put other system startup commands here, the boot process will wait until they complete.
# Use bootlocal.sh for system startup commands that can run in the background 
# and therefore not slow down the boot process.
/usr/bin/sethostname box
/opt/bootlocal.sh &
/opt/eth0.sh &
.filetool.lstの編集。
tc@box:/opt$ vi .filetool.lst

.filetool.lstファイルは、前述した「filetool.sh -b」コマンドでデータを保存する場所を設定している。
これに「opt/eth0.sh」を追記する。
追記しなかったら、再起動したら設定が消えてしまうということ。
同時に、いくつか他にも保存して欲しい場所やファイルがあるので、これも追記する。
usr/local/etc/
opt/bootlocal.sh
以上を追記して、以下の通り。以前はetc/fstabも追記していたけど、うちでは使わないので。使うようなら記載を。

opt
home
etc/passwd
etc/shadow
etc/group
etc/gshadow
usr/local/etc/ssh/ssh_host_dsa_key
usr/local/etc/ssh/ssh_host_dsa_key.pub
usr/local/etc/ssh/ssh_host_ecdsa_key
usr/local/etc/ssh/ssh_host_ecdsa_key.pub
usr/local/etc/ssh/ssh_host_ed25519_key
usr/local/etc/ssh/ssh_host_ed25519_key.pub
usr/local/etc/ssh/ssh_host_rsa_key
usr/local/etc/ssh/ssh_host_rsa_key.pub
usr/local/etc/
opt/bootlocal.sh
opt/eth0.sh

いきなり追記。
上の内容を眺めていて、今更一番上に「opt」とあるのに気付く。
これって、/optディレクトリの内容は保存されるってことじゃないだろうか。
試しに、
opt/bootlocal.sh
opt/eth0.sh
の2行を削除して動かしてみる。、、問題ないみたいだ。
.filetool.lstに追記しなくても、bootlocal.shもeth0.shもfiletool.sh -bで保存される。

ということで訂正。
usr/local/etc/のみ追記でいいようだ。
/usr/local/etc/にはalsaのファイルもあるようなので、追記しておいた方がいいんじゃないかな。たぶん、、、

忘れないように「filetool.sh -b」を打って、設定が失われないようにする。

tc@box:/opt$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz\
Done.
tc@box:/opt$ sudo reboot

これで再起動したら、指定したipアドレスに固定される。
当然、sshでのログインも新たに固定されたアドレスで行うことになる。
再起動の前に、filetool.sh -bを打ち忘れたら、また最初からやり直しになるので注意。

bootlocal.shを設定。

tc@box:/opt$ vi bootlocal.sh

再起動、ログインして作業を継続。
bootlocal.shは、起動時に実行するコマンドを記載するファイル。
うちでは、下記のようなコマンドを追加で書き込んでいる。mpdの動作環境設定に関係してくる指示で、人によっては要らなかったり、もっと他の内容が望ましい場合もあるだろう。個々の環境や状況に合わせて設定することになる。

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

# mount -o addr=192.168.1.80,nolock -t nfs 192.168.1.80:/titan /mnt/music/nas

僕の場合、/home以下にNASのマウントポイントを作る気になれなかったので(間違ってfiletool.sh -bを打ったら、NASのデータをmicroSDに保存するようなことになりかねないので困ると思った)、/mnt以下に起動のたびに作ることにしたということ。
一番下の行のコマンドでNASをマウントさせるようにしている(/etc/fstabに記載するよりも簡単)。
敢えてコメントにしているのは、各種設定の途中ではマウントする必要がないから。一通り作業が終わってmpdの環境が完成したら、コメントアウトしてを外して、filetool.sh -bで保存し、再起動したらNASがマウントされているという塩梅。

各種ライブラリをインストール。

mpdをインストールしたり動かすためのライブラリなどをインストールする。
以下、コマンドのみを羅列。

tce-load -wi gcc.tcz glib2-dev.tcz ncurses-dev.tcz make.tcz automake.tcz compile-essentials.tcz squashfs-tools.tcz bash.tcz bc.tcz pkg-config-doc.tcz pkg-config.tcz
tce-load -wi python-dev.tcz python-doc.tcz python.tcz boost-dev.tcz boost.tcz doxygen-doc.tcz doxygen.tcz
tce-load -wi alsa.tcz alsa-config.tcz alsa-doc.tcz alsa-dev.tcz alsaequal.tcz alsa-locale.tcz

tce-load -wiというコマンドは、TCZライブラリから指定したソフトをダウンロード、インストールしてくれる。
上記のコマンドでmpdなどのインストールに必要な環境と、alsaをインストールした、つもり(本当は、不要なものが混じってるかもしれない)。

この時点でalsaの状況を確認したら下記のような感じ。
接続しているi2sDACの設定ができている。

tc@box:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
tc@box:~$ 

tc@box:~$ ls /opt
alsa/         bootlocal.sh  bootsync.sh   eth0.sh       shutdown.sh   tcemirror

こんな感じで、/optにalsaのディレクトリができている。
つまり、この時点でfiletool.sh -bを打たずにシャットダウンしたら、このディレクトリが消えることになるのかな。詳細は調べてないから正確なことは言えないけど、いろいろとインストールしていく合間に適宜保存のコマンドを打つ必要はありそう。

続いてflacなどの再生デコーダー関係をインストール。コマンドのみ羅列。

tce-load -wi libsamplerate-dev.tcz libsamplerate-doc.tcz libsamplerate.tcz
tce-load -wi flac-dev.tcz flac.tcz flac-doc.tcz libcue.tcz libcue-dev.tcz icu-dev.tcz icu.tcz
tce-load -wi 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
tc@box:~$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz\
Done.
tc@box:~$ 

忘れず、保存、、、

mpdをインストール。

今回、以下の2通りのやりかたをまとめておく。

  • (1)tce-load -wiコマンドでmpdをインストール。
  • (2)ソースからコンパイルしmpdをインストール。
(1)tce-load -wiコマンドでmpdをインストール。
tc@box:~$ tce-load -wi mpd-doc.tcz mpd.tcz

上記コマンド一つでmpdのインストールが始まる。
しかし同時にインストールされるものが次々に出て来て、そんなに要るの?と思うほどだ。 インストール終了後は下記のような感じ。

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

Copyright (C) 2003-2007 Warren Dukes 
Copyright (C) 2008-2014 Max Kellermann 
This is free software; see the source for copying conditions.  There is NO
warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Database plugins:
 simple proxy

Storage plugins:
 local smbclient

Neighbor plugins:
 smbclient

Decoders plugins:
 [mad] mp3 mp2
 [mpg123] mp3
 [vorbis] ogg oga
 [oggflac] ogg oga
 [flac] flac
 [opus] opus ogg oga
 [sndfile] wav aiff aif au snd paf iff svx sf voc w64 pvf xi htk caf sd2
 [dsdiff] dff
 [dsf] dsf
 [faad] aac
 [ffmpeg] 16sv 3g2 3gp 4xm 8svx aa3 aac ac3 afc aif aifc aiff al alaw amr anim
 apc ape asf atrac au aud avi avm2 avs bap bfi c93 cak cin cmv cpk daud dct divx
 dts dv dvd dxa eac3 film flac flc fli fll flx flv g726 gsm gxf iss m1v m2v m2t m2ts
 m4a m4b m4v mad mj2 mjpeg mjpg mka mkv mlp mm mmf mov mp+ mp1 mp2 mp3 mp4 mpc mpeg mpg
 mpga mpp mpu mve mvi mxf nc nsv nut nuv oga ogm ogv ogx oma ogg omg opus psp pva qcp qt
 r3d ra ram rl2 rm rmvb roq rpl rvc shn smk snd sol son spx str swf tgi tgq tgv thp
 ts tsp tta xa xvid uv uv2 vb vid vob voc vp6 vmd wav webm wma wmv wsaud wsvga wv wve
 [pcm]

Output plugins:
 null fifo alsa ao oss pulse jack httpd recorder

Encoder plugins:
 null vorbis opus lame twolame wave flac

Archive plugins:
 [bz2] bz2

Input plugins:
 file alsa archive curl ffmpeg smbclient

Playlist plugins:
 extm3u m3u pls xspf asx rss cue embcue

Protocols:
 file:// http:// https:// gopher:// rtp:// rtsp:// rtmp:// rtmpt:// rtmps:// smb:// alsa://
tc@box:~$ 

ffmpegとかdsd関連もインストールされている。

mpdの設定を行っていく。mpd.confファイルはどこにあるんだろう。
デフォルトは~/.mpdconf、~/.mpd/mpd.conf、/etc/mpd.confなので、そこにないかと探しても見つからない。

findコマンドで探したら、下記にmpdconf.exampleがみつかった。
/usr/local/share/doc/mpd/mpdconf.example
/tmp/tcloop/mpd-doc/usr/local/share/doc/mpd/mpdconf.example
これらをコピーして使うよりか、viで設定ファイルを作って、どこかから設定をコピペしたほうが簡単だと思う。
記載例は後述。

(2)ソースからコンパイルしmpdをインストール。
tc@box:~$ wget https://www.musicpd.org/download/mpd/0.19/mpd-0.19.9.tar.xz
tc@box:~$ xz -dv mpd-0.19*
tc@box:~$ tar -xf mpd-0.19*
tc@box:~$ cd mpd-0.19*
tc@box:~/mpd-0.19.9$
tc@box:~/mpd-0.19.9$ ./configure

########### MPD CONFIGURATION ############

Archive support:
	(+bzip2) (-ISO9660) (-ZIP) 
Client support:
	(+IPv6) (+TCP) (+UNIX Domain Sockets) 
Storage support:
	(-NFS) (-SMB) 
File format support:
	(+AAC) (-AdPlug) (+DSD) (-C64 SID) (-FFMPEG) (+FLAC) (-FluidSynth) (-GME) 
	(+libsndfile) (-MikMod) (-MODPLUG) (+MAD) (-MPG123) (-Musepack) 
	(-Opus) (-OggTremor) (+OggVorbis) (-WAVE) (-WavPack) (-WildMidi) 
Other features:
	(+libsamplerate) (-libsoxr) (+libmpdclient) (+inotify) (+SQLite) 
Metadata support:
	(-ID3) 
Playback support:
	(+ALSA) (+FIFO) (+File Recorder) (+HTTP Daemon) (-JACK) 
	(-libao) (+OSS) (-OpenAL) (-OS X) (-Pipeline) 
	(-PulseAudio) (-ROAR) (-SHOUTcast) (-Solaris) (-WinMM) 
Streaming encoder support:
	(+FLAC) (+LAME) (-Shine) (+Ogg Vorbis) (-Opus) (-TwoLAME) (+WAVE) 
Streaming support:
	(-CDIO_PARANOIA) (-CURL) (-SMBCLIENT) (-Soundcloud) 
	(-MMS) 
Event loop:
	epoll

##########################################

Generating files needed for compilation
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating doc/doxygen.conf
config.status: creating systemd/mpd.service
config.status: creating config.h
config.status: executing depfiles commands
MPD is ready for compilation, type "make" to begin.
tc@box:~/mpd-0.19.9$ 

今回、ダウンロードしたmpdは0.19.9。これはTCZで用意されているmpdに合わせた。
ソースからコンパイルするメリットは、システムを小さくできることだ。
1分かそこらでconfigure終了。うまく行ったかに見えた。

tc@box:~/mpd-0.19.9$ make -j4
(ひたすら文字が並ぶ)
src/decoder/plugins/MadDecoderPlugin.cxx:37:17: fatal error: mad.h: No such file or directory
compilation terminated.
Makefile:7346: recipe for target 'src/decoder/plugins/libdecoder_a-MadDecoderPlugin.o' failed

上記のように、エラーでmake終了。configureが通ったのにmakeで止まるという経験は初めてだ。
libmadをアンインストールしないといけないらしい。

tc@box:~/mpd-0.19.9$ cd /mnt/*2/tce
tc@box:/mnt/mmcblk0p2/tce$ ls
mydata.tgz  onboot.lst  ondemand/   optional/
tc@box:/mnt/mmcblk0p2/tce$ vi onboot.lst

tc@box:~$ sudo reboot

tc@box:~$ cd /mnt/*2/tce
tc@box:/mnt/mmcblk0p2/tce$ rm optional/libmad.tcz*
rm: remove 'optional/libmad.tcz'? y
rm: remove 'optional/libmad.tcz.md5.txt'? y

tc@box:/mnt/mmcblk0p2/tce$ sudo reboot

/mnt/mmcblk0p2/tce/onboot.lstの記載から、libmad.tczの1行を削除し保存(ここはfiletool.sh -bを使わなくてもいい)、reboot。
さらに、/mnt/mmcblk0p2/tce/optionalから、libmad.tcz関連を削除して、reboot。
これでアンインストールできる。

アンインストールしてconfigureしてmakeしたら、エラーなく終了。

tc@box:~/mpd-0.19.9$ make -j4
(ひたすら文字が並び10分で完了)

tc@box:~/mpd-0.19.9$ mkdir ../mpd
tc@box:~/mpd-0.19.9$ sudo make DESTDIR=../mpd install

tc@box:~/mpd-0.19.9$ cd
tc@box:~$ mksquashfs mpd mpd-0.19.9.tcz
tc@box:~$ md5sum mpd-0.19.9.tcz > mpd-0.19.9.tcz.md5.txt
tc@box:~$ ls
mpd/                    mpd-0.19.9.tar          mpd-0.19.9.tcz.md5.txt
mpd-0.19.9/             mpd-0.19.9.tcz
tc@box:~$ sudo mv *tcz* /mnt/*2/tce/optional
tc@box:~$ ls
mpd/            mpd-0.19.9/     mpd-0.19.9.tar
tc@box:~$
tc@box:~$ sudo vi /mnt/*2/tce/onboot.lst

tiny core linux系では、ひとまとめにインストールしてtczファイルを作って管理する。
今回の場合、コンパイルしたデータからtczファイルとtcz.md5.txtファイルを作る。
これらのファイルを/mnt/mmcblk0p2/tce/optionalディレクトリに移動させて、onboot.lstの末尾に、mpd-0.19.9.tczと記載を追記する。

これでインストール終了。
しかしlibmadをアンインストールしたので、mp3は聞けない。

ところで、GCCの最適化をしてコンパイルしmpdをインストールする方法がある。
最適化について参考にさせていただいたサイトは下記のとおり。

みみず工房
http://mimizukobo.sakura.ne.jp/index.html
2017/10/21(PC_Audio) gccの最適化オプション

new_western_elec
http://nw-electric.way-nifty.com/blog/2016/08/mpdpi-2-pi-3-5a.html
MPDをソースコードからコンパイルしてPi 2 Pi 3に最適化する方法

僕には最適化について知識はないので、上記サイトでPi2とPi3用に紹介されているコマンドを打った。

./configure CFLAGS="-O2 -march=armv7-a -mtune=cortex-a7 \
-mfpu=neon-vfpv4 -mfloat-abi=hard" \
CXXFLAGS="-O2 -march=armv7-a -mtune=cortex-a7 \
-mfpu=neon-vfpv4 -mfloat-abi=hard" \
--with-systemdsystemunitdir=/lib/systemd/system

これも一見、問題なくconfigure終了したかに見えたけど、やはりmakeの段階でエラーになった。
libmadをアンインストールして再度configureしたら、make、installできた。
本当はalsaなどのインストールもソースから最適化してコンパイルを試みるべきだったかもしれないけど見送った。ちょっとそこまで試行錯誤する余裕がなくて、、、

mpdの設定を行っていく。mpd.confファイルが必要だ。

tc@box:~$ ls
mpd/            mpd-0.19.9/     mpd-0.19.9.tar
tc@box:~$ ls m*9/doc
developer.xml    doxygen.conf.in  mpd.conf.5       protocol.xml
doxygen.conf     mpd.1            mpdconf.example  user.xml

tc@box:~$ cp m*9/doc/mpdconf.example .mpdconf

ダウンロード、解凍したファイルの中にmpdconf.exampleがある。
それを、/home/tcディレクトリにコピーして.mpdconfを作り編集。ここに置くのが一番簡単かな。
しかし素のmpdconf.exampleを編集するより、viで作って既存のmpdサーバーから設定をコピペして編集したほうがいろいろ早いだろうと思う。

この時点で、インストールの作業場として使ったmpdディレクトリや落として解凍したファイルなどが残っている。
これらは、もう要らないので削除していい。
残していたら、filetool.sh -bに際して無駄に時間がかかる。
mpd.confのdb_fileの設定場所によっては、保存するのにfiletool.sh -bを使うことになるので、削除しておいたほうが快適になる。

tc@box:~$ ls
mpd/            mpd-0.19.9/     mpd-0.19.9.tar
tc@box:~$ sudo rm -rf mpd*

.mpdconfの編集例。

tc@box:~$ 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                  "ISO-8859-1"

上記は一部で一例。各自で自分の環境やニーズに合わせて編集する必要がある。

tc@box:~$ mkdir .mpd
tc@box:~$ mkdir .mpd/playlists

.mpdconfのplaylist_directoryなどの設定に合わせて、.mpdディレクトリなどコマンドで作成。

mpdを起動しmpd clientでアクセスする。

sshからmpdコマンドで起動。最初の起動に際してはライブラリファイルがないと警告がでるけど無視していい。
好みのmpd clientでアクセスして、コントロール。

ざっとこんなところ。 mpdのインストール方法によって音の違いを比較しようかとも思ってたんだけど、そのうち、余裕があるときに。

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

Aug 28, 2016

mpd + SoXによるアップコンバートについて (Ras pi2用のpiCore7にはmpdのインストールが簡単にできる - 追記あり)

Ras pi 2 + piCore7 + mpd + libsamplerateによるメモリ再生をメインシステムとして使い始めて(と言いながらRas pi B+ + Volumioも普段使いに併用してるけど)、アップサンプリングは微妙なものだということに初めて気付いた。
デジタルだからある程度は正確なのかな、融通きくのかな、という先入観があったのだけど、意外と注意がいるもんなんだな、みだりに上げ下げしちゃいけないんだな、という感じ。

libsamplerateは http://tinycorelinux.net/7.x/armv7/tcz/ ここから簡単にRas pi2用のpiCore7にインストールできるのだけど、よく見たら、soxr.tcz、sox.tcz というのも用意されている。
用意されてるから動くとは限らないが、やってみても損はない。

SoXについては、本家のサイトなどを読んでみようとしたんだけど、よく分からない。
SoX - Sound eXchange
| HomePage http://sox.sourceforge.net/Main/HomePage
| Resampling http://sox.sourceforge.net/SoX/Resampling
| FAQ http://sox.sourceforge.net/Docs/FAQ
| Documentation http://sox.sourceforge.net/Docs/Documentation
https://sourceforge.net/p/soxr/wiki/Home/

http://src.infinitewave.ca/
ここでは、コンバーターの比較をしてるようなんだけど、見方が分からない、、、
lightMPDで採用されてて、libsamplerateよりも軽くて音がいいらしいということなので、どういう仕組みなんだろうというのは興味があるのだけど、英語に弱いというのもあって、どこに何が書いてあるのかよく分からないのだ。

とりあえずpiCore7にインストールしてやってみよう。
早速問題が。
http://git.musicpd.org/cgit/master/mpd.git/plain/NEWS?h=v0.19
>ver 0.19 (2014/10/10)
>* new resampler option using libsoxr

つまり、mpd ver 0.19以上じゃないとSoXが使えない。
piCore7に0.19はインストールできない。 http://blown-lei.net/endive/blosxom.cgi/audio_diary/20160602a.htm

piCore7は止めて、Raspbianでやるか、、、
RaspbianはDebianでVolumioだし、たぶんいけるだろう。
でも、前に試みてから3ヶ月になる。piCoreの中の人ががんばっていればなんとかなってるかもしれない。Ras pi B+用ではダメだがRas pi2用だったらいけるという可能性もある。とりあえずはpiCore7でやれないかどうか確かめる。

Raspberry pi2用piCore7のファイルイメージをこちらから落す。
http://tinycorelinux.net/7.x/armv7/releases/RPi2/
microSDに焼いて設定を書き込んで、Ras pi2に刺して起動。イメージの拡張、アドレス設定、各種インストールしていく。
何がtczに用意されているかは、ここを参考に。http://tinycorelinux.net/7.x/armv7/tcz/
ときにバージョンアップされてファイル名が変わってることがある。

さて、SoXだ。
tce-load -wi sox-dev.tcz sox-doc.tcz soxr-dev.tcz soxr-doc.tcz soxr.tcz sox.tcz
こんなコマンドでいいか?と思ったら、以下のような感じでインストールが始まった。

sox-dev.tcz.dep OK
sox.tcz.dep OK
libao.tcz.dep OK
twolame.tcz.dep OK
libsndfile.tcz.dep OK
flac.tcz.dep OK
libvorbis.tcz.dep OK
lame-dev.tcz.dep OK
libao-dev.tcz.dep OK
libid3tag-dev.tcz.dep OK
libmad-dev.tcz.dep OK
libpng-dev.tcz.dep OK
opencore-amr-dev.tcz.dep OK
twolame-dev.tcz.dep OK
libsndfile-dev.tcz.dep OK
flac-dev.tcz.dep OK
libogg-dev.tcz.dep OK
libvorbis-dev.tcz.dep OK
sqlite3-dev.tcz.dep OK
wavpack-dev.tcz.dep OK

lameとかうちでは要らない気がするんですけど。まあ、いいや、任せよう。
mpdのインストール、できるだろうか。

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

Downloading: mpd-doc.tcz
mpd.tcz.dep OK
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
curl.tcz.dep OK
mpd-doc.tcz          100% |***********************************************************************| 36864   0:00:00 ETA
mpd-doc.tcz: OK
libavformat.tcz.dep OK
gnutls.tcz.dep OK
nettle.tcz.dep OK
p11-kit.tcz.dep OK
libavcodec.tcz.dep OK
celt.tcz.dep OK
libswresample.tcz.dep OK
libtheora.tcz.dep OK
libwebp.tcz.dep OK
libtiff.tcz.dep OK
schroedinger.tcz.dep OK
speex.tcz.dep OK
mpg123.tcz.dep OK
pulseaudio.tcz.dep OK
dbus.tcz.dep OK
Xorg-7.7-lib.tcz.dep OK
fontconfig.tcz.dep OK
freetype.tcz.dep OK
harfbuzz.tcz.dep OK
jack.tcz.dep OK
libsamplerate.tcz.dep OK
libcap.tcz.dep OK
libudev.tcz.dep OK
samba4-lib.tcz.dep OK
acl.tcz.dep OK
python.tcz.dep OK
readline.tcz.dep OK
Downloading: talloc.tcz
libmpdclient-dev.tcz.dep OK

これ全部いるんだろうか。
なんか、今回は使うつもりがないlibsamplerateとかも落ちてきてるんですけど。
最小限のシステムでいいんだけどな、、、

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

Copyright (C) 2003-2007 Warren Dukes 
Copyright (C) 2008-2014 Max Kellermann 
This is free software; see the source for copying conditions.  There is NO
warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Database plugins:
 simple proxy

Storage plugins:
 local smbclient

Neighbor plugins:
 smbclient

Decoders plugins:
 [mad] mp3 mp2
 [mpg123] mp3
 [vorbis] ogg oga
 [oggflac] ogg oga
 [flac] flac
 [opus] opus ogg oga
 [sndfile] wav aiff aif au snd paf iff svx sf voc w64 pvf xi htk caf sd2
 [dsdiff] dff
 [dsf] dsf
 [faad] aac
 [ffmpeg] 16sv 3g2 3gp 4xm 8svx aa3 aac ac3 afc aif aifc aiff al alaw amr anim apc ape 
 asf atrac au aud avi avm2 avs bap bfi c93 cak cin cmv cpk daud dct divx dts dv dvd dxa 
 eac3 film flac flc fli fll flx flv g726 gsm gxf iss m1v m2v m2t m2ts m4a m4b m4v mad mj2 
 mjpeg mjpg mka mkv mlp mm mmf mov mp+ mp1 mp2 mp3 mp4 mpc mpeg mpg mpga 
 mpp mpu mve mvi mxf nc nsv nut nuv oga ogm ogv ogx oma ogg omg opus psp pva qcp qt 
 r3d ra ram rl2 rm rmvb roq rpl rvc shn smk snd sol son spx str swf tgi tgq tgv thp ts tsp 
 tta xa xvid uv uv2 vb vid vob voc vp6 vmd wav webm wma wmv wsaud wsvga wv wve
 [pcm]

Output plugins:
 null fifo alsa ao oss pulse jack httpd recorder

Encoder plugins:
 null vorbis opus lame twolame wave flac

Archive plugins:
 [bz2] bz2

Input plugins:
 file alsa archive curl ffmpeg smbclient

Playlist plugins:
 extm3u m3u pls xspf asx rss cue embcue

Protocols:
 file:// http:// https:// gopher:// rtp:// rtsp:// rtmp:// rtmpt:// rtmps:// smb:// alsa://

なんと、目出度くMusic Player Daemon 0.19.9のインストールができてしまった。しかしなんか、豪勢なシステムが出来てしまった。まるでVolumioだ。
これってメモリ再生に適してるの?
ちなみに、今迄うちでメモリ再生に使ってきているmpdはこんな感じ。

tc@box:~$ mpd -V
mpd (MPD: Music Player Daemon) 0.17.6 

Copyright (C) 2003-2007 Warren Dukes 
Copyright (C) 2008-2012 Max Kellermann 
This is free software; see the source for copying conditions.  There is NO
warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Decoders plugins:
 [vorbis] ogg oga
 [oggflac] ogg oga
 [flac] flac
 [sndfile] wav aiff aif au snd paf iff svx sf voc w64 pvf xi htk caf sd2
 [dsdiff] dff
 [dsf] dsf
 [pcm]

Output plugins:
 null fifo alsa oss httpd recorder

Encoder plugins:
 null vorbis wave flac

Input plugins:
 file

Playlist plugins:
 extm3u m3u xspf pls asx rss cue cue

Protocols:
 file://

こっちのほうがだいぶシンプルだ。
でも、これでSoXで音が出せるかな。
こちらのサイト(http://tatsumi.audio-asc.co.jp/article/425494296.html)を参考に、.mpdconfを設定。

とりあえず、
samplerate_converter "soxr very high"
に設定。
ネット上には、OpenMPは複数のCPU(複数コアを含む)を持った計算機上での並列化に威力を発揮する、とあり、pi2は4coreなので、設定しといたほうがいいんじゃないかと思うけど、どうやらOpenMPをインストールしないといけないらしく、今のところはやめておく。

他、設定はlibsamplerateのほうと同じ。
audio_buffer_size "4096"
buffer_before_play "25%"
audio_output_format "176400:16:2"

音はちゃんと出ました。
ちょっと聴いただけだが、なるほど、SoXとlibsamplerateでは違いはありそう。といっても他の条件があれやこれやと違うんだけど。
現時点では、libsamplerateのほうが耳に優しい音がする感じだ。
SoXのほうが刺激が強い。システムをもっとシンプルにシェイプアップしたらどうなるか、mpdのバージョンによってどう違うのか(libsamplerateのほうはmpd 0.17.6だ)、試みる時間があればやってみたいけど、いつになるかは分からない。

ちなみにtopで確認したら、SoXでは%CPUが4%台。libsamplerateでは20%台になる。

  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
 1520     1 tc       S     135m 14.6   0  4.5 mpd

  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
 1414     1 tc       S    62272  6.5   0 25.1 mpd

仮想メモリの数値が違う(SoXのほうがlibsamplerateの倍)のも謎なんだけど、そこで何かしてるんだろう。

追記。
今回作ったシステムにはlibsamplerateもインストールされているということは、同じシステムで音の違いを比べることができるじゃないかということに後から気づいた。
いろいろ比較はまた、余裕があるときに気が向いたらしようかと思う。

9月1日、追記。
Raspberry pi2を2台で運用しようとしたら動作が不安定になってきた。
mediumの設定でアップサンプリングが出来なくなり、ついにはpiCore7が落ちた。
確認したらras pi2の赤いLEDが消えている。

usb電源周りの不具合ということ。
過去にRaspberry pi B+を2台で運用していたときは、サンワサプライのUSB-HSM410Wで問題なく動作していた。
https://www.sanwa.co.jp/product/syohin.asp?code=USB-HSM410W

これはスイッチが付いていたりして扱いやすかったけど供給電流は最大2A。
pi2を2台だと供給し切れない。
そこでusb電源をサンワダイレクトの700-AC011Wに変更した。アマゾンから買ったので型番は700-AC011WAZなのだけど。
http://direct.sanwa.co.jp/ItemPage/700-AC011W
これだと10Aを給電できるので問題なく動く。

給電が安定したら、音も安定した気がする。

mpd 0.19,19のインストールをソースからコンパイルでやってみたらどうだろうと思ってやってみた。

wget https://www.musicpd.org/download/mpd/0.19/mpd-0.19.19.tar.gz
boostとかlibid3tagとか、何かが足りないとconfigureやmakeでエラーになるので適宜、足りないものを追加しながら、、、
tc@box:~$ tce-load -wi boost-dev.tcz boost.tcz
tc@box:~$ tce-load -wi soxr.tcz sox.tcz soxr-dev.tcz sox-dev.tcz
tc@box:~$ tce-load -wi libid3tag-dev.tcz

あれこれ追加を繰り返し、ようやく動いた。
tce-load -wiでmpdをインストールした時よりも使用してる仮想メモリが半分近くに減っている。

  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
 1317     1 tc       S    85724  9.0   0  4.3 mpd

mpd -Vはこんな感じ。

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

Copyright (C) 2003-2007 Warren Dukes 
Copyright (C) 2008-2014 Max Kellermann 
This is free software; see the source for copying conditions.  There is NO
warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Database plugins:
 simple

Storage plugins:
 local

Decoders plugins:
 [mad] mp3 mp2
 [vorbis] ogg oga
 [oggflac] ogg oga
 [flac] flac
 [sndfile] wav aiff aif au snd paf iff svx sf voc w64 pvf xi htk caf sd2
 [dsdiff] dff
 [dsf] dsf
 [pcm]

Output plugins:
 null fifo alsa ao oss httpd recorder

Encoder plugins:
 null vorbis lame twolame wave flac

Archive plugins:
 [bz2] bz2

Input plugins:
 file alsa archive

Playlist plugins:
 extm3u m3u pls cue embcue

Protocols:
 file:// alsa://

軽ければいいとばかりは言えないけど、すっきりしてるほうが好きなら気休めにはなるかもしれない。

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

Jun 02, 2016

Raspberry Pi でメモリ再生を試みる(piCore7にmpdをインストールする)-いろいろ追記あり

http://www.yung.jp/bony/ こちらのサイトで5月頃から興味深い試みの報告が行われている。
mpdサーバのRAMに音楽ファイルを読み込んで再生したら、NASをマウントするよりもサーバの負担が少ないので音質改善が見込めるのではないかという話だ。
うちでも昔、NASを交換したときの音質変化に驚いたことがある。
機種によってはcifs、nfsでマウントすることが負担になるNASがあるようで、そうした機種だと音が悪くなる。データの転送自体が不安定になってジッタが増加するのが原因だと思う。
そうした経験があったので「メモリ再生でNAS接続の負担から開放される」という話は、なるほどそうか、という思いだった。

試みたいが、うちにはTiny Core Linuxを走らせるハードがないから出来ないな、と思っていたら、Ras PiでPiCoreという派生OSを走らせることが出来るという。
これは面白そうだ。

結局、raspbianとpiCore7にmpdをインストールした。少々苦労したがなんとかなったので備忘録にしておく。
今回はpiCore7について。

2018年1月、追記。
このエントリーは読んでも分かりにくい面があるので、改訂版というのか、書き直しのエントリーをアップした。
分かりやすくするという目論みが成功したとは言い難いが。
piCore7にmpdをインストールする方法
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20180103a.htm

microSDの準備。

piCore7はここから落としてくる。 http://tinycorelinux.net/7.x/armv6/releases/RPi/
これをmicroSDに焼く。

6月11日、追記。
Raspberry pi2以降の機種の場合は、こちらから落す。
http://tinycorelinux.net/7.x/armv7/releases/RPi2/
piはarmv6で、pi2以降はarmv7ということらしい。プロセッサーが違うということだ。

次に、下記のサイトから設定をもらってくる。hifiberryのデバイスの設定だ。
https://www.hifiberry.com/guides/configuring-linux-3-18-x/
以下にメモとして引用しておく。

DAC/DAC+ Light
dtoverlay=hifiberry-dac

DAC+ standard/pro
dtoverlay=hifiberry-dacplus

Digi/Digi+
dtoverlay=hifiberry-digi

Amp/Amp+
dtoverlay=hifiberry-amp

選択する機種によって設定が違うので合わせてconfig.txtに記載する。
ついでに、もとからある設定について下記のように記載変更した。
dtparam=i2c=off,spi=off,i2s=on,i2c_vc=off

piCore7を起動しsshでログイン。

microSDをRasPiに刺して電源供給するとpiCoreが起動する。
sshでログイン。
ipはxxx.xxx.xxx.116。ここらは環境によって変わる。
http://tinycorelinux.net/7.x/armv6/releases/RPi/README にも書いているが、userはtc、パスワードはpiCoreだ。

適宜、下記のコマンドで設定を保存していく。

filetool.sh -b

6月5日、追記。
ipアドレスを固定した。流れは下記のとおり。

tc@box:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr B8:27:EB:36:8A:DF  
          inet addr:192.168.1.116  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:775439 errors:0 dropped:92 overruns:0 frame:0
          TX packets:250166 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1123681152 (1.0 GiB)  TX bytes:24070244 (22.9 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tc@box:~$ cd /opt
tc@box:/opt$ ls
alsa/         bootlocal.sh  bootsync.sh   shutdown.sh   tcemirror
tc@box:/opt$ vi eth0.sh

#!/bin/sh
pkill udhcpc
ifconfig eth0 192.168.1.82 netmask 255.255.255.0 broadcast 192.168.1.255 up
route add default gw 192.168.1.1
echo nameserver 192.168.1.1 > /etc/resolv.conf

tc@box:/opt$ ls
alsa/         bootlocal.sh  bootsync.sh   eth0.sh       shutdown.sh   tcemirror
tc@box:/opt$ chmod +x eth0.sh
tc@box:/opt$ ls -aFl
total 28
drwxrwsr-x    3 root     staff          200 Jun  4 12:46 ./
drwxr-xr-x   17 root     root           380 Jan  1  1970 ../
-rw-rw-r--    1 tc       staff          403 Jun  4 10:53 .filetool.lst
-rw-rw-r--    1 root     staff          145 Dec 31  2014 .xfiletool.lst
drwxr-sr-x    2 root     staff           40 May 31 08:36 alsa/
-rwxrwxr-x    1 root     staff          360 Jan 20  2015 bootlocal.sh*
-rwxrwxr-x    1 root     staff          272 Dec 31  2014 bootsync.sh*
-rwxr-xr-x    1 tc       staff          179 Jun  4 12:46 eth0.sh*
-rwxrwxr-x    1 root     staff          613 Dec 31  2014 shutdown.sh*
-rw-rw-r--    1 root     staff           31 Dec 31  2014 tcemirror
tc@box:/opt$ sudo vi bootsync.sh

#!/bin/sh
# put other system startup commands here, the boot process will wait until they complete.
# Use bootlocal.sh for system startup commands that can run in the background 
# and therefore not slow down the boot process.
/usr/bin/sethostname box
/opt/bootlocal.sh &
/opt/eth0.sh &

tc@box:/opt$ vi .filetool.lst

opt
home
etc/passwd
etc/shadow
etc/group
etc/gshadow
usr/local/etc/ssh/ssh_host_dsa_key
usr/local/etc/ssh/ssh_host_dsa_key.pub
usr/local/etc/ssh/ssh_host_ecdsa_key
usr/local/etc/ssh/ssh_host_ecdsa_key.pub
usr/local/etc/ssh/ssh_host_ed25519_key
usr/local/etc/ssh/ssh_host_ed25519_key.pub
usr/local/etc/ssh/ssh_host_rsa_key
usr/local/etc/ssh/ssh_host_rsa_key.pub
usr/local/etc/
etc/fstab
opt/bootlocal.sh
opt/eth0.sh

tc@box:/opt$ filetool.sh -b
Backing up files to /mnt/mmcblk0p2/tce/mydata.tgz\
Done.
tc@box:/opt$ 

これでsudo rebootしたらipアドレスが固定される。

ディスクイメージを拡張。

以下の流れでディスクイメージを拡張。もともとは最低限の大きさなので、拡張しないと後で諸々のインストールに支障を生じる

tc@box:~$ sudo fdisk -u /dev/mmcblk0
Command (m for help): p

Disk /dev/mmcblk0: 7948 MB, 7948206080 bytes
3 heads, 8 sectors/track, 646826 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes

        Device Boot      Start         End      Blocks  Id System
/dev/mmcblk0p1            8192       69631       30720   c Win95 FAT32 (LBA)
/dev/mmcblk0p2           69648       93119       11736  83 Linux

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

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First sector (8-15523839, default 8): 69648
Last sector or +size or +sizeM or +sizeK (69648-15523839, default 15523839): 15523839

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@box:~$ 
tc@box:~$ sudo reboot
tc@box:~$ Connection to 192.168.1.116 closed by remote host.
Connection to 192.168.1.116 closed.



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

tc@box:~$ 
tc@box:~$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/mmcblk0p2 is mounted on /mnt/mmcblk0p2; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 30
The filesystem on /dev/mmcblk0p2 is now 7727096 (1k) blocks long.
tc@box:~$ 

この流れは http://tinycorelinux.net/7.x/armv6/releases/RPi/README にも書いているが、ちょっと不親切。
コマンドの使い方を調べる必要があった。

各種ライブラリやalsa、flacなどなどインストール。

下記のコマンドでいろいろインストール。

tc@box:~$ tce-load -wi gcc.tcz glib2-dev.tcz
tc@box:~$ tce-load -wi ncurses.tcz ncurses-dev.tcz make.tcz automake.tcz
tc@box:~$ tce-load -wi compile-essentials.tcz squashfs-tools.tcz bash.tcz bc.tcz
tc@box:~$ tce-load -wi pkg-config-doc.tcz pkg-config.tcz

tc@box:~$ tce-load -wi alsa.tcz alsa-config.tcz alsa-doc.tcz alsa-dev.tcz alsaequal.tcz alsa-locale.tcz alsa-modules-4.1.13-piCore+.tcz alsa-modules-4.1.20-piCore+.tcz

tc@box:~$ tce-load -wi flac-dev.tcz flac.tcz flac-doc.tcz libcue.tcz libcue-dev.tcz icu-dev.tcz icu.tcz

ぞろぞろ文字やらなにやらインストールの状況が端末に表示される。
なかなか面白い。

当方ではflacをcue sheetで扱えれば充分なので上記のような感じだけど、他に扱いたいファイル形式があるなら適宜必要なものを追加してインストールしておく必要がある。

alsaはユーティリティとかなくてもいいのか?と思ってたけど、なくてもデバイスの認識は出来て音も出るようだ。
この時点でこんな感じ。

tc@box:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

6月24日、追記。
wavを再生する必要性が生じたため、下記コマンドにてインストール追加した。
tce-load -wi libsndfile-dev.tcz libsndfile-doc.tcz libsndfile.tcz

mpdを再インストールしないといけない。
以前にインストールした後に残っていた、mpd、mpd-0.17.6、両ディレクトリをsudo rm -rfで削除。 あとは、下記の流れに沿ってmpd-0.17.6.tar.gzを再解凍して再インストール、で問題なく動く。

mpdのインストール。

将来的には分からないけど5月31日の時点では、tce-load -wi mpd.tcz ではインストールできない。
libopus.tczがないとかでエラーになる。

なのでソースから自分でコンパイルしてということになる。
以下、コマンドを羅列。

tc@box:~$ wget https://www.musicpd.org/download/mpd/0.17/mpd-0.17.6.tar.gz
tc@box:~$ tar xvf mpd*
tc@box:~$ cd mpd*6
tc@box:~/mpd-0.17.6$ ./configure
tc@box:~/mpd-0.17.6$ make

tc@box:~/mpd-0.17.6$ sudo mkdir ../mpd
tc@box:~/mpd-0.17.6$ 
tc@box:~/mpd-0.17.6$ sudo make DESTDIR=../mpd install
tc@box:~/mpd-0.17.6$ cd ..
tc@box:~$ 

tc@box:~$ mksquashfs mpd mpd-0.17.6.tcz
tc@box:~$ ls
mpd/               mpd-0.17.6/        mpd-0.17.6.tar.gz  mpd-0.17.6.tcz
tc@box:~$ md5sum mpd-0.17.6.tcz > mpd-0.17.6.tcz.md5.txt
tc@box:~$ ls
mpd/               mpd-0.17.6/        mpd-0.17.6.tar.gz  mpd-0.17.6.tcz  mpd-0.17.6.tcz.md5.txt

tc@box:~$ ls /mnt
mmcblk0p1/ mmcblk0p2/
tc@box:~$ sudo mv *tcz* /mnt/*2/tce/optional

コマンドの羅列にしたら、こんな感じ。
本当は間に文字やら何やらが表示される。

まずwgetコマンドでmpdのサイトからソースを落として解凍。
解凍されたディレクトリでconfigure、make。

ここから後が通常のlinuxと違うところで、mpdフォルダを作ってそこに一式まとめて、make installする。
その一式を、mksquashfsコマンドでtczファイルに圧縮。
md5sumコマンドで付録をつけて、/mnt/mmcblk0p2/tce/optionalディレクトリに送り保存する。
これで管理するのがtiny coreの作法ということだ。

次に、onboot.lstの末尾に、mpd-0.17.6.tczを追記する。

tc@box:~$ sudo vi /mnt/*2/tce/onboot.lst

ちなみに、mpd-0.17.6、mpd-0.16.8はインストールできた。 mpd-0.18.19、mpd-0.19.4、mpd-0.19.5はインストール自体ができなかったり実用にならなかったりしている。

RAMDISKでmusicフォルダを設定

6月5日、追記。
RAMDISKでmusicフォルダを設定などという余計なことはせず、普通にmusicフォルダのままがいいようだ。

RAMDISKは、raspbianにmpdをインストールした時に試してみたもので、特に問題なかったのでpiCoreでも設定していたんだけど、swapとの関係なのかどうなのか分からないが、ファイルの転送がうまくいかないようだ。
現在は/etc/fstabの設定は止めている。

tc@box:~$ sudo mkdir music
tc@box:~$ sudo chmod 777 music

tc@box:~$ sudo vi /etc/fstab
tc@box:~$ 
# /etc/fstab
proc            /proc        proc    defaults          0       0
sysfs           /sys         sysfs   defaults          0       0
devpts          /dev/pts     devpts  defaults          0       0
tmpfs           /dev/shm     tmpfs   defaults          0       0
/dev/zram0  swap         swap    defaults,noauto   0       0
/dev/mmcblk0p1  /mnt/mmcblk0p1  vfat     noauto,users,exec,umask=000 0 0 # Added by TC
/dev/mmcblk0p2  /mnt/mmcblk0p2  ext4     noauto,users,exec    0 0 # Added by TC

tmpfs       /home/tc/music     tmpfs    defaults,size=400m 0      0

これは意味があるのかどうか良く分からない。RAMDISKとして設定しなくても動くみたいだ。
sftpソフトでアクセスして/home/tc/musicに音楽ファイルを転送する。
mpd.confで、ここをmusic_directoryに設定する。

6月4日、追記。
homeディレクトリ以下にmusicフォルダを置くと、filetool.sh -bでmusicフォルダの音楽ファイルが記憶されてしまう、ということに今更気付いた。つまり、何かの必要があって再起動したら、その記憶されていた音楽ファイルが現れてくるということ。
通常運用し始めたらfiletool.sh -bを使う機会はそうそうないと思うけど、注意がいるかも。
そういう意味では、/musicとかfiletool.sh -bの影響を受けない場所を、bootlocal.shで指示して確保したほうがスマートかもしれない。

.filetool.lstへの追記

これは、うちの環境で意味があるのかどうか分からないんだけど、一応。

sudo vi /opt/.filetool.lst

以下の3行を追記している。

usr/local/etc/
etc/fstab
opt/bootlocal.sh

bootlocal.shにmpdを記載することでboot時に起動するとかあるようなんだけど、うちでは上手くいかなかった。sshでログインしてmpdコマンドを打って起動させている。

mpdの設定。

tc@box:~$ 
tc@box:~$ mkdir .mpd
tc@box:~$ mkdir .mpd/playlists
tc@box:~$ sudo cp mpd-0.17.6/doc/mpdconf.example ~/.mpdconf
tc@box:~$ 
tc@box:~$ sudo vi .mpdconf

mpd.confを設定する。
mpdのINSTALLファイルにデフォルト指定があるので、そのひとつの~/.mpdconfを選択。
music_directoryなどの設定、alsaを出力に設定。
後は勝手知ったるもので、好きなように設定したらいい。
auto_updateを有効にしておけば、ファイルを入れ替えたらすぐに反映されるので便利。

とりあえず、以上だ。

6月6日、さらに追記。

nfsでNASをマウントする

nfsでNASをマウントするコマンド。
addr=を使う必要がある。

tc@box:~$ sudo mount -o addr=192.168.1.80,nolock -t nfs 192.168.1.80:/titan /home/tc/music

上記のコマンドで、192.168.1.80のNASの共有フォルダtitanを、piCoreのmusicディレクトリにマウントできる。
これでメモリ再生とNASをマウントした場合の比較が出来るかな。
いまさら気付いたが、NASをマウントした場合はライブラリの自動アップデートが効かない。これはmpdのバージョンが古いせいだと思う。
参考にしたサイトは以下。
http://forum.tinycorelinux.net/index.php?topic=19913.0

Posted at 17:15 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 › »