Skip to content

Commit 1b08d3e

Browse files
dai-zephyr: Prioritize HW params channels over base config params
When the hardware is able to return a valid number of DMA buffer audio channels (e.g., extracted from a blob), give the returned number of channels higher precedence over the number supplied via the base config params. Signed-off-by: Serhiy Katsyuba <serhiy.katsyuba@intel.com>
1 parent c038b48 commit 1b08d3e

1 file changed

Lines changed: 24 additions & 4 deletions

File tree

src/audio/dai-zephyr.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,8 @@ static int dai_set_dma_config(struct dai_data *dd, struct comp_dev *dev)
794794
}
795795

796796
static int dai_set_dma_buffer(struct dai_data *dd, struct comp_dev *dev,
797-
struct sof_ipc_stream_params *params, uint32_t *pb, uint32_t *pc)
797+
const struct sof_ipc_stream_params *params,
798+
uint32_t *pb, uint32_t *pc)
798799
{
799800
struct sof_ipc_stream_params hw_params = *params;
800801
uint32_t frame_size;
@@ -916,8 +917,10 @@ static int dai_set_dma_buffer(struct dai_data *dd, struct comp_dev *dev,
916917
}
917918

918919
int dai_common_params(struct dai_data *dd, struct comp_dev *dev,
919-
struct sof_ipc_stream_params *params)
920+
struct sof_ipc_stream_params *base_cfg_params)
920921
{
922+
struct sof_ipc_stream_params params = *base_cfg_params;
923+
struct sof_ipc_stream_params hw_params;
921924
struct dma_sg_config *config = &dd->config;
922925
uint32_t period_bytes = 0;
923926
uint32_t period_count = 0;
@@ -932,13 +935,30 @@ int dai_common_params(struct dai_data *dd, struct comp_dev *dev,
932935
return err;
933936
}
934937

935-
err = dai_verify_params(dd, dev, params);
938+
/* When the hardware is able to return a valid number of DMA buffer audio channels
939+
* (e.g., extracted from a blob), give the returned number of channels higher precedence
940+
* over the number supplied via the base config params.
941+
*/
942+
memset(&hw_params, 0, sizeof(hw_params));
943+
err = dai_common_get_hw_params(dd, dev, &hw_params, params.direction);
944+
if (err < 0) {
945+
comp_err(dev, "dai_common_get_hw_params() failed: %d", err);
946+
return err;
947+
}
948+
949+
if (hw_params.channels != 0 && hw_params.channels != params.channels) {
950+
params.channels = hw_params.channels;
951+
comp_info(dev, "Replacing %d base config channels with %d hw params channels.",
952+
base_cfg_params->channels, params.channels);
953+
}
954+
955+
err = dai_verify_params(dd, dev, &params);
936956
if (err < 0) {
937957
comp_err(dev, "dai_zephyr_params(): pcm params verification failed.");
938958
return -EINVAL;
939959
}
940960

941-
err = dai_set_dma_buffer(dd, dev, params, &period_bytes, &period_count);
961+
err = dai_set_dma_buffer(dd, dev, &params, &period_bytes, &period_count);
942962
if (err < 0) {
943963
comp_err(dev, "dai_zephyr_params(): alloc dma buffer failed.");
944964
goto out;

0 commit comments

Comments
 (0)