Raspberry Pi ZERO PulseAudioサーバーにする(Part2)

今までの100均SPと比較すると1000倍位の改善がありました!?(まあ表現は多少アレですが)

pulseaudio実に快適ですね。
但し現状はZEROにログインしてpulseaudioを起動しなければいけません。

pulseaudioには多くのオプションがあるのですがその分理解できないところも多いですね。
なんとか現状のまま簡単にpulseaudioをスタート、キルする方法はないもんか検討してみました。

そこで前々回導入したRadiko Playerから制御してみようと思います。

pulseaudioを起動するユーザーは基本ログイン可能なユーザーでなければいけません。
ブラウザからZEROにアクセスするユーザーとしてはwww-dataになります。
freedesktop.orgのシステムモードの設定マニュアルを見るとやはりpulseユーザーをログイン可にしているようです。
そこで当サイトではwww-dataからpulseaudioを起動してみることにしました。
www-dataユーザーをログイン可にしてもパスワードを設定する訳ではないので通常はログイン不可になります。唯一rootのみがwww-dataになることができます。
外部に公開する訳ではないので比較的安全なローカルLan内を想定しています。
アクセス制限など施すことも可能です。(でも自己責任でね

では実際に設定してみましょう

www-data アカウント変更
最初にlighttpdを停止します。

# systemctl stop lighttpd

ホームディレクトリは/homeにすることにしました。/var/runは再起動で消えてしまいます。

# mkdir /home/www-data
# chown www-data:www-data www-data

www-dataをログイン可にします。

usermod -s /bin/bash www-data -d /home/www-data

ほかのプロセスで使用中の場合はメッセージを表示します。
usermod: user www-data is currently used by process 860
kill 860して再度実行、radiko playerのみなら出ないはずです。

ここでsudo suしてさらにrootからsu www-dataするとログインできます。
pulseaudio -Dするとホームディレクトリに~/.config/pulseができます。
ほかのユーザーと同様にclient.confとdefault.paを作成
~/.config/pulse/client.conf

autospawn = no
daemon-binary = /bin/true

default.paは以下だけでもOK
~/.config/pulse/default.pa

.include /etc/pulse/default.pa
(下は1行です)
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.11.0/24 auth-anonymous=1

pulseaudio -k
pulseaudio -D
pulseaudioが起動して今まで同様クライアントからも接続できるはずです。

radiko player index.phpの編集
最初ブラウザからradikoを立ち上げた時pulseaudioを起動
先頭附近session_start();の下あたり
/var/www/html/index.php

session_start();

if ($_SESSION['pulse_d'] == NULL) {
    exec("nohup pulseaudio --start > /dev/null 2>&1");
    $_SESSION['pulse_d'] = 'pulse_start';
}

php実行部

case "pulse--start";
    exec("nohup pulseaudio --start > /dev/null 2>&1");
    $_SESSION['pulse_d'] = 'pulse_start';
    $select = 'pulse';
break;

case "pulse--kill";
    exec("nohup killall pulseaudio > /dev/null 2>&1");
    $_SESSION['pulse_d'] = 'pulse_stop';
    $select = 'pulse';
break;

html(ボタン)

<a class="btn btn-dark" href="index.php?id=pulse--start">Pulse Start</a>
<a class="btn btn-error" href="index.php?id=pulse--kill">Pulse  kill</a>

html(テキストエリア)

case "pulse";
    $pulse = shell_exec('ps ax | grep pulseaudio 2>&1');
    print_r($pulse);
break;

radiko playerのmplayerをpulseaudio経由で再生する
ZEROのradikoなどmplayerを直接USB-DACのデバイス指定をするとradiko実行中はデバイスを専有してしまうことになりクライアント側ではNULLデバイスとなってしまいます。そのためサーバー側でもpulseaudio経由で再生するようにします。
ディレクトリ/etc/mplayerとmplayer.confは新たに作成します。input.confも空でいいので置いておいたほうがwarningが無くなります。
/etc/mplayer/mplayer.conf

#ao=alsa:device=plughw=0.0
#ao=alsa:device=plughw=1.0
ao=pulse

ao=pulseを有効にしておきます。必要があれば直接デバイスを指定することもできます。
radiko.sh,rajiru.sh,index.phpで直接デバイス指定している部分があったら外しておきます。

radiko.sh rajiru.sh
# Play
mplayer -

index.phpも同様にradiko.sh rajiru.sh以外で指定している部分があったら外しておきます。

これでクライアントのPi3からはpavucontrolで確認しながらradiko playerから自由にpulseaudioをコントロールすることができました。

次回アプリケーションからいろいろ試してみたいと思います・・・・・続く

Raspberry Pi ZERO PulseAudioサーバーにする

当サイトのRaspberry Pi3ディスクトップはスピーカーが非常にプアです。なんとかこの状況を改善したくPulseAudioを利用してみたいと思います。

と思って検索したのですが新しい情報があまり見つかりませんね。

参考サイト
freedesktop.org PulseAudio
archlinux PulseAudio
archlinux PulseAudio/サンプル


現状の100均スピーカーは音が出るか出ないかの確認程度でとても聴くに耐えません。
目標はyoutubeを快適に視聴したいと思います。

サーバーのOSは安定稼働を狙ってjessie-liteを使いました。X環境のjessieでは長時間使っていると動作が不安定になるようです。またLanアダプタも多少普通のものが必要そうです。
USB-DACはOSが正常に認識してあればpulseaudioは自動で見つけ出してくれます。

環境

pulseaudio server(実際に音を出す方)
Pi ZERO jessie-lite-2017-04-10
UAC3552A(USB-DAC)
Lan adapter ASIX AX88772A
AMP PAM8403
SP Victor(SETものジャンク)

pulseaudio client
Raspberry Pi3 jessie-2017-04-10

PulseAudioについて
開発元のfreedesktop.orgではデーモンの起動はユーザーとして起動するよう推奨しています。
systemオプションでシステムデーモンとして起動もできるようですがやはり設定など簡単にはいかないようです。
現在のjessieもシステムデーモンとして起動する設定もなく、検索するとこのあたりの解説が異なるように感じます。
ユーザー起動の設定は簡単ですがその挙動をつかむまで少々慣れが必要かもしれません。
当サイトとしては基本通りユーザー単位で起動して最低限の設定で出来るだけ再現性の高い方向でいってみたいと思います。

pulseaudio serverの設定
jessie-liteではpulseaudioのインストールが必要です。

# apt install pulseaudio

ディレクトリを作成

$ mkdir -p ~/.config/pulse

~/.config/pulse/client.confの編集
archの解説では/etc/pulse/の設定ファイルを編集しないよう推奨しています。

$ cp /etc/pulse/client.conf ~/.config/pulse

下記の内容で編集します。新たに作成してもOKです。

autospawn = no
daemon-binary = /bin/true

~/.config/pulse/default.paの編集
/etc/pulseからdefault.paをコピー

$ cp /etc/pulse/default.pa ~/.config/pulse

ネットワークモジュールを追記します。(下記を1行で)
ネットワークの値は自ネットワークの値を書き入れます。
~/.config/pulse/default.pa

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.11.0/24 auth-anonymous=1

以上でサーバー(Pi ZERO)の設定は完了しました。
pulseaudioの起動、停止は以下のコマンドで実行します。
エラーを表示しないでプロンプトが帰ってくればOK

$ pulseaudio -D or pulseaudio --start
$ pulseaudio -k or pulseaudio --kill

pulseaudio clientの設定
クライアントのPi3には音量コントロールのpavucontrolをインストール

# apt install pavucontrol

~/.config/pulse/client.confの編集
クライアント側にはサーバーのアドレスを記述します。
LAN内に複数のPulseAudioサーバーがあればこのファイルを編集して接続先を切り替えることができます。

autospawn = no
daemon-binary = /bin/true
# default-server = 192.168.11.111
default-server = 192.168.11.13

設定は以上で完了です。

PulseAudioサーバーに接続してみる
Pi3からインストールしたPulseAudio音量調節を起動します。

サーバー(Pi ZERO)のデーモン(pulseaudio)が起動していない時はこのようになにも表示しません。

sshでPi ZEROにログインしてpulseaudioを起動します。

Pi ZEROから
$ pulseaudio -D を実行するとコントロールが表示します。
当サイトのUSB=DACはSpeakers アナログステレオとして表示されています。
出力装置タブはマスターボリュームに相当します。
ここで少しボリュームを絞っておきます。


アプリケーションからなにか再生してみます。
最初は音が出ないかもしれません。
再生タブを選択するとアプリケーションの出力が(pulseaudio入力)bcm2835に入っています。
Speakers アナログステレオに切り替えると無事音が出ました。


youtubeを再生してみましょう。
youtubeのサイトを開く前に予めサーバーのpulseaudioが起動してないと自マシンのスピーカー出力にいってしまいます。
pulseaudioに接続するとパネルの音量コントロールは効かなくなるので最初はpavucontrolから確認しながら操作することになります。

なかなか快適に使えますね〜

次回はもう少しいろいろ触ってみたいと思います。・・・・・続く

Raspberry Pi ZeroにRadiko Playerを導入する

Pi ZeroにRadiko Playerを導入してみました。

ZeroでRadikoを聴く訳ではないのですがほかのテスト目的でインストールしたところ少し気がついた点があったので軽く纏めてみました。

OS 2017-04-10-raspbian-jessie-lite

カード作成

dd if=2017-04-10-raspbian-jessie-lite.img of=/dev/sda bs=1M

wiringPiインストール
内蔵alsaで音を出すには前回記事を参照
jessie-liteにはwiringPiがインストールされてないのでインストールします。

# apt install libi2c-dev git-core
# cd
# git clone git://git.drogon.net/wiringPi
# cd wiringPi
# ./build

mplayer関連
radikoスクリプトは適当に調達

# apt install mplayer swftools libxml2-utils libav-tools rtmpdump

lighttpd

# apt install lighttpd php5-cgi
# lighty-enable-mod cgi
# lighty-enable-mod userdir
# gpasswd -a www-data audio

/etc/lighttpd/conf-available/10-cgi.conf編集
下記の部分コメントを外してphp部を追記

cgi.assign      = (
        ".pl"  => "/usr/bin/perl",
        ".py"  => "/usr/bin/python",
        ".php" => "/usr/bin/php-cgi",
)

radikoスクリプトをブラウザから実行すると停止する
新規にインストールするといつもこの現象が発生します。
適当に触っているといつの間にか正常に再生できてしまうのですが今回は少し真面目に挙動を観察してみました。
コマンドラインからは連続再生できる
らじるスクリプトは正常に再生できる
インストール直後は正常に再生できる
再起動後は1分足らずで停止する

ここでroot権限でコマンドラインからradikoスクリプトを実行
正常に再生する
ブラウザからも正常に再生する
再起動後も正常に再生する

/var/tmpにできるauthkey.pngとplayer.swfも最初に実行したユーザーのままです。
カード2枚で試しましたがほぼ同じ結果を得ています。という訳でなにが原因なのかはわかりませんでした。

ボリューム値を取得する
amixer -R からボリューム値を取得していますがカードが変わると当然取得する箇所も変更になります。
sampleの//print_r($vol_a);の部分をコメントアウトすると画面に表示します。
取得している箇所は2箇所あります。(先頭附近と下記箇所)

// goto vol
        vol:
            $vol = shell_exec("amixer -c 0 -R 2>&1");
            $vol_a = explode(' ',$vol,30);
            $vol_s = $vol_a[24];
print_r($vol_a);
            $vol_x = substr($vol_s,1,3);


空白ごとに切り出しているのでamixer -Rから大体の切り出す数と目的のナンバーを指定します。

ブラウザのキャッシュが効いているのでクリアするかブラウザを再起動すると見えてくると思います。

スマホ対応デザインにしてみた

小さいボタンを使用したのでスマホでもこんな感じに見えると思います。

lighttpdからradiko.shを実行するとmplayerの実行ログはsyslogに記録されていました。
ZeroではこのログがSDへのアクセスになりノイズとなってしまいます。
そのためmplayerの実行ログはすべて捨てるようにしました。
radiko.sh -p FMT /dev/null & → 1>/dev/null 2>/dev/null &

参考 index.php_zero_radiko

Raspberry Pi Zero PWMオーディオを試してみる

Pi Zeroにはオーディオジャックがありません。

GPIO端子を利用して内装音源から音を出す方法が公開されているので試してみました。

参考サイト
adafruit.com Pi Zero PWM Audio
othermod.com Raspberry Pi Zero Audio Circuit

adafruit.comではGPIO端子にPWMを割り当てるため2つの方法が紹介されています。
両方試してみましたが音を出すだけならばDTOを利用するのが簡単です。

Option 1. Use Device Tree Overlay

/boot/config.txtに追記

dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4

次にraspi-configを実行してHeadphoneに切り替えます。

# raspi-config
7 Advanced Options → A4 Audio → 1 Force 3.5mm (‘headphone’) jack

以上で再起動すると

12 ALT5
13 ALT0

準備ができました。

さすがに直にアンプに接続してみるとガーガーピーピーいいます。

まずは仮で簡単にフィルタのテストをしてみます。

フィルタの解説についてはothermod.comのページを参考にしてみました。
フィルタを組んでテストしてみると大きな問題があります。
1.音の出だしの1回目のみかなり強烈なポップノイズが発生する、またシャットダウン時にも発生。
2.マイクロSDへのアクセス時にノイズが載る。
PWM変換ノイズはある程度フィルタで除去できますがマイクロSDへのアクセス時に発生するノイズは可聴音のため完全に除去することは困難と思われます。再生音自体はまあまあそれなりにいい音がしていると思います。

シャットダウン時のポップノイズについてはothermod.comのページにあるように抵抗の入れる位置を変更することにより除去することができました。
最初のポップノイズ発生時は出力端子に+の電圧が発生、10uFのコンデンサが充電して以降は発生しません。シャットダウン(リブート)はーの電圧が発生して10uFと150Ωの抵抗の時定数でうまく相殺されるものと思います。聴感上はオリジナルの回路と比べても変わらないと思います。
以上から音楽再生用としての使用はかなり厳しいと思いますが音を出す何かの実験用にはUSBポートを消費しないことからも有用と思います。
簡単にユニバーサル基板に組んでみることにしました。


以前Pi1BでポップノイズによってPAMアンプを壊してしまった経緯があることからトランジスタを追加しています。完全に抑えることはできませんがPAMアンプを壊さない程度まで小さくすることはできます。フィルタの抵抗値は手持ちの関係から変更しています。コンデンサも聴感上あまり変わらないので10nにしています。

最初の再生時にポップノイズが発生することから起動時に1回喋らせることにしました。
スクリプトを作成します。aplay実行後もマイクロSDにアクセスがあるので30秒のsleepを入れています。
/root/pwmaudio.sh

#!/bin/bash
gpio -g mode 27 out
gpio -g write 27 1
sleep 1
aplay /usr/share/sounds/alsa/Front_Center.wav
sleep 30
gpio -g write 27 0
# chmod 755 /root/pwmaudio.sh

/etc/rc.localに追記、起動時に実行します。

fi
/root/pwmaudio.sh > /dev/null 2>&1
exit 0


実験環境
RUNピンにタクトスイッチを取り付けたのですがZEROの場合はLEDが消灯、消費電力もかなり少ないためシャットダウン後のパワースイッチとしても使えそうです。
但しUSBポートに接続している機器はやはり電力を消費していますが!


テストはradikoとaudio playerにはAudaciousをインストールして試してみました。
radikoやAudaciousは一旦稼働してしまえばマイクロSDにアクセスすることは少ないのでまあまあ使えるレベルかと思います。但しほかのアプリケーションを起動するとノイズが乗ってくるのがわかります。


マイクロSDアクセス時のノイズはボリューム(alsamixer)を0にしても発生するためアナログラインに直接飛び込んでくものと思われます。
USBポート一つのZEROにとってはマイクロSDアクセス時のノイズが無ければ充分実用になるのですが次期の改善に期待したいと思います。

raspbian-jessie 2017-04-10 (fstab)

Raspbianの新しいイメージ2017-04-10-raspbian-jessieが出ています。

今回のイメージからfstabの書式が少し変更になっています。

Raspberry Pi3にインストールしてみました。

これまでのようにカード作成時にパーテーションを変更した場合はこのままでは起動しなくなってしまいました。

参考 arch linux fstab

カード作成

# dd if=2017-04-10-raspbian-jessie.img of=/dev/sda bs=1M

/etc/fstab

proc                  /proc           proc    defaults          0       0
PARTUUID=402e4a57-01  /boot           vfat    defaults          0       2
PARTUUID=402e4a57-02  /               ext4    defaults,noatime  0       1

従来のデバイス名からPARTUUIDの指定に変更になっています。

できたカードをセットして起動するとカードの空き領域を拡張してしまいます。(普通はこのようにして使うのですが)

当サイトでは空き領域の全部を/rootに割り当てたくないためパーティションを切り直します。


/dev/sda2は8000M(8G)にリサイズ
残り全部を/dev/sda3に割り当ててみました。

ですがこのままでは起動しません。PARTUUIDが変わってしまうんですね。(rootで実行)

# blkid /dev/sda1
/dev/sda1: LABEL="boot" UUID="95E0-9AC4" TYPE="vfat" PARTUUID="45afc544-01"
# blkid /dev/sda2
/dev/sda2: UUID="b105f9a8-f450-4976-8ac8-69053f57bab4" TYPE="ext4" PARTUUID="45afc544-02"
# blkid /dev/sda3
/dev/sda3: UUID="e935f818-2bac-4ee9-9637-3db52e1ef389" TYPE="ext4" PARTUUID="45afc544-03"

/etc/fstabの編集

proc                  /proc           proc    defaults          0       0
PARTUUID=45afc544-01  /boot           vfat    defaults          0       2
PARTUUID=45afc544-02  /               ext4    defaults,noatime  0       1

もうⅠ箇所変更します。 /boot/cmdline.txt

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=45afc544-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles


無事起動することができました。

これで今までと同様に扱うことができます。

# カード作成時の/dev/sda2(/root)はほぼ100%近く使いきっているので必ず拡張が必要です。

Top