我使用SDL 1.2.15来播放libav (ffmpeg)音频,就像这个例子一样。
我已经声明了一个类来播放声音。但是现在我必须在SDL_AudioSpec::callback
中存储回调函数的指针(在示例wanted_spec.callback
中)。但是我的回调是我的类的成员。
SDL中的回调指针是:
void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len);
式中SDLCALL
为__cdecl
。
如何在wanted_spec_.callback
中存储成员函数的指针?
如果你想使用非静态成员函数来处理回调,你需要提供一个转发函数,并将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;