2013-05-30 1 views
0

SDL lib (버전 1.2.15)를 사용하고 있습니다. 나는이 예제에서처럼 libav (ffmpeg)에서 오디오를 재생하려고 시도한다 here.sdl_audio 콜백의 memberfunction에 대한 포인터

나는 사운드를 재생하기위한 클래스를 선언했습니다. 하지만 이제는 SDL_AudioSpec::callback (예 : wanted_spec.callback)에 콜백 함수에 대한 포인터를 저장해야합니다. 하지만 내 콜백은 내 수업의 구성원입니다.

SDL의 콜백 포인터는 다음과 같습니다

SDLCALL이 __cdecl입니다
void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len); 

.

wanted_spec_.callback에 memberfunction의 포인터를 저장할 수 있습니까?

+3

콜백 함수는 정적으로 선언되어야합니다. 그러나 userdata 매개 변수에는 객체에 대한 'this'포인터가 포함될 수 있습니다. 객체 포인터로 캐스팅하고 비 정적 멤버 함수를 호출하는 데 사용합니다. –

+0

방금 ​​시도했습니다. 일하는 것처럼 보입니다. D 감사합니다. 대답으로 확인하십시오 ... – user1810087

답변

-1

. 내 문제가 해결되었습니다. 감사합니다.

3

비 정적 멤버 함수를 사용하여 콜백을 처리하려면 전달 함수를 제공하고 userdata을 대상 객체에 대한 포인터로 설정해야합니다. 내가 멤버 함수가 callback 정적 만들어 유저 데이터로 this를 사용했습니다

: ScottMcP - MVP는 그의 주석에서 언급 한 바와 같이

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