alsa: Cleaned up the 5.1 swizzle mess a little. Shouldn't this be something ALSA handles for us with channel maps, so we can just delete this code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
diff --git a/src/audio/alsa/SDL_alsa_audio.c b/src/audio/alsa/SDL_alsa_audio.c
index e9f672f..56e55cd 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) {