第5章 バッファ

バッファはサンプルデータの装飾に関するOpenALステートをカプセル化します。アプリケーションはバッファオブジェクトの要求および開放、そしてそれらをデータで満たす事が出来ます。データはサポートされたフォーマットで圧縮か符号化されたもので与えられる事が出来ます。バッファは内部的に波形データを非圧縮/圧縮のサンプルとして含む事が出来ます。

ソースおよびリスナと違い、バッファオブジェクトはALコンテキスト間で共有する事が出来ます。バッファはソースにより参照されます。単一バッファは複数ソースにより関連づけられる事が可能です。この区別はドライバおよびハードウェアに適応可能な箇所の記憶領域および処理を最適化することを許可します。

最も単純な、バッファデータとしてサポートされたフォーマットはPCMです。PCMデータはプロセッサのネイティブのバイトオーダを使用していると仮定されます。他形式はその形式でネイティブのバイトオーダを使用します。

第1節 ステート

いまこの時、バッファステートは議論の目的の為に定義されます。この節で説明されるステートは取得や直接設定といったような、APIを通じて表面に現れてはいず、そして実装の中で使われるステートの記述はこれと違うかもしれません。

バッファは後に続くステートのうち一つにあるとみなされます。

バッファステートはこのバッファをキューに含む全てのソースのステートに依存しています。バッファの単一キュー発生は全ソースに渡ってバッファステートをUNUSEDからPROCESSEDやより高位にします。AL_STOPPEDやAL_INITIALステートのソースはまだバッファをPROCESSEDにするキュー項目をもっています。

まだPROCESSEDでないバッファについて単一ソースの単一キュー項目はバッファのキューステートをPENDINGにします。

与えられたソースについてPROCESSEDのバッファはそのソースのキューから取り出す事が可能です。全てのソースからデキューされたバッファはUNSEDです。UNUSEDのバッファは削除やalBufferDataコマンドによる変更が可能です。

第2節 バッファネームの管理

OpenALはバッファネームの獲得、妥当なバッファネームと関連づいたバッファオブジェクトの削除要求、およびバッファネームの検証を行う呼び出しを提供します。バッファ属性を制御する呼び出しも提供されます。

第1項 バッファネームを要求する

アプリケーションはalGenBuffersを使って好きな数のバッファを要求します。

void alGenBuffers (ALsizei n, ALuint *bufferNames);

これはいつでも呼び出し可能で、かつ複数回呼び出しは複数のバッファの組を生成します。

第2項 バッファネームを解放する

アプリケーションはalDeleteBuffersを使って好きな数のバッファの削除を要求します。

一旦削除するとネームはAL関数呼び出しでの使用について無効となります。どんな使用もAL_INVALID_NAMEエラーを引き起こします。実装は実際のリソース開放を延期してもかまいません。

void alDeleteBuffers(ALsizei n, ALuint *bufferNames);

alIsBuffer(bname)はバッファの削除を証明するのに使う事ができます。バッファネーム0の削除は正当な無効命令(NOP)です。ソースに割り当てられたバッファは削除不能です。

第2項 バッファネームを検証する

アプリケーションはalIsBufferを使ってバッファネーム有効であるかどうかを検証する事が出来ます。

Alboolean alIsBuffer (ALuint bufferName);

第3節 バッファ属性を扱う

第1項 属性

この項では取得可能なバッファ属性を羅列します。羅列された属性がalBufferDataを使用により設定されることに注意してください。

不正なバッファネームによるバッファの属性の取得はAL_INVALID_OPERATIONを投じます。不正な属生名の指定はAL_INVALID_VALUEエラーを投じます。

表5–1 バッファのFREQUENCY属性
名前記号デフォルト
AL_FREQUENCYi, iv(0, any]0

解説

sps(samples per second)、すなわちヘルツ[Hz]で指定された周波数です。alGetBufferで取得します。バッファの周波数ステートはalBufferData呼び出しにより設定します。

表5–2 バッファのSIZE属性
名前記号デフォルト
AL_SIZEi, iv[0, MAX_UINT]0

解説

バッファデータのバイト単位のサイズです。alGetBufferを通じて取得し、alBufferData呼び出しを使用する事にのみより設定出来ます。AL_SIZEを0に設定する事は正当な無効命令です。

表5–3 バッファのBITS属性
名前記号デフォルト
AL_BITSi, iv8, 1616

解説

バッファに含まれるデータについてのサンプルあたりのビット数です。alGetBufferにより取得します。ビット数はalBufferData呼び出しにより設定します。

表5–4 バッファのCHANNELS属性
名前記号デフォルト
AL_CHANNELSi, iv1, 21

解説

バッファに含まれるデータについてのチャネル数です。alGetBufferにより取得します。チャネル数はalBufferData呼び出しにより設定します。

第2項 属性の変更

バッファに関するエクステンションは以下の呼び出しのうちの一つを使って、自らのバッファ属性の設定を望む事ができます。

void alBuffer{n}{if} (ALuint sourceName, ALenum paramName, T value);
void alBuffer{n}{if}v (ALuint sourceName, ALenum paramName, T *values);

第3項 属性の取得

バッファステートはOpenALの実装の中で管理され、完全に取得可能です。paramNameについて妥当な値はAL_FREQUENCY、AL_SIZE、AL_BITSおよびAL_CHANNELSで、その値の結果はバッファデータの内部表現を表すでしょう。

void alGetBuffer{n}{if}{v} (ALuint bufferName, ALenum paramName, T *values);

第4項 バッファの内容を設定する

バッファステートの特別な場合はバッファの集合に格納された実際の音声サンプルデータです。アプリケーションはalBufferDataを使ってサンプルデータを設定出来ます。

void alBufferData (ALuint bufferName, ALenum format, const ALvoid *data, ALsizei size, ALsizei frequency);

設定されたデータは内部ソフトウェアバッファ、あるいは可能であればハードウェアバッファにコピーされます。実装は必要があれば展開、変換、リサンプルおよびフィルタリングしてもかまいません。正当なフォーマットはAL_FORMAT_MONO8、AL_FORMAT_MONO16、AL_FORMAT_STEREO8およびAL_FORMAT_STEREO16です。実装はエクステンションを通じて他の形式も示すかもしれません。

8ビットデータは0から255の符号なし値で表現され、128はゼロレベルのオーディオ出力です。

16ビットデータは-32768から32767の符号あり値で表現され、0はゼロレベルのオーディオ出力です。16ビット値のバイトオーダはCPUのネイティブの形式により決定されます。

ステレオデータはインタリーブ形式で表現され、左チャネルのサンプルは右チャネルサンプルにより引き続かれます。

1チャネル以上のオーディオデータを内包するバッファは3D空間化機能なしで再生されるでしょう。これらの形式は通常BGMとして使用されます。

サイズはバイト数で与えられ、与えられた形式について論理的である必要があります。例えば16ビットデータにおいて奇数は常にエラーとなります。不正なサイズはAL_INVALID_VALUEエラーを起こすでしょう。

アプリケーションは、実装がAL_OUT_OF_MEMORYを生成する場合やAL_INVALID_VALUEエラーに関する変換の場合を、バッファデータの設定を試みた後のエラー状態について常にチェックするべきです。

アプリケーションは一旦alBufferDataの呼び出しから戻るとデータポインタとして与えたメモリを再利用してもかまいません。実装は例えばalBufferData実行中にコピーして、参照を解きます。