Top / EBUG勉強会 / 20181117_mp3jukebox

mp3jukebox

EBUG 第67回会合
2018年11月17日、新潟市万代市民会館
川俣吉広、kaw@on.rim.or.jp

mp3jukeboxとは

2005年に作ったこんなの → ネットワーク対応MP3ジュークボックス

  • 古いPCの再利用
  • 流しっぱなし想定の用途
    • 起動すると自動再生
    • ループ再生 → エンドレス
  • ネットワーク対応
    • リモートのMP3ファイル再生
    • リモートからの制御可
  • ファイルによるAPI
制御
ctrlディレクトリに特定の名前でファイルを作成すると実行を制御できる(中身は見ない。空ファイルでOK)。
例: stopというファイルを作ると再生中の曲を中断して次の曲に行く。
コマンド: rescan, clean, usecache, checkcache, pause, exit, restart, reboot, halt, mute, loud, stop
監視
ファイルの有無、若しくはその内容を見ることで各種ステータスを取得できる。
ステータス: reverse, playing, playing/contents, playing/endstatus, playing/started
  • UI
    特になし。コマンドラインで直接ファイル操作をしてもよいし、GUIの上物を被せるのもあり
    • NFSやsshfs、SMBなどでマウントすれば、即ネットワーク対応に
    • 適当なFTPクライアント, Web (CGIなど), mail ...
    • サンプル: filegui.tcl

実装

fileplayer.sh
メインスクリプト
  • プレイリストによる演奏の制御
    • spool0に入っている曲を順次mpg123を呼び出して再生。終ったものをspool1に移動
    • spool0が空になったら、逆向き(spool1→spool0)に再生
    • 以下繰返し...
    • oneshotディレクトリにファイルがあったら、プレイリストに割り込んで演奏する
  • ctrl以下の制御ファイルの監視(同期的)
    • ファイルが存在したら、該当する動作を実行
  • ネットワーク経由のアクセス
    • ファイルが.urlの拡張子の場合は記述されているURLにアクセスし、ファイルを取得しつつ演奏
    • アクセスしたファイルはキャッシュに残す
    • 再生時、キャッシュにファイルがあればそちらを使用
mpg123
コマンドラインで使用できるMP3プレーヤ、曲の演奏に使用。
OpenBSDのports/packagesから導入したものは、sndioオーディオサーバに対応している。
ftp(1)
OpenBSDネイティブのFTPクライアント。実際にはFTP, HTTP, HTTPSに対応。FreeBSDのftpとfetchを足したような感じ。
ネットワーク経由でのMP3ファイル取得時に使用。
filefwatch.c
ファイルやディレクトリの変化を監視するコマンド。このmp3jukebox用にC言語で作成した。構文は、

fwatch file-or-directory command

kqueue(2), kevent(2)システムコールを用いてファイル又はディレクトリを監視し、内容が変更されたら指定されたコマンドを呼び出す。
fileasyncevent.sh
fwatchから呼び出されるスクリプト
fwatchは起動するコマンドに対しては、変化があったファイル、又はディレクトリの名前を知らせるだけで、変化の内容は伝えない。
asyncevent.shは、変化の内容(ctrlディレクトリ下で、どのようなファイルが作成or消去されたか)を調べ、対応する動作を行う。

パッケージング

紹介記事にあるように、OpenBSD全部入りでインストールする。配布サイトは、以下のようになっている。

Index of /kawhc/dl/pub/OpenBSD/jukebox
      Name                    Last modified       Size  Description
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[DIR] Parent Directory        16-Apr-2017 13:58      -
[   ] base37.tgz              08-Aug-2005 22:36  15.2M  OpenBSD 3.7のベースシステム(から余分なもの
                                                        を取り除いたもの)
[   ] bsd                     27-Jun-2005 13:40   4.9M  カーネル
[   ] floppy37.fs             14-Aug-2009 14:15   1.4M  インストーラ
[   ] floppyB37.fs            14-Aug-2009 14:15   1.4M      〃
[   ] floppyC37.fs            14-Aug-2009 14:15   1.4M      〃
[TXT] index.txt               14-Aug-2009 14:16     1k  ファイル一覧(HTTP用)
[   ] site37.tgz              08-Aug-2005 22:36   2.8M  mp3jukeboxに固有な部分(ユーザアカウント、
                                                        起動スクリプト、プログラム本体、
                                                        デモ音源など)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Apache/1.3.29 Server at fuguita.org Port 80

OpenBSDのインストーラは、正規の配布パッケージ以外に、siteXX.tgz (XXはリリース番号)というファイルがあるとユーザが作成したファイルセットとして認識され、追加でインストールされる。

OSのインストール後システムを再起動すると、ブート完了後バックグラウンドでデモ音源の再生が始まり、ターンキーシステムとして使用できるようになっている。

Future Work (もしやるとしたら)

  • MP3以外の音声フォーマット対応
  • 同期コマンド(曲間で動作するコマンド)の非同期化
  • sndioフレームワークを利用して、音声出力もネットワーク対応にする
  • サンプルUIの提供
  • etc...

Top / EBUG勉強会 / 20181117_mp3jukebox

Attach file: fileplayer.sh 24 download [Information] filefwatch.c 26 download [Information] fileasyncevent.sh 22 download [Information] filegui.tcl 24 download [Information]
Reload  New Edit Freeze Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS
Last-modified: 2018-11-16 (Fri) 06:54:30 (25d)