summaryrefslogtreecommitdiff
path: root/speaker-test
diff options
context:
space:
mode:
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>2021-03-12 11:03:16 -0600
committerTakashi Iwai <tiwai@suse.de>2021-03-14 09:33:39 +0100
commit00be486131129a6d209de62202d2a4974638127f (patch)
tree7cadea5aa50f46d7489091b2e06b5db2161c9321 /speaker-test
parentc2d27acfce79dfdd23a397f884c3886511acbbf2 (diff)
downloadalsa-utils-00be486131129a6d209de62202d2a4974638127f.tar.gz
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>
Diffstat (limited to 'speaker-test')
-rw-r--r--speaker-test/speaker-test.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/speaker-test/speaker-test.c b/speaker-test/speaker-test.c
index 773af0a..fd13d88 100644
--- a/speaker-test/speaker-test.c
+++ b/speaker-test/speaker-test.c
@@ -285,6 +285,8 @@ static const int supported_formats[] = {
SND_PCM_FORMAT_FLOAT_LE,
SND_PCM_FORMAT_S24_3LE,
SND_PCM_FORMAT_S24_3BE,
+ SND_PCM_FORMAT_S24_LE,
+ SND_PCM_FORMAT_S24_BE,
SND_PCM_FORMAT_S32_LE,
SND_PCM_FORMAT_S32_BE,
-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) >> 16;
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:
*samp32++ = LE_INT(res.i);
break;