なんか
最近やっと暇になったのでなんか書きました。
完全に自分用の備忘録めいた記事なんですけど、こんな適当なの投稿して大丈夫なのかな…
3編併せて文章量だけは多いので暇つぶしにはなるかもしれません
3編に分かれてます
この記事は下の2つの記事と連動してるのでそのへんも読むといいとおもいます
- 準備編:VS2012でPortAudioの環境構築 ←いまここ
- 前編:PortAudioでWAVEファイルを再生してみる(WAVEファイル読み込み編)
- 後編:PortAudioでWAVEファイルを再生してみる(鳴らす編)
PortAudioってなに
フリーの音声処理ライブラリです。
Audacity とかの有名ソフトにも使われてるらしいです。
音声処理ライブラリとは言うもののいわゆるDSP部分(処理部分)は自分で記述する必要があるため、
波形データを直で扱いたい!という人以外には向かないかもしれません。
PortAudioを使うには自分の環境でのライブラリのビルドが必要なのですが、
多少問題になる部分が出てくるので自分の備忘録も兼ねて注意点書いときます。
ビルド環境は Visual Studio 2012,Windows 8 64bit です。
PortAudio本家は以下:
PortAudio
PortAudio リファレンス(英)
・余談
いきなり余談ですがゲームに使えるフリーの音声処理ライブラリってググってもあんまり出てきませんね。
だいたいXAudio2か、OpenALの二択って感じがします…。
OpenALはLGPLでちょっと有償販売ゲームには使い辛いし、XAudio2は正直初期化とか色々めんどくさいと思います。
(まあ、前者については動的リンクしてラップしたライブラリ自前で用意すればいいんですけども。
ちなみにPortAudioはMITライセンスです)
というわけで波形をいじったり、柔軟に色々できるという意味ではPortAudioも選択肢としてアリなんじゃないでしょうか?
勿論お金を払えばFmodとかBASSがあるんで、それらを使えるなら使った方が楽だと思います。
ライブラリのビルド
本題です。
まあぶっちゃけ
こことここの記事を見れば事足りる感あるんですが、
詰まった部分 として、ASIOドライバが入ってない場合の対処が挙げられます。
上の一個目のリンクに書いてある
PA_USE_ASIO=1
PA_USE_DS=0
PA_USE_WMME=0
PA_USE_WASAPI=1
PA_USE_WDMKS=0
と変更する部分なんですけど、 音が出ない場合 はとりあえず全部1にしといて問題ないと思います。
ただしどのAPIが優先的に使われるのかよく分からんので、レイテンシを気にする場合はリンク先の設定でいいかと。
あと一番目のリンクではVS2008を使ってますが、VS2012で普通にビルドできました。
(ソリューションの変換も特に問題なくいけました)
今回のビルド環境も64bitですが、ライブラリディレクトリ指定のDirectX SDKのLibフォルダはx86でOKです。
あとは二番目のリンクの通りにリンカー設定してやればビルド出来ると思います。
ちなみに、試しにWin32ではなくx64でビルドしてみましたが、どうもそっちの方は上手く動きませんでした。
・余談2
ASIO SDKのDLにはSteinbergのデベロッパ登録が必要でめんどくさい感ありますが、
音声処理やるなら登録しといて損はないです。(VSTプラグイン作成に必要なSDKもダウンロードできるので)
サンプルを動かす
その他、参考にさせていただいたページとして
があって非常にありがたいんですけれども、
DLLってプロジェクトの作業ディレクトリに置いただけだと使えませんよね…?
それに類する話が参考リンク中のどこにも出てなかったのでちょっと気になりました。
コード中でLoadLibrary();するか.libファイル使って静的リンクさせるか が必要だと思うんですけど、
portaudio.hを見てもDLL読んでる記述無いし、
当然そのままコンパイルすると外部参照未解決になるのでかなり謎です…。
(DLLのロードやったことないので間違ってるかもしれません)
なので、先のライブラリのビルドで一緒に生成された portaudio_x86.libも一緒に使いましょう。
DLLと同じところに置いて、コードの最初の部分で
#pragma comment(lib, "portaudio_x86.lib")
と追加してやればコンパイル通ると思います。
あとはportaudioのexamplesフォルダにサンプルがいろいろ入ってるので、
適宜上の記述を追加して試してみましょう。
とりあえず次回はPortAudioでWaveファイル読み込んで鳴らすところまでやりたいと思います。
コード部分が長くなりそう…