diff -up xmms-1.2.11-20071117cvs/Output/alsa/audio.c.fix-loop xmms-1.2.11-20071117cvs/Output/alsa/audio.c
--- xmms-1.2.11-20071117cvs/Output/alsa/audio.c.fix-loop	2006-07-25 17:45:08.000000000 -0400
+++ xmms-1.2.11-20071117cvs/Output/alsa/audio.c	2011-07-15 16:05:55.805328775 -0400
@@ -807,7 +807,7 @@ static void *alsa_loop(void *arg)
 	unsigned short *revents;
 
 	if (npfds <= 0)
-		goto _error;
+		goto _cleanup;
 	pfds = alloca(sizeof(*pfds) * npfds);
 	revents = alloca(sizeof(*revents) * npfds);
 	while (going && alsa_pcm)
@@ -828,16 +828,34 @@ static void *alsa_loop(void *arg)
 				int i;
 				snd_pcm_poll_descriptors_revents(alsa_pcm, pfds,
 								 npfds, revents);
-				for (i = 0; i < npfds; i++)
+				for (i = 0; i < npfds; i++) 
+				{
 					if (revents[i] & POLLOUT)
 					{
+						debug("calling alsa_write_out_thread_data()");
 						alsa_write_out_thread_data();
+						debug("done with alsa_write_out_thread_data, break!");
 						break;
-					}
+					} 
+					debug("Still in the for loop");
+				}
+				debug("Out of the for loop, but still in the if poll.");	
 			}
+			debug("Still in the not-paused not-prebuffer conditional");
 		}
 		else
-			xmms_usleep(10000);
+		{
+			if (paused)
+				debug("Sorry, I'm paused. Taking a little nap.");
+			if (prebuffer)
+				debug("Buffering like Real Player.");
+			if (paused || prebuffer) {
+				xmms_usleep(10000);
+			} else {
+				debug("All done!");
+				goto _cleanup;
+			}
+		}
 
 		if (pause_request != paused)
 			alsa_do_pause(pause_request);
@@ -850,11 +868,12 @@ static void *alsa_loop(void *arg)
 		}
 	}
 
- _error:
+ _cleanup:
 	alsa_close_pcm();
 	g_free(thread_buffer);
 	thread_buffer = NULL;
 	pthread_exit(NULL);
+	return;
 }
 
 /* open callback */
@@ -901,6 +920,7 @@ int alsa_open(AFormat fmt, int rate, int
 	flush_request = -1;
 	
 	pthread_create(&audio_thread, NULL, alsa_loop, NULL);
+	debug("Do we get here?");
 	return 1;
 }
 
