忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

OpenALでHello World [C#]

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


これを実行すると、"ヘローワール ―プッ"という音がスピーカーから出てくるはずです。
(どうも音が小さいので耳を澄ましてみてください)



 

拍手[0回]

PR