diff --git a/src/audio/rtnr/rtnr.c b/src/audio/rtnr/rtnr.c index 9f1e741d7c7f..9f27829b6f2e 100644 --- a/src/audio/rtnr/rtnr.c +++ b/src/audio/rtnr/rtnr.c @@ -38,6 +38,8 @@ #define RTNR_BLK_LENGTH_MASK (RTNR_BLK_LENGTH - 1) #define RTNR_MAX_SOURCES 1 /* Microphone stream */ +#define SOF_RTNR_CONFIG 0 + static const struct comp_driver comp_rtnr; /** \brief RTNR processing functions map item. */ @@ -399,16 +401,45 @@ static int rtnr_cmd_get_data(struct comp_dev *dev, return ret; } +static int rtnr_set_bin_data(struct comp_dev *dev, + struct sof_ipc_ctrl_data *cdata) +{ + struct comp_data *cd = comp_get_drvdata(dev); + int ret = 0; + + assert(cd); + + comp_dbg(dev, "rtnr_set_bin_data() msg_index = %d, num_elems = %d, remaining = %d ", + cdata->msg_index, cdata->num_elems, + cdata->elems_remaining); + + if (cdata->data->type == SOF_RTNR_CONFIG) { + comp_dbg(dev, "rtnr_set_bin_data(): SOF_RTNR_CONFIG"); + ret = comp_data_blob_set_cmd(cd->model_handler, cdata); + if (ret >= 0) + ret = rtnr_check_config_validity(dev, cd); + } else { + comp_dbg(dev, "rtnr_set_bin_data(): SOF_RTNR_DATA type: %d", cdata->data->type); + ret = RTKMA_API_Set_Data(cd->rtk_agl, + cdata->data->data, + cdata->msg_index, + cdata->num_elems, + cdata->elems_remaining, + cdata->data->type); + } + + return ret; +} + static int rtnr_cmd_set_data(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata) { - struct comp_data *cd = comp_get_drvdata(dev); int ret = 0; switch (cdata->cmd) { case SOF_CTRL_CMD_BINARY: comp_info(dev, "rtnr_cmd_set_data(), SOF_CTRL_CMD_BINARY"); - ret = comp_data_blob_set_cmd(cd->model_handler, cdata); + ret = rtnr_set_bin_data(dev, cdata); break; default: comp_err(dev, "rtnr_cmd_set_data() error: invalid command %d", cdata->cmd); @@ -416,9 +447,6 @@ static int rtnr_cmd_set_data(struct comp_dev *dev, break; } - if (ret >= 0) - ret = rtnr_check_config_validity(dev, cd); - return ret; } diff --git a/src/include/sof/audio/rtnr/rtklib/include/RTK_MA_API.h b/src/include/sof/audio/rtnr/rtklib/include/RTK_MA_API.h index febb47d383d2..a0c44462b518 100644 --- a/src/include/sof/audio/rtnr/rtklib/include/RTK_MA_API.h +++ b/src/include/sof/audio/rtnr/rtklib/include/RTK_MA_API.h @@ -44,6 +44,12 @@ int RTKMA_API_Set(void *Context, const void *pParameters, int size, unsigned int int RTKMA_API_Get(void *Context, void *pParameters, int size, unsigned int IDs); +int RTKMA_API_Set_Data(void *Context, unsigned int *data, + unsigned int msg_index, + unsigned int num_elms, + unsigned int elems_remaining, + unsigned int data_type); + #ifdef __cplusplus } #endif diff --git a/src/include/user/rtnr.h b/src/include/user/rtnr.h index f76ffb175e5a..3ffbc65da1a9 100644 --- a/src/include/user/rtnr.h +++ b/src/include/user/rtnr.h @@ -10,7 +10,7 @@ #include -#define SOF_RTNR_MAX_SIZE 256 +#define SOF_RTNR_MAX_SIZE 8192 struct sof_rtnr_params { /* 1 to enable RTNR, 0 to disable it */ @@ -26,6 +26,7 @@ struct sof_rtnr_config { uint32_t reserved[4]; struct sof_rtnr_params params; + int32_t data[]; } __attribute__((packed, aligned(4))); #endif /* __USER_RTNR_H__ */ diff --git a/tools/topology/topology1/sof/pipe-rtnr-capture-16khz.m4 b/tools/topology/topology1/sof/pipe-rtnr-capture-16khz.m4 index 74dc9e9a87d1..545c4f4b6114 100644 --- a/tools/topology/topology1/sof/pipe-rtnr-capture-16khz.m4 +++ b/tools/topology/topology1/sof/pipe-rtnr-capture-16khz.m4 @@ -24,6 +24,10 @@ ifdef(`RTNR_BUFFER_SIZE_MAX',`', define(RTNR_BUFFER_SIZE_MAX, `65536')) define(DEF_RTNR_PRIV, concat(`rtnr_priv_', PIPELINE_ID)) define(DEF_RTNR_BYTES, concat(`rtnr_bytes_', PIPELINE_ID)) +define(DEF_RTNR_DATA_1, concat(`rtnr_data_1', PIPELINE_ID)) +define(DEF_RTNR_DATA_1_BYTES, concat(`rtnr_data_1_bytes_', PIPELINE_ID)) +define(DEF_RTNR_DATA_2, concat(`rtnr_data_2', PIPELINE_ID)) +define(DEF_RTNR_DATA_2_BYTES, concat(`rtnr_data_2_bytes_', PIPELINE_ID)) CONTROLBYTES_PRIV(DEF_RTNR_PRIV, ` bytes "0x53,0x4f,0x46,0x00,0x00,0x00,0x00,0x00,' @@ -41,10 +45,45 @@ C_CONTROLBYTES(DEF_RTNR_BYTES, PIPELINE_ID, CONTROLBYTES_OPS(bytes, 258 binds the mixer control to bytes get/put handlers, 258, 258), CONTROLBYTES_EXTOPS(258 binds the mixer control to bytes get/put handlers, 258, 258), , , , - CONTROLBYTES_MAX(, 256), + CONTROLBYTES_MAX(, 8192), , DEF_RTNR_PRIV) +CONTROLBYTES_PRIV(DEF_RTNR_DATA_1, +` bytes "0x53,0x4f,0x46,0x00,0x01,0x00,0x00,0x00,' +` 0x10,0x00,0x00,0x00,0x00,0x30,0x01,0x03,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,' +` 0x52,0x54,0x4b,0x00,0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00"' +) + +# Bytes control for RTNR Data 1 blob +C_CONTROLBYTES(DEF_RTNR_DATA_1_BYTES, PIPELINE_ID, + CONTROLBYTES_OPS(bytes, 258 binds the mixer control to bytes get/put handlers, 258, 258), + CONTROLBYTES_EXTOPS(258 binds the mixer control to bytes get/put handlers, 258, 258), + , , , + CONTROLBYTES_MAX(, 10240), + , + DEF_RTNR_DATA_1) + +CONTROLBYTES_PRIV(DEF_RTNR_DATA_2, +` bytes "0x53,0x4f,0x46,0x00,0x02,0x00,0x00,0x00,' +` 0x10,0x00,0x00,0x00,0x00,0x30,0x01,0x03,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,' +` 0x52,0x54,0x4b,0x00,0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00"' +) + +# Bytes control for RTNR Data 2 blob +C_CONTROLBYTES(DEF_RTNR_DATA_2_BYTES, PIPELINE_ID, + CONTROLBYTES_OPS(bytes, 258 binds the mixer control to bytes get/put handlers, 258, 258), + CONTROLBYTES_EXTOPS(258 binds the mixer control to bytes get/put handlers, 258, 258), + , , , + CONTROLBYTES_MAX(, 524288), + , + DEF_RTNR_DATA_2) # # Components and Buffers @@ -55,7 +94,7 @@ C_CONTROLBYTES(DEF_RTNR_BYTES, PIPELINE_ID, W_PCM_CAPTURE(PCM_ID, Capture, 0, 2, DMIC_PIPELINE_16k_CORE_ID) # "RTNR 0" has 2 sink period and 2 source periods -W_RTNR(0, PIPELINE_FORMAT, 2, DAI_PERIODS, DMIC_PIPELINE_16k_CORE_ID, LIST(` ', "DEF_RTNR_BYTES")) +W_RTNR(0, PIPELINE_FORMAT, 2, DAI_PERIODS, DMIC_PIPELINE_16k_CORE_ID, LIST(` ', "DEF_RTNR_BYTES", "DEF_RTNR_DATA_1_BYTES", "DEF_RTNR_DATA_2_BYTES")) # Capture Buffers W_BUFFER(0, COMP_BUFFER_SIZE(4, @@ -88,3 +127,7 @@ PCM_CAPABILITIES(Capture PCM_ID, CAPABILITY_FORMAT_NAME(PIPELINE_FORMAT), undefine(`DEF_RTNR_PRIV') undefine(`DEF_RTNR_BYTES') +undefine(`DEF_RTNR_DATA_1') +undefine(`DEF_RTNR_DATA_1_BYTES') +undefine(`DEF_RTNR_DATA_2') +undefine(`DEF_RTNR_DATA_2_BYTES') diff --git a/tools/topology/topology1/sof/pipe-rtnr-capture.m4 b/tools/topology/topology1/sof/pipe-rtnr-capture.m4 index 79e616866683..452e5a3c323a 100644 --- a/tools/topology/topology1/sof/pipe-rtnr-capture.m4 +++ b/tools/topology/topology1/sof/pipe-rtnr-capture.m4 @@ -24,6 +24,10 @@ ifdef(`RTNR_BUFFER_SIZE_MAX',`', define(RTNR_BUFFER_SIZE_MAX, `65536')) define(DEF_RTNR_PRIV, concat(`rtnr_priv_', PIPELINE_ID)) define(DEF_RTNR_BYTES, concat(`rtnr_bytes_', PIPELINE_ID)) +define(DEF_RTNR_DATA_1, concat(`rtnr_data_1', PIPELINE_ID)) +define(DEF_RTNR_DATA_1_BYTES, concat(`rtnr_data_1_bytes_', PIPELINE_ID)) +define(DEF_RTNR_DATA_2, concat(`rtnr_data_2', PIPELINE_ID)) +define(DEF_RTNR_DATA_2_BYTES, concat(`rtnr_data_2_bytes_', PIPELINE_ID)) CONTROLBYTES_PRIV(DEF_RTNR_PRIV, ` bytes "0x53,0x4f,0x46,0x00,0x00,0x00,0x00,0x00,' @@ -41,10 +45,45 @@ C_CONTROLBYTES(DEF_RTNR_BYTES, PIPELINE_ID, CONTROLBYTES_OPS(bytes, 258 binds the mixer control to bytes get/put handlers, 258, 258), CONTROLBYTES_EXTOPS(258 binds the mixer control to bytes get/put handlers, 258, 258), , , , - CONTROLBYTES_MAX(, 256), + CONTROLBYTES_MAX(, 8192), , DEF_RTNR_PRIV) +CONTROLBYTES_PRIV(DEF_RTNR_DATA_1, +` bytes "0x53,0x4f,0x46,0x00,0x01,0x00,0x00,0x00,' +` 0x10,0x00,0x00,0x00,0x00,0x30,0x01,0x03,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,' +` 0x52,0x54,0x4b,0x00,0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00"' +) + +# Bytes control for RTNR Data 1 blob +C_CONTROLBYTES(DEF_RTNR_DATA_1_BYTES, PIPELINE_ID, + CONTROLBYTES_OPS(bytes, 258 binds the mixer control to bytes get/put handlers, 258, 258), + CONTROLBYTES_EXTOPS(258 binds the mixer control to bytes get/put handlers, 258, 258), + , , , + CONTROLBYTES_MAX(, 10240), + , + DEF_RTNR_DATA_1) + +CONTROLBYTES_PRIV(DEF_RTNR_DATA_2, +` bytes "0x53,0x4f,0x46,0x00,0x02,0x00,0x00,0x00,' +` 0x10,0x00,0x00,0x00,0x00,0x30,0x01,0x03,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,' +` 0x52,0x54,0x4b,0x00,0x00,0x00,0x00,0x00,' +` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00"' +) + +# Bytes control for RTNR Data 2 blob +C_CONTROLBYTES(DEF_RTNR_DATA_2_BYTES, PIPELINE_ID, + CONTROLBYTES_OPS(bytes, 258 binds the mixer control to bytes get/put handlers, 258, 258), + CONTROLBYTES_EXTOPS(258 binds the mixer control to bytes get/put handlers, 258, 258), + , , , + CONTROLBYTES_MAX(, 524288), + , + DEF_RTNR_DATA_2) # # Components and Buffers @@ -55,7 +94,7 @@ C_CONTROLBYTES(DEF_RTNR_BYTES, PIPELINE_ID, W_PCM_CAPTURE(PCM_ID, Capture, 0, 2, SCHEDULE_CORE) # "RTNR 0" has 2 sink period and 2 source periods -W_RTNR(0, PIPELINE_FORMAT, 2, DAI_PERIODS, SCHEDULE_CORE, LIST(` ', "DEF_RTNR_BYTES")) +W_RTNR(0, PIPELINE_FORMAT, 2, DAI_PERIODS, SCHEDULE_CORE, LIST(` ', "DEF_RTNR_BYTES", "DEF_RTNR_DATA_1_BYTES", "DEF_RTNR_DATA_2_BYTES")) # Capture Buffers W_BUFFER(0, COMP_BUFFER_SIZE(4, @@ -88,3 +127,7 @@ PCM_CAPABILITIES(Capture PCM_ID, CAPABILITY_FORMAT_NAME(PIPELINE_FORMAT), undefine(`DEF_RTNR_PRIV') undefine(`DEF_RTNR_BYTES') +undefine(`DEF_RTNR_DATA_1') +undefine(`DEF_RTNR_DATA_1_BYTES') +undefine(`DEF_RTNR_DATA_2') +undefine(`DEF_RTNR_DATA_2_BYTES')