なんとなく

誰得感満載な記事が多いかも。Mono関係とLinuxのサーバ関係、レビューとか。

#RaspberryPi でDSDを配信できるminidlnaを作ってみた。

ムシャクシャしてやった、後悔はしていない

rockdisknextがminidlnaでDSDを配信できるようにしていたので、購入して、ソースを開示請求して他のハードでも使えるようにしようと思っていたのだけれど、ちょうど消費税増税も重なって、在庫切れになっていた。

今までは、dsfファイルの拡張子をwavに変えてDLNAサーバに解釈させて、クライアント側でDSDとして再生させていた。あたりまえだけどダグでの管理ができないので、ファイル名だけで区別していた。

音源が多くなって、区別がつかないのも出てきたし、dsfファイルをコピーしてwavにするので容量が倍になり、HDDの容量を食ってきていたので、むしゃくしゃして、5月のGWを過ぎた頃からminidlnaでdsf対応を始めた。
自分で使う程度の質であれば、dsfについてはすぐに対応できた。せっかく作るんだったら、他の人も使えるものをと思ってdffにも対応することにした。後悔はしていない。

Raspberry Pi Type B 512MB

仕様(Feature)

仕様については、簡単にいうとminidlnaにdsfのタグを管理できるようにし、DSDを配信できるものをようにしてみた。

拡張子.dsf と .dffのファイルをMIMEのContent-typeをaudio/x-dsdとして配信する

  • dsf
    • id3tag support
  • dff
    • id3tag Notsupport(DSDIFFの仕様には沿わないがファイルの最後にあるID3chunkであれば、すぐに対応可能。要望があればというレベル。ただ、先頭にあるものについては対応する予定はない。)
    • DIAR(artist) support
    • DITI(title) support
    • dst support(テスト時に仕様書通りにファイルを作って検証したが、ファイルが手に入らなかったので正式なものでは未検証)

詳しくはソースをみてほしい。

検証サーバ

サーバサイドの検証として、以下のアーキテクチャで動作を確認した(一般的なアーキテクチャではないがたぶん一般的なものでも動く)。

検証クライアント

DLNAクライアントとしては、以下のもので行った。

  • STR-DN2030
  • UPnPlay(Android)
    • 曲の時間
    • ビットレート(minidlnaでの表示がおかしいようだ。)
    • サンプリングレート

f:id:takeshich:20140604182935p:plain

実装のため参考にしたもの

どちらもPDF。

検証のお願い

DLNAクライアント機能を持つDSD対応のAV機器での検証は、当方がSTR-DN2030しか所持していないので、STR-DN2030のみの検証となっている。
他のDLNAクライアント機能を持つDSD対応のAV機器では確認できていないので、機材を持っている方は検証していただきコメントを頂きたい。
(後述するソースからのコンパイルかRaspberryPi向けにはdebがあるのでそちらを使っていただきたい。)

  • OPPO
    • BDP-103JP
    • BDP-103DJP
    • BDP-105JP
    • BDP-105DJP
  • Pioneer
    • SC-LX57
    • SC-LX77
    • SC-LX87

上述した機器をお持ちの方はぜひ試していただきたい。
もしかするとクライアントごとにmimeのContent-Typeをaudio/x-dsfやaudio/x-dff変える必要があるかもしれないからだ。
実はクライアント側の仕様がわかっていない。。。AV機器は高くて個人レベルでは複数揃えることは無理。。。
わかっているのはSTR-DN2030についてはContent-Typeをaudio/x-dsdで配信してあげれば、DSDとして認識してくれるということだけだ。

ソース

http://sourceforge.net/u/takeshich/minidlna/ci/AddSupport4DSD/tree/

においた。
これは、sourceforgeのmasterに今回の対応を当てたもので、後述するRaspberryPi用のdebを作成したソースとは異なるので注意。

コンパイル

debianでのコンパイル手順について記述する。minidlnaがパッケージで入っていないという前提にしている。すでに入っている場合は、予め/etc/minidlna.confのバックアップを取って、minidlnaをpurgeしておいてください。

まず、必要なライブラリなどについてインストール

