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