第7章 付録:エクステンションについて

エクステンションはOpenAL APIの将来の拡張を提供する方法です。典型的に、エクステンションはベンダにより仕様策定され、提案されます。そしてもし知的所有権が主張されなければベンダ中立に扱われる事が出来ます。

エクステンションはまた、頼れる、真のエクステンションとしてコアAPIに追加される前の最終ステップであるARBエクステンションに策定・昇進することもできます。ARBエクステンションはひとたび策定されると、後方互換性を保つ義務があります。

第1節 エクステンションを取得する

エクステンションを使用するには、アプリケーションは関数のアドレスおよび列挙子の値を得る必要があるでしょう。エクステンションが使用されうる前に、アプリケーションはalIsExtensionPresent関数も使ってエクステンションの存在を検証するべきでしょう。そして、アプリケーションはエクステンションのエントリポイントのアドレス(関数ポインタ)をalGetProcAddress関数を用いて得る事が出来ます。

エクステンションおよびエントリポイントはコンテキスト固有になり得るし、アプリケーションはalIsExtensionPresent関数がAL_TRUEを返さない限り使用可能になっているエクステンションを係数する事は出来ません。さらにアプリケーションはコンテキスト毎にポインタを保持しなければなりません。

ALboolean alIsExtensionPresent(const ALchar *extName);

もし与えられたエクステンションが現在のコンテキストにおいてサポートされている場合、AL_TRUEを返します。それ以外の場合AL_FALSEを返します。 extNameは大文字小文字を問わず、実装が内部的に全て大文字に変換するでしょう。(そして大文字でエクステンション名が表現されるでしょう。)

第2節 関数のエントリポイントを取得する

void *alGetProcAddress(const ALchar *funcName);

もしfuncNameという名前のエントリポイントが見つけられなかった場合、NULLを返します。実装はもしエントリポイントが存在するが、現在コンテキストに適していない場合NULLを返してもかまいません。けれども、仕様はこの振る舞いを保証はしません。

アプリケーションはエクステンションではなく、コアAPIのエントリポイントを得るのにalGetProcAddress関数を使う事が出来ます。これはサウンドドライバにあわせOpenAL DLLを動的ロード/アンロードするさいに推奨された方法です。

第3節 列挙子を取得する

エクステンションの、列挙子の値をえるには、アプリケーションはエクステンショントークによりalGetEnumValue関数を使う必要があります。列挙子の値はOpenAL名前空間の中に定義され、コアAPIおよびエクステンションの仕様に従い割り当てられます。それゆえ、コンテキスト独立です。

ALuint alGetEnumValue(const ALchar *enumName);

もし列挙子が見つからなかった場合0が返され、AL_INVALID_VALUEエラー状態がセットされます。

列挙子の値が存在するという事は、現在のコンテキストにおいてエクステンションが適用出来るという事を保証する訳ではありません。非ゼロの戻り値はただ単に、実装がこのエクステンションの存在に気づいているという事のみを示しています。