我正在使用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
中存储成员函数的指针?
答案 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)
我已将成员函数callback
设为静态,并将this
用作userdata。
这解决了我的问题,谢谢。