From 1b7f9278af0727e1e2a7431d041572f2a8e1cd5c Mon Sep 17 00:00:00 2001 From: Giuliano Pochini Date: Mon, 28 Apr 2008 09:16:27 +0200 Subject: [PATCH] speaker-test.c - fix pink noise generator on big-endian archs This patch makes speaker-test fill the buffers with properly coded data on both big- and little-endian processors. Signed-off-by: Giuliano Pochini --- speaker-test/speaker-test.c | 52 +++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/speaker-test/speaker-test.c b/speaker-test/speaker-test.c index ce735de..22d13bf 100644 --- a/speaker-test/speaker-test.c +++ b/speaker-test/speaker-test.c @@ -259,7 +259,8 @@ static void generate_pink_noise( uint8_t *frames, int channel, int count) { while (count-- > 0) { for(chn=0;chn>16; +#if __BYTE_ORDER == __LITTLE_ENDIAN + *samp16++ = ires >> 16; +#elif __BYTE_ORDER == __BIG_ENDIAN + *samp16++ = bswap_16(ires >> 16); +#endif } else { *samp16++ = 0; } - } else if ((sample_size_bits == 32) && (format == SND_PCM_FORMAT_FLOAT_LE)) { + break; + case SND_PCM_FORMAT_S16_BE: if (chn==channel) { - res = generate_pink_noise_sample(&pink) * 0.75; /* Don't use MAX volume */ - fres = res; - *samp_f++ = fres; + res = generate_pink_noise_sample(&pink) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; +#if __BYTE_ORDER == __BIG_ENDIAN + *samp16++ = ires >> 16; +#elif __BYTE_ORDER == __LITTLE_ENDIAN + *samp16++ = bswap_16(ires >> 16); +#endif } else { - *samp_f++ = 0.0; + *samp16++ = 0; } - } else if ((sample_size_bits == 32) && (format != SND_PCM_FORMAT_FLOAT_LE)) { + break; + case SND_PCM_FORMAT_S32_LE: + if (chn==channel) { + res = generate_pink_noise_sample(&pink) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; +#if __BYTE_ORDER == __LITTLE_ENDIAN + *samp32++ = ires; +#elif __BYTE_ORDER == __BIG_ENDIAN + *samp32++ = bswap_32(ires); +#endif + } else { + *samp32++ = 0; + } + break; + case SND_PCM_FORMAT_S32_BE: if (chn==channel) { res = generate_pink_noise_sample(&pink) * 0x03fffffff; /* Don't use MAX volume */ ires = res; +#if __BYTE_ORDER == __BIG_ENDIAN *samp32++ = ires; +#elif __BYTE_ORDER == __LITTLE_ENDIAN + *samp32++ = bswap_32(ires); +#endif } else { *samp32++ = 0; } + break; + default: + ; } } - } - } static int set_hwparams(snd_pcm_t *handle, snd_pcm_hw_params_t *params, snd_pcm_access_t access) {