[SDL] Mix_ChannelFinished and OO

Ryan C. Gordon icculus at clutteredmind.org
Fri Sep 6 17:55:01 PDT 2002


> 		void (SoundEffect::*done)(int);
> 		done = &SoundEffect::onDone;
> 		Mix_ChannelFinished(done);
>
> Clearly this does not work as the parameter to the Mix_ChannelFisished
> is : void (*channel_finished)(int channel))
>
> Any thoughts and suggestions would be gladly appreciated.

You need to have a static method, so the hidden "this" pointer isn't part
of the function signature.

You'll probably need to do something like:

#define MAX_CHANNELS 16  // you can make this dynamic if you want.


class SoundEffect
{
	static SoundEffect *handlers[MAX_CHANNELS];
        static void catchChannelDone(int chan);
	// etc.
};


SoundEffect *SoundEffect::handlers[MAX_CHANNELS];
void SoundEffect::catchChannelDone(int chan)
{
	handlers[chan]->onDone();
	handlers[chan] = NULL;
}


...which is lame. A better solution is (ack!) to break backwards
compatibility and add an argumentto Mix_ChannelFinished():

SoundEffect::SoundEffect(blah)
{
	Mix_ChannelFinished(SoundEffect::catchChannelDone, this);
}

and then catchChannelDone would take an int and a void *:


void SoundEffect::catchChannelDone(int chan, void *arg)
{
	((SoundEffect *) arg)->onDone();
}


Thoughts? I'm more inclined to support backwards compatibility for now,
but tear this up for SDL_mixer 2.0.

--ryan.









More information about the SDL mailing list