PortAudioでリアルタイム入出力制御 (1)
PortAudioを用いてリアルタイム入出力制御を行う
~環境構築編~
■必要なもの*1
Windows7 32bit
Visual Studio 2008 Express (Visual C++ 2008)*2
ASIO SDK v2.3
PortAudio SDK v19
■Visual Studio 2008 Express (Visual C++ 2008) インストール時の注意
VS2010, VS2008, VS2005のランタイムライブラリが入っているとインストールに失敗することがある
→アンインストールしてからVS2008をインストール
VS2010など後継ソフトが入っていると(略
→アンインストールしてからVS2008をインストール
エラー1935(VS2005Runtimeを入れていると出ることがある)
→1) Windowsの[スタート]で[プログラムとファイルの検索]にfeatures」とタイプ入力
2) (1)の検索結果から[Windowsの機能の有効化または無効化]を選択
3)[Windowsの機能]ダイアログボックスで、
「Microsoft .NET Framework 3.5.1」の項目内にある、
「Windows Communication Foundation HTTP Activation」をチェック
■DirectX SDK(June 2010)のインストール
http://www.microsoft.com/en-us/download/details.aspx?id=6812
特に問題はないはず*3
■ASIO SDK v2.3
http://blog.livedoor.jp/sce_info3-craft/archives/7590862.html
いろいろ登録とかしないとダウンロードできない
でも無料なのでそのくらいの手間は惜しむべきではない
■PortAudio v19 から DLLをビルドする方法
基本的にここの情報に従う
http://portaudio.com/docs/v19-doxydocs/compile_windows.html
以下コメント
1) Windows用PortAudio は DirectX SDK(June 2010) の「dsound.h」「dsconf.h」「Dsound.lib」あたりが必要らしい
VC++2008を開いて、ツール→オプション→プロジェクトおよびソリューション
→VC++ディレクトリ
ディレクトリを表示するプロジェクトでインクルードファイルを選択
DirectX SDKのIncludeフォルダとPortAudioのIncludeフォルダを追加
例:「C:\Program Files\Microsoft DirectX SDK (June 2010)\Include」
例:「C:\Users\(*ユーザー名*)\Documents\Visual Studio 2008\Projects\pa_stable_v19_20111121\portaudio\include」
ディレクトリを表示するプロジェクトでライブラリファイルを選択
例:「C:\Program Files\Microsoft DirectX SDK (June 2010)\Lib\x64」※なぜかx64で動いた(未検討)
2) ASIOSDK2.3からASIOSDKにリネーム src\hostapi\asio にコピー
3) VS6, 7, 2001, 2003, VC.NET では無いので省略
4) Visual C + + 2008 Express で build\msvc\portaudio.sln を開く
コードが変換される
多少警告が出るようだが変換が出来ればOK
5) ソリューション(Portaudio)のプロパティを開き、構成プロパティを選択
6) 構成(C):[すべての構成]に、プラットフォーム(P):[Win32]にしておく(すべてのプラットフォームがあるならそれ)
7) オプションを設定
C/C++ -> 最適化 -> フレームポインタなし=はい(/Oy)
C/C++ -> コード生成 -> ランタイムライブラリ=マルチスレッド (/MT)
C/C++ -> コード生成 -> 浮動小数点モデル=Fast (/fp:fast)
C/C++ -> コード生成 -> 構造体メンバのアライメント -> 既定値(※MATLABの資料には 4 バイト (/Zp4)にしろと書いてあるがそうしたら動かなくなった)
8) 構成(C):[Release]に変更
PA_ENABLE_DEBUG_OUTPUT を削除(コンソールがデバッグメッセージを出力しなくなる)
9) 構成(C):[Release]
以下のようにASIOとWASAPIのみ使用するように変更
PA_USE_ASIO=1
PA_USE_DS=0
PA_USE_WMME=0
PA_USE_WASAPI=1
PA_USE_WDMKS=0
10) Release, Win32 で ビルド
portaudio_x86.dll/lib が build\msvc\Win32\Release に作成される
例:「C:\Users\(*ユーザー名*)\Documents\Visual Studio 2008\Projects\pa_stable_v19_20111121\portaudio\build\msvc\Win32\Release」
■portaudio_x86.dllを使用してサンプルを動かす
プロジェクトの新規作成
Win32コンソールアプリケーション
名前は適当に「PATEST」
空のプロジェクトでいい
プロジェクトのフォルダの中に以下を用意
portaudio.h
portaudio_x86.dll
サンプルプログラム(paex_saw.c, paex_read_write_wire.c, など)
ヘッダーファイルにportaudio.hを追加
ソースファイルにサンプルプログラムを追加
(※サンプルプログラムは1つだけ入れること.複数入れるとmain()が複数になるのでビルドできない)
ビルドしてデバッグ
音が出ればOK
paex_read_write_wire.c を実行すると遅延(レイテンシ)が表示される
0.100~0.050secとかだとなにかおかしい
ASIOになっていないかも…
ちなみに
Quad-Capture ver.1.5.2
ASIOバッファサイズ 32samples(44100Hz)
低レイテンシーモード
だと0.000725624secでした(32/44100=0.000725623)
上記設定はQuad-Capture ver.1.5.2で設定できる最小バッファサイズなので
これがこのオーディオインターフェイスのレイテンシの限界
ということになるはず
以上