moOde audio 7.0.1 (chromium-browser pulseaudio)

moOde audio 7.0.1に更新(新規インストール)しました。バグ修正のようですが当サイトの環境では特に変わったところは気が付きませんでした。
Raspberry Pi 3はほかの目的に使いたいことからRaspberry Pi 2に変更。WiFi Bluetoothは使っていないためSDカードは全く同じでいけます。Raspberry Pi 2ではStreamlink radikoの再生開始が若干長くなった以外特に違いは無いようです。

chromium-browser

当サイトのmoOde audioは常時稼働、moOde audio7からvnc server上でchromium-browserを起動しています。通常日中は問題ないのですが夜間翌日にはメモリを喰いつぶしています。
system(syslog)が関係していると思いますがcron,swapを有効にして指定時間にchromium-browserを終了するようにしました。
デフォルトではcron,swap共有効になっていません。
0時30分 chromium-browser終了

$ crontab -e
30 00 * * * /bin/killall -q /usr/lib/chromium-browser/chromium-browser-v7

SDカードは7GiBに拡張 デフォルトは100MBですが不足なのでコメントにすることで1.15GB
/etc/dphys-swapfile

#CONF_SWAPSIZE=100

有効にする

# systemctl enable cron dphys-swapfile
# systemctl start cron dphys-swapfile

pulseaudio control (pulse.php)

pulseaudio control(pulse.php)からmpc volumeを変更できるようにしてみました。

見た目は変わりませんがmpdモード時も音量を変更できます。ほかエリアで作業中音量を変更したい時便利です。
mpc volumeは%値になっています。
参考 pulse.php

moOde audioとpulseaudio

moOde audioのmpdとpulseaudioの関係について簡単に整理してみます。
通常moOde audioは使いやすいクライアントのwebブラウザからmoOde playerにアクセスすることになると思います。
moOde audioにpulseaudioを導入、pulseaudioがキルのときデフォルトのmoOde playerは正常動作、pulseaudioをスタートするとmoOde player(mpd)は再生不可になります。
pulseaudioをスタート、キルするためには誰かがログインしてスタート、キルを実行しなければいけません。webサーバーの実行ユーザーであるwww-dataに権限を与えることでwebブラウザからpulseaudioをスタート、キルしています。

pulseaudioサーバー(moOde audio)

以前moOde audio 630(PulseAudio)作業時の記録

pulse.phpは操作性などからskyblue cssを利用しています。最初にダウンロード展開、mvして/var/www/htmlとして保存。pulseaudioの設定関連をhtml以下に保存します。
moOde audioにpulseaudioをインストール、/etc/pulse/default.paに自ネットワーク帯とデバイス情報を追記
当サイトのES9023,PCM5102A,TDA1543は下記の設定で動いています。

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24 auth-anonymous=1
set-default-source alsa_output.platform-soc_sound.stereo-fallback.monitor
set-default-sink alsa_output.platform-soc_sound.stereo-fallback

www-dataからpulseaudioをスタートするにはwww-dataのホームディレクトリをhtml以下に作成、設定
www-dataにはsudo権限(visudo)とaudioグループに所属、設定
pulseaudioをwww-dataでスタート

# runuser -l www-data -c "pulseaudio --start"

/var/www/html/www-data/.config/pulseが作成されます。
/var/www/html/www-data/.config/pulse/client.conf作成

autospawn = no
daemon-binary = /bin/true
auto-connect-localhost = yes

www-dataのホームディレクトリ、ファイルのパーミッションを揃えておきます。(確認)
基本www-dataから~/.config/pulseを読み書きできるようにします。

-rw-r--r-- 1 www-data www-data    70  1月 11 16:49 client.conf

以前はdefault.paを作成していましたがclient.confのみでOK
/var/www/html/killall.sh (pulse.php用のkillall.shを作成設定 chmod 755 killall.sh)

#!/bin/sh
sudo killall -q mplayer
sudo killall -q mpv
sudo killall -q ffplay
mpc stop > /dev/null 2>&1

pulseaudioクライアント

クライアントのraspberry pi4にclient.confを設定
~/.config/pulse/client.conf (default-serverはmoOde audioのIPアドレス)

autospawn = no
daemon-binary = /bin/true
default-server = 192.168.0.113

クライアントはpulseaudioがインストールされているならclient.confの設定のみでOK
pulse.php実行(サイズ、位置はdevilspie2で設定しておくといいでしょう)

