2012-08-02 173 views
1

我正在嘗試爲我的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_InitSDL_INIT_EVERYTHING一起被調用。然後圖形完全初始化(SDL_SetVideoMode等),然後音頻系統用上面的代碼初始化。

有沒有可能以某種方式編譯SDL而無需音頻支持? (有沒有辦法檢查音頻是否啓用或者它是否使用某種空音頻設備?)

回答

0

爲什麼@ audioStep @應該被調用,如果您從不播放聲音?沒有什麼可做的。

Using SDL Sound

+0

應調用回調函數來填充聲音緩衝區,無論是否使用SDL的示例播放例程。我引用了您鏈接的頁面:「在調用SDL_PauseAudio(0)之前,音頻不會真正開始播放。」我在上面的代碼中這樣做。 – Kaganar 2012-08-13 14:18:11

+0

對不起,我看不到,你在哪裏填充緩衝區/開始播放。 我在myApplication中查看並放入一些printf的內部。如果我填充緩衝區並開始播放,我的回叫將被調用。 – Thomas 2012-08-22 05:27:15

1

我在SDL.NET工作的代碼,所以也許這將幫助。我發現我必須打開一個視頻窗口:

SdlDotNet.Graphics.Video.SetVideoMode(1, 1); 
    SdlDotNet.Audio.Mixer.OpenAudio(stream); 
    // BUG: close (or hide) it 
    SdlDotNet.Graphics.Video.Close(); 

否則,它不會正確初始化。