聞きかじりめも

主にC++やメディア処理技術などに関して気付いたことを書いていきます.ここが俺のメモ帳だ!

XAudio2をC++/CLIで使いたい

初めて書くブログなので見づらくてもご容赦を…

 

VS2012から標準でUIプリセットが無くなり,Microsoftから見捨てられつつあるC++/CLIですが,OpenCVのようにC/C++ベースのAPIをフル機能で使いながらWindowsGUIを作りたい俺にはC#という選択肢が無かった.

 

今回は簡単なリアルタイムファンクションジェネレータ(波形生成器)をGUIで作成したかったため,GUIに使い慣れたC++/CLIを,音響にXAudio2を利用することにしました.最初はWindows APIのPlaySound()で行けるかと思ったけど,細かい指定ができない上に,リアルタイム生成&再生する都合上一旦WAVファイルに書き出すなんて真似はしたくなかったので,初の試みですがDirectXを使いました.また,DirectSoundなんか使うな!XAudio2を使え!という動きがあるみたいなのでビッグウェーブに乗ってみました.

本当はOpenALみたいなWinとMac両方で使えるクロスプラットフォームAPIを利用したかったのですが,なんか3D音源定位が主目的のライブラリっぽかったので(違ったらごめんなさい)今回はパス.機会があったら使ってみたい.

 

さて,C++/CLIでXAudio2を使うにあたって注意するべきポイント(つまり私が引っかかったところ)を列挙しておきます.なお,開発環境はVisualStudio 2013で,OSはWindows 8.1です.

 

  • MSDNの説明に潜む罠

XAudio2はDirectXの1ライブラリなのでMSDNにリファレンスがあります

(参考:XAudio2 移行ガイド ,XAudio2 ライブラリのバージョン).そこには,

どちらのバージョンの XAudio2 も、xmcore ライブラリに依存しています。どちらかの XAudio2 ライブラリにリンクしているアプリケーションは、xmcore.lib にもリンクする必要があります。

なーんて書いてあるのですが,結論としては(CUIアプリケーションの場合でも)XAudio2を使うにあたってこいつらを特別に #pragma comment(lib, "xmcore.lib") かなんかで追加する必要はないです(XAudio2.libも不要).私はこの"xmcore.lib"が一体どこにあるのかを探すために2日以上を浪費してしまいました.C:直下で検索しても出てこないし,新たにDLする必要があるのかとネットの海を探し回った挙句ウイルスに引っかかりそうになったり...皆さんも注意してくださいね.

 

…タイトルを否定する事項が出てきました.

XAudio2を使うときにはどうやらプロジェクトのプロパティで「マルチスレッド(/MT)」を指定しなきゃいけないようで,こいつがC++/CLIの「共通言語ランタイムサポート(/clr)」と競合するんですね.これはどうしようもなかったので,仕方なくDirectXを直接使うのは諦めて.NETラッパーのSlimDXを使うことにしました.ここまで来ると何でわざわざC++/CLIにしたのか疑問が湧きそうになったけど,流石ラッパーといったところ,使い方がちょっと楽になってるのでまあ良しとしよう.

 

これには困りました.なんせどこのサイトを見ても当たり前のようにsamples内のサンプルプロジェクトに沿ってどーだかって書いてあるのに,俺のSlimDX SDKのディレクトリにはそのsamples自体が無い.漸くある一つのブログで上記の内容に触れてあったからよかったものの,それすら無かったらどうなっていたことか...

解決方法としては,過去バージョンのSeptember 2011をインストールするとちゃんとsamplesディレクトリが存在するので,その中身の"SlimDX Samples.exe"を実行・展開して事なきを得ました.

 

 

次回,Sin波のリアルタイム生成コードを載せます.