void SDL_MixAudioFormat(Uint8* dst, const Uint8* src, SDL_AudioFormat format, Uint32 len, int volume)
dst | ミキシングされた音声の出力先 |
src | ミキシングする音声バッファ |
format | SDL_AudioFormat |
len | 音声バッファのバイト長 |
volume | 0〜128の範囲, SDL_MIX_MAXVOLUMEのとき最大ボリューム |
void myAudioCallback(void *udata, Uint8 *stream, int len)
{
extern SDL_AudioFormat deviceFormat;
extern const Uint8 *mixData;
SDL_memset(stream, 0, len); // 無音にする
// 無音に対してあなたの音声データを50%のボリュームでミキシングする
SDL_MixAudioFormat(stream, mixData, deviceFormat, len, SDL_MIX_MAXVOLUME / 2);
}
受け取った形式formatのバイト長lenの音声バッファsrcを, ボリュームの調整とオーバーフローのクリップを行い, ミキシングしてdstに書き込む. dstバッファも, バイト長lenで形式formatの必要がある.
この関数は簡便さのために提供されている -- 自分で音声データをミキシングすることもできる.
この関数を3つ以上のサンプルデータのストリームをミキシングするために使ってはならない. この関数を繰り返し使うと, 出力はクリップによって劣化する. 入力より広い範囲に増幅することはないためである(これを行うのは非効率である).
この関数は, コールバック関数の中で出力ストリームに音声データを書くために必要だとよく誤解される. それも可能だが, SDL_MixAudioFormat()は1つの音声ストリームのボリュームを調整してミキシングする場合のみ必要である.