ECS LIVAを操作するWebリモコンを作ってみた

作成日2014年8月28日


さて、 前回の更新から既に2ヶ月以上経ってしまいました。

いつものパターンだと、新しいハードに手を出してハマっているパターンですが、そうでも無いです。

知らない間にRaspberry Piも新型が出たりしてました。
USBコントローラが今までとは違う物になり、LANとのハード共用も無くなったらしいです。更に4portと倍増してます!
まさにPi最大の問題に手を入れられた可能性があります。

...これが3ヶ月前の事なら、すぐに飛びついたことでしょう。

でも...。現時点ではRaspberryPiをカリカリにいじって無理やり音を出す事を繰り返す気分にはなれません。
気力の問題だけですが...。

もちろん、livaがそこそこ安定していると言うのが一番の理由です。

とは言え、この2ヶ月でハード的な改造も多少は行っています。

(1)ちょっと変わった方法で20mmファンを追加しました。LIVAには直接は風を当てません。でも効果抜群でした。
(2)持ち運び時にかさばるので、LIVAとCONCEROを横に並べる形に変更しています。
(3)ルータのON/OFFスイッチを付けた。モバイルルータが起動に失敗する事があるので...。

(3)についてはWN-TR2の性能的な問題っぽい。Raspberry Piの頃から3個体程使ってますが、全部同じ現象が起きるので..。
この問題以外、サイズと消費電力のポイントで他に代替できる機種が無く、許容するしかないと思ってます。

そして、タイトルにもある様にWebでコントロールするリモコンづくりに没頭していました。

そんな訳で今回はソフトの話です。

なんでそんなことになったかと言うと、そもそもはlivaの温度変化を記録したかった事に端を発しています。
livaを持ち運び用のケースに入れ、更に平置きすると結構熱くなってしまいました。80度近くまで行きます。
具体的にどの程度の時間でどの程度熱くなるのか?SoCとしては105度までOKらしいけど...と言う疑問から...

1.livaのSoC(CPU)温度を一定間隔で記録してみる。これは簡単にできるけど。
2.数値だけじゃなぁ...グラフ化してみたいかも...livaはheadlessだけどどうやって見る?..。
3.手っ取り早くWebブラウザから見られる様にしてみるか...Webサーバ要るじゃん。
4.なんとかなった....ついでに電源offとか出来る様にしてみよう...cgiが必要か...。
5.あれ?ここまで作ったんだったら、簡単にリモコンにできるじゃん。
6.mpcのコントロール系は大体できたけど...そもそもmpdのplaylist方式ってあんまり好きじゃないかも...
7.アルバムアートって大事だよね。だけど動画から切り出すのって面倒だしなぁ...

今ここ。ってな感じです。この過程で20mmファンの追加とかしてました。

Webでコントロールする事にしようってのは、なんとなくvolumioなどの開発経緯と同じ様な流れを踏んでいる様な気もしないでもないですが...

まぁ、残念な事に私の場合、volumioみたいな凄いWebインターフェースなんて作る知識はキッパリありません。
今まさにご覧になっているこのページの様なレトロなhtmlページを手書きする程度のものです。

毎度の事ですがあくまでも私の「日記」にすぎません。その点、ご容赦ください。

まずは歴史から。

ancient

割と早い段階のスクリーンショットが残ってました。画面の日付から6月29日だったらしい。
最初はこんな感じでした。もうすでにリモコン機能が入っているので本当の最初のバージョンじゃないですが。
温度変化をプロットした画面にオマケで再生/停止程度のコントローラがついてる感じです。




その後、スマホでコントロールしやすいようにと...

ancient

こんな画面を作って見ました。7月1日時点の画面。

CSS3ってなんですか?という所から始まってますので、CSS3の習作みたいなもんです。

いつの間にかhtmlも色々と進化してる事に驚きつつ、その崖っぷちになんとか手を伸ばそうとあがいてます。

