*** SDL_mixer-1.2.4/mixer.c 2002-05-19 15:50:35.000000000 -0500 --- SDL_mixer-1.2.4_mod/mixer.c 2007-01-16 02:00:36.486695232 -0600 *************** *** 52,57 **** --- 52,58 ---- static struct _Mix_Channel { Mix_Chunk *chunk; + Mix_Chunk *next_chunk; int playing; int paused; Uint8 *samples; *************** *** 201,232 **** mix_channel[i].samples += mixable; mix_channel[i].playing -= mixable; ! /* If looping the sample and we are at its end, make sure we will still return a full buffer */ ! while ( mix_channel[i].looping && mixable < len ) { ! int remaining = len - mixable; ! int alen = mix_channel[i].chunk->alen; ! if (remaining > alen) { ! remaining = alen; ! } ! ! mix_input = Mix_DoEffects(i, mix_channel[i].chunk->abuf, remaining); ! SDL_MixAudio(stream+mixable, mix_input, remaining, volume); ! if (mix_input != mix_channel[i].chunk->abuf) ! free(mix_input); ! --mix_channel[i].looping; ! mix_channel[i].samples = mix_channel[i].chunk->abuf + remaining; ! mix_channel[i].playing = mix_channel[i].chunk->alen - remaining; ! mixable += remaining; } ! if ( ! mix_channel[i].playing && mix_channel[i].looping ) { ! if ( --mix_channel[i].looping ) { ! mix_channel[i].samples = mix_channel[i].chunk->abuf; ! mix_channel[i].playing = mix_channel[i].chunk->alen; ! } } - /* rcg06072001 Alert app if channel is done playing. */ if (!mix_channel[i].playing) { _Mix_channel_done_playing(i); --- 202,239 ---- mix_channel[i].samples += mixable; mix_channel[i].playing -= mixable; ! /* If looping the sample or if another chunk is queued and we are at the end, make sure we will still return a full buffer */ ! while ( (mix_channel[i].next_chunk || mix_channel[i].looping) && mixable < len ) { ! if(mix_channel[i].next_chunk) { ! mix_channel[i].chunk = mix_channel[i].next_chunk; ! } ! else { --mix_channel[i].looping; ! } ! int remaining = len - mixable; ! int alen = mix_channel[i].chunk->alen; ! if (remaining > alen) { ! remaining = alen; ! } ! SDL_MixAudio(stream+mixable, mix_channel[i].chunk->abuf, remaining, volume); ! mix_channel[i].samples = mix_channel[i].chunk->abuf + remaining; ! mix_channel[i].playing = mix_channel[i].chunk->alen - remaining; ! mixable += remaining; } ! if ( !mix_channel[i].playing) { ! if (mix_channel[i].next_chunk) { ! mix_channel[i].chunk = mix_channel[i].next_chunk; ! mix_channel[i].next_chunk = NULL; ! mix_channel[i].samples = mix_channel[i].chunk->abuf; ! mix_channel[i].playing = mix_channel[i].chunk->alen; ! _Mix_channel_done_playing(i); // Alert app that chunk is done playing. ! } ! else if(mix_channel[i].looping && --mix_channel[i].looping) { ! mix_channel[i].samples = mix_channel[i].chunk->abuf; ! mix_channel[i].playing = mix_channel[i].chunk->alen; ! } } /* rcg06072001 Alert app if channel is done playing. */ if (!mix_channel[i].playing) { _Mix_channel_done_playing(i); *************** *** 293,298 **** --- 300,306 ---- /* Clear out the audio channels */ for ( i=0; i