[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();
}
}