surf moode/html/pulse.php &

moOde playerはクライアントのwebブラウザからアクセスします。
pulseaudio(pulse.php)のみを導入した環境(vnc serverなし)のpulseaudio再生はクライアント側でアプリケーションを実行、再生します。
moOde audio内部からは基本pulseaudio再生をしないのでpulseaudioの設定が正しければ安全に運用することが出来ます。

pulseaudioクライアント(moOde audio user)

moOde audioのユーザー(pi)からpulseaudio再生をする場合は~/.config/pulse/client.confのdefault-serverをローカルホスト(127.0.0.1)に向けます。

autospawn = no
daemon-binary = /bin/true
default-server = 127.0.0.1

simul.pyやstreamlink radikoのpython3-tkはX環境(vnc server)が必要です。
サイマルラジオをmoOde playerに登録することでsimul.pyからは音量コントロールを含めて連携することが出来ます。
またsimul.pyやstreamlink radikoを正しく設定することでpulseaudioを自動でスタート、キルします。
動画はvnc server(moOde audio)では無理そうなのでPi4で再生、音声をmoOde audioのpulseaudioで再生します。

外部のクライアントマシンは物理的なaudio deviceが無いSBCからもネットワーク経由のpulseaudio音声出力が可能です。(当サイトのSBCで確認、多分pcmをサポート)
moOde playerが必要なければRaspberryPiOSなどでもpulseaudioサーバーを構築できます。(pulse.phpはwebサーバー、phpが必要)
Lan内にサブのシステムとして設置しても有効と思います。
やはりradikoは前回の記事の時点(ジャストタイミング)でflashサポートを停止したようですね。

moOde audio 7.0.0 リストアイコン

前回の宿題です。 moOde audio(700)のファイルをつらつら眺めていたら/var/local/www/imagesw/radio-logos/thumbs以下にリスト用の画像ファイルがありました。 7.0.0では新規登録時アップした画像を元にラジオメニューの200×200サイズとリスト用80×80の画像ファイルを作成するようです。

リスト用画像ファイルの作成

正規のインポート作業では作成してくれるのでしょうか? 取り敢えずデータベースは更新できているのでこのまま手作業で進めて行くことにします。

 

かつしかFM.jpgに対してかつしかFM_sm.jpg(80×80)を作成します。
6.7.1からエクスポートしたファイルからサイマルラジオの画像ファイルをディレクトリに纏めてあります。
imagemagick(convert)で200×200サイズから80×80の画像ファイル作成

# apt install imagemagick

var/local/www/imagesw/simul-logos/thumbs
ディレクトリの作成

$ mkdir sm

スクリプト作成
sm.sh

#!/bin/sh
for i in *.jpg ; do convert -geometry 80x80 "$i" "./sm/$i" ; done

スクリプト実行

sh sm.sh

ディレクトリsm以下に同じファイル名で80×80の画像ファイルが作成されます
var/local/www/imagesw/simul-logos/thumbs/sm
Station name.jpgをStation name_sm.jpgに一括変換するためにrenameコマンド実行
renameコマンドをインストール

# apt install rename

rename実行(sedで置き換えして一括変換)

$ rename 's/.jpg/_sm.jpg/' *jpg

登録したラジオ局は210局ほどありました。

$ ls -1 | wc -l
211

出来たファイルをPi3の/var/local/www/imagesw/radio-logos/thumbs/へコピー

# cp sm/* /var/local/www/imagesw/radio-logos/thumbs/

う〜ん スッキリしました。

 

 

moOde audio 7.0.0 + Raspberry Pi 3B

moOde audio 7.0.0がリリースされています。

Raspberry Pi 3Bに新規インストールしてみました。
記事は当サイト設定のmoOde audio(671)が正常に稼働しているものとします。

moOde audio 7.0.0

moOde audio 7.0.0をダウンロード、カードを作成
非力なzeroでは不要なアプリケーションをできるだけ削除していたのですがPi3Bに代えたことでそのままとしてカードを取り敢えず5GiBに拡張
Pi3B + moOde audio(671)は特に問題無く動いているので作成したカードを現稼働中のmoOde audio(671)にマウントして必要なデータ、設定をコピー
パスワード関連をコピーすることで作成した/var/www/htmlはそのまま活きてきます
moode-r700-config.txt 作成したカードの最上位(/ ルートディレクトリ)に入れておきます

