目次 - API(機能別) - 再生と録音 - SDL_LoadWAV_RW

# SDL_LoadWAV_RW

データソースからWAVEを読み込む. freesrcが0以外のとき自動的に解放する

## 構文

`SDL_AudioSpec* SDL_LoadWAV_RW(SDL_RWops* src, int freesrc, SDL_AudioSpec* spec, Uint8** audio_buf, Uint32* audio_len)`

## 引数

src | WAVEファイルのデータソース. ファイルI/Oを参照すること
freesrc | 0でないとき自動的にデータソースを解放する
spec | WAVEファイルの形式を代入するSDL_AudioSpec
audio_buf | 音声バッファ
audio_len | 音声バッファのバイト数

## 戻り値

この関数は呼び出しに成功すると, 元のWAVEの音声データが設定されたSDL_AudioSpecを戻す. audio_bufには音声データが確保されたバッファへのポインタが, audio_lenには音声バッファのバイト長が代入される.

WAVEファイルを開けない, 不明な形式, または壊れている場合はNULLを戻す. SDL_GetError()を呼んで詳細を知ることができる.

アプリケーションが戻されたaudio_bufを使った後は, SDL_FreeWAV()を呼んで解放する必要がある.

## サンプルコード

``

    extern SDL_RWops *myRWops;
    SDL_AudioSpec wav_spec;
    Uint32 wav_length;
    Uint8 *wav_buffer;

    /* WAVを読み込む */
    if (SDL_LoadWAV_RW(myRWops, 1, &wav_spec, &wav_buffer, &wav_length) == NULL) {
        fprintf(stderr, "test.wavを読み込めなかった: %s\n", SDL_GetError());
    } else {
        /* ここでWAVデータを処理する. そして... */
        SDL_FreeWAV(wav_buffer);
    }

## 詳細

WAVEファイルをロードするには, src, spec, audio_buf, audio_lenへのポイントが必要である. その後, ファイルのデータ部分がメモリに読み込まれ, 必要ならばデコードされる.

freesrcが0でないとき, 関数から戻る前にデータソースは自動的にクローズされ解放される.

対応しているフォーマットは, PCM(8, 16, 24, 32ビット), IEEE浮動小数点(32ビット), Microsoft ADPCMとIMA ADPCM(4ビット), A-lawとμ-law(8ビット)である. 他のフォーマットには現時点では対応しておらずエラーとなる.

この関数は呼び出しに成功すると, 元のWAVEの音声データが設定されたSDL_AudioSpecを戻す. audio_bufには音声データが確保されたバッファへのポインタが, audio_lenには音声バッファのバイト長が代入される. SDL_AudioSpecのメンバのfreq, channels, formatには, バッファ内の音声データの値が代入される. samplesメンバにはデフォルトが, 他には0が代入される.

使った後は音声バッファをSDL_FreeWAV()で解放する必要がある.

.WAVファイルフォーマットの仕様が不完全なため, デコーダが厳密に解釈すると, 広く出回っている問題のあるファイルを再生できない. これらのファイルを再生するため, デコーダはファイル, factチャンク, RIFFチャンクサイズの切り捨てを認めている. SDL_HINT_WAVE_RIFF_CHUNK_SIZE, SDL_HINT_WAVE_TRUNCATION, SDL_HINT_WAVE_FACT_CHUNKヒントでロード時の振る舞いを調整できる.

不正な(切り捨て, 破損, ヘッダの不正な値), または大きすぎる, または対応していないファイルは全てエラーとなる. また, データソースの致命的なI/Oエラーは, 読み込みを中断してエラーとなる. いずれのエラーの場合もNULLを戻し(srcがNULLの場合を除く), 適当なエラーメッセージが設定される.

データソースはシークに対応している必要がある.

例:
``

    SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, &spec, &buf, &len);

SDL_LoadWAVマクロでも同じことができるが, より単純である:
``

    SDL_LoadWAV("sample.wav", &spec, &buf, &len);

## バージョン

SDL 2.0.0以降

## 関連項目(関数)

SDL_FreeWAV
SDL_LoadWAV

## SDL Wikiへのリンク

SDL_LoadWAV_RW - SDL Wiki