Boticized lightMPDのmpdの最新版への入れ換えですが、一応音が出るようになりました。音は素晴らしいです。尖った音という感じはすっかりひっこみ、落ち着いた雰囲気で、楽器のリアルな質感がとてもよく再現されるようになりました。悪戦苦闘しましたが、やってみた甲斐はありました。
lightmpd login: root
# uname -a
Linux lightmpd 4.8.13-rt8-lightMPDbbb-00128-g46e67de-dirty #9 PREEMPT RT Thu Jan 12 08:24:28 JST 2017 armv7l GNU/Linux
# mpd -V
Music Player Daemon 0.19.21
Copyright (C) 2003-2007 Warren Dukes <warren.dukes@gmail.com>
Copyright (C) 2008-2014 Max Kellermann <max@duempel.org>
公開しようかと思いますが、前回のzImageとam335x-boneblack-botic.dtbに加え、uInitrdとmpdの入れ換えが必要で、更に、uEnv.txt、lightmpd.conf、mpd.confの一部修正が必要です。つまりBBB版のlightMPDをブートローダを除いて、総入れ換えすることになります。こうなると公開は著作権者のデジファイのおとさんの許可を得ておくのが仁義かと思います。
あと、ビルドするmpdの構成に関してはいろいろな設定が可能ですが、当然、僕の使い方に合わせた設定になっています。ラジオが聞けないとか、SOXによる変換はしないとか、多々制限があります。
また、原因不明のバグ残りです。一番大きいのはmpdが自動起動されないというやつ。その他、tag_cache作成途中で止まるので、古い版で作成してから使う必要があるなど。このあたりは公開して、他の方の環境でどうなるか知りたいです。
という次第でどうしたものか思案中です。
なお、uInitrdの入れ換えは相当に大変です。「インタネットラジオを聞きたいからなんとかしろ」などといわれても、気安くハイハイいえるレベルではありません。デジファイのおとさんがあれだけの数のソフトを様々な要望を聞き入れながら、メンテナンスされていることに改めて敬服、感謝します。
lightMPD用のmpdをビルドための情報はほとんどありません。ググって出てきた情報で役に立ったのはlightMPD掲示版のこの情報だけでした。
https://groups.google.com/forum/#" target="_blank">https://groups.google.com/forum/#!topic/lightmpd/rHUIeT_OUdQ
buildrootというのを使うのが正しい作法らしいが、知らない、面倒だという理由で却下。Boticized Debian(jessie版)を使うことにしました(Boticized Archはlib構造が違うので、使えません)。
Boticized Debianの作り方については、ここのmoctさんの情報を参照して下さい。
http://mimizukobo.sakura.ne.jp/cgi-bin/read.cgi?mode=all&list=topic&no=5424#5440" target="_blank">http://mimizukobo.sakura.ne.jp/cgi-bin/read.cgi?mode=all&list=topic&no=5424#5440
lightmpdのカーネルのビルドについては結構あちこちに情報はありますね。例えばここ。
https://groups.google.com/forum/#" target="_blank">https://groups.google.com/forum/#!topic/lightmpd/UhTitAMPr4E
コンパイルの仕方についてはこちらを参照して下さい。
http://mimizukobo.sakura.ne.jp/cgi-bin/read.cgi?mode=all&list=topic&no=5424#5436" target="_blank">http://mimizukobo.sakura.ne.jp/cgi-bin/read.cgi?mode=all&list=topic&no=5424#5436
この時ポイントは事前にmpdをインストールしないこと。まっさらの状態でビルドを開始して下さい。もう一つ。Debianが最新になっているので、gccのバージョン指定は不要です。
mpd 0.19.21を選択するとlintweakerさんのパッチはDSDパッチはかからなくなるので、RTパッチだけかけます。
myconfigはサイトに最近書き込んだ内容のものを使っています。一応掲載しておくと
#!/bin/sh
./configure \
--disable-bzip2 \
--disable-iso9660 \
--disable-zzip \
--enable-id3 \
--disable-sqlite \
--enable-ffmpeg \
--enable-alsa \
--disable-wave-encoder \
--enable-pipe-output \
--enable-httpd-output \
--disable-recorder-output \
--disable-sndfile \
--disable-oss \
--disable-shout \
--disable-pulse \
--disable-ao \
--disable-mad \
--disable-jack \
--disable-cdio-paranoia \
--disable-soundcloud \
--disable-inotify \
--disable-ipv6 \
--enable-curl \
--disable-mms \
--disable-wavpack \
--disable-lame-encoder \
--disable-twolame-encoder \
--disable-vorbis \
--disable-lsr \
--enable-rtopt \
--with-zeroconf=auto \
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
となります。
さて、ここからが勝負です。
まず、mpdが使っているライブラリの情報を出力させます。
root@arm:~# ldd /usr/local/bin/mpd
linux-vdso.so.1 (0xbed49000)
libexpat.so.1 => /lib/arm-linux-gnueabihf/libexpat.so.1 (0xb6f8a000)
libFLAC.so.8 => /usr/lib/arm-linux-gnueabihf/libFLAC.so.8 (0xb6f57000)
libavformat.so.56 => /usr/lib/arm-linux-gnueabihf/neon/vfp/libavformat.so.56 (0xb6e75000)
・・・
libffi.so.6 => /usr/lib/arm-linux-gnueabihf/libffi.so.6 (0xb3766000)
libgpg-error.so.0 => /lib/arm-linux-gnueabihf/libgpg-error.so.0 (0xb374a000)
root@arm:~#
という感じで72行分出力されます。Boticisedした結果カーネルのバージョンはあっているので、理屈としてはこれを全部 Boticized lightMPD側にコピーしてやれば、ビルドしたMPDは動くことになります。
その方法も考えたが、ここで思案。エディターの検索機能を使い、必要なものだけピックアップすることにしました(これは後から考えると、かえって手間をかけてしまっかもです^^;;;)。
Boticised lightMPD側で
# ls /usr/lib/arm-linux-gnueabihf/
# ls /usr/lib
# ls /lib
この出力結果を先程のlddの出力結果の先にコピーし、検索機能を使って、有るか無いか確認します。
ついでに、Debian側も同じことを行っておきます。こちらは確実にあるということの確認です。
この検索編集作業が一番大変でした。適当なスクリプトを作れば、もう少しスマートに出来るとは思いますが、どうせ一回だけだからと手抜き。
そして、最終的にこういうスクリプトを作成します。
cd /home
mkdir ./work-lib
mkdir ./work-libarm
mkdir ./work-usrlibarm
cp \
/lib/arm-linux-gnueabihf/libbz2.so.1.0 \
./work-lib
cp \
/usr/lib/arm-linux-gnueabihf/libasound.so.2.0.0 \
/usr/lib/arm-linux-gnueabihf/libcurl.so.4.3.0 \
/usr/lib/arm-linux-gnueabihf/libicuuc.so.52 \
/usr/lib/arm-linux-gnueabihf/libmpcdec.so.6 \
/usr/lib/arm-linux-gnueabihf/libicui18n.so.52 \
/usr/lib/arm-linux-gnueabihf/libicudata.so.52 \
/usr/lib/arm-linux-gnueabihf/librtmp.so.1 \
/usr/lib/arm-linux-gnueabihf/libgnutls-deb0.so.28 \
/usr/lib/arm-linux-gnueabihf/neon/vfp/libavresample.so.2 \
/usr/lib/arm-linux-gnueabihf/libxvidcore.so.4 \
/usr/lib/arm-linux-gnueabihf/libx264.so.142 \
/usr/lib/arm-linux-gnueabihf/vfp/neon/libvpx.so.1 \
/usr/lib/arm-linux-gnueabihf/libtheoraenc.so.1 \
/usr/lib/arm-linux-gnueabihf/libtheoradec.so.1 \
/usr/lib/arm-linux-gnueabihf/libspeex.so.1 \
/usr/lib/arm-linux-gnueabihf/libschroedinger-1.0.so.0 \
/usr/lib/arm-linux-gnueabihf/libopus.so.0 \
/usr/lib/arm-linux-gnueabihf/libopenjpeg.so.5 \
/usr/lib/arm-linux-gnueabihf/libmp3lame.so.0 \
/usr/lib/arm-linux-gnueabihf/libgsm.so.1 \
/usr/lib/arm-linux-gnueabihf/libva.so.1 \
/usr/lib/arm-linux-gnueabihf/libidn.so.11 \
/usr/lib/arm-linux-gnueabihf/libssh2.so.1 \
/usr/lib/arm-linux-gnueabihf/libssl.so.1.0.0 \
/usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0 \
/usr/lib/arm-linux-gnueabihf/libgssapi_krb5.so.2 \
/usr/lib/arm-linux-gnueabihf/libkrb5.so.3 \
/usr/lib/arm-linux-gnueabihf/libk5crypto.so.3 \
/usr/lib/arm-linux-gnueabihf/liblber-2.4.so.2 \
/usr/lib/arm-linux-gnueabihf/libldap_r-2.4.so.2 \
/usr/lib/arm-linux-gnueabihf/libhogweed.so.2 \
/usr/lib/arm-linux-gnueabihf/libnettle.so.4 \
/usr/lib/arm-linux-gnueabihf/libgmp.so.10 \
/usr/lib/arm-linux-gnueabihf/libp11-kit.so.0 \
/usr/lib/arm-linux-gnueabihf/libtasn1.so.6 \
/usr/lib/arm-linux-gnueabihf/liborc-0.4.so.0 \
/usr/lib/arm-linux-gnueabihf/libkrb5support.so.0 \
/usr/lib/arm-linux-gnueabihf/libsasl2.so.2 \
./work-usrlibarm
cp \
/lib/arm-linux-gnueabihf/libdl.so.2 \
/lib/arm-linux-gnueabihf/librt.so.1 \
/lib/arm-linux-gnueabihf/libpcre.so.3 \
/lib/arm-linux-gnueabihf/libgcrypt.so.20 \
/lib/arm-linux-gnueabihf/libkeyutils.so.1 \
/lib/arm-linux-gnueabihf/libgpg-error.so.0 \
./work-libarm
これで、debian側で作成したMPDをlightMPD側で実行するために、必要なライブラリを捕獲できることになります。
スクリプトをdebian側で実行します。
nano save_mpdlib
上記内容をコピー。
sh ./save_mpdlib
と書くとすんなり出来たようですが、実は単純な検索だけでは駄目なものが二つありました。
/usr/lib/arm-linux-gnueabihf/libasound.so.2.0.0 \
/usr/lib/arm-linux-gnueabihf/libcurl.so.4.3.0 \
この二つはこの後のmpd入れ替え後の最初のlightMPDの起動で以下のエラーとなり、最新版への更新が必要と分かったものです。
mpd: /usr/lib/arm-linux-gnueabihf/libcurl.so.4: no version information available (required by mpd)
mpd: /usr/lib/arm-linux-gnueabihf/libasound.so.2: no version information available (required by mpd)
mpd: /usr/lib/arm-linux-gnueabihf/libasound.so.2: no version information available (required by mpd)
mpd: /usr/lib/arm-linux-gnueabihf/libasound.so.2: no version information available (required by mpd)
Music Player Daemon 0.19.21
というエラーが出て調べたら
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jan 15 10:18:07 2017
root@arm:~# ls -l /usr/lib/arm-linux-gnueabihf/libasound.so.2
lrwxrwxrwx 1 root root 18 Apr 24 2016 /usr/lib/arm-linux-gnueabihf/libasound.so.2 -> libasound.so.2.0.0
root@arm:~# ls -l /usr/lib/arm-linux-gnueabihf/libasound.so.2.0.0
-rw-r--r-- 1 root root 627336 Apr 24 2016 /usr/lib/arm-linux-gnueabihf/libasound.so.2.0.0
root@arm:~# ls -l /usr/lib/arm-linux-gnueabihf/libcurl.so.4
lrwxrwxrwx 1 root root 16 Nov 2 01:01 /usr/lib/arm-linux-gnueabihf/libcurl.so.4 -> libcurl.so.4.3.0
root@arm:~# ls -l /usr/lib/arm-linux-gnueabihf/libcurl.so.4.3.0
-rw-r--r-- 1 root root 292468 Nov 2 01:02 /usr/lib/arm-linux-gnueabihf/libcurl.so.4.3.0
lightMPDでは
# ls -l /usr/lib/arm-linux-gnueabihf/libcurl.so.4.3.0
-rwxr-xr-x 1 root root 301596 Jan 1 09:00 /usr/lib/arm-linux-gnueabihf/libcurl.so.4.3.# ls -l /usr/lib/arm-linux-gnueabihf/libasound.so.2.0.0
-rwxr-xr-x 1 root root 812036 Jan 1 09:00 /usr/lib/arm-linux-gnueabihf/libasound.so.2.0.0
となっているので、Debian側の最新版が必要と判断しました。
ここから先は適当なlinux環境で作業します。僕はVmwarePlayerのUbuntuを使いました。
次に uInitrd に捕獲したライブラリをコピーします。uInitrd を解凍し、展開したディレクトリで操作します。
uInitrd は Windowsの 7zip で解凍します。initrd.romfsという名前でromfsが解凍されます。
http://download.atmark-techno.com/armadillo-9/tools/" target="_blank">http://download.atmark-techno.com/armadillo-9/tools/
これを上記リンク先(armadilloのtoolsディレクトリ)にあるextromfs.shで展開します。
wget http://download.atmark-techno.com/armadillo-9/tools/extromfs.sh" target="_blank">http://download.atmark-techno.com/armadillo-9/tools/extromfs.sh
mkdir root
chmod 777 ./extromfs.sh
sudo ./extromfs.sh /mnt/boot/initrd.romfs root/
これでrootにlightMPDのrootfsが展開されます。
extromfs.shのについては以下に解説があります。
http://armadillo.atmark-techno.com/howto/extromfs-a9" target="_blank">http://armadillo.atmark-techno.com/howto/extromfs-a9
http://wiki.onakasuita.org/pukiwiki/?extract_uImage.sh" target="_blank">http://wiki.onakasuita.org/pukiwiki/?extract_uImage.sh
Windowsの 7zip を使うというダサイ方法ではなく、全部linuxやるスマートな方法の情報を教えてもらいました。
http://mimizukobo.sakura.ne.jp/cgi-bin/read.cgi?mode=all&list=topic&no=5485#5502" target="_blank">http://mimizukobo.sakura.ne.jp/cgi-bin/read.cgi?mode=all&list=topic&no=5485#5502
ただ、この方法はloopマウントしたrootfsをrwに出来ないので、上記方法としています。
Boticized DebianのSDカードをもってきます。
sudo mount /dev/sdb1 /mnt
sudo cp /mnt/home/work-lib/* root/lib/
sudo cp /mnt/home/work-libarm/* root/lib/arm-linux-gnueabihf/
sudo cp /mnt/home/work-usrlibarm/* root/usr/lib/arm-linux-gnueabihf/
これで、めでたく捕獲したライブラリは Boticized lightMPDの住民となりました。
次に展開したrootfsを再びuInitrdに戻します。
参考にしたサイトはこちら。
http://blog.rustle.info/archives/2045" target="_blank">http://blog.rustle.info/archives/2045
このサイトはrpiのlightMPDに関する情報サイトですが、なかなか参考になります。
http://mimizukobo.sakura.ne.jp/cgi-bin/read.cgi?mode=all&list=topic&no=5485#5491" target="_blank">http://mimizukobo.sakura.ne.jp/cgi-bin/read.cgi?mode=all&list=topic&no=5485#5491
上記の情報にも助けられました。
sudo apt install genromfs
cd root
sudo genromfs -f ../initrd.romfs
sudo gzip ../initrd.romfs
mkimage -A arm -O linux -T ramdisk -C gzip -d ../initrd.romfs.gz ../uInitrd-botic
これで MPD入れ換え用にライブラリの入れ換えを行った uInitrd が誕生しました。
あとは、誕生したuInitrd をBoticized lightMPDに入れてやるだけです。sdカード交換前にmpdをコピーしておきます。
sudo cp /mnt/usr/local/bin/mpd ../
sudo umount /mnt
sdカードを入れ換えます。
sudo mount /dev/sdb1 /mnt
sudo cp ../uInitrd-otic /mnt/boot/
これで作業は完了ですが、このままでは動きません。まず uEnv.txtを修正します。
sudo nano /mnt/uEnv.txt
#initrd_file=/boot/uInitrd
initrd_file=/boot/uInitrd-botic
もう一箇所変更があります。捕獲したライブラリを大量に取り込んだため、 uInitrd が太りすぎたのですよね。僕の腕ではダイエットすることは難しいので(^^;;;、太ったサイズに合わせることにします(^^;;;。
#ramroot=/dev/ram0 rw ramdisk_size=65536
ramroot=/dev/ram0 rw ramdisk_size=131072
しかし、倍のサイズとはあんまりだといわれそうですが、無視です(^^;;;。
長い道のりでしたが、ようやくmpdの入れ換えとなります。
cp ../mpd /mnt/lightmpd
あと二つ、設定ファイルの修正が必要です。
sudo nano /mnt/lightmpd/lightmpd.conf
# load_module=mpd-0.19.9rt
load_module=mpd
次に
sudo nano /mnt/lightmpd/mpd.conf
#samplerate_converter "soxr very high"
これでお終いです。システムを起動します。
今のところ気がついているバグは二つです。
一つ目は時々(というかほとんど毎回)、mpdがうまく起動されません。
# mpd /etc/mpd.conf
で回避しています。Gaucheのスクリプトと勝負しないと駄目なのですかね。ウームだなぁ。
二つ目は僕の環境では tag_cacheの作成が途中で止まってしまいます。だだ、これはlightMPDの問題ではなく、mpdの問題だと思います。他の方の環境ではどうなるか、公開して知りたいと思っています。
リンク先にこの掲示板のアドレスがいっぱいあります。多くの方に助けられてなんとかlightmpdのbotic化が出来ました。ご協力いただいた皆様ありがとうございました。
yoさん
孤軍奮闘お疲れ様です。
苦労は目に見えるようですがその分音が出た時は
感動されたのではないかと推察します。
以前も話題にしましたがdonuts.shop73さんという方はrpi用
ですがlightmpdを改良されpolipoやupmpdcliを入れてupnp
化しておられます。この方も公開する前にちゃんとdigififanさんに
ことわっておられますので、その方がいいでしょう。
取りあえずお疲れ様でした。
inthedark
inthedark さん、アドバイスありがとうございました。
デジファイのおとさんのご了解は頂きました。
問題は一つの目のバグで、telenetを使えない方にはかなり致命的な内容だから、解決しないといけませんね。しかしGaucheは相手の戦いは厳しいなぁというところです。
yoさん
デジファイのおとさんの掲示板、私も読ませていただきました。
yoさんは人望がありますからこれからも様々な情報が入ってくる
と思います。
様々な人の知恵が結集され、面白いことができますように。
inthedark
デジファイのおとさんがbbbのカーネル、mpdのバージョンアップ版を公開されています。
https://sites.google.com/site/digififan/home/lightmpdbbs" target="_blank">https://sites.google.com/site/digififan/home/lightmpdbbs
inthedark
こんにちは。ちょっと私も見てみました(趣味でGaucheを使うもので)。あちらでもご回答があったようなので足しになるか分かりませんが、とにかく報告させていただきます。
それで、最初の起動プロセスでは、
(1) /etc/init.d/S00setupvar内でsyssetup.scmにより生成されたスクリプト(setup.sh)でコピー&+xしたmpdを、
(2) /etc/init.d/S95mpd
という普通のシェルスクリプトが実行してる様です。このへんの起動に齟齬が起きてるんでしょうか?
ちなみに、/etc/init.d/にシェルスクリプトを仕込めばGaucheとは関係なしにシステムをいじれるのかもしれません。
(1)についてもう少し書くと、syssetup.scmはセットアップ用のシェルスクリプトsetup.shを作るものらしく、
/mnt/var.rom% grep -R "MPD-LOAD" .
./lightMPD/bin/syssetup.scm:(define-constant MPD-LOAD-MODULE (outfile "bin/mpd"))
./lightMPD/bin/syssetup.scm: (format port "cp /mnt/lightMPD/~a ~a\n" lm MPD-LOAD-MODULE)
./lightMPD/bin/syssetup.scm: (format port "chmod +x ~a\n" MPD-LOAD-MODULE)))))
の様になっていて、mpdの実行ファイルに関しては(多分RAM上に)コピーしてxをつけるくらいのことをする模様です。
inthedark さん、情報ありがとうございました。
zImage-4.9.3rt1は僕のuInitrdと組み合わせて、問題なく動くようですね。オリジナルのuInitrdではエラーになります。
mpd-0.19.21rt-native-dsdは再生しようとするとエラーになるので、デジファイのおとさんに質問しているところです。
mpdの起動の件は解決しました。
あとはmoctさんから要望の出ているrt優先レベルの設定方法なのですが、悩ましいですね。
スクリプトにして初期設定処理で起動する位は出来そうですが、設定内容を自由に変えるというのは、大変なので。
ca2 さん、アドバイスありがとうございます。
mpdの起動の件は多分ビルドの仕方の違いに起因する問題だったようです。S95mpdのmpdを起動する部分の修正で対応できそうですね。
> (趣味でGaucheを使うもので)
(@д@)。凄いですね。僕は、昔、emacsのマクロ(lispです)を使っていたことがあるのですが、あまりの難しさにメゲて(^^;;;、wzに転向しました。これからも教えていただけると幸いです。
それで、便乗して質問ですが、sdカードのrootにrt優先レベルを設定するシェルスクリプト(例えばrtlevelset.sh)を置いたとして、これを初期設定処理で起動する一番簡単な方法を教えてもらえますか。
digififanさんの説明で割込ハンドラーのプライオリティの設定が
lightmpd.confからできるというのには正直よく考えておられる
なあと感心しました。
[irqpriority]
setdefault=no
musb-hdrc.0.auto=FIFO:30
inthedark
yoさん お疲れ様です。
ここ数日の変化はものすごいですね。
今、yoさんのカーネルと「デジファイのおと」さんのバージョンアップしたmpdで聴いていますが、とんでもないですね、これは。
「デジファイのおと」さんが隠していた優先レベルを変更する機能も、使いにくいですが必要十分です。この辺は無理をされなくても良いと思います。
> 今、yoさんのカーネルと「デジファイのおと」さんのバージョンアップしたmpdで聴いていますが
この組み合わせで音がでますか。となると僕の環境で駄目なのは、mpd.confの問題ですかね。
yoさん こんばんは
# uname -r
4.8.13-rt8-lightMPDbbb-00128-g46e67de-dirty
# mpd -V
Music Player Daemon 0.19.21-dsd
>この組み合わせで音がでますか。となると僕の環境で駄目なのは、mpd.confの問題ですかね。
参考までに
https://www.dropbox.com/sh/v49t12thdy0h6jp/AACN1gtPLnVyPtPFKJ-hvxuxa?dl=0" target="_blank">https://www.dropbox.com/sh/v49t12thdy0h6jp/AACN1gtPLnVyPtPFKJ-hvxuxa?dl=0
moctさん
僕の確認ミスでした。
オリジナルのuInitrdとmpd-0.19.21rt-native-dsdの組み合わせであれば、音は出ますね。
ということは、今の状態で最新のmpdの音を聞けることになるので、こちらで作ったuInitrd-boticを急いでアップロードする必要はなさそうです。
データ、ありがとうございました。
inthedark さん
ドタバタしていて、質問し忘れていましたが、
> 以前も話題にしましたがdonuts.shop73さんという方はrpi用
> ですがlightmpdを改良されpolipoやupmpdcliを入れてupnp
> 化しておられます。この方も公開する前にちゃんとdigififanさんに
> ことわっておられますので、その方がいいでしょう。
この方の公開されているサイト(アドレス)を教えて頂けますか。
調べればいいのですが、不精をして(^^;;;。
yoさん。時間が今あまりないので手抜きですが、
var.rom/lightMPD/bin/syssetup.scm内の、
(format port "cp /mnt/lightMPD/~a ~a\n" lm MPD-LOAD-MODULE)
(format port "chmod +x ~a\n" MPD-LOAD-MODULE)))))
の直前に
(format port "cp /mnt/lightMPD/script.sh bin/script.sh\n")
(format port "chmod +x bin/script.sh\n" MPD-LOAD-MODULE)
を加えて、
/etc/init.d/S95mpdに、/usr/bin/script.shを加えてしまえば、一応良い気がします。sdの mpd と同じディレクトリに置いた script.sh の内容が実行されるかたちになります。
他にも方法はありそうですが…それは時間ができた時にさせてください。
yoさん
lightmpdの掲示板内でダウンロードリンクを張っておられます。
https://drive.google.com/file/d/0B9LSJY9xM01jbnJWUUNnSXUxTmc/view?usp=sharing" target="_blank">https://drive.google.com/file/d/0B9LSJY9xM01jbnJWUUNnSXUxTmc/view?usp=sharing
inthedark
ca2 さん、ご教授ありがとうございます。
早速試してみましたが、結果はNGです。
教えていただいたように(script.shはmyscript.shに変更しました)
(define (output-copy-mpdloadmodule-script param)
(let ((lm (hash-table-get param "load_module" "mpd")))
(call-with-output-string
(lambda (port)
(format port "cp /mnt/lightmpd/myscript.sh bin/myscript.sh\n")
(format port "chmod +x bin/myscript.sh\n" MPD-LOAD-MODULE)
(format port "cp /mnt/lightMPD/~a ~a\n" lm MPD-LOAD-MODULE)
(format port "chmod +x ~a\n" MPD-LOAD-MODULE)))))
という具合に修正し、起動すると(当然/lightmpd/myscript.shは作成しておきます)
started
/etc/init.d/S95mpd: line 31: /usr/bin/mpd: not found
OK
/etc/init.d/S95mpd: line 31: /usr/bin/myscript.sh: not found
webconsole started
ympd started
Welcome to lightMPD
lightmpd login: MPD connection: Connection refused
MPD connection failed.
*** PARSEOPT-ERROR: running out the arguments for option "p"
Stack Trace:
という具合にエラーになります。MPDのコピーまで巻き込んでエラーになっていますので、
(format port "chmod +x bin/myscript.sh\n" MPD-LOAD-MODULE)
のMPD-LOAD-MODULEが悪いのですかね。
ちなみにこの行をコメントアウトするとエラーは
/etc/init.d/S95mpd: line 31: /usr/bin/myscript.sh: not found
だけになります。
書き忘れましたがS95mpdは修正してあります。case文のstartの時にmyscript.shを実行するように。
inthedark さん、情報ありがとうございました。
サイトの方に書き込んでいますが、僕がlightMPDに興味を持ったのはUPnP対応したという理由からです。まあrpiだと使うことはなさそうですけれども、スレッドは読んでみます。
一応こちらでdigififanさんの4.9.3用のconfig.gzを使って
再度ビルドしなおして見ました。
digififanさんのご忠告どおりDevice Drivers --> Multifunction drivers --> TI TPS65217 Power Management
チェックをいれるとビルドは通ります。
これでmpdもkernelもすっきりしますね。
inthedark
lightMPDの掲示板でデジファイのおとさんといろいろやりとりしていますが、なかなか興味深いです。中でも、alsaが同じバージョンレベルなのに内容は違っているというのが面白かったです。
調べたら
arch
[root@alarm ~]# ls -l /usr/lib/libasound.so.2.0.0
-rwxr-xr-x 1 root root 869108 Dec 23 01:32 /usr/lib/libasound.so.2.0.0
lightMPD
# ls -l /usr/lib/libasound.so.2.0.0
-rwxr-xr-x 1 root root 812036 Jan 1 1970 /usr/lib/libasound.so.2.0.0
debian
root@arm:~# ls -l /usr/lib/arm-linux-gnueabihf/libasound.so.2.0.0
-rw-r--r-- 1 root root 627336 Apr 24 2016 /usr/lib/arm-linux-gnueabihf/libasound.so.2.0.0
となっています。いずれもboticizedしたもの。
archが一番新しいようですね。どういう訳か僕がビルドしたmpdはどれでも動くので、lightmpdで聞き比べてみました。arch版が一番音が良いような気がします。boticizedした版でもarchが一番評判が良いみたいですが、このあたりにも原因の一つがあるのですかね。
デジファイのおとさんが公開されているmpdはlightMPDに搭載されているlibasoundでないと動かないのですが、これも不思議。
さて、公開するuInitrdはどうしますかね。着せ変え人形方式にして、好みの服を着せて頂戴とするかな。
yoさん。すみません、時間に追われていたため(format port "chmod +x bin/myscript.sh\n" MPD-LOAD-MODULE)の行の修正をわすれてました。
(define (output-copy-mpdloadmodule-script param)
(let ((lm (hash-table-get param "load_module" "mpd")))
(call-with-output-string
(lambda (port)
(format port "cp /mnt/lightmpd/myscript.sh bin/myscript.sh\n")
(format port "chmod +x bin/myscript.sh\n")
(format port "cp /mnt/lightMPD/~a ~a\n" lm MPD-LOAD-MODULE)
(format port "chmod +x ~a\n" MPD-LOAD-MODULE)))))
のようにして下さい。これでどうでしょうか?
format はprintfみたいなもので、~aの数だけ後ろに引数をもつので、MPD-LOAD-MODULEを消し忘れてエラーになったと思います。
SD内のlightmpd/lightMPD/myscript.shをコピーします(mpdやlightmpd.confのあるディレクトリです)。
やりたいことは、mpdの実行ファイルをコピーする時に便乗してSDのデータをコピーしたいというだけです(応用すれば、initrdに全部入れて固めなくても、外にあるデータをRAMに移すことができると思います)。
本当は別の関数に分ける方が良いと思いますが、とりあえずということで…。
まだミスがありますね。大文字小文字がまちがってるので、以下のようにすれば良いと思います。
(define (output-copy-mpdloadmodule-script param)
(let ((lm (hash-table-get param "load_module" "mpd")))
(call-with-output-string
(lambda (port)
(format port "cp /mnt/lightMPD/myscript.sh bin/myscript.sh\n")
(format port "chmod +x bin/myscript.sh\n")
(format port "cp /mnt/lightMPD/~a ~a\n" lm MPD-LOAD-MODULE)
(format port "chmod +x ~a\n" MPD-LOAD-MODULE)))))
lightMPDの標準の設定法を越えることになるので、ここまでやる必要あるかわかりませんが…
たびたび長々と済みません…これで(多分)最後です。修正は次のようになります。
(define (output-copy-mpdloadmodule-script param)
(let ((lm (hash-table-get param "load_module" "mpd")))
(call-with-output-string
(lambda (port)
(format port "cp /mnt/lightMPD/myscript.sh ~a\n" (outfile "bin/myscript.sh"))
(format port "chmod +x ~a\n" (outfile "bin/myscript.sh"))
(format port "cp /mnt/lightMPD/~a ~a\n" lm MPD-LOAD-MODULE)
(format port "chmod +x ~a\n" MPD-LOAD-MODULE)))))
手元のgaucheで少し工夫するとsyssetup.scmを実行してsetup.shを作成できるのですが、上の修正をして出力を得ました。該当の場所としては、
cp /mnt/lightMPD/myscript.sh /mnt/var.rom/lightMPD/bin/myscript.sh
chmod +x /mnt/var.rom/lightMPD/bin/myscript.sh
cp /mnt/lightMPD/mpd-0.19.9rt /mnt/var.rom/lightMPD/bin/mpd
chmod +x /mnt/var.rom/lightMPD/bin/mpd
の様になってます。
"/mnt/var.rom/lightMPD" となってるのは変に思うかもしれませんが、手元でsyssetup.scmを実行するために設定を書き変えたせいだと思います。少なくともmpdと同じ場所にコピーされるはずなので問題ないはずですが、もしかするとコピーしたmyscriptをどう実行するのか考える必要があるかもしれません。
案の定というか…
lightmpd の /usr/bin/mpd はシンボリックリンク(../../var/lightMPD/bin/mpd)ですね。コピーされるのは/var/lightMPD/bin/以下の様です。なので、myscript実行のためにはS95mpdだとかで
/var/lightMPD/bin/myscript.sh
のように実行して下さい。
ca2 さん、お忙しいところに勝手なお願いをしてしまって申し訳ありません。
修正ありがとうございました。後で確認して、結果をご報告します。
ca2 さん
うまくいきました。ありがとうございました。
lightmpd login: root
# ls /var/lightMPD/bin/
irqhandler.scm setaffinity.scm statusout.sh
mpd setmpdmask.scm syssetup.log
myscript.sh setup.sh syssetup.scm
# /var/lightMPD/bin/myscript.sh
Welcome to Boticized lightMPD
#
という感じです(^^)。
> lightMPDの標準の設定法を越えることになるので、ここまでやる必要あるかわかりませんが…
「毒食わば、皿まで」だから(ちょっと違うかな ? )、いいのじゃないでしょうか。
これで、このuInitrdとmpdを公開すればよさそうですね。
yoさん
お尋ねします。yoさんが作成されたmpdは、DSD再生については如何でしょうか。
当方の環境で、Botic化されたものでうまくDSD再生できるのは、moctさんのBoticized Archくらいですので。
追伸:
円安なので厳しかったですが(^^;、ついにPCengineにapuを注文しました。
また、いろいろと教えてやってくださいm(_ _)m
えふ さん
DSD再生できています。ネイティブ/DOPのどちらもOKです。
> ついにPCengineにapuを注文しました。
ようこそapuクラブに。いじり甲斐のあるハードです。楽しみですね。
yoさん
新たなスレッドを立てるのも大げさなのでここで簡単にご回答
いたします。
buildrootで作れるものは,x86,x64,arm,sparc(64),mipsなど様
々なものが作れます。私は、arm用(rpi,bbg)しか作ってませ
んが、digififanさんのようにapu用も作れます。
buildrootの扱い方はそう簡単ではありません。(私にとって
はですよ、皆さんは簡単じゃないかと思うかもしれません。)
僕も自分でマニュアルと格闘しどうしてもわからないことだけ
詳しい方に質問させていただきました。
それを説明するというのは私には難しいですね。(自分用に
環境構築する手順を書いたマニュアルはありますが、これは他
人に公開するようなものではありませんしね。)
digififanさんも
”lightMPDのイメージファイルはbuildrootというソフトで作成しています。buildrootのconfigやpackageは
以前から公開するとアナウンスしていましたが、こちらの都合でのびのびになっています。”
とはおっしゃってますが、buildrootについて一から十まで説明
するなんてことはしないでしょう。digififanさんはやさしい
方なので実行されるかもしれませんが。
まあ、私も気が向けば(需要がたくさんあれば)別スレッドで書かせて頂くかもしれません。(お約束はできませんが)
inthedark
言い忘れていましたが、もちろんbuildrootは仮想環境でも
動きます。
私は、windows10+vmware+ubuntu+buildrootでやってます。
intel core5なんでビルドのスピードは断然速いです。
カーネルのビルドだけなら、コンフィグの内容にもよりますが、
digififanさんのコンフィグなら5分もかかりません。3分ちょ
っとくらいかな。私が作っているものは、内容にもよりますが
30分もかかりません。
inthedark
inthedark さん、勝手にこちらにお呼びしてしまって恐縮です。
情報ありがとうございました。参考になりました。
自力でも調べないといけないなと考え、ググってみました。
ここが参考になりました。
http://blog.kmckk.com/tag/buildroot" target="_blank">http://blog.kmckk.com/tag/buildroot
ビルドが必要など、かなり大変そうですね。
更に質問は二つあります。
いわゆるライブラリ管理機能はないのですよね。
digififanさんのコンフィグというのはどこかに公開されているのでしょうか。
しかし、donuts.shop73さんは何故使っていないのですかね。
やはり面倒なのでしょうか。
yoさん
このスレとは直接関係ございませんので恐縮ですが、簡単に。
ライブラリ管理機能というか、例えば、mpdをルートファイルシステムに組み込みたいと思ったら、関連ライブラリをすべて取って来てコンパイルしてくれる、それがbuildrootです。管理機能
があるといっていいでしょう。
digififanさんは近々公開といっておられるので現時点では
まだでしょう。アナウンスしてくださると思います。
donuts.shop73さんは、自分で関連ライブラリも含めてビルド
することがおできになる方だと推察します。
クロスビルドの環境もclosstool-ngなんかを自由に使いこなせ
るんだと思います。こういう方はbuildrootなんて必要ありませ
んね。
僕のあこがれの師匠のお一人(僕が勝手にそう思っているだけ)
です。
inthedark
inthedark さん、丁寧な解説ありがとうございました。
> 例えば、mpdをルートファイルシステムに組み込みたいと思ったら、関連ライブラリをすべて取って来てコンパイルしてくれる、それがbuildrootです。
なるほど。それが、lightmpdのlibasoundのレベルが arch linux 最新版より古くなっていた理由でしたか。デジファイのおとさんのbuildrootは一昨年の版のようですから。どんどん謎が解けていきますね。
クロスビルド環境は難しいですね。僕はそんな腕はないので、BBB版の arch linux でbuildrootトライしてみようかなと思っています。カーネルのビルドはVmwarePlayer仮想環境のクロスビルドで問題はないので。
yoさん。syssetup.scmをいじるよりS00setupvarの中身を見れば済んだことのようです。話の本筋とずれてるかもしれませんが、そのへん一度まとめて書かせてください。
lightmpdのブート後の動作については、普通に考えると、
/etc/init.d/S+数字+..
というファイルを順番に起動するのだと思います。
なので、新たにS+数字+..のファイルをつくって、その中でSDカードをマウントして、データのコピー+実行をするコマンドを書けばGaucheは関係なしにある程度の操作はできそうです(S00setupvarの中身のSDマウント方法を真似できるかと)。
てっとり早いのは、S00setupvarを改造してコマンドを加えればSDの中身をコピーできそうです(実際、S00setupvarではGaucheのスクリプトをコピーしてるので、真似するだけです)。たとえばSDに、スクリプトの入ったextraと言うディレクトリを作っておいて、S00setupvarの「sh $SETUP」の行のあたりに、
cp -r /mnt/lightMPD/extra /var/lightMPD/bin/; dos2unix /var/lightMPD/bin/extra/myscript.sh; sh /var/lightMPD/bin/extra/myscript.sh
(あるいは cp -r $SRCDIR/extra $LMPDBIN/; dos2unix $LMPDBIN/extra/myscript.sh; sh $LMPDBIN/extra/myscript.sh)
とすれば、S00の時点でmyscriptが実行されると思います(起動タイミングがどこが良いか、というのはありますが)。このへんは、とりあえず普通のシュル・スクリプトで完結するんでしょうか。
yoさんに試していただいた様に、/var/lightMPD/以下には少なくとも書き込める様です。ただし、ディレクトリによってはリード・オンリーでコピー不能かもしれず、大きな変更のためには結局initrdの中身をいじる必要があるのかもしれません。SDはfat形式なのでパーミッションの問題もあって、状況によりchmodするとかtarで固めるとかも必要です。