buffer: add new buffer management apis for component convenience

Add new APIs to allow components to easily resize, reset and clear
buffers. Update host, mixer and volume to use them.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
This commit is contained in:
Liam Girdwood 2017-09-06 23:39:00 +01:00
parent 8e1e7e6dbd
commit 1eee57481c
4 changed files with 55 additions and 8 deletions

View File

@ -412,11 +412,10 @@ static int host_params(struct comp_dev *dev)
/* resize the buffer if space is available to align with period size */
buffer_size = hd->period_count * hd->period_bytes;
if (buffer_size <= hd->dma_buffer->alloc_size)
hd->dma_buffer->size = buffer_size;
else {
err = buffer_set_size(hd->dma_buffer, buffer_size);
if (err < 0) {
trace_host_error("eSz");
return -EINVAL;
return err;
}
/* component buffer size must be divisor of host buffer size */
@ -432,8 +431,7 @@ static int host_params(struct comp_dev *dev)
if (err < 0)
return err;
hd->dma_buffer->r_ptr = hd->dma_buffer->addr;
hd->dma_buffer->w_ptr = hd->dma_buffer->addr;
buffer_reset_pos(hd->dma_buffer);
/* set up DMA configuration */
config->src_width = sizeof(uint32_t);

View File

@ -124,6 +124,9 @@ static void mixer_free(struct comp_dev *dev)
static int mixer_params(struct comp_dev *dev)
{
struct mixer_data *md = comp_get_drvdata(dev);
struct sof_ipc_comp_config *config = COMP_GET_CONFIG(dev);
struct comp_buffer *sink;
int ret;
trace_mixer("par");
@ -141,6 +144,17 @@ static int mixer_params(struct comp_dev *dev)
return -EINVAL;
}
sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list);
/* set downstream buffer size */
ret = buffer_set_size(sink, md->period_bytes * config->periods_sink);
if (ret < 0) {
trace_mixer_error("mx3");
return ret;
}
buffer_reset_pos(sink);
return 0;
}

View File

@ -505,8 +505,8 @@ static int volume_prepare(struct comp_dev *dev)
{
struct comp_data *cd = comp_get_drvdata(dev);
struct comp_buffer *sinkb, *sourceb;
struct sof_ipc_comp_config *sconfig;
int i;
struct sof_ipc_comp_config *sconfig, *config = COMP_GET_CONFIG(dev);
int i, ret;
trace_volume("pre");
@ -556,6 +556,16 @@ static int volume_prepare(struct comp_dev *dev)
dev->frame_bytes = cd->sink_period_bytes;
/* set downstream buffer size */
ret = buffer_set_size(sinkb, cd->sink_period_bytes *
config->periods_sink);
if (ret < 0) {
trace_volume_error("vp0");
return ret;
}
buffer_reset_pos(sinkb);
/* validate */
if (cd->sink_period_bytes == 0) {
trace_volume_error("vp1");

View File

@ -162,4 +162,29 @@ static inline uint32_t comp_buffer_get_copy_bytes(struct comp_dev *dev,
return copy_bytes;
}
static inline void buffer_reset_pos(struct comp_buffer *buffer)
{
buffer->r_ptr = buffer->addr;
buffer->w_ptr = buffer->addr;
buffer->free = buffer->size;
buffer->avail = 0;
}
static inline void buffer_clear(struct comp_buffer *buffer)
{
memset(buffer->addr, 0, buffer->size);
}
/* set the runtime size of a buffer in bytes and improve the data cache */
/* performance by only using minimum space needed for runtime params */
static inline int buffer_set_size(struct comp_buffer *buffer, uint32_t size)
{
if (size > buffer->alloc_size)
return -ENOMEM;
buffer->end_addr = buffer->addr + size;
buffer->size = size;
return 0;
}
#endif