@@ -1442,6 +1442,25 @@ static int sof_ipc4_get_valid_bits(struct snd_sof_dev *sdev, struct snd_pcm_hw_p
1442
1442
}
1443
1443
}
1444
1444
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
+
1445
1464
static int sof_ipc4_init_input_audio_fmt (struct snd_sof_dev * sdev ,
1446
1465
struct snd_sof_widget * swidget ,
1447
1466
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,
1453
1472
u32 valid_bits ;
1454
1473
u32 channels ;
1455
1474
u32 rate ;
1475
+ u32 type ;
1456
1476
bool single_format ;
1457
1477
int sample_valid_bits ;
1478
+ int sample_type ;
1458
1479
int i = 0 ;
1459
1480
1460
1481
if (!pin_fmts_size ) {
@@ -1470,6 +1491,10 @@ static int sof_ipc4_init_input_audio_fmt(struct snd_sof_dev *sdev,
1470
1491
if (sample_valid_bits < 0 )
1471
1492
return sample_valid_bits ;
1472
1493
1494
+ sample_type = sof_ipc4_get_sample_type (sdev , params );
1495
+ if (sample_type < 0 )
1496
+ return sample_type ;
1497
+
1473
1498
/*
1474
1499
* Search supported input audio formats with pin index 0 to match rate, channels and
1475
1500
* sample_valid_bits from reference params
@@ -1483,8 +1508,9 @@ static int sof_ipc4_init_input_audio_fmt(struct snd_sof_dev *sdev,
1483
1508
rate = fmt -> sampling_frequency ;
1484
1509
channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT (fmt -> fmt_cfg );
1485
1510
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 );
1486
1512
if (params_rate (params ) == rate && params_channels (params ) == channels &&
1487
- sample_valid_bits == valid_bits )
1513
+ sample_valid_bits == valid_bits && sample_type == type )
1488
1514
break ;
1489
1515
}
1490
1516
0 commit comments