diff --git a/src/audio/alsa/SDL_alsa_audio.c b/src/audio/alsa/SDL_alsa_audio.c index e9f672f8c..56e55cd25 100644 --- a/src/audio/alsa/SDL_alsa_audio.c +++ b/src/audio/alsa/SDL_alsa_audio.c @@ -241,37 +241,37 @@ ALSA_WaitDevice(_THIS) * "For Linux ALSA, this is FL-FR-RL-RR-C-LFE * and for Windows DirectX [and CoreAudio], this is FL-FR-C-LFE-RL-RR" */ -#define SWIZ6(T) \ - T *ptr = (T *) this->hidden->mixbuf; \ +#define SWIZ6(T, buf, numframes) \ + T *ptr = (T *) buf; \ Uint32 i; \ - for (i = 0; i < this->spec.samples; i++, ptr += 6) { \ + for (i = 0; i < numframes; i++, ptr += 6) { \ T tmp; \ tmp = ptr[2]; ptr[2] = ptr[4]; ptr[4] = tmp; \ tmp = ptr[3]; ptr[3] = ptr[5]; ptr[5] = tmp; \ } static SDL_INLINE void -swizzle_alsa_channels_6_64bit(_THIS) +swizzle_alsa_channels_6_64bit(void *buffer, Uint32 bufferlen) { - SWIZ6(Uint64); + SWIZ6(Uint64, buffer, bufferlen); } static SDL_INLINE void -swizzle_alsa_channels_6_32bit(_THIS) +swizzle_alsa_channels_6_32bit(void *buffer, Uint32 bufferlen) { - SWIZ6(Uint32); + SWIZ6(Uint32, buffer, bufferlen); } static SDL_INLINE void -swizzle_alsa_channels_6_16bit(_THIS) +swizzle_alsa_channels_6_16bit(void *buffer, Uint32 bufferlen) { - SWIZ6(Uint16); + SWIZ6(Uint16, buffer, bufferlen); } static SDL_INLINE void -swizzle_alsa_channels_6_8bit(_THIS) +swizzle_alsa_channels_6_8bit(void *buffer, Uint32 bufferlen) { - SWIZ6(Uint8); + SWIZ6(Uint8, buffer, bufferlen); } #undef SWIZ6 @@ -282,18 +282,16 @@ swizzle_alsa_channels_6_8bit(_THIS) * channels from Windows/Mac order to the format alsalib will want. */ static SDL_INLINE void -swizzle_alsa_channels(_THIS) +swizzle_alsa_channels(_THIS, void *buffer, Uint32 bufferlen) { if (this->spec.channels == 6) { - const Uint16 fmtsize = (this->spec.format & 0xFF); /* bits/channel. */ - if (fmtsize == 16) - swizzle_alsa_channels_6_16bit(this); - else if (fmtsize == 8) - swizzle_alsa_channels_6_8bit(this); - else if (fmtsize == 32) - swizzle_alsa_channels_6_32bit(this); - else if (fmtsize == 64) - swizzle_alsa_channels_6_64bit(this); + switch (SDL_AUDIO_BITSIZE(this->spec.format)) { + case 8: swizzle_alsa_channels_6_8bit(buffer, bufferlen); break; + case 16: swizzle_alsa_channels_6_16bit(buffer, bufferlen); break; + case 32: swizzle_alsa_channels_6_32bit(buffer, bufferlen); break; + case 64: swizzle_alsa_channels_6_64bit(buffer, bufferlen); break; + default: SDL_assert(!"unhandled bitsize"); break; + } } /* !!! FIXME: update this for 7.1 if needed, later. */ @@ -303,19 +301,18 @@ swizzle_alsa_channels(_THIS) static void ALSA_PlayDevice(_THIS) { - int status; const Uint8 *sample_buf = (const Uint8 *) this->hidden->mixbuf; - const int frame_size = (((int) (this->spec.format & 0xFF)) / 8) * + const int frame_size = (((int) SDL_AUDIO_BITSIZE(this->spec.format)) / 8) * this->spec.channels; snd_pcm_uframes_t frames_left = ((snd_pcm_uframes_t) this->spec.samples); - swizzle_alsa_channels(this); + swizzle_alsa_channels(this, this->hidden->mixbuf, frames_left); while ( frames_left > 0 && SDL_AtomicGet(&this->enabled) ) { /* !!! FIXME: This works, but needs more testing before going live */ /* ALSA_snd_pcm_wait(this->hidden->pcm_handle, -1); */ - status = ALSA_snd_pcm_writei(this->hidden->pcm_handle, - sample_buf, frames_left); + int status = ALSA_snd_pcm_writei(this->hidden->pcm_handle, + sample_buf, frames_left); if (status < 0) { if (status == -EAGAIN) {