*** ../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<num_channels; ++i ) {
  		mix_channel[i].chunk = NULL;
+ 		mix_channel[i].next_chunk = NULL;
  		mix_channel[i].playing = 0;
  		mix_channel[i].looping = 0;
  		mix_channel[i].volume = SDL_MIX_MAXVOLUME;
***************
*** 354,359 ****
--- 367,373 ----
  		int i;
  		for(i=num_channels; i < numchans; i++) {
  			mix_channel[i].chunk = NULL;
+ 			mix_channel[i].next_chunk = NULL;
  			mix_channel[i].playing = 0;
  			mix_channel[i].looping = 0;
  			mix_channel[i].volume = SDL_MIX_MAXVOLUME;
***************
*** 820,825 ****
--- 834,847 ----
  	return(prev_volume);
  }
  
+ /* Queue audio chunk to channel */
+ int Mix_QueueChannel(int which, Mix_Chunk *chunk)
+ {
+ 	mix_channel[which].next_chunk = chunk;
+ 	return(0);
+ }
+ 
+ 
  /* Halt playing of a particular channel */
  int Mix_HaltChannel(int which)
  {
