*** ../SDL_mixer-1.2.7/mixer.c 2006-05-01 02:25:57.000000000 -0500 --- mixer.c 2007-01-16 15:36:50.537675656 -0600 *************** *** 55,60 **** --- 55,61 ---- static struct _Mix_Channel { Mix_Chunk *chunk; + Mix_Chunk *next_chunk; int playing; int paused; Uint8 *samples; *************** *** 212,249 **** mix_channel[i].playing -= mixable; index += mixable; ! /* rcg06072001 Alert app if channel is done playing. */ ! if (!mix_channel[i].playing && !mix_channel[i].looping) { _Mix_channel_done_playing(i); } } /* If looping the sample and we are at its end, make sure we will still return a full buffer */ ! while ( mix_channel[i].looping && index < len ) { int alen = mix_channel[i].chunk->alen; remaining = len - index; if (remaining > alen) { remaining = alen; } - mix_input = Mix_DoEffects(i, mix_channel[i].chunk->abuf, remaining); SDL_MixAudio(stream+index, 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; index += 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; ! } } - } } } --- 213,261 ---- mix_channel[i].playing -= mixable; index += mixable; ! /* rcg06072001 Alert app if channel is done playing ! or if the current chunk is done and next_chunk is queued. */ ! if (!mix_channel[i].playing && !mix_channel[i].looping && !mix_channel[i].next_chunk) ! { _Mix_channel_done_playing(i); } } /* If looping the sample and we are at its end, make sure we will still return a full buffer */ ! while ( (mix_channel[i].next_chunk || mix_channel[i].looping) && index < len ) { ! if(mix_channel[i].next_chunk) { ! mix_channel[i].chunk = mix_channel[i].next_chunk; ! } ! else { ! --mix_channel[i].looping; ! } int alen = mix_channel[i].chunk->alen; remaining = len - index; if (remaining > alen) { remaining = alen; } mix_input = Mix_DoEffects(i, mix_channel[i].chunk->abuf, remaining); SDL_MixAudio(stream+index, mix_input, remaining, volume); if (mix_input != mix_channel[i].chunk->abuf) free(mix_input); mix_channel[i].samples = mix_channel[i].chunk->abuf + remaining; mix_channel[i].playing = mix_channel[i].chunk->alen - remaining; index += 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_done_playing(i); ! mix_channel[i].samples = mix_channel[i].chunk->abuf; ! mix_channel[i].playing = mix_channel[i].chunk->alen; ! } ! 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; ! } } } } } *************** *** 312,317 **** --- 324,330 ---- /* Clear out the audio channels */ for ( i=0; i