MP3 の入っている USB メモリを刺したときに自動で MP3 を再生するルールを追加してみました。
全ての USB メモリをチェックするためには中身を全部見なければいけないので、"JUKEBOX" のラベルがついた USB が刺された時だけ再生するような条件にしてみました。
マウントやアンマウントするルールの前に次のルールを書きます。
---------------------------ここから---------------------------
# USB Jukebox
KERNEL=="sd?1", ENV{ID_FS_LABEL}=="JUKEBOX", ENV{mount_point}="play_music"
KERNEL=="sd?1", ENV{ID_FS_LABEL}=="JUKEBOX", ACTION=="add", \
SYMLINK+="$env{mount_point}%n", ENV{mount_options}="$env{mount_options},ro"
KERNEL=="sd?1", ENV{ID_FS_LABEL}=="JUKEBOX", ACTION=="remove", \
RUN+="/root/bin/stopplay.sh"
---------------------------ここまで---------------------------
マウントする場所を決めて、追加の場合には、念のため、読み込み専用とします。
アンマウントするときには、はじめに再生を止めて alsaplayer も終了させるシェルスクリプトを実行します。
シェルスクリプトの内容は、次のようにしました。
---------------------------ここから---------------------------
#!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/root/bin
MNTDIR=/media/play_music
if [ -d $MNTDIR ]; then
alsaplayer --stop
alsaplayer --quit
fi
---------------------------ここまで---------------------------
次にマウントするルールの次に以下のルールを追加します。
---------------------------ここから---------------------------
# USB Jukebox post
KERNEL=="sd?1"ACTION=="add", ENV{mount_point}!="", \
ENV{ID_FS_LABEL}=="JUKEBOX", RUN+="/root/bin/autoplay.sh"
---------------------------ここまで---------------------------
マウントした後で再生を開始するシェルスクリプトです。
内容は次のようにしました。
---------------------------ここから---------------------------
#!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/root/bin
MNTDIR=/media/play_music
if [ -d $MNTDIR ]; then
alsaplayer --quit
sleep 5
alsaplayer -i daemon -q > /dev/null 2>&1 &
sleep 5
getmp3dir $MNTDIR | while read dir
do
alsaplayer -e "$MNTDIR/$dir/"*.mp3
done
fi
---------------------------ここまで---------------------------
alsaplayer はディレクトリを指定するとその下を再帰的に検索してくれますが、そうすると再生順がディレクトリのエントリ順となってしまうので、このようになりました。私は、ファイル名の前にトラック番号を付けているのでこれで必ずトラック順になります。getmp3dir コマンドは自作のコマンドです。ソースは
ここに、実行形式は
ここに置いておきます。
ボリュームラベルを "JUKEBOX" にして MP3 を置いた USB を刺すと再生が始まります。再生中に抜いてみましたが問題ないようです。