まだまだスカスカな画面です。画面が余ったので余計なロゴまで入れてます。

この時点では、この程度の機能があれば充分だろう...これで完成。おしまい。



の、つもりだったはずなのですが...一度始めちゃうとなかなか止まりません。


一番気になっていたのは、そもそものmpdのスタイルであるplaylist方式です。
曲を聴く際には、一旦playlistを作り、それを選択しなくてはならないと言うステップがあまり好きではなかったのです。

階層化されたフォルダリストから聴きたい曲を選択し、即再生したい。
そういうコンセプトで構成してみました。

そして、紆余曲折あり、それなりの実装を施した結果が...

Main controler
v2main
Main画面

こんな感じです。結構無駄な機能いっぱい付けました。
Monモニター画面へ遷移
Cue再生中の曲を最初から再生しなおし
Coda再生中の曲のラスト5%へジャンプ
Gain Controlデバイス毎にプリセットされた音量へ変更
Offシャットダウン
液晶っぽい画面液晶っぽい内容を表示
Seek bar現在の曲の再生位置(%)を表示するとともに、スライダーでseek可能
その下各種ステータス表示
Volume bar現在のvolume値を表示するとともに、スライダーでvolume調整可能。誤爆注意
Prev/Next前/次の曲へジャンプ
GetArtファイルに埋め込まれたartを抽出
FolderFolder選択画面へ遷移
画像アルバム内の曲選択へ遷移

あとは、10秒前/後へjumpとか、アルバム単位、アーティスト単位でjump、音量調整(2step)&微調整(1step)とか

中央のHi-Resロゴが張り付いてるボタンはSYNC(同期)ボタンです。
ちなみにDSDを再生してればDSDロゴになりますし、ただのwavならpcmロゴとかです。

何に使うものかと言うと、まさにLIVAとリモコンを同期する時に使います。
実はこのリモコン、リアルタイムに残量表示、画面表示していますが、LIVAとは独立して動いています。
LIVAと通信するのはユーザがボタンを押した時と、次の曲へ移った(と計算された)時だけです。

ザックリ言うとクライアントからのリクエスト時にhtml内に曲の残時間を埋めて返し、クライアント側には独自で管理させます。
クライアント側でタイマーがゼロになったら、再度クライアントからリクエストを飛ばす仕組みです。

SYNCボタンはその同期が外れた場合に使用します。
同期が外れるのは、複数のリモコンから操作してるとか、別のssh画面とかからlivaの状態を変化させちゃった場合などです。
またAndroidなどのWebブラウザは、省電力の為でしょうけど画面が消えたりするとタイマーも停止しちゃいます。
ただ、この場合は画面復帰後に既にタイマー時間を過ぎていれば、勝手にリクエストするので問題ありません。

本当の意味でリアルタイムにすることも出来なくはないですが、可能な限りmpd以外の外部負荷変動は避けたいです。
外乱の発生はユーザが操作した時と、画面全更新が必要の場合に限りたい。
...未だにRaspberryPiの呪縛が解けてないのかもしれません。

もちろん使用するWebサーバも極力軽いものを使いたい。
Apacheは論外としても、nginxやlighttpdでは過剰な機能が多すぎる。
しかし逆にdarkhttpなどではそもそもCGIが使えないので意味がない。

lighttpdあたりで妥協しようかとも思いましたが...

-下に続く-
Folder selector - Song select -
v2main
Main画面のアルバムアートをクリックすると、フォルダ/ファイルセレクタに遷移し、再生中のアルバムの曲選択ができます。

この画面にあるデータベースアップデートボタンによりDBの更新が可能です。



- 続き -
最終的にmattowsと言うWebサーバを使ってみました。

このサーバ、驚くべき事にたった800行のC言語で記述されている上に、CGIまで処理可能なのです。
バイナリのサイズもdarkhttpdの半分以下、たった15KBの実行ファイル1つのみです。

