diff src/audio/alsa/SDL_alsa_audio.c @ 4320:33d306630296 SDL-1.2

Corrected misuse of snd_pcm_writei() in ALSA driver. Hopefully fixes Bugzilla #650.
author Ryan C. Gordon <icculus@icculus.org>
date Mon, 12 Oct 2009 08:06:40 +0000
parents 464126f4c7db
children c9a1de1eda57
line wrap: on
line diff
--- a/src/audio/alsa/SDL_alsa_audio.c	Sat Oct 10 15:10:06 2009 +0000
+++ b/src/audio/alsa/SDL_alsa_audio.c	Mon Oct 12 08:06:40 2009 +0000
@@ -304,17 +304,18 @@
 
 static void ALSA_PlayAudio(_THIS)
 {
-	int           status;
-	int           sample_len;
-	signed short *sample_buf;
+	int status;
+	snd_pcm_uframes_t frames_left;
+	const Uint8 *sample_buf = (const Uint8 *) mixbuf;
+	const int frame_size = ( ((int) this->spec.channels) *
+	                         ((int) (this->spec.format & 0xFF)) );
 
 	swizzle_alsa_channels(this);
 
-	sample_len = this->spec.samples;
-	sample_buf = (signed short *)mixbuf;
+	frames_left = ((snd_pcm_uframes_t) this->spec.samples) / this->spec.channels;
 
-	while ( sample_len > 0 ) {
-		status = SDL_NAME(snd_pcm_writei)(pcm_handle, sample_buf, sample_len);
+	while ( frames_left > 0 ) {
+		status = SDL_NAME(snd_pcm_writei)(pcm_handle, sample_buf, frames_left);
 		if ( status < 0 ) {
 			if ( status == -EAGAIN ) {
 				SDL_Delay(1);
@@ -336,8 +337,8 @@
 			}
 			continue;
 		}
-		sample_buf += status * this->spec.channels;
-		sample_len -= status;
+		sample_buf += status * frame_size;
+		frames_left -= status;
 	}
 }