#!/bin/sh
cp /etc/passwd ./etc
cp /etc/shadow ./etc
cp /etc/group ./etc
cp /etc/gshadow ./etc
cp /etc/sudoers ./etc

cp -Rp /var/www/html ./var/www
cp /etc/dhcpcd.conf ./etc
cp /etc/init.d/vncboot ./etc/init.d
cp /usr/local/bin/dwm ./usr/local/bin
cp -r /etc/fonts ./etc

cp -rp /home/pi ./home

moOde audio(671)にマウント(/mediaにマウントしたとして)rootで実行

# cd /media
# sh moode-r700-config.txt

moOde audio 7.0.0起動

$ ssh pi@moode


起動しました。


クライアントのwebブラウザからも見えています
Audio Deviceを設定、再起動することでラジオなど再生可能になります

vncserver simul-radio streamlink-radiko

ここから独自の実装をインストール、設定をします
user pi : network 192.168.0.0/24 : I2S device 汎用(Generic) 適宜変更
moode-r700-setup.txt

#!/bin/sh

# ssh pi@moode
# password: moodeaudio

echo "--- Timezone locale ---"
timedatectl set-timezone Asia/Tokyo
sed -i 5a"ja_JP.UTF-8 UTF-8" /etc/locale.gen && locale-gen
update-locale LANG=ja_JP.UTF-8

echo "--- update ---"
apt update

apt -y install tcsh lv vim
apt -y install tigervnc-standalone-server tigervnc-common xbindkeys
apt -y install ranger highlight ffmpegthumbnailer surf python3-tk
apt -y install pulseaudio pavucontrol ncmpcpp
apt -y install mpv mplayer
runuser -l pi -c pip3 install --upgrade --user streamlink
apt -y remove youtube-dl
curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
chmod a+rx /usr/local/bin/youtube-dl

echo "--- jp ---"
apt install -y fonts-ipafont fonts-ricty-diminished
apt install -y uim uim-anthy uim-mozc uim-xim uim-gtk2.0

echo "--- themes ---"
apt install lxappearance gnome-accessibility-themes

echo "--- pulseaudio /etc/pulse/default.pa ---"
sed -i -e '$a load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24 auth-anonymous=1' /etc/pulse/default.pa
sed -i -e '$a set-default-source alsa_output.platform-soc_sound.stereo-fallback.monitor' /etc/pulse/default.pa
sed -i -e '$a set-default-sink alsa_output.platform-soc_sound.stereo-fallback' /etc/pulse/default.pa

echo "--- systemctl ---"
systemctl enable vncboot

echo "--- autoremove ---"
apt -y autoremove

sh -c 'echo -n "Hit Enter key to reboot..."; read x'
reboot

同様に予め作成(/ ルートディレクトリ)に保存

# sh moode-r700-setup.txt

再起動後クライアントのPi4から接続(Pi3のvnc passwdは~/.vnc/vncにコピー、リネーム)

$ vncviewer -passwd /home/pi/.vnc/vnc moode:1 &

surfブラウザではアニメーション画像を使っているせいかロードアベレージがかなり高くなってしまいます。
moOde audioデフォルトのchromium-browserは初めてですが思っていたよりかなり軽快に動作します。
気になっていたブラウザ経由の音声出力は殺しているようで問題無く使用できそうです。

サイマルラジオ


さて肝心のサイマルラジオのmoOde audioへの登録ですが新規に1局登録してみたのですが正常にできました。
Station name,Url,Logo画像を登録
以前手作業で復活したラジオデータの方法でインポートしたところsqlite3で見事にエラーになってしまいました。

671と比べると700ではデータ形式が変更になっているようです。
moOde audio(671) 501,http://mtist.as.smartstream.ne.jp/30031/livestream/playlist.m3u8,”かつしかFM”,u,local,””,””,””,””,””,””,””
moOde audio(700) 501,http://mtist.as.smartstream.ne.jp/30031/livestream/playlist.m3u8,”かつしかFM”,r,local,””,””,””,””,””,””,””,No,NULL,NULL
moOde audio(671)からは事前にエクスポートしています。
EXportしたstations,zipを展開 var/local/www/db/cfg_radio.csvから登録したcfg_radio.csv.500を作成
vi editorで置き換え

:%s/u,local,"","","","","","",""/r,local,"","","","","","","",No,NULL,NULL/g

