mirror of https://github.com/thesofproject/sof.git
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:
parent
cec76442eb
commit
8fa4b80213
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue