OpenAL

    1. コンパイル
    2. 再生

戻る


mingwでALUTを用いたOpenALのコンパイル方法
英語の分かる方はマニュアル読んでちゃんとインストールしてください。
ここの方法は、マニュアル読みながら試した方法ではないので、 参考にされる場合は自己責任で試してください。
コピー先をvisual Studioのincludeやlibにすればvisual studioでもコンパイルできました。
OpenAL.orgから
  • OpenAL SDK
  • freealut Binary Zip
  • をダウンロード。
    OpenAL SDKはインストールし、freealutは解凍する。

  • インストールしたフォルダ/OpenAL*SDK/include/にあるファイル全て
  • 解凍したフォルダ/include/AL/alut.h
  • .../MinGW/include/AL へ入れる。ALというフォルダはないので作る。

  • インストールしたフォルダ/OpenAL*SDK/libs/win32/にあるファイル全て
  • 解凍したフォルダ/lib/alut.lib
  • .../MinGW/libへ入れる。

  • 解凍したフォルダ/lib/alut.dll
  • C:\WINDOWS\system32へ入れる。

    コンパイルは必要に応じてオプションをつける。
    例:
    $ g++ main.cpp -lOpenAL32 -lalut


    hello world
    「hello world」としゃべります。
    #include<AL/alut.h>

    int main(int argc, char** argv){
    alutInit(&argc,argv);
    ALuint buffer, source;
    alGenBuffers( 1, &buffer );
    alGenSources( 1, &source );
    buffer = alutCreateBufferHelloWorld ();
    alSourcei( source, AL_BUFFER, buffer );
    alSourcePlay( source );
    alutSleep (1);
    return 0;
    }
    keypoint
    初期化
    alutInit(&argc,argv);
    有効なバッファとソース番号を取得します
    alGenBuffers( 1, &buffer );
    alGenSources( 1, &source );
    用意されている"hello world"の音声のバッファを作ります
    buffer = alutCreateBufferHelloWorld ();
    ソースとバッファを結び付けます
    alSourcei( source, AL_BUFFER, buffer );
    再生します
    alSourcePlay( source );
    1秒待ちます
    alutSleep(1);
    終了処理をします
    alutExit ();
    comment

    OpenALのイメージ

    耳がリスナー、スピーカーがソース、CDがバッファーです。(編集中)
    wavファイルの再生
    wav形式のファイルを再生します。
    #include<AL/alut.h>

    int main(int argc, char** argv){
    alutInit(&argc,argv);
    ALuint buffer, source;
    alGenBuffers( 1, &buffer );
    alGenSources( 1, &source );
    buffer = alutCreateBufferFromFile( "se.wav" );
    alSourcei( source, AL_BUFFER, buffer );
    alSourcePlay( source );
    alutSleep (1);
    return 0;
    }
    keypoint
    "se.wav"というファイルをバッファに読み込みます
    buffer = alutCreateBufferFromFile( "se.wav" );

    comment
    sin波の作成と再生
    sin波を作り再生します
    #include<cmath>
    #include<AL/alut.h>
    using namespace std;

    int main(int argc, char** argv){
    alutInit(&argc,argv);
    ALuint buffer, source;
    alGenBuffers( 1, &buffer );
    alGenSources( 1, &source );
    const int freq = 10000 , Hz = 440;
    ALshort data[freq/Hz];
    for (int i = 0; i < freq/Hz ; ++i) {
    data[i] = 32767 * sin(i * 3.14159 * 2 * Hz / freq);
    }
    alBufferData( buffer, AL_FORMAT_MONO16, data, freq/Hz*sizeof(ALshort), freq );
    alSourcei( source, AL_BUFFER, buffer );
    alSourcei( source, AL_LOOPING, AL_TRUE );
    alSourcePlay( source );
    alutSleep (1);
    return 0;
    }
    keypoint
    const int freq = 10000 , Hz = 440;では、サンプリング周波数を10000Hz、 音階が440Hz(「ラ」)としています。for文でそのデータを作っています。
    以下でバッファに音データを渡します。
    alBufferData( buffer, AL_FORMAT_MONO16, data, freq/Hz*sizeof(ALshort), freq );
    第2引数のAL_FORMAT_MONO16とはモノラルの16bit-PCM音源であることを示しています。
    第4引数は渡すデータの長さをbyte単位で渡します。第4引数はサンプリング周波数です。
    ここでは1波長分しか音データを作成していないのでループ再生させるため
    alSourcei( source, AL_LOOPING, AL_TRUE );
    を呼んで、ループ再生をオンにしています。
    comment
    32767という数字は符号付16bitの数が、-32768〜32767だからです。
    AL_FORMAT_MONO16のほかにも
    AL_FORMAT_MONO8は8bit-PCM音源を表し、0〜255の値で表します。
    AL_FORMAT_STEREO16はステレオの16bit-PCM音源を表します。 データは左右左右・・・と交互に並べます。
    AL_FORMAT_STEREO8はステレオの8bit-PCM音源を表します。