Pulse Audioを使ってWAVファイルを再生するC++例題プログラム (Ubuntu 11.1で確認)

Introduction

OSのバージョンが上がると、それまで使えてたプログラムが突然使えなくなったりしてよく困る。また、それが、自分が開発してるプログラムだと、今度は何が変わったんだ、と、憂鬱になる。 いや、今回もなったんだけど。

Ubuntu 8.10を使ってたときは、OSSなるAPIでWAVファイルを再生することができていたのに、Ubuntu 11.1にアップグレードしたら、いきなり音が鳴らなくなった。なにやら、最近はPulse AudioなるAPIが標準になったらしい。(というのは誤りで、ALSAが標準、と、別の人から教えてもらった。けど、Pulse Audioが使えてるのは間違いないっぽい。)。しかし、これを放っておいてはYSFLIGHT for Linuxで効果音が鳴らないんで、Pulse Audioなるものを使って見ることにした。

しかし、とりあえず、Pulse Audioのリファレンスは検索したら見つかったのだが、例題が見つからない。公式サイトにある例題は、同期モードで音を再生する例題だったから、フライトシミュレータの効果音には不適だった。音が鳴るたびにシミュレーションが止まってたら話にならない。8ビット時代はそういうゲームもあったかもね。

仕方ないから、リファレンスマニュアルを見ながら、自分でWAVファイルの再生方法を解明することにした。やってみると、案外単純明快にできていた。Pulse Audioの言うメインループの概念が最初ちょっとわかりにくかったけど、それ以外は結構迷わずに書けたと思う。

OSSから書き換えなきゃならないのは面倒だったけど、Pulse AudioのAPIはよくできている。いや、OSSはちょっとあんまりだったもんな。

公式サイトの例題があの有様だと、案外同じ問題で困ってる人もいるかもしれないと思ったんで、非同期で音を鳴らす方法を解明するために書いた例題プログラムを公開することにした。


というか、いろんな例題は、22.5KHzの生のストリームデータを食わせるようにできてるみたいなんだけど、、どこからそんなのもってくりゃいいんだ?って、普通の人は思うんじゃないかと思うんだけど。多分、そんな生データをどうやって作るかと言ったらWAVファイルから抜き出すんじゃないかと思うんで、そんなことするなら、直接WAVファイル読み込んで鳴らす例題が一本あった方が、みんな助かると思った。けど、そういう例題は検索しても出てこなかったんだよね。

 

 
 

ダウンロード

[ダウンロードはここをクリック]

コンパイルと実行の仕方

ダウンロードしてファイルを解凍すると、pulse_async_test.cpp, yswavfile.cpp, yswavfile.hの3本のファイルができる。これをひとつのディレクトリに解凍して、次のようにタイプしてコンパイルできる。(Pulse Audioのヘッダとライブラリは既にインストール済みと仮定)

# g++ pulse_async_test.cpp yswavfile.cpp /I. -lpulse

実行は、

# ./a.out sampleWaveFile.wav

のように第一引数にWAVファイル名を指定する。このプログラムの中では、最大5秒間、指定されたWAVファイルを再生して終了する。最大5秒間という制限は、メインループの中でチェックを入れてるだけだから、それを消して、代わりにBuffer Underflowを検出したら終了するように書き換えれば、最後まで再生して終了するようになる、と、思う。

コードの利用について

コードの著作権は僕にありますが、商用でも非商用でも自由に利用していただいて結構です。ただし、それによって何が起きても僕は責任を負いませんので、その点ご了承いただけない場合は、利用しないでください。

[更新履歴]

2012/02/19

この間アップロードしたやつは、yswavfile.cppの実装がかなりいい加減だったんで、少し真面目に書き直した。Resampleとか、ConvertTo***関数も一応使えるようにした。あと、NTimeStepとDataPointerAtTimeStep関数は、ALSAと使うときに便利かも.

2012/02/09 [このバージョンをダウンロード]

公開。