ちょっとした評価用に作られたものの様ですが、組み込み用途などにも使ってる人も居るみたいです。
まぁ、index.htmlをデフォルトで読んでくれない(1行改造すりゃOK)とか、
CGIは使えるけどPOSTが使えない(GETで頑張る!)とか...フルスペックって訳には行きませんけどね。
セキュリティ的な面ではInternetに公開する様なWebサーバとして使うのは無謀な気はします。
なにしろ、cgiから特権コマンドだろうとなんだろうと無制限に実行できますので....
でもクローズドなネットワーク上でのみ使うのであれば、各種制限一切気にせずcgiが書けるのは物凄く楽です。
Folder selector - Album select -
v2main
Folder選択画面

再生中のアーティストフォルダが表示されます。

TOPボタンで最上位階層(アーティスト選択画面)へ移動します。
Album art selector - browse view -
v2main
アルバムアート選択画面。

mp4動画の場合、動画の中の1フレームをアルバムアートにすることが可能です。

まずは曲を2%刻みで50枚切り出し。画像を選べば即アルバムアートとして採用します。
もっと細かく選びたければ、画像下のボタンを押下すると秒単位での切り出しモードへ遷移します。


この機能あたりから、もはやmusic playerとしての機能と言うよりは、完全に趣味のソフト開発になってるかも。

余談ですが、ipod touchがretina displayになったとき、結構頑張ってMusic videoやライブ映像などをリッピングしてました。

ところが、リッピングしてみたものの、移動中に動画を見るというスタイルは私にとっては「無し」だったのです....。
でもmpdでは動画だろうと区別なく普通に音楽ソースとして再生されますので、とてもうれしい。
反面、アルバムアートはとても重要と思っています。基本的にはCDジャケット写真で良いのですが、映像があるならそれを利用するのもいいかと。
Album art selector - seconds view -
v2main
一秒単位での選択画面です。

気に入った画像があれば選択。
もっと細かく選びたければ、画像下のボタンを押下すると更にフレーム単位での選択画面へ遷移。

Album art selector - frame view -
v2main
最終的なフレーム単位での画像選択画面です。


その気になればファイル内のすべてのフレームを見る事ができます。
ひたすらNextボタンを押すことになりますが...。
全フレームの中から好きな画像を選べます。


ここまでやるなら、動画を再生しちゃえば良い気もします。
が、それをやるにはストリーミングできるWebサーバとか必要です。
それはさすがに本質を逸脱しまくりな気がしたので却下です。

Monitor screen
v2main
モニター画面です。

SoC温度の変化グラフと各種ログ情報がさっくり出せる様になってます。

下の液晶っぽい画面に各種ログを表示します。上下左右にスクロールするウィンドウになってます。

Temperature log screen
v2main
過去の9回分(起動毎)の温度ログを見ることができます。

リモコン開発のきっかけとなった機能ですが、このフォーマットに統合してしまいました。

Psuedo terminal screen
v2main
簡易ターミナル画面です。

いや、sshで直接接続すりゃいいので、オマケのオマケで作って見ました。
Shutdown/Reboot confirmation
v2main
ほとんどの画面についてるOffボタンを押すと、reboot/shutdownが選べます。

いきなり電源断は危険なので、誤爆防止の目的でもあります。


playlist方式を否定している様に見えちゃいますが、実はこのリモコン、mpdのplaylistを利用して動作してます。
Webリモコンでは「全ての曲」を1つのplaylistとしてmpdに登録し、そのデータベースを基にコントロールしています。

5000曲とか登録したら最初の一回は数分掛かりますが、その後の曲追加は一瞬なので問題ないかと。


まぁ...問題なのは、汎用性が無いって事です。。。
環境依存だらけ(つまり私のLIVAでしか使えない)です。なので「日記」にしかならないのです。



戻る

inserted by FC2 system