Skip to content

Commit e1bfb75

Browse files
committed
ASoC: SOF: ipc4-topology: Handle sample type
The PCM ALSA format need to be converted to sample type in IPC4 pin format definition to be able to select correct converter function in FW side PCM converter. Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
1 parent 9731d1b commit e1bfb75

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

sound/soc/sof/ipc4-topology.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1442,6 +1442,25 @@ static int sof_ipc4_get_valid_bits(struct snd_sof_dev *sdev, struct snd_pcm_hw_p
14421442
}
14431443
}
14441444

1445+
static int sof_ipc4_get_sample_type(struct snd_sof_dev *sdev, struct snd_pcm_hw_params *params)
1446+
{
1447+
switch (params_format(params)) {
1448+
case SNDRV_PCM_FORMAT_A_LAW:
1449+
return SOF_IPC4_TYPE_A_LAW;
1450+
case SNDRV_PCM_FORMAT_MU_LAW:
1451+
return SOF_IPC4_TYPE_MU_LAW;
1452+
case SNDRV_PCM_FORMAT_U8:
1453+
return SOF_IPC4_TYPE_UNSIGNED_INTEGER;
1454+
case SNDRV_PCM_FORMAT_S16_LE:
1455+
case SNDRV_PCM_FORMAT_S24_LE:
1456+
case SNDRV_PCM_FORMAT_S32_LE:
1457+
return SOF_IPC4_TYPE_SIGNED_INTEGER;
1458+
default:
1459+
dev_err(sdev->dev, "invalid pcm sample type %d\n", params_format(params));
1460+
return -EINVAL;
1461+
}
1462+
}
1463+
14451464
static int sof_ipc4_init_input_audio_fmt(struct snd_sof_dev *sdev,
14461465
struct snd_sof_widget *swidget,
14471466
struct sof_ipc4_base_module_cfg *base_config,
@@ -1453,8 +1472,10 @@ static int sof_ipc4_init_input_audio_fmt(struct snd_sof_dev *sdev,
14531472
u32 valid_bits;
14541473
u32 channels;
14551474
u32 rate;
1475+
u32 type;
14561476
bool single_format;
14571477
int sample_valid_bits;
1478+
int sample_type;
14581479
int i = 0;
14591480

14601481
if (!pin_fmts_size) {
@@ -1470,6 +1491,10 @@ static int sof_ipc4_init_input_audio_fmt(struct snd_sof_dev *sdev,
14701491
if (sample_valid_bits < 0)
14711492
return sample_valid_bits;
14721493

1494+
sample_type = sof_ipc4_get_sample_type(sdev, params);
1495+
if (sample_type < 0)
1496+
return sample_type;
1497+
14731498
/*
14741499
* Search supported input audio formats with pin index 0 to match rate, channels and
14751500
* sample_valid_bits from reference params
@@ -1483,8 +1508,9 @@ static int sof_ipc4_init_input_audio_fmt(struct snd_sof_dev *sdev,
14831508
rate = fmt->sampling_frequency;
14841509
channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg);
14851510
valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg);
1511+
type = SOF_IPC4_AUDIO_FORMAT_CFG_SAMPLE_TYPE(fmt->fmt_cfg);
14861512
if (params_rate(params) == rate && params_channels(params) == channels &&
1487-
sample_valid_bits == valid_bits)
1513+
sample_valid_bits == valid_bits && sample_type == type)
14881514
break;
14891515
}
14901516

sound/soc/sof/ipc4-topology.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@
4141
#define SOF_IPC4_FW_MAX_PAGE_COUNT 20
4242
#define SOF_IPC4_FW_MAX_QUEUE_COUNT 8
4343

44+
/* IPC4 sample types */
45+
#define SOF_IPC4_TYPE_SIGNED_INTEGER 2
46+
#define SOF_IPC4_TYPE_UNSIGNED_INTEGER 3
47+
#define SOF_IPC4_TYPE_A_LAW 5
48+
#define SOF_IPC4_TYPE_MU_LAW 6
49+
4450
/* Node index and mask applicable for host copier and ALH/HDA type DAI copiers */
4551
#define SOF_IPC4_NODE_INDEX_MASK 0xFF
4652
#define SOF_IPC4_NODE_INDEX(x) ((x) & SOF_IPC4_NODE_INDEX_MASK)

0 commit comments

Comments
 (0)