VGF-WA1をDLNA DMRっぽく使う

概要

NASにインストールしてあるDLNAサーバ(miniDLNA)から音楽再生できなくてリアルにホコリをかぶっていたVGF-WA1をメディアレンダラっぽく使えるようにしたメモです。
WA1が10秒ぐらいバッファリングするので選曲とかシークはタイムラグがひどいですが、音楽を垂れ流しにするには十分です。

うちの構成はこんな感じ:

[Android]
BubleUPnP(DMC)
[NAS]
miniDLNA(DMS)
  ↓ 
[Linux PC]
XBMC(DMR)
  ↓ 
PythonスクリプトのWebサーバ
  ↓ 
[VGF-WA1]
WEB RADIO(ShoutCast)

WA1をLinux PCのWiFiスピーカとして使えるようにして、PC上でDMRアプリケーションを動かす構成になっています。

DMRにするPC

実際にDMRとして動いているのはPC上のXBMC(現Kodi)です。
PulseAudioのmonitor sourceから音声データを取り出して、MP3に変換しています。Pythonスクリプトで作られたWebサーバに接続すると変換したMP3データがストリーミング出力されるようにしています。

この方法の元ネタは以下のページです。
pulseaudio - How do I set up live audio streams to a DLNA compliant device? - Ask Ubuntu
http://askubuntu.com/questions/187086/how-do-i-set-up-live-audio-streams-to-a-dlna-compliant-device

回答の中の、"The next idea was to write a http server in python that serves the stream instead."と紹介されているAdamさんのスクリプトをほぼそのまま使っています。

WA1のWEB RADIOは、MP3ストリームしか受け取ってくれないようでFLACやWAVのストリームでは再生できませんでした。
スクリプトの"MONITOR"は各自のPCに合わせて書き換えてください。以下の様にpactlを実行して、

pactl list short | grep monitor

出力されるリストから音声出力として使用しているデバイスを選んでください。

#!/usr/bin/python

import BaseHTTPServer
import SocketServer
import subprocess

PORT = 8086
# run "pactl list short |grep monitor" to see what monitors are available
# you may add a null sink for streaming, so that what is streamed is not played back locally
# add null sink with "pactl load-module module-null-sink"
#MONITOR = 'null.monitor'
MONITOR = 'alsa_output.pci-0000_00_01.1.hdmi-stereo.monitor'
#MIMETYPE = 'audio/flac'
#ENCODER = 'flac - -c --channels 2 --bps 16 --sample-rate 44100 --endian little --sign signed'
#MIMETYPE = 'audio/wav'
#ENCODER = ''
MIMETYPE = 'audio/mpeg'
ENCODER = 'lame -r --cbr -b 320 -q 0 - -'
BUFFER = 65536

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
  def do_HEAD(s):
    print s.client_address, s.path, s.command
    s.send_response(200)
    s.send_header('content-type', MIMETYPE)
    s.end_headers()
  def do_GET(s):
    s.do_HEAD()
    pa = subprocess.Popen('parec -d {} | {}'.format(MONITOR, ENCODER), shell = True, bufsize = BUFFER, stdout = subprocess.PIPE)
    while True:
        data = pa.stdout.read(1024)
        if len(data) == 0: break
        s.wfile.write(data)
    print 'stream closed'


httpd = SocketServer.TCPServer(("", PORT), Handler)

print "listening on port", PORT

try:
  httpd.serve_forever()
except KeyboardInterrupt:
  pass

httpd.server_close()

VGF-WA1の設定

WA1にWEB RADIOとして、Linux PCを登録します。
WebブラウザからWA1をアクセスすると登録ページが開くので、上記のPCのアドレス(ポート:8086)を登録します。
以下の例では、"ラジオ局1"に"192.168.0.9:8086/"を登録しています。


使ってみる

Linux PC上でPythonスクリプトとXBMCを起動してから、WA1からWEB RADIOに接続します。
XBMCはデフォルトではDMR機能がオフになっているので、このあたりを参考に設定を変更してください。
音楽再生だけならXBMCはオーバスペックでRygelを使ったほうが良いのですが、動画再生用のDMRとしても使用しているのでXBMCを使用しています。

WEB RADIO以外で

元ネタの回答には、Rygelのメディアサーバ機能を使ってPulseAudioの出力をストリーミングする方法も紹介されています。
実はこちらもWA1の"PC"モードでの接続を確認できています。ただし、問題がありまして無音期間が長く続くとWA1側でエラーになってしまいます。"WEB RADIO"モードではどれだけ無音期間が続いてもエラーにならないので、この構成で使用しています。