component: do not set buffer sizes

Change flow of components to not resize sink buffers.
We should just check the size of the allocated buffers
and let the topology define the maximum sizes.
Components can easily work with non aligned buffer sizes.

Signed-off-by: Tomasz Lauda <tomasz.lauda@linux.intel.com>
This commit is contained in:
Tomasz Lauda 2019-10-21 10:57:06 +02:00 committed by Tomasz Lauda
parent cec76442eb
commit 8fa4b80213
9 changed files with 22 additions and 91 deletions

View File

@ -98,33 +98,6 @@ void comp_unregister(struct comp_driver *drv)
irq_local_enable(flags);
}
int comp_set_sink_buffer(struct comp_dev *dev, uint32_t period_bytes,
uint32_t periods)
{
struct comp_buffer *sinkb;
int ret = 0;
sinkb = list_first_item(&dev->bsink_list, struct comp_buffer,
source_list);
/* components connected to dma configure buffer independently */
if (!sinkb->sink->is_dma_connected) {
ret = buffer_set_size(sinkb, period_bytes * periods);
if (ret < 0) {
trace_comp_error("comp_set_sink_buffer() error: "
"buffer_set_size() failed");
return ret;
}
} else if (sinkb->size < period_bytes * periods) {
trace_comp_error("comp_set_sink_buffer() error: "
"sink buffer size is not sufficient");
ret = -EINVAL;
return ret;
}
return ret;
}
int comp_set_state(struct comp_dev *dev, int cmd)
{
int requested_state = comp_get_requested_state(cmd);

View File

@ -733,12 +733,10 @@ static int eq_fir_prepare(struct comp_dev *dev)
else
dev->params.frame_fmt = cd->sink_format;
/* set downstream buffer size */
ret = comp_set_sink_buffer(dev, sink_period_bytes,
config->periods_sink);
if (ret < 0) {
if (sinkb->size < config->periods_sink * sink_period_bytes) {
trace_eq_error("eq_fir_prepare() error: "
"comp_set_sink_buffer() failed");
"sink buffer size is insufficient");
ret = -ENOMEM;
goto err;
}

View File

@ -778,12 +778,10 @@ static int eq_iir_prepare(struct comp_dev *dev)
else
dev->params.frame_fmt = cd->sink_format;
/* set downstream buffer size */
ret = comp_set_sink_buffer(dev, sink_period_bytes,
config->periods_sink);
if (ret < 0) {
if (sinkb->size < config->periods_sink * sink_period_bytes) {
trace_eq_error("eq_iir_prepare() error: "
"comp_set_sink_buffer() failed");
"sink buffer size is insufficient");
ret = -ENOMEM;
goto err;
}

View File

@ -154,8 +154,8 @@ static void mixer_free(struct comp_dev *dev)
static int mixer_params(struct comp_dev *dev)
{
struct sof_ipc_comp_config *config = COMP_GET_CONFIG(dev);
struct comp_buffer *sinkb;
uint32_t period_bytes;
int ret;
trace_mixer("mixer_params()");
@ -166,13 +166,13 @@ static int mixer_params(struct comp_dev *dev)
return -EINVAL;
}
/* set downstream buffer size */
ret = comp_set_sink_buffer(dev, period_bytes,
config->periods_sink);
if (ret < 0) {
sinkb = list_first_item(&dev->bsink_list, struct comp_buffer,
source_list);
if (sinkb->size < config->periods_sink * period_bytes) {
trace_mixer_error("mixer_params() error: "
"comp_set_sink_buffer() failed");
return ret;
"sink buffer size is insufficient");
return -ENOMEM;
}
return 0;

View File

@ -380,12 +380,10 @@ static int selector_prepare(struct comp_dev *dev)
trace_selector("selector_prepare(): sink->params.channels = %u",
sinkb->sink->params.channels);
/* set downstream buffer size */
ret = comp_set_sink_buffer(dev, cd->sink_period_bytes,
config->periods_sink);
if (ret < 0) {
if (sinkb->size < config->periods_sink * cd->sink_period_bytes) {
trace_selector_error("selector_prepare() error: "
"comp_set_sink_buffer() failed");
"sink buffer size is insufficient");
ret = -ENOMEM;
goto err;
}

View File

@ -820,12 +820,10 @@ static int src_prepare(struct comp_dev *dev)
else
dev->params.frame_fmt = cd->sink_format;
/* set downstream buffer size */
ret = comp_set_sink_buffer(dev, sink_period_bytes,
config->periods_sink);
if (ret < 0) {
if (sinkb->size < config->periods_sink * sink_period_bytes) {
trace_src_error("src_prepare() error: "
"comp_set_sink_buffer() failed");
"sink buffer size is insufficient");
ret = -ENOMEM;
goto err;
}

View File

@ -615,14 +615,10 @@ static int volume_prepare(struct comp_dev *dev)
else
dev->params.frame_fmt = cd->sink_format;
/* set downstream buffer size */
ret = comp_set_sink_buffer(dev, sink_period_bytes,
config->periods_sink);
if (ret < 0) {
if (sinkb->size < config->periods_sink * sink_period_bytes) {
trace_volume_error("volume_prepare() error: "
"comp_set_sink_buffer() failed");
"sink buffer size is insufficient");
ret = -ENOMEM;
goto err;
}

View File

@ -379,15 +379,6 @@ static inline void comp_free(struct comp_dev *dev)
*/
int comp_set_state(struct comp_dev *dev, int cmd);
/**
* Set component's sink buffer size
* @param dev Component device.
* @param period_bytes Amount of bytes in one period.
* @param periods Amount of periods.
*/
int comp_set_sink_buffer(struct comp_dev *dev, uint32_t period_bytes,
uint32_t periods);
/**
* Component parameter init.
* @param dev Component device.

View File

@ -55,27 +55,6 @@ void pipeline_xrun(struct pipeline *p, struct comp_dev *dev, int32_t bytes)
{
}
int comp_set_sink_buffer(struct comp_dev *dev, uint32_t period_bytes,
uint32_t periods)
{
struct comp_buffer *sinkb;
int ret = 0;
sinkb = list_first_item(&dev->bsink_list, struct comp_buffer,
source_list);
if (!sinkb->sink->is_dma_connected) {
ret = buffer_set_size(sinkb, period_bytes * periods);
if (ret < 0)
return ret;
} else if (sinkb->size < period_bytes * periods) {
ret = -EINVAL;
return ret;
}
return ret;
}
int comp_set_state(struct comp_dev *dev, int cmd)
{
return 0;