moOde audio + Raspberry Pi 3

前回のRaspberry Pi Zeroで実行するStreamlink radikoは再生までの待ち時間が20秒とかなり長めになっています。やはりギリギリ我慢できませんでした。以前メインで使っていたRaspberry Pi 3は現在のところ特に決まった用途が無いことからmoOde audioとして運用してみることにしました。

概要

moOde audioは音質の観点からmpd(mpc)によってダイレクト再生をしています。Raspberry Pi + I2Sデバイスにpulseaudioをインストール適切に設定することでLan内のマシンはmoOde audioに接続したアンプ、スピーカーを共有することが可能になります。
moOde audioでpulseaudioをスタート、クライアントのpulseaudioはmoOde audioのIpアドレスに向けることでmoOde audioを利用できます。ここまでは比較的安全に運用できますが問題はmoOde audio内部からmpd以外のプレーヤーから実行した場合pulseaudioをスタートしていないとミキサーの無いI2Sデバイスは100%で出力します。
zeroのサイマルラジオ(simul.py)は必要に応じてpulseaudioをスタート、キルしています。スペック的にmoOdeプレーヤーとサイマルラジオ以外触ることの少なかったzeroに比べてパワーのあるPi3は意図せず動画などの実行をついやらかしてしまうことが想定されます。
画面の構成はプレーヤー、ラジオに特化する方法やPi3の資源を活かしてマルチメディア以外にも活用する方法など考えられますが極力安全に運用できるよう環境を設定、考慮してみたいと思います。

SDカード

現行のmoOde audioのバージョンは6.7.1と変わってないことからZeroのカードをddでカード作成
device名は適宜変更

# dd if=/dev/sdx of=/dev/sdy bs=1M status=progress

書き込んだカードを確認、アンマウントしてfsck

# umount -l /media/*
# fsck -y /dev/sdz1
# fsck -y /dev/sdz2

ディスク領域の拡張
zeroで作成したカードはデフォルトサイズ(3.4G)で90%の使用率になっています。
gpartedで取り敢えず5Gに拡張

カードをセットして起動

作成したカードをPi3にセットして起動、当然ですがzeroと全く同じ状態で立ち上がります。
Streamlink radikoはOS起動直後初回だけ約8秒、以降は約4秒で再生を開始します。

tigervnc-server

tightvncからtigervncに変更 uim-mozc追加

# apt update && apt upgrade
# apt install tigervnc-standalone-server tigervnc-common uim-mozc

vncserverはalternativesによってtigervncがdefaultになります。
~/.vnc/vnc.conf その他~/.vnc/xstartup /etc/init.d/vncbootの変更必要(過去記事参照)

$geometry     = "1805x840";
$depth        = 24;
$desktopName  = "moOde audio";
$localhost    = "no";


mozcはデフォルト無効になっています。
ダイアログから有効(編集ボタンをクリック)

運用方針

概要にある通りマニュアルで活用するためには音楽ファイル、動画ファイル、音を出す(出る)アプリケーションの扱いについては充分留意する必要があります。
1.コマンドラインでは基本音を出すコマンドを実行しない(決めごとです)
テスト目的で実行する際はpulseaudioをスタート、確認の上実行する
2.webブラウザはsurf(moOde player),w3m-img(ranger)のみとする(ほかはインストールしない)
3.ファイルマネージャーはranger一択とする

ファイルマネージャー ranger

rangerから安全に実行できるよう~/.config/ranger/pulse-start.pyの作成

#!/usr/bin/python3

import subprocess

subprocess.run("~/bin/killall.sh", shell=True)
command = ("ps ax | grep pulseaudio | grep -v grep | awk '{print substr($6,1)}' | cut -b 3-8")
proc = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
proc = proc.strip()
if proc != "start":
    subprocess.run("sudo runuser -l www-data -c 'pulseaudio --start'", shell=True)

実行権限

$ chmod 755 ~/.config/ranger/pulse-start.py

rangerの関連付け設定ファイルは~/.config/ranger/rifle.conf
Video/Audio関連に作成したpulse-start.pyを付け加えます。(計18箇所)

#--------------------------------------------
# Video/Audio with a GUI
#-------------------------------------------
mime ^video,       has mpv,      X, flag f = ~/.config/ranger/pulse-start.py && mpv -- "$@"


rangerは再立ち上げするといいでしょう。
rangerからVideo/Audioファイルを選択するとpulseaudioをスタートしてPlayします
関連付けは当サイトにあるファイル形式では特に問題ありません(確認必要)


Raspberry pi(vncserver)はOpenGLを有効に出来ないため動画はカクカクします。音楽ファイルはOK
(OrangePi3はvo=x11でも比較的スムーズに再生するのですが)

moOde audio main window


ウインドウは左側から配置され順次押し出されます。modキー(win) + Enterで選択したウインドウと左右入れ替え
modキー + マウス(L)でウインドウをフロート
modキー + マウス(R)でウインドウサイズ変更

フロートしたウインドウがバックグラウンドに隠れたらmodkey + J 連打で前面
modキー + タブをマウスクリック ウインドウ移動

pavucontrolは必ず常時起動しておきます(pulseaudioスタート状態を保持)適当なタブでいいでしょう。または適当なクライアントマシン側でもOK

surfブラウザもOpenGLの関係で重くリソースも消費します。小さいウインドウではCPU使用率も小さくなってモニターとして曲選択、ボリュームコントロール位は問題無いようです。
pi3からアクセス surf localhost
アルバムの選択などはクライアントのsurfブラウザから実行(Pi3のsurfブラウザに反映されます)


今までのzeroはいつでも選手交代可能です。
Pi3にSSD(HDD)を追加NFS or samba設定で自前で音楽ソースを構築することもできますね。
moOde audio(player)以外にもいろいろ遊べると思います。

取り敢えず通常はこんな感じで運用(境界線はもう少し中央寄りでもいいかな)

前回のradiko-streamlink.py(python radiko)も同じようにpulseaudioをスタートするようにしました。

def play():
    subprocess.run("~/bin/killall.sh", shell=True)
    command = ("ps ax | grep pulseaudio | grep -v grep | awk '{print substr($6,1)}' | cut -b 3-8")
    proc = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
    proc = proc.strip()
    if proc != "start":
        subprocess.run("sudo runuser -l www-data -c 'pulseaudio --start'", shell=True)
    time.sleep(1)
    subprocess.run("~/.local/bin/streamlink -p " + player + " http://radiko.jp/#!/live/" + id + " best &", shell=True)