我正在嘗試爲我的C++應用程序通過mingw32環境使用SDL流式傳輸音頻。從我的理解這是一個相當簡單的事:SDL音頻流回調函數從未觸發
extern "C" void audioStep(void* unused, Uint8* stream, int len);
void initAudio()
{
SDL_AudioSpec* fmt;
fmt = (SDL_AudioSpec*)malloc(sizeof(SDL_AudioSpec));
fmt->freq = 22050;
fmt->format = AUDIO_S16;
fmt->channels = 1;
fmt->samples = 8192;
fmt->callback = audioStep;
fmt->userdata = NULL;
SDL_AudioSpec obFmt;
if (SDL_OpenAudio(fmt, &obFmt) < 0)
{
fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError());
getchar();
exit(1);
}
SDL_PauseAudio(0);
}
.
.
.
extern "C" void audioStep(void* unused, Uint8* stream, int len)
{
// Do stuff.
}
我遇到的問題是,audioStep
似乎從來沒有被調用。在運行initAudio
之前SDL_Init
與SDL_INIT_EVERYTHING
一起被調用。然後圖形完全初始化(SDL_SetVideoMode
等),然後音頻系統用上面的代碼初始化。
有沒有可能以某種方式編譯SDL而無需音頻支持? (有沒有辦法檢查音頻是否啓用或者它是否使用某種空音頻設備?)
應調用回調函數來填充聲音緩衝區,無論是否使用SDL的示例播放例程。我引用了您鏈接的頁面:「在調用SDL_PauseAudio(0)之前,音頻不會真正開始播放。」我在上面的代碼中這樣做。 – Kaganar 2012-08-13 14:18:11
對不起,我看不到,你在哪裏填充緩衝區/開始播放。 我在myApplication中查看並放入一些printf的內部。如果我填充緩衝區並開始播放,我的回叫將被調用。 – Thomas 2012-08-22 05:27:15