speaker-test: add support for S24_LE and S24_BE

These formats are sometimes advertised by drivers, e.g. SOF.
The format is 3 bytes packed in 32-bit container, with the MSB zeroed
out.

sample: 0x00123456

S24_LE format:
b0 56
b1 34
b2 12
b3 00

S24_BE format:
b0 00
b1 12
b2 34
b3 56

I only tested the S24_LE format with the SOF driver, S24_BE was added
for symmetry only.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Pierre-Louis Bossart 2021-03-12 11:03:16 -06:00 committed by Takashi Iwai
parent c2d27acfce
commit 00be486131

View file

@ -285,6 +285,8 @@ static const int supported_formats[] = {
SND_PCM_FORMAT_FLOAT_LE, SND_PCM_FORMAT_FLOAT_LE,
SND_PCM_FORMAT_S24_3LE, SND_PCM_FORMAT_S24_3LE,
SND_PCM_FORMAT_S24_3BE, SND_PCM_FORMAT_S24_3BE,
SND_PCM_FORMAT_S24_LE,
SND_PCM_FORMAT_S24_BE,
SND_PCM_FORMAT_S32_LE, SND_PCM_FORMAT_S32_LE,
SND_PCM_FORMAT_S32_BE, SND_PCM_FORMAT_S32_BE,
-1 -1
@ -338,6 +340,20 @@ static void do_generate(uint8_t *frames, int channel, int count,
*samp8++ = BE_INT(res.i) >> 8; *samp8++ = BE_INT(res.i) >> 8;
*samp8++ = BE_INT(res.i) >> 16; *samp8++ = BE_INT(res.i) >> 16;
break; break;
case SND_PCM_FORMAT_S24_LE:
res.i >>= 8;
*samp8++ = LE_INT(res.i);
*samp8++ = LE_INT(res.i) >> 8;
*samp8++ = LE_INT(res.i) >> 16;
*samp8++ = 0;
break;
case SND_PCM_FORMAT_S24_BE:
res.i >>= 8;
*samp8++ = 0;
*samp8++ = BE_INT(res.i);
*samp8++ = BE_INT(res.i) >> 8;
*samp8++ = BE_INT(res.i) >> 16;
break;
case SND_PCM_FORMAT_S32_LE: case SND_PCM_FORMAT_S32_LE:
*samp32++ = LE_INT(res.i); *samp32++ = LE_INT(res.i);
break; break;