2009年11月30日月曜日

linux + usb radio + peercast

がんばったのでメモ。
何をやりたいのかはコマンドから察してください。
Peercastの設定はすでに完了しているものとしています。

構成
・Ubuntu 9.04 からアップグレードした Ubuntu 9.10 (カーネル2.6.31)
・PeercastVP
・SUNTEC RDPC-101 (USB AM/FM tuner)
・SUNTEC RDPC-101 (USB AM/FM tuner) ドライバ カーネルパッチ for Linux (Driver Labo. 製)

1. RDPC-101をLinuxで使えるようにする

まず、以下のような手順でドライバを組み込みます。

コンパイル用のディレクトリを作成。
$ mkdir ~/module
$ cd ~/module

カーネルパッチから、radio-rdpc101.cの部分だけを抜き出し、radio-rdpc101.cとして保存する。
ただし、2.6.31系カーネル(新しめのカーネル)のときには
#include <linux/smp_lock.h>
を書き加える必要がある。

RDPC-101のカーネルモジュールを作成。カーネルまるまる再構築はめんどくさいのでモジュールだけ。
$ vi Makefile # 内容は「モジュールのみコンパイル」の記事を参照。
$ ls
Makefile radio-rdpc101.c radio-rdpc101.ko .........

モジュールの組み込み。
$ sudo /sbin/modprobe videodev #radio-rdpc101が依存しているので
$ sudo /sbin/insmod radio-rdpc101.ko

ここでRDPC-101をUSBポートに挿す。
先に変なところで挿しちゃってたら、違うドライバ(radio-si470x)が使われてしまいエラーになる。
そのときは
$ sudo /sbin/rmmod radio-si470x
として、モジュールを除去してから上の作業を行えばOK。

再生確認。
$ sudo /sbin/modprobe snd-pcm-oss   # alsaの疑似oss機能を追加(/dev/dsp*が作成される)
$ sudo /dev/dsp1 > /dev/dsp

ここで、スピーカーから音が聞こえればOK
うちのマシンでは音声が再生されない仕様(?)なので、サウンドレコーダーでラジオを録音したファイルを他PCに転送して再生を確認した。

2. ffmpeg + vlc media player でPeercastにストリーム配信


以下のコマンドでoggストリーミング。
$ ffmpeg -f oss -ac2 -i /dev/dsp1 -ar 44100 -f wav - | cvlc -vvv - --sout '#transcode{acodec=vorb,ab=256,channels=2}:duplicate{dst=std{access=shout,mux=ogg,dst=[user]:[passwd]@[host]:[port]/}} --sout-keep'

[user],[passwd],[host],[port]は、Peercastへ配信するためのユーザー名、パスワード、Peercastが動いているホスト、ポートを指定する。

以上で、配信ができました。

文章量は少ないけど、いろんな試行錯誤で、再生できるまでに缶詰丸5日もかかった。。。


追記
# スピーカーで聞きながら配信
$ ffmpeg -f oss -ac2 -i /dev/dsp1 -ar 44100 -f wav - | cvlc -vvv - --sout '#duplicate{dst=display,dst=transcode{acodec=vorb,ab=256,channels=2}:std{access=shout,mux=ogg,dst=[user]:[passwd]@[host]:[port]/}} --sout-keep'

#これだとうまくいかない
$ ffmpeg -f oss -ac2 -i /dev/dsp1 -ar 44100 -f wav - | cvlc -vvv - --sout '#transcode{acodec=vorb,ab=256,channels=2}:duplicate{dst=display,dst=std{access=shout,mux=ogg,dst=[user]:[passwd]@[host]:[port]/}} --sout-keep'

2009年11月29日日曜日

Linuxのカーネルモジュールだけコンパイル・インストール

以下の内容のMakefileを作成する
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

makeする
$ make

モジュールの組み込み・除去は次のようにする
$ su
$ /sbin/insmod hello.ko
$ /sbin/rmmod hello.ko

次のようなコマンドで確認
$ dmesg
$ /sbin/modprobe -l | grep hello

参考
Linux Kernel 2.6.x プログラミングガイド
Loadable Kernel Moduleの作り方
LS-GLのiptablesによるルーター化(insmodできないときの解決法)

Fedora11でカーネル再構築

カーネル再構築に必要なパッケージをインストール
$ su
$ yum install rpmdevtools yum-tuils
$ exit

パッケージ構築用のディレクトリ構造を作る
$ cd
$ rpmdev-setuptree

カーネルソースをダウンロードする。特定のバージョンがほしい場合はどっかから持ってくる。
$ yumdownloader --source kernel

カーネルソース再構築に必要なパッケージをインストール
$ su
$ yum-builddep kernel-.fc11.rpm
$ exit

カーネルソース展開と準備
$ rpm -Uhv kernel-.fc11.src.rpm
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=`uname -m` kernel.spec

カスタムカーネル作成準備
ここでパッチを当てる(※はずだが、コンパイル時にソースが再展開されるのでパッチは無効になる)
$ cd ~/rpmbuild/BUILD/kernel-/linux-
$ cp configs/kernel-.config .config
$ make oldconfig
$ make menuconfig
$ make xconfig
$ cd ~/rpmbuild/SPECS
$ vi kernel.spec

#% define buildid .local

%define buildid .test

コンパイル(時間かかる)
$ rpmbuild -bb --target=`uname -m` kernel.spec

インストール
$ cd ~/rpmbuild/RPMS/i686
$ su
$ rpm -ihv kernel-.test.fc11.i686.rpm

ちなみに、パッケージを削除するには
$ su
$ rpm -ehv kernel-.test.fc11.i686

参考文献

Fedora 10でカーネルを再構築するには

FC4 私的MEMO カーネル再構築とrpmの作成
RPM

フォロワー