2013-05-30 46 views
0

我正在使用SDL lib(版本1.2.15)。我嘗試播放libav(ffmpeg)中的音頻,例如here指向sdl_audio回調成員函數的指針

我已經宣佈一個類播放聲音。但現在我必須在SDL_AudioSpec::callback(在示例wanted_spec.callback)中存儲回調函數的指針。但我的回撥是我班的一員。

在SDL回調指針是:

void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len); 

其中SDLCALL是__cdecl

如何在我的wanted_spec_.callback中存儲成員函數的指針?

+3

回調函數必須聲明爲靜態。但是userdata參數可以包含指向你的對象的'this'指針。將其轉換爲對象指針並使用它來調用非靜態成員函數。 –

+0

剛剛嘗試過。似乎工作:D謝謝。使它成爲答案... – user1810087

回答

-1

爲ScottMcP-MVP在他的評論中提到:

我所做的成員函數callback靜態和使用this作爲用戶數據。 這解決了我的問題,謝謝。

3

如果要使用非靜態成員函數處理回調,則需要提供轉發功能並將userdata設置爲指向目標對象的指針。

struct CallbackObject 
{ 
    void onCallback(Uint8 *stream, int len) 
    { 
     // .... 
    } 

    static void forwardCallback(void *userdata, Uint8 *stream, int len) 
    { 
     static_cast<CallbackObject*>(userdata)->onCallback(stream, len); 
    } 
}; 



SDL_AudioSpec audio; 
CallbackObject callbackObject; 

audio.callback = CallbackObject::forwardCallback; 
audio.userdata = &callbackObject; 
+0

不錯的方法,但我寧願使用ScottMcP-MVP的指針變體。 – user1810087