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

SDL_AudioSpec

音声出力形式の構造体. オーディオデバイスが更なるデータを要求する場合に呼ぶコールバック関数もここに記述する.

フィールド

intfreqDSP周波数 (1秒あたりのサンプル数) (詳細を参照すること)
SDL_AudioFormatformat音声データ形式 (詳細を参照すること)
Uint8channels分けられた音声チャネルの数 (1秒あたりのサンプル数)
Uint8silence無音の値 (計算される)
Uint16samples音声バッファの長さ (2のベキ乗) (詳細を参照すること)
Uint32size音声バッファのバイト数 (計算される)
SDL_AudioCallbackcallbackオーディオデバイスが更なるデータを要求した場合に呼ぶ関数 (詳細を参照すること)
void*userdatacallbackに渡されるポインタ (SDLはそれ以外は無視する)

サンプルコード

SDL_AudioSpec want, have;
SDL_AudioDeviceID dev;

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;  // 別の場所で関数を書く必要がある
dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE);

詳細

この構造体はSDL_OpenAudioDevice()SDL_LoadWAV()で使われる. SDL_OpenAudioDevice()は全てのフィールドを使う. SDL_LoadWAV()はfreq, format, channels, samplesを使う.

freqは1秒間にオーディオデバイスに送信するサンプルフレームの数である. よく使われる値は11025, 22050, 44100, 48000で, 値が大きいほど音がよくなる. 解像度が高いほどグラフィックがよくなるのと同じである.

formatは1サンプルのサイズと型を決める. SDL_AudioFormatの値の1つである.

channelsは出力するチャネルの数を決める. SDL2.0では, 1(モノラル), 2(ステレオ), 4(クアッド), 6(5.1)に対応している.

samplesは一度に出力する音声の長さを決める. SDL_OpenAudioDevice()で使う場合, この値は音声バッファのサンプルフレーム単位の長さになる. 1サンプルフレームは, formatで決まるサイズの音声データを, チャネル数だけ集めたものである. SDL_AudioSpecSDL_LoadWAV()で使われる場合, samplesは4096に設定される. このフィールドの値は2のベキ乗の必要がある.

silenceの値はSDL_OpenAudioDevice()によって計算される.

チャネルデータは交互に格納されている. ステレオの場合, 左/右の順である. クアッドの場合, 左前/右前/左後/右後の順である. 5.1の場合, 左前/右前/中央/低音/左後/右後の順である. (「低音」が「.1」スピーカー)

callbackの関数プロトタイプは
void SDL_AudioCallback(void* userdata, Uint8* stream, int len)

パラメータは
userdataアプリケーション固有のSDL_AudioSpecのuserdataフィールドに保存したパラメータ
streamSDL_AudioCallback()が設定する音声データバッファのポインタ
lenバッファのバイト長
コールバック関数から抜けると, バッファは無効になる.

コールバック関数はバッファを必ず完全に初期化しなければならない. SDL2.0では, コールバック関数が呼ばれる前にバッファは初期化されない. もし再生する音声がない場合は, コールバック関数はバッファをsilenceで満たさなければならない.

関連項目(関数)

SDL_LoadWAV
SDL_LoadWAV_RW
SDL_OpenAudioDevice

SDL Wikiへのリンク

SDL_AudioSpec - SDL Wiki