1

我正在使用 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?

4

1 回答 1

7

如果要使用非静态成员函数来处理回调,则需要提供转发函数并设置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;
于 2013-05-30T14:41:49.073 回答