Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Merged Ryan's 5.1 audio fix from SDL 1.2
Browse files Browse the repository at this point in the history
  • Loading branch information
slouken committed Jun 23, 2006
1 parent e317642 commit f06c49d
Showing 1 changed file with 67 additions and 2 deletions.
69 changes: 67 additions & 2 deletions src/audio/alsa/SDL_alsa_audio.c
Expand Up @@ -351,15 +351,81 @@ ALSA_WaitAudio(_THIS)
}
}


/*
* http://bugzilla.libsdl.org/show_bug.cgi?id=110
* "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 *) mixbuf; \
const Uint32 count = (this->spec.samples / 6); \
Uint32 i; \
for (i = 0; i < count; 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 __inline__ void
swizzle_alsa_channels_6_64bit(_THIS)
{
SWIZ6(Uint64);
}
static __inline__ void
swizzle_alsa_channels_6_32bit(_THIS)
{
SWIZ6(Uint32);
}
static __inline__ void
swizzle_alsa_channels_6_16bit(_THIS)
{
SWIZ6(Uint16);
}
static __inline__ void
swizzle_alsa_channels_6_8bit(_THIS)
{
SWIZ6(Uint8);
}

#undef SWIZ6


/*
* Called right before feeding this->mixbuf to the hardware. Swizzle channels
* from Windows/Mac order to the format alsalib will want.
*/
static __inline__ void
swizzle_alsa_channels(_THIS)
{
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);
}

/* !!! FIXME: update this for 7.1 if needed, later. */
}


static void
ALSA_PlayAudio(_THIS)
{
int status;
int sample_len;
signed short *sample_buf;

swizzle_alsa_channels(this);

sample_len = this->spec.samples;
sample_buf = (signed short *) mixbuf;

while (sample_len > 0) {
status =
SDL_NAME(snd_pcm_writei) (pcm_handle, sample_buf, sample_len);
Expand All @@ -372,8 +438,7 @@ ALSA_PlayAudio(_THIS)
do {
SDL_Delay(1);
status = SDL_NAME(snd_pcm_resume) (pcm_handle);
}
while (status == -EAGAIN);
} while (status == -EAGAIN);
}
if (status < 0) {
status = SDL_NAME(snd_pcm_prepare) (pcm_handle);
Expand Down

0 comments on commit f06c49d

Please sign in to comment.