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

# SDL_OpenAudio

オーディオデバイスを開く古い関数. 新しいプログラムは代わりにSDL_OpenAudioDevice()を使う方がよい

## 構文

`int SDL_OpenAudio(SDL_AudioSpec* desired, SDL_AudioSpec* obtained)`

## 引数

desired | 要求する出力形式のSDL_AudioSpec
obtained | 実際のパラメータが代入されたSDL_AudioSpec, またはNULL

## 戻り値

この関数はオーディオデバイスを要求したパラメータで開く. 成功のとき0を戻し, 実際のハードウェアのパラメータをobtainedの示すポインタに書き込む.

obtainedがNULLの場合, コールバック関数に渡される音声データは要求した形式であることが保証されている. そして必要ならば実際のハードウェアの音声形式に自動的に変換される. obtainedがNULLの場合, desiredのフィールドが書き換えられる.

この関数はオーディオデバイスを開く, またはオーディオスレッドの設定に失敗したとき, 負の数のエラーコードを戻す. SDL_GetError()を呼んで詳細を知ることができる.

## サンプルコード

``

    SDL_AudioSpec want, have;

    SDL_memset(&want, 0, sizeof(want)); /* または SDL_zero(want); */
    want.freq = 48000;
    want.format = AUDIO_F32;
    want.channels = 2;
    want.samples = 4096;
    want.callback = MyAudioCallback;  // この関数はどこか別の場所に書く

    if (SDL_OpenAudio(&want, &have) < 0) {
        printf("オーディオを開けなかった: %s\n", SDL_GetError());
    } else {
        if (have.format != want.format)
            printf("32bit浮動小数点のオーディオ形式に対応していない\n");
        SDL_PauseAudio(0);  // 再生を開始する
        SDL_Delay(5000);  // コールバックで音声を5秒間再生する
        SDL_CloseAudio();
    }

## 詳細

この関数はSDL1.2との互換性のために残されている. しかし, SDL2の新しい関数よりもやや簡単に使えるという理由もある. オーディオデバイスを開く, 新しくより強力な推奨される方法は, SDL_OpenAudioDevice()を使うことである.

この関数は

`SDL_CloseAudioDevice(1);`

と同じである.

2つの異なる点がある.

- obtainedがNULLのとき, desiredが(変更されず)使われる. その場合, desiredのsilenceなどの値は正しい値に変更される. そして, SDLはアプリケーションの要求とハードウェアの違いを変換する.
- 戻された値は成功か失敗のいずれかで, デバイスのIDではない. よって, この関数では一度に1つのデバイスしか開けない.

## 関連項目(関数)

SDL_CloseAudio
SDL_LockAudio
SDL_PauseAudio
SDL_UnlockAudio

## SDL Wikiへのリンク

SDL_OpenAudio - SDL Wiki