bool SDL_SetAudioPostmixCallback(SDL_AudioDeviceID devid, SDL_AudioPostmixCallback callback, void *userdata);
| SDL_AudioDeviceID | devid | オープンしたオーディオデバイス |
| SDL_AudioIterationCallback | callback | 呼ばれるコールバック関数. NULLも可 |
| void * | userdata | アプリケーションがコールバックに渡すポインタ. NULLも可 |
(bool) 成功のとき真, 失敗のとき偽を戻す. SDL_GetError()を呼んで詳細を知ることができる.
これは, 例えばビジュアライザーの書き込みや, 再生前のオーディオデータに最後のエフェクトを適用させるような, 最後のミックスにアクセスしたい場合に有用である.
このバッファはオープンされたデバイスにバインドされた全てのオーディオストリームを最終的にミックスしたものである. このコールバックは, 通常はオープンされ一時停止中でない各オーディオデバイスで呼ばれる. デバイスにストリームがバインドされていない, または全てのストリームが空のどちらの理由でも, ミックスすべき新しいデータがない場合でもコールバックはバッファ全体に無音が設定された状態で呼ばれる.
このコールバックでデータを変更できる. この呼び出しの後のバッファの内容がハードウェアに送られる最終的なデータである.
このコールバックには常に浮動小数点形式のデータ(-1.0fから1.0fの値)が渡されるが, デバイスをオープンしたときアプリケーションが要求したチャネル数やサンプルレートとは異なる場合がある. SDLが背後で変換している, システムのデフォルトが変わったとき再生が新しい物理ハードウェアに切り替わっているなどためである. この変更は呼び出しと呼び出しの間に行われる. そのため, バッファのサイズも呼び出しのたびに変わる可能性がある.
これらのコールバックは, いつでも, どのスレッドからも実行されうる. アプリケーションのデータへのアクセスを直列化する必要がある場合は, ミューテックスやその他のデバイスの直列化を使用する必要がある.
結論として, このコールバックは多くの要望を満たせるが, 簡単な方法ではない. アプリケーションはSDL_AudioStreamに好ましい形式でオーディオデータを渡し, 差異はSDLに扱わせるべきである.
こののコールバックには強い時間の制約があり, 可能な限り処理を少なくしてすぐに戻らなければならない. コールバックの実行が長くなるほど音声の欠落や他の問題を引き起こす危険性が高くなる.
この関数はオーディオデバイスの繰り返し処理の間はブロックする. そのため, 既にある実行しようとしているコールバックは, この関数で新しいコールバックを設定して戻る前に実行される.
コールバック関数としてNULLを設定すると, 以前のコールバックが無効になる.
この関数はどのスレッドからも安全に呼べる.