$ sudo apt-get install autoconf
$ sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libflac-dev libvorbis-dev libexif-dev libjpeg-dev libsqlite3-dev libid3tag0-dev libogg-dev

ソースの取得

$ wget http://sourceforge.net/code-snapshots/git/u/u/u/takeshich/minidlna.git/u-takeshich-minidlna-7c0d58a0da44fcf98bd8d1acb7ecef1def295bbc.zip -O minidlna.zip


展開とコンパイル・インストール

$ unzip minidlna.zip
$ cd u-takeshich-minidlna-7c0d58a0da44fcf98bd8d1acb7ecef1def295bbc
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

起動スクリプトを設定

$ sudo cp linux/minidlna.init.d.script /etc/init.d/minidlna
$ sudo chmod a+x /etc/init.d/minidlna
$ sudo update-rc.d minidlna defaults

設定ファイル

$ sudo cp ./minidlna.conf /etc/
$ sudo vi /etc/minidlna.conf

音楽ソースのありかを指定する。

起動

$ sudo /etc/init.d/minidlna start

RaspberryPi向けにdebも作ってみた

minidlna1.1.2において、

  • アイコンをRaspberryPiに
  • DSD配信

に対応させたものを作成した。

ソースは以下のもの
https://gitorious.org/debian-pkg/takeshichs-minidlna/source/58d965ee034514bd61c4f4850cb7cd7cbffeda9e:
ソースを1元管理したいので、どうにかしたい。
https://www.dvgtu.org/attachments/212/minidlna_1.1.2+nora-1.debian.tar.gz
md5sum: 0f5ef7cdc1d18bcd8c9df9200e6f3a3b
https://www.dvgtu.org/attachments/213/minidlna_1.1.2+nora-1.dsc
md5sum: 248d2885883e33f25d5778d763a8240e
https://www.dvgtu.org/attachments/214/minidlna_1.1.2+nora.orig.tar.xz
md5sum: 3d364a502fdd6c60a9b7af38b1d83f9a

f:id:takeshich:20140604182600p:plain

debのありか

ここからダウンロードしてください。
https://www.dvgtu.org/attachments/209/minidlna_1.1.2+nora-1_armhf.deb
md5sum: 71b400859e6c48c2ef6bf505defa264f

インストール

もし、すでにminidlnaを導入済みなら、予め/etc/minidlna.confのバックアップを取って、minidlnaをpurgeしておいてください。

$ sudo dpkg -i minidlna_1.1.2+nora-1_armhf.deb
注意点

localeのバグが有るみたいで、LANG=ja_JP.UTF-8だと初期のDB作成時に本来日本語になるべき文字列が????となってしまう。
なお、タグは化けない。
回避方法としては、インストール後、曲ソースの在処を/etc/minidlna.confで指定し、LANGの設定をクリアし、再起動する。

$ echo $LANG

とした際に

ja_JP.UTF-8

と出る場合は、対応が必要。

$ sudo vi /etc/minidlna.conf

で音源ソースのありかを指定したら、

$ export LANG=C

とし、クリアしてください。
それから

$ sudo /etc/init.d/minidlna restart
$ export LANG=ja_JP.UTF-8

としてください。

dbの再作成をする際にも必要です。

あと、テストはしていますが、利用に際しデータ消失などの障害が発生しても、当方では保証いたしかねることをあらかじめご了承ください。

本家へのrequest mergeについて

本家へマージのリクエストをするつもりだけど、まだ確認が足りないと思っていて、DLNAクライアント機能を持つDSD対応のAV機器で再生ができるのであれば、するつもりです。
再生ができなくても、対応させて本家へのrequest mergeはするつもりなので協力してくれる方を募集です。いなくても、とりあえずするかも。

まとめ

C言語は大学生の時に授業でやったくらいだからエラー処理とか微妙だったり、モージュール化を全然していなかったりする。。。おかしいところはガンガン指摘してほしい。また、DLNAクライアント機能を持つDSD対応のAV機器での検証とか他のNASへの導入とかしてほしい。
いろいろと検証している最中にminidlnaのバグやSTR-DN2030のプレイヤーのバグらしきものを見つけてしまった。対応しよう。。。