[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
OpenAL
突然ですがOpenALなるものでHello Worldをしてみました。
OpenALというのはOpenGLのオーディオ版のようなものなのだそうです。
(Open Audio Library)
OpenGLがグラフィックス・ライブラリ(GL)なのにたいし、OpenALはオーディオ・ライブラリ(AL)というわけです。
ではなぜこのようなことをするのかというと、4gamer.netのこの記事を読んだからです。
これを読むと、なんとなくOpenALが出来たほうがいいような気がしてきます。
もちろん、無駄骨になる可能性もあります。
Microsoft.Xna.Framework.Audioがあるから知る必要は無いのではないかという気もします。
でもこっちの方が柔軟そうですし、好奇心がこれをやりたいと言っているのです。
というわけで、C#のInteropサービスを利用してOpenALを使ってみることにしました。
最初はC++/CLIでやろうと思っていたのですが、挫折しました(笑)。
全部C#で行きます。
インストール
OpenALのインストールは、まずここの次の2つをダウンロードします。
OpenAL 1.1 Installer for Windows
freealut Binary ZIP
上のほうは実行、下は展開してlibの中にあるalut.dllをC#で作る実行ファイルと一緒に置いてやります(Visual Studioを使う場合は単にプロジェクトに追加+右クリック > プロパティ > でアウトプットディレクトリにコピーするように設定すればいいでしょう)。
Hello World
では単純にスピーカーから”Hello World”と鳴らすプログラムを書いてみましょう。
using System; using System.Runtime.InteropServices; class Program { //OpenAL Utility Toolkit (Alut) の関数をインポート const string AlutDll = "alut.dll"; [DllImport(AlutDll)] static extern bool alutInit(IntPtr argc, string[] argv); [DllImport(AlutDll)] static extern bool alutExit(); [DllImport(AlutDll)] static extern int alutCreateBufferHelloWorld(); //OpenALの関数をインポート const string OpenALDll = "OpenAL32.dll"; [DllImport(OpenALDll)] static extern void alSourcePlay(int sourceHandle); [DllImport(OpenALDll)] static extern void alGenSources(int resultSize, int[] result); const int AL_BUFFER = 0x1009; [DllImport(OpenALDll)] static extern void alSourcei(int sourceHandle, int propertyType, int value); static void Main() { alutInit(IntPtr.Zero, null); //"Hello World!"と喋る音声データを作る int bufferHandle = alutCreateBufferHelloWorld(); //音源を作り、音声データをセットする int[] sources = new int[1]; alGenSources(sources.Length, sources); alSourcei(sources[0], AL_BUFFER, bufferHandle); //音源から音を鳴らす alSourcePlay(sources[0]); System.Threading.Thread.Sleep(1300); alutExit(); } }