typedef void (SDLCALL *SDL_AudioStreamCallback)(void *userdata, SDL_AudioStream *stream, int additional_amount, int total_amount);
void * | userdata | アプリケーションが使用するために渡した不透明ポインタ |
SDL_AudioStream * | stream | このコールバックに関連付けられたオーディオストリーム |
int | additional_amount | 現在必要なデータのバイト数 |
int | total_amount | 要求されたデータの総バイト数 |
アプリケーションはオーディオストリームにSDL_PutAudioStreamDataでデータを追加した, またはSDL_GetAudioStreamDataでデータを要求したとき呼ばれるコールバックを登録することができる(任意).
2つの値が提供される. 1つは現在の要求で必要な追加のデータの量(ストリームのデータが十分な場合は0もありうる)で, もう1つは要求される合計量である. 読み込みで呼び出されコールバックで書き込む場合(再生)は, 2つの値は異なる場合がある. 書き込みで呼び出されコールバックで読み込む場合(録音)は, 2つの値は常に同じである.
バイト数はバッファリングや再サンプリングの影響でやや大きい場合があり, 呼び出しごとに変化する場合もある.
このコールバックで必ず何かをしなければならないのではない. 一般的には, これは要求に応じてデータを追加したい/獲得したい場合に便利で, アプリケーションは必要な場合に読み書きを行えるが, システムはコールバックが何もしなくても利用可能なデータがあれば処理を続行する.
このコールバックはあらゆるスレッドで動作しうる. よって, 共通データを保護する必要がある場合は, SDL_LockAudioStreamでロックして直列化する必要がある. このロックはコールバックが呼ばれる前に行われるため, コールバック内で明示的にロックする必要はない.