diff --git a/examples/playwave.c b/examples/playwave.c index 3251dd33..43fe5bed 100644 --- a/examples/playwave.c +++ b/examples/playwave.c @@ -77,7 +77,7 @@ static void test_versions(void) } static int channel_is_done = 0; -static void SDLCALL channel_complete_callback (int chan) +static void SDLCALL channel_complete_callback (void *userdata, int chan) { if (verbose) { Mix_Chunk *done_chunk = Mix_GetChunk(chan); @@ -86,6 +86,8 @@ static void SDLCALL channel_complete_callback (int chan) SDL_Log(" Which %s correct.\n", (g_wave == done_chunk) ? "is" : "is NOT"); } channel_is_done = 1; + + (void) userdata; /* rcg06192001 unused */ } /* rcg06192001 abstract this out for testing purposes. */ @@ -415,7 +417,7 @@ int main(int argc, char *argv[]) flip_sample(g_wave); } - Mix_ChannelFinished(channel_complete_callback); + Mix_ChannelFinished(NULL, channel_complete_callback); if ((!Mix_SetReverseStereo(MIX_CHANNEL_POST, reverse_stereo)) && (reverse_stereo)) diff --git a/include/SDL3_mixer/SDL_mixer.h b/include/SDL3_mixer/SDL_mixer.h index b912882e..3db1d078 100644 --- a/include/SDL3_mixer/SDL_mixer.h +++ b/include/SDL3_mixer/SDL_mixer.h @@ -1052,7 +1052,7 @@ extern SDL_DECLSPEC void SDLCALL Mix_HookMusicFinished(Mix_MusicFinishedCallback */ extern SDL_DECLSPEC void * SDLCALL Mix_GetMusicHookData(void); -typedef void (SDLCALL *Mix_ChannelFinishedCallback)(int channel); +typedef void (SDLCALL *Mix_ChannelFinishedCallback)(void *userdata, int channel); /** * Set a callback that runs when a channel has finished playing. @@ -1065,12 +1065,13 @@ typedef void (SDLCALL *Mix_ChannelFinishedCallback)(int channel); * * A NULL pointer will disable the callback. * + * \param userdata the user data to pass to the callback. * \param channel_finished the callback function to become the new * notification mechanism. * * \since This function is available since SDL_mixer 3.0.0. */ -extern SDL_DECLSPEC void SDLCALL Mix_ChannelFinished(Mix_ChannelFinishedCallback channel_finished); +extern SDL_DECLSPEC void SDLCALL Mix_ChannelFinished(void *userdata, Mix_ChannelFinishedCallback channel_finished); /** * Magic number for effects to operate on the postmix instead of a channel. diff --git a/src/mixer.c b/src/mixer.c index 6f548e3f..ddfdd178 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -100,6 +100,7 @@ static void *mix_postmix_data = NULL; /* rcg07062001 callback to alert when channels are done playing. */ static Mix_ChannelFinishedCallback channel_done_callback = NULL; +static void *channel_done_callback_userdata = NULL; /* Support for user defined music functions */ static Mix_MixCallback mix_music = music_mixer; @@ -291,7 +292,7 @@ static bool _Mix_remove_all_effects(int channel, effect_info **e); static void _Mix_channel_done_playing(int channel) { if (channel_done_callback) { - channel_done_callback(channel); + channel_done_callback(channel_done_callback_userdata, channel); } /* @@ -1023,10 +1024,11 @@ void *Mix_GetMusicHookData(void) return music_data; } -void Mix_ChannelFinished(Mix_ChannelFinishedCallback channel_finished) +void Mix_ChannelFinished(void *userdata, Mix_ChannelFinishedCallback channel_finished) { Mix_LockAudio(); channel_done_callback = channel_finished; + channel_done_callback_userdata = userdata; Mix_UnlockAudio(); }