指向sdl音频回调的成员函数的指针

时间:2013-05-30 14:31:29

标签: c++ pointers callback sdl member

我正在使用SDL lib(版本1.2.15)。我尝试播放来自libav(ffmpeg)的音频,如本例here中所示。

我宣布了一个播放声音的课程。但现在我必须在SDL_AudioSpec::callback(在示例wanted_spec.callback中)存储回调函数的指针。但我的回调是我班上的一员。

sdl中的回调指针是:

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

其中SDLCALL为__cdecl

如何在我的wanted_spec_.callback中存储成员函数的指针?

2 个答案:

答案 0 :(得分:4)

如果要使用非静态成员函数来处理回调,则需要提供转发函数并将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;

答案 1 :(得分:-1)

正如ScottMcP-MVP在评论中提到的那样:

我已将成员函数callback设为静态,并将this用作userdata。 这解决了我的问题,谢谢。