dp: make dp_queue using externally provided params set

Dp_queue is currently used only as a comp_buffer "shadow"
for DP modules.
Shadow buffers must have the very same param set as main
buffers.
Problem: till now the complete vector of params was
copied from comp_buffer to dp_queue inm prepare method.
Problem is that if anything will change any of params
afterwards, the change won't propagate.
This commit introduces sharing the param vector between
comp_buffer and its shadow

Signed-off-by: Marcin Szkudlinski <marcin.szkudlinski@intel.com>
This commit is contained in:
Marcin Szkudlinski 2024-04-19 13:42:32 +02:00 committed by Liam Girdwood
parent 80445dc5ee
commit 5f25174789
3 changed files with 32 additions and 24 deletions

View File

@ -201,10 +201,10 @@ static int dp_queue_set_ipc_params(struct dp_queue *dp_queue,
if (dp_queue->_hw_params_configured && !force_update)
return 0;
dp_queue->audio_stream_params.frame_fmt = params->frame_fmt;
dp_queue->audio_stream_params.rate = params->rate;
dp_queue->audio_stream_params.channels = params->channels;
dp_queue->audio_stream_params.buffer_fmt = params->buffer_fmt;
dp_queue->audio_stream_params->frame_fmt = params->frame_fmt;
dp_queue->audio_stream_params->rate = params->rate;
dp_queue->audio_stream_params->channels = params->channels;
dp_queue->audio_stream_params->buffer_fmt = params->buffer_fmt;
dp_queue->_hw_params_configured = true;
@ -246,7 +246,7 @@ static const struct sink_ops dp_queue_sink_ops = {
};
struct dp_queue *dp_queue_create(size_t min_available, size_t min_free_space, uint32_t flags,
uint32_t id)
uint32_t id, struct sof_audio_stream_params *audio_stream_params)
{
struct dp_queue *dp_queue;
@ -260,14 +260,15 @@ struct dp_queue *dp_queue_create(size_t min_available, size_t min_free_space, ui
return NULL;
dp_queue->_flags = flags;
dp_queue->audio_stream_params = audio_stream_params;
CORE_CHECK_STRUCT_INIT(dp_queue, flags & DP_QUEUE_MODE_SHARED);
/* initiate structures */
source_init(dp_queue_get_source(dp_queue), &dp_queue_source_ops,
&dp_queue->audio_stream_params);
dp_queue->audio_stream_params);
sink_init(dp_queue_get_sink(dp_queue), &dp_queue_sink_ops,
&dp_queue->audio_stream_params);
dp_queue->audio_stream_params);
list_init(&dp_queue->list);
@ -287,7 +288,7 @@ struct dp_queue *dp_queue_create(size_t min_available, size_t min_free_space, ui
if (!dp_queue->_data_buffer)
goto err;
dp_queue->audio_stream_params.id = id;
dp_queue->audio_stream_params->id = id;
tr_info(&dp_queue_tr, "DpQueue created, id: %u shared: %u min_available: %u min_free_space %u, size %u",
id, dp_queue_is_shared(dp_queue), min_available, min_free_space,
dp_queue->data_buffer_size);

View File

@ -170,9 +170,12 @@ static int module_adapter_dp_queue_prepare(struct comp_dev *dev)
size_t min_free_space =
sink_get_min_free_space(audio_stream_get_sink(&source_buffer->stream));
/* create a shadow dp queue */
/* create a shadow dp queue
* shadow queue must share runtime_stream_params with the source_buffer
*/
dp_queue = dp_queue_create(min_available, min_free_space, dp_mode,
buf_get_id(source_buffer));
buf_get_id(source_buffer),
&source_buffer->stream.runtime_stream_params);
if (!dp_queue)
goto err;
@ -183,11 +186,6 @@ static int module_adapter_dp_queue_prepare(struct comp_dev *dev)
*/
mod->sources[i] = dp_queue_get_source(dp_queue);
/* copy parameters from buffer to be shadowed */
memcpy_s(&dp_queue->audio_stream_params,
sizeof(dp_queue->audio_stream_params),
&source_buffer->stream.runtime_stream_params,
sizeof(source_buffer->stream.runtime_stream_params));
i++;
}
mod->num_of_sources = i;
@ -204,9 +202,12 @@ static int module_adapter_dp_queue_prepare(struct comp_dev *dev)
size_t min_free_space =
sink_get_min_free_space(audio_stream_get_sink(&sink_buffer->stream));
/* create a shadow dp queue */
/* create a shadow dp queue
* shadow queue must share runtime_stream_params with the sink_buffer
*/
dp_queue = dp_queue_create(min_available, min_free_space, dp_mode,
buf_get_id(sink_buffer));
buf_get_id(sink_buffer),
&sink_buffer->stream.runtime_stream_params);
if (!dp_queue)
goto err;
@ -217,11 +218,6 @@ static int module_adapter_dp_queue_prepare(struct comp_dev *dev)
*/
mod->sinks[i] = dp_queue_get_sink(dp_queue);
/* copy parameters from buffer to be shadowed */
memcpy_s(&dp_queue->audio_stream_params,
sizeof(dp_queue->audio_stream_params),
&sink_buffer->stream.runtime_stream_params,
sizeof(sink_buffer->stream.runtime_stream_params));
/* calculate time required the module to provide OBS data portion - a period */
unsigned int sink_period = 1000000 * sink_get_min_free_space(mod->sinks[i]) /
(sink_get_frame_bytes(mod->sinks[i]) *

View File

@ -111,7 +111,15 @@ struct dp_queue {
struct list_item list; /**< fields for connection queues in a list */
/* public: read only */
struct sof_audio_stream_params audio_stream_params;
/* note!
* as dpQueue is currently used as a shadow for comp_buffer only for DP components,
* the audio_stream_params vector must be shared between comp_buffer and dp_queue
* the audio_stream_params pointer should point to the proper comp_buffer structure
*
* to be changed to the structure itself when pipeline2.0 is introduced
*/
struct sof_audio_stream_params *audio_stream_params;
size_t data_buffer_size;
/* private: */
@ -138,9 +146,12 @@ struct dp_queue {
*
* @param id a stream ID, accessible later by sink_get_id/source_get_id
*
* @param audio_stream_params pointer to audio params vector, shared between dp_queue and
* comp_buffer for dp modules
*
*/
struct dp_queue *dp_queue_create(size_t min_available, size_t min_free_space, uint32_t flags,
uint32_t id);
uint32_t id, struct sof_audio_stream_params *audio_stream_params);
/**
* @brief remove the queue from the list, free dp queue memory