2014年4月27日日曜日

jack & rakarrack & pulseaudio

jackとpulseaudioを使い、マイク入力はrakarrackを使いつつ
line入力はarecordでラジオ録音に使うためのメモ

○前準備
apt-get install linux-lowlatency
apt-get install qjackctl jackd
apt-get install pulseaudio-module-jack

まず、物理的にスピーカ、マイク入力を司っているのはALSAである。
そしてpulseaudioがそのALSAを握っている。

 ALSA(スピーカ) <== pulseaudio <== mplayerなど

line入力の方はarecordは直接ALSAを使うっぽい

 ALSA(マイク) ==> arecordなど

○とりあえず、ALSAがpulseaudioに握られていてはjackが使えないのでunloadする。

pactl unload-module module-alsa-sink
pactl unload-module module-alsa-card

○qjackctlでjackdを開始する。
qjackctlの設定はドライバをalsaにして、以下のように設定。
・出力デバイスhw:0
・入力デバイスhw:0,2
  入力デバイスの1つ目はline入力で、ラジオ録音に使うので、
 jackとしては2つ目のマイク入力を使うようにする。
 (arecord -Lで、hw:CARD=PCH,DEV=0と hw:CARD=PCH,DEV=2がある)

とりあえずjackが使われるようになるが、
このままだと、pulseaudioをぶった切ってjackをつなげただけなので、
jackが使える代わりに色んな音が鳴らなくなる。

ALSA(スピーカ) <== jack <== rakarrack
                          ×<== pulseaudio


○pulseaudioでjackを使うようにする。

pulseaudioのjackモジュールをロード

pactl load-module module-jack-source channels=2
pactl load-module module-jack-sink

多分以下のような感じになる。

ALSA(スピーカ) <== jack <== rakarrack
                          ↑<== pulseaudio(module-jack-sink) <== mplayerなど

ALSA(マイク入力) ==> jack ==> rakarrack
                          ==> pulseaudio(module-jack-source) ==> 何につかわれるのやら?

とりあえずこれで、jack経由でpulseaudioを鳴らすことができる。

○rakarrack

jackも使えるようになったはずだが、
マイク入力に何かつないで、rakarrackを動かしてみても反応なし。
ここでしばらく悩んだけど、
ALSAのマイク入力がキャプチャモードになってないからということに気づいた。

alsamixerで、 CaptureとCapture 1があるが、Captureの方はラジオ録音に使うので、
Capture 1を録音に設定、 Input Source 1をマイク入力に設定する。
コマンドでやるなら amixer -- sset なんとかかんとか で行けるはず。

これで動いた。

○終わらせ方

1.qjackctlでjackdを終わらせる。
2.pulseaudioのjackモジュールをunload
 pactl unload-module module-jack-sink
 pactl unload-module module-jack-source
3.pulseaudioのダミーがロードされるのでunload
 pactl unload-module module-null-sink
4.pulseaudioのalsaモジュールをload
 pactl load-module module-alsa-card
 pactl load-module module-alsa-sink

○結論

とりあえずは上記をやればいいっぽいので、
qjackctlに以下のように設定

・スタートアップ時にスクリプトを実行
 pactl unload-module module-alsa-sink; pactl unload-module module-alsa-card
・スタートアップ後にスクリプトを実行
 pactl load-module module-jack-source channels=2; pactl load-module module-jack-sink
・シャットダウン時にスクリプトを実行(追記: シャットダウン後じゃなくて前にやる。)
 pactl unload-module module-jack-sink; pactl unload-module module-jack-source
・シャットダウン後にスクリプトを実行
 pactl unload-module module-null-sink; pactl load-module module-alsa-card; pactl load-module module-alsa-sink

alsaのキャプチャは使わない場合はノイズがうるさいので、
使う時だけalsamixerでONにする。

・D-BUSインターフェース
jackを開始すると、jackdbusというのが走りっぱなしになるので、
jackを停止したら使わないようにしたい。
よって、qjackctlの設定:その他のD-Busインターフェースの有効化をやめる。

2014年4月26日土曜日

epgrec dvb: Value too large for defined data type

epgrecをpt2(dvb)で使っててたまに以下のようなエラーが出る。
 dd: reading `/dev/dvb/adapter0/dvr0': Value too large for defined data type

これが出るとデータがドロップされているので、動画がちょっと飛ぶ。
なんとかしたい。

ちょっと調べた限りでは、ファイルサイズ32bitの壁みたいな情報があったけど、
多分それが原因では無さそう。
(ちゃんと64bitを指定してるし。)

メッセージを調べると、errornoのEOVERFLOWの時に出るメッセージのようだ。
どうもdd内のreadがEOVERFLOWで失敗しているっぽい。
となると原因はドライバ内と思われる。

で、pt2に関係ありそうなところで、EOVERFLOWがあるのは、kernelソース内
drivers/media/dvb/pt1/dvb-core/dmxdev.c
dvb_dmxdev_buffer_writeで、

        free = dvb_ringbuffer_free(buf);
        if (len > free) {
                dprintk("dmxdev: buffer overflow\n");
                return -EOVERFLOW;
        }

という感じでリングバッファにデータを詰め込もうとしているところくらいか。
どうもカーネル内のリングバッファが足りてないのではないか?

と思ったので、カーネルのリングバッファサイズを増やしたい。
カーネルソースを眺めた結果、ioctlのDMX_SET_BUFFER_SIZEで動的に変更できそうだ。

結果はまたあとで書く。

ubuntu 13.10とepgrec

OpenSSLの問題でアップデートしようとしたら、
ubuntu 12.10のサポートが切れたっぽいので、しかたなく13.10にアップデート。

1. 毎度のことながら、phpで問題が起きる。(いい加減にしてほしい)
今までは、以下でタイムゾーンを設定していた。
 /etc/php5/conf.d/5-timezone.ini

今回から、以下になったようだ。
最初、cgiに移動しただけかと思っていたが、両方やっとかないと
多分getepg.phpと時間がずれるから問題が起きる。
 /etc/php5/cgi/conf.d/ /etc/php5/cli/conf.d/

タイムゾーンなんてcgiとcliで共通にするだろうに
なんで今まで読んでたファイルを無視するのか?
 あと上記を調べるのにphpinfoをやろうとして動かなかった。
微妙に変更になっている。
前:<? phpinfo(); ?>
後:<?php phpinfo(); ?>

userdirとphpmyadminでうまく動かないのは前と同様。
設定メモ: ubuntu 12.10とphpmyadmin

2.日本語が入らない

以下のサイトを参考にfcitxにした。色々書いてて毎度ありがたい。
http://www.k5.dion.ne.jp/~r-f/sicklylife/memo/ubuntu1310/

まだ他にもあるかもしれないが、とりあえずはOK。
録画はdvb使っているので問題無さそう。