cfg_radio.csv.500をPi3の/var/local/www/dbへコピー、あとは以前の記事の通りエラー無くインポートできました(正式なインポート手順は未確認)
登録したplsファイル、ロゴ画像は手作業でコピーする必要があります。

取り敢えず約200局のデータは復活しましたが新機能リストの小さいアイコンだけは適用されませんでした。
データベースのどこかに項目があるものと思います。
simul.pyは1局選択、再生をするので取り敢えず気にしないことにします(宿題にしておきます)

通常運用画面はこんな感じにしました。simul.pyとstreamlink radikoはフロート
simulラジオ、radikoは自由に選局可、moOde playerはpulseaudioキルの状態で操作可(mpd errorを返します)

Pi3のmoOde playerは基本モニターとしてアルバムの選択はクライアント(Pi4)のブラウザから実行、選択したアルバムは即Pi3のメインウインドウに反映されます。
Pi4のブラウザはdevilspie2で定位置、サイズ、タイトルバーのみ(shade)で待機しています。

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)

moOde audio streamlink + radiko

前回作成したstreamlink仕様のradiko playerをmoOde audioで試してみました。 取り敢えず動作確認は出来たものの今まで使っていたradikoスクリプトが動かなくなってしまいました!!! 遅かれ早かれ移行することになると思うのでstreamlink仕様にsimul.pyその他関連する箇所を急遽修正してみました。

Warning

現在稼働中のradikoスクリプトの環境にstreamlinkを導入するとradikoスクリプトは動かなくなる可能性があります。 現在の環境を壊したくない場合は導入しないようにして下さい。

auth1_fms

radiko streamlink player確認後、radikoスクリプト実行

$ ./radiko.sh -p FMT
[stop] failed auth1 process (/var/tmp/auth1_fms_11798)

$ ll /var/tmp
-rw-r--r-- 1 pi pi      0 12月  3 17:12 auth1_fms_11798
-rw-r--r-- 1 pi pi 198393  7月 29 16:24 authkey.png
-rw-r--r-- 1 pi pi 685413 10月  7  2016 player.swf

認証に失敗しているようです???

radiko streamlink player

補足
このプログラムは実験、確認用です。
moOde audioでradikoを再生するにはpulse audioを設定、pulse audioをスタートした状態でないと音量100%で出力します。
常用するには適切にpulse audioをコントロールするようプログラムを変更する必要があります。

moOde audioでは環境は整っているのでstreamlinkをインストールするだけでOK

raspberry pi zero + streamlink + ffplay 再生まで20秒弱 ギリギリ我慢できる範囲内です。
Pi4からも再生可なのでいいことにします。

simul.py

プレーヤーはffplay

# default player
#player = "mpv"
player = "'ffplay -nodisp'"

実行はradiko.shからstreamlink(194行目附近)

#subprocess.run(bin_dir + "radiko.sh -p " + proc + " 1>/dev/null 2>/dev/null &", shell=True)
subprocess.run("~/.local/bin/streamlink -p " + player + " http://radiko.jp/#!/live/" + proc + " best &", shell=True)

ON AIR radiko(368行目附近)

# on station radiko
#command = ("ps ax | grep rtmpdump | grep -v grep | awk '{print substr($5,1)}'")
command = ("ps ax | grep radiko.jp | grep -v grep | awk '{print $(NF-1)}' | awk 'NR==1' | cut -c 8-13")

(373行目附近)

#if proc == 'rtmpdump': # Radiko
if proc == 'radiko':

(376行目附近)

#command = ("ps ax | grep rtmpdump | grep -v grep | awk '{print substr($9,1)}' | tr -d /_definst_")
command = ("ps ax | grep radiko.jp | grep -v grep | awk '{print $(NF-1)}' | awk 'NR==1' | cut -c 26-")

参考 simul.py

radiko logo画像

/var/www/html/pulse.php

//$station = shell_exec("ps ax | grep rtmpdump | grep -v grep | awk '{print substr($9,1)}' | tr -d /_definst_");
$station = shell_exec("ps ax | grep radiko.jp | grep -v grep | awk '{print $(NF-1)}' | awk 'NR==1' | cut -c 26-");

参考 pulse.php

Pi zeroでは再生開始が遅いのがネック
再生自体は問題ない
ちょっと予定より早くなってしまいましたが脱Flashできました。

 

Top