Edit
OpenALとは?

OpenAL (Open Audio Library)はクロスプラットフォームのオーディオAPIであるフリーソフト。マルチチャンネル3次元定位オーディオを効率よく表現するように設計された。APIのスタイルと慣習は意図的にOpenGLと似せてある。- Wikipedia

Edit
マルチチャネルとは

いわゆるドルビーデジタルなどのように、5.1ch などの多チャンネルを表す。OpenALを利用することで、ゲームプレイなどにおいても、多チャンネルによるサラウンド・サウンドを利用することができる。(スピーカーシステムで3Dサウンドが実現できる)

Edit
特徴

OpenALの最大の特徴は、マルチプラットフォームであり、フリーのソフトなので、例えば1本のソフトを多くのゲームなどに移植する場合に効果を発揮する。ただし現在 OpenAL (-soft)のライセンスは、LGPLを適用しており、静的リンクではもちろんの事、ダイナミックリンクで利用する場合でもグレーであり、自作品のソースが強制的に公開が義務付けられる可能性がある。もちろん、ALUTなどの静的リンクライブラリを利用すると完全に黒になってしまう。

Edit
インストールや実装

OpenALで定義されていることは、ハードなどの部分とシンプルな音声データを定義するものであり、データの圧縮フォーマットとの連携は、別のライブラリに依存する。

Edit
Contextの使い方

AlcCreateContextの第2引数に渡される値(但しここは設定せずに、nullを渡しても通常は問題無い)
第2引数は特殊で、下記のようにOSのコマンドへの引数のような配列の形で引き渡す。(配列の最後は0にする)

const ALint context_attribs[] = { ALC_FREQUENCY, 22050, 0 };
名前説明
ALC_FREQUENCYミキシング出力バッファの周波数を[Hz]で示す
ALC_REFRESHリフレッシュ間隔を[Hz]で示す
ALC_SYNC同期コンテキストかどうかを示すフラグ
ALC_MONO_SOURCESモノラルデータをサポートするソースがいくつあるべきかを示すヒント
ALC_STEREO_SOURCESステレオデータをサポートするソースがいくつあるべきかを示すヒント(通常デバイスによって規定されるので設定の必要は無い)

※ただし、ソース中の処理には実装していない項目もあるようだ。

Edit
Sourceの使い方

alGetSourcei関数の第三引数に競ってされるステータス情報

定義名意味設定される関数
AL_INITIAL初期処理中
AL_PLAYING再生中void alSourcePlay (ALuint sName);
AL_PAUSED一時停止中void alSourcePause (ALuint sName);
AL_STOPPED終了void alSourceStop (ALuint sName);
-リピート処理開始void alSourceRewind (ALuint sName);

Edit
Bufferの使い方

定義名意味
AL_FREQUENCYヘルツ[Hz]で指定された周波数通常22050 or 44100
AL_SIZEバッファデータのバイト単位のサイズ。AL_SIZEを0に設定する事は正当な無効命令
AL_BITSサンプルあたりのビット数8 or 16
AL_CHANNELSバッファデータにおけるチャネル数1 or 2

alGetBuffersiなどでstate情報を取得した場合

定義名意味
AL_UNUSED
AL_PENDING
AL_PROCESSED

Edit
主な提供関数

