忍者ブログ

Memeplexes

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

OpenAL Alutのエラー・ハンドリング [C#]

ALUTでのエラーの扱いについてメモしておきます


ALUTにはエラー関係の関数が2つあるようです。
1つはエラーの定数を取得する関数で、もう1つはその定数から説明をあらわす文字列を取得する関数です。

alutGetError
alutの関数は失敗したときにNULLを返し、どこかにあるグローバル変数にエラー定数をセットするそうです。
で、どのようなエラー定数がセットされたのかを調べる関数がこのalutGetErrorです。

ALenum alutGetError();

戻り値はエラーを表す定数で、以下のものがあるそうです:
ドキュメントを適当に訳しました(本当に適当ですよ)

定数名 説明
ALUT_ERROR_NO_ERROR エラーはありません。 0
ALUT_ERROR_OUT_OF_MEMORY メモリが足りません。 0x200
ALUT_ERROR_INVALID_ENUM Alutの関数に不正な定数が与えられました。 0x201
ALUT_ERROR_INVALID_VALUE Alutの関数に不正な値が与えられました。 0x202
ALUT_ERROR_INVALID_OPERATION 行った操作は現在のALUTの状態では不正です。 0x203
ALUT_ERROR_NO_CURRENT_CONTEXT 現在のコンテキストがセットされていません。(alutInitを呼べば自動的にコンテキストはセットされるのでこれはあまり気にしなくていいでしょう) 0x204
ALUT_ERROR_AL_ERROR_ON_ENTRY ALUT関数へのエントリーにすでにALエラーがあります。
(なんのこっちゃ)
0x205
ALUT_ERROR_ALC_ERROR_ON_ENTRY ALUT関数へのエントリーにすでにALCえらーがあります。 0x206
ALUT_ERROR_OPEN_DEVICE ALCデバイスを開く上でエラーがありました。 0x207
ALUT_ERROR_CLOSE_DEVICE ALCデバイスを閉じる上でエラーがありました。 0x208
ALUT_ERROR_CREATE_CONTEXT Contextを生成する上でエラーがありました。 0x209
ALUT_ERROR_MAKE_CONTEXT_CURRENT 現在のContextを変更できませんでした。 0x20A
ALUT_ERROR_DESTROY_CONTEXT Contextを破壊する上でエラーがありました。 0x20B
ALUT_ERROR_GEN_BUFFERS AL Bufferを生成するのにエラーがありました。 0x20C
ALUT_ERROR_BUFFER_DATA バッファ・データをALに送る途中でエラーがありました。 0x20D
ALUT_ERROR_IO_ERROR I/Oエラー。より詳しくはerrnoを。 0x20E
ALUT_ERROR_UNSUPPORTED_FILE_TYPE サポートされていないファイルタイプです。 0x20F
ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE ファイルタイプは大丈夫ですが、サポートされていないモードです。 0x210
ALUT_ERROR_CORRUPT_OR_TRUNCATED_DATA サウンドデータに間違いがあるか、欠けています 0x211


alutGetErrorString
alutGetErrorで返された定数はそのままでは人間には理解しがたいため、これをわかりやすい文字列に変換する必要があります。
数値の定数から文字列への変換をやってくれるのが、alutGetErrorString関数です。

const char *alutGetErrorString ( ALenum error);

引数はエラーを表す定数、戻り値はもちろん0で終わる文字列へのポインタです。

using System.Runtime.InteropServices;

enum AlutError
{
    ALUT_ERROR_NO_ERROR = 0,
    ALUT_ERROR_OUT_OF_MEMORY = 0x200,
    ALUT_ERROR_INVALID_ENUM,
    ALUT_ERROR_INVALID_VALUE,
    ALUT_ERROR_INVALID_OPERATION,
    ALUT_ERROR_NO_CURRENT_CONTEXT,
    ALUT_ERROR_AL_ERROR_ON_ENTRY,
    ALUT_ERROR_ALC_ERROR_ON_ENTRY,
    ALUT_ERROR_OPEN_DEVICE,
    ALUT_ERROR_CLOSE_DEVICE,
    ALUT_ERROR_CREATE_CONTEXT,
    ALUT_ERROR_MAKE_CONTEXT_CURRENT,
    ALUT_ERROR_DESTROY_CONTEXT,
    ALUT_ERROR_GEN_BUFFERS,
    ALUT_ERROR_BUFFER_DATA,
    ALUT_ERROR_IO_ERROR,
    ALUT_ERROR_UNSUPPORTED_FILE_TYPE,
    ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE,
    ALUT_ERROR_CORRUPT_OR_TRUNCATED_DATA
}

class Program
{
    [DllImport("alut")]
    static extern string alutGetErrorString(AlutError error);

    static void Main()
    {
        foreach (AlutError error in System.Enum.GetValues(typeof(AlutError)))
        {
            System.Console.WriteLine(error + " : " + alutGetErrorString(error));
        }

        System.Console.ReadLine();
    }
}


このサンプルを実行すると、定数とその説明をコンソールに表示します。

拍手[0回]

PR