カテゴリ関数名関数概要戻り値引数
デバイスALCdevice* alcOpenDevice( const ALCchar* devicename );デバイスへの接続nullが戻ってきた場合にはデバイスに接続できない(音がならない)状態引数はデバイス名(nullの場合は、初期値デバイスで指定)
ALCboolean alcCloseDevice( ALCdevice *device );接続したデバイスの切り離し関数の正否接続時に作成されたデバイスポインタ
コンテキストALCcontext* alcCreateContext( ALCdevice *device, const ALCint* attrlist );オーディオコンテキストの作成生成失敗時にnull、成功時にはコンテキストのポインタ上記関数で作成したデバイスポインタ + 初期化のパラメータを配列で渡す
void alcDestroyContext( ALCcontext *context );コンテキストの解放無し解放したいコンテキストのポインタ
ALCboolean alcMakeContextCurrent( ALCcontext *context );上記で作成されたコンテキストを操作対象のコンテキストとして指定関数の正否コンテキストポインタ
Source 管理void alGenSources(ALsizei cnt, ALuint *srcNames);新しいソース名(実体は番号)を作成する無しcnt分のソースを作成し、srcNamesの配列に代入する
void alDeleteSources(ALsizei cnt, ALuint *srcNames);ソースを削除する無しcnt分のソースを、srcNamesの配列に格納されているソース名で削除
ALboolean alIsSource(ALuint srcName);指定したソース名が利用できるものかの判定を行うAL_TRUE...有効、AL_FALSE...無効ソース名
void alSourcef( ALuint srcName, ALenum param, ALfloat value );ソースのパラメータ設定関数。最後のfは、引き渡すパラメータによって、~f, ~3f, ~fv, ~i, ~3i, ~ivと形が変わる。無しパラメータに応じて変化
void alGetSourcef( ALuint srcName, ALenum param, ALfloat* value );ソースのパラメータを取得する。その他はalSourcefと同じ無しパラメータに応じて変化
void alSourcePlay( ALuint srcName );指定ソースの再生。関数名の最後にvが付くと、引数をソース名配列で渡せる無しソース名。関数名にvが付くと、ソース名配列のポインタとなる
void alSourcePause( ALuint srcName );指定ソースの一時停止。playで再開。その他はPlayと同じ無しソース名。関数名にvが付くと、ソース名配列のポインタとなる
void alSourceStop( ALuint srcName );指定ソースの終了。その他はPlayと同じ無しソース名。関数名にvが付くと、ソース名配列のポインタとなる
void alSourceRewind( ALuint srcName );指定ソースの先頭からもう一度再生。その他はPlayと同じ無しソース名。関数名にvが付くと、ソース名配列のポインタとなる
void alSourceQueueBuffers( ALuint srcName, ALsizei bufCount, const ALuint *bufNames );ソースにバッファのキューを登録する。無し第1引数=ソース名, 第2引数=バッファ数, 第3引数=バッファ名の配列
void alSourceUnqueueBuffers( ALuint srcName, ALsizei bufCount, ALuint *bufNames );ソースのバッファに登録されているキューを解除する。無し第1引数=ソース名, 第2引数=バッファ数, 第3引数=バッファ名の配列

Edit
OpenALで利用される特殊な用語

名前機能概要
ContextアプリケーションとOpenALを繋げる管理領域。スレッドが複数あっても同じContextを利用する。(OpenALはスレッドセープ)
バッファ音声データを格納する領域の事。通常複数のバッファを管理して、ストリーム再生を可能にする
ソーススピーカーを意味する
リスナー実際に音を聞く人
ゲイン音量

Edit
OGGフォーマットについて

OGGフォーマットでは、ヘッダー(27バイト)とデータ(255バイト)のセットを、1ページ(1パケットとも呼ぶ)と呼び、ヘッダーにはBitstreamにおける、ページの順番なども含まれることで、複数のストリームがフォーマット内に存在できる仕様となっている。

項目名バイト数ヘッダー項目の意味
capture_pattern4OggS
stream_structure_version10x00
header_type_flag1そのページが格納するBitstreamの種類
absolute granule position8このページ内でBitstreamが終了する場合、その場所
stream serial number4Bitstreamの番号
page sequence no4ページ番号
page checksum432bit CRCの値
page_segments1格納するBitstreamのサイズ(バイト数)

Edit
3Dサウンドの使い方

Edit
その他

OpenAL Softを使用するアプリケーションでは%AppData%\alsoft.iniを編集できる [generic] channels = surround71 layout_stereo = fl=-90, fr=90 layout_quad = fl=-30, fr=30, bl=-150, br=150 layout_surround51 = fl=-30, fr=30, fc=0, bl=-150, br=150 layout_surround61 = fl=-30, fr=30, fc=0, sl=-90, sr=90, bc=180 layout_surround71 = fl=-30, fr=30, fc=0, sl=-90, sr=90, bl=-150, br=150