[Sound-open-firmware] [PATCH] buffer: move buffer functions to c file
Liam Girdwood
liam.r.girdwood at linux.intel.com
Fri Dec 8 21:14:37 CET 2017
On Fri, 2017-12-08 at 23:11 +0800, Keyon Jie wrote:
> These are all functions may be called by other modules frequently,
> but not small enough, to reduce the elf binary size, they should
> not be static and inline, move the implementation to the c file
> buffer.c.
>
> Example:
> Before applying this patch, the baytrail binary sizes as below:
> reef 640436 Bytes;
> reef-byt.ri 66361 Bytes;
> After applied it, they are changed to:
> reef 635280 Bytes;
> reef-byt.ri 65625 Bytes;
>
We need to inline these for use in copy() to save a function call(s)
and window exceptions at the expense of slightly larger code.
Liam
> Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
> ---
> src/audio/buffer.c | 110
> +++++++++++++++++++++++++++++++++++++
> src/include/reef/audio/buffer.h | 117 ++++------------------------
> ------------
> 2 files changed, 120 insertions(+), 107 deletions(-)
>
> diff --git a/src/audio/buffer.c b/src/audio/buffer.c
> index 0acf660..ad9d2f3 100644
> --- a/src/audio/buffer.c
> +++ b/src/audio/buffer.c
> @@ -97,3 +97,113 @@ void buffer_free(struct comp_buffer *buffer)
> rfree(buffer->addr);
> rfree(buffer);
> }
> +
> +/* called by a component after producing data into this buffer */
> +void comp_update_buffer_produce(struct comp_buffer *buffer,
> + uint32_t bytes)
> +{
> + buffer->w_ptr += bytes;
> +
> + /* check for pointer wrap */
> + if (buffer->w_ptr >= buffer->end_addr)
> + buffer->w_ptr = buffer->addr + (buffer->w_ptr -
> buffer->end_addr);
> +
> + /* calculate available bytes */
> + if (buffer->r_ptr < buffer->w_ptr)
> + buffer->avail = buffer->w_ptr - buffer->r_ptr;
> + else if (buffer->r_ptr == buffer->w_ptr)
> + buffer->avail = buffer->size; /* full */
> + else
> + buffer->avail = buffer->size - (buffer->r_ptr -
> buffer->w_ptr);
> +
> + /* calculate free bytes */
> + buffer->free = buffer->size - buffer->avail;
> +
> + tracev_buffer("pro");
> + tracev_value((buffer->avail << 16) | buffer->free);
> + tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer-
> >size);
> + tracev_value((buffer->r_ptr - buffer->addr) << 16 | (buffer-
> >w_ptr - buffer->addr));
> +}
> +
> +/* called by a component after consuming data from this buffer */
> +void comp_update_buffer_consume(struct comp_buffer *buffer,
> + uint32_t bytes)
> +{
> + buffer->r_ptr += bytes;
> +
> + /* check for pointer wrap */
> + if (buffer->r_ptr >= buffer->end_addr)
> + buffer->r_ptr = buffer->addr + (buffer->r_ptr -
> buffer->end_addr);
> +
> + /* calculate available bytes */
> + if (buffer->r_ptr < buffer->w_ptr)
> + buffer->avail = buffer->w_ptr - buffer->r_ptr;
> + else if (buffer->r_ptr == buffer->w_ptr)
> + buffer->avail = 0; /* empty */
> + else
> + buffer->avail = buffer->size - (buffer->r_ptr -
> buffer->w_ptr);
> +
> + /* calculate free bytes */
> + buffer->free = buffer->size - buffer->avail;
> +
> + tracev_buffer("con");
> + tracev_value((buffer->avail << 16) | buffer->free);
> + tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer-
> >size);
> + tracev_value((buffer->r_ptr - buffer->addr) << 16 | (buffer-
> >w_ptr - buffer->addr));
> +
> +}
> +
> +/* get the max number of bytes that can be copied between sink and
> source */
> +int comp_buffer_can_copy_bytes(struct comp_buffer *source,
> + struct comp_buffer *sink, uint32_t bytes)
> +{
> + /* check for underrun */
> + if (source->avail < bytes)
> + return -1;
> +
> + /* check for overrun */
> + if (sink->free < bytes)
> + return 1;
> +
> + /* we are good to copy */
> + return 0;
> +}
> +
> +uint32_t comp_buffer_get_copy_bytes(struct comp_buffer *source,
> + struct comp_buffer *sink)
> +{
> + if (source->avail < sink->free)
> + return sink->free;
> + else
> + return source->avail;
> +}
> +
> +void buffer_reset_pos(struct comp_buffer *buffer)
> +{
> + /* reset read and write pointer to buffer bas */
> + buffer->w_ptr = buffer->r_ptr = buffer->addr;
> +
> + /* free space is buffer size */
> + buffer->free = buffer->size;
> +
> + /* ther are no avail samples at reset */
> + buffer->avail = 0;
> +
> + /* clear buffer contents */
> + bzero(buffer->r_ptr, buffer->avail);
> +}
> +
> +/* set the runtime size of a buffer in bytes and improve the data
> cache */
> +/* performance by only using minimum space needed for runtime params
> */
> +int buffer_set_size(struct comp_buffer *buffer, uint32_t size)
> +{
> + if (size > buffer->alloc_size)
> + return -ENOMEM;
> + if (size == 0)
> + return -EINVAL;
> +
> + buffer->end_addr = buffer->addr + size;
> + buffer->size = size;
> + return 0;
> +}
> +
> diff --git a/src/include/reef/audio/buffer.h
> b/src/include/reef/audio/buffer.h
> index 2bb2033..611857c 100644
> --- a/src/include/reef/audio/buffer.h
> +++ b/src/include/reef/audio/buffer.h
> @@ -77,112 +77,15 @@ struct comp_buffer {
> struct comp_buffer *buffer_new(struct sof_ipc_buffer *desc);
> void buffer_free(struct comp_buffer *buffer);
>
> -/* called by a component after producing data into this buffer */
> -static inline void comp_update_buffer_produce(struct comp_buffer
> *buffer,
> - uint32_t bytes)
> -{
> - buffer->w_ptr += bytes;
> -
> - /* check for pointer wrap */
> - if (buffer->w_ptr >= buffer->end_addr)
> - buffer->w_ptr = buffer->addr + (buffer->w_ptr -
> buffer->end_addr);
> -
> - /* calculate available bytes */
> - if (buffer->r_ptr < buffer->w_ptr)
> - buffer->avail = buffer->w_ptr - buffer->r_ptr;
> - else if (buffer->r_ptr == buffer->w_ptr)
> - buffer->avail = buffer->size; /* full */
> - else
> - buffer->avail = buffer->size - (buffer->r_ptr -
> buffer->w_ptr);
> -
> - /* calculate free bytes */
> - buffer->free = buffer->size - buffer->avail;
> -
> - tracev_buffer("pro");
> - tracev_value((buffer->avail << 16) | buffer->free);
> - tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer-
> >size);
> - tracev_value((buffer->r_ptr - buffer->addr) << 16 | (buffer-
> >w_ptr - buffer->addr));
> -}
> -
> -/* called by a component after consuming data from this buffer */
> -static inline void comp_update_buffer_consume(struct comp_buffer
> *buffer,
> - uint32_t bytes)
> -{
> - buffer->r_ptr += bytes;
> -
> - /* check for pointer wrap */
> - if (buffer->r_ptr >= buffer->end_addr)
> - buffer->r_ptr = buffer->addr + (buffer->r_ptr -
> buffer->end_addr);
> -
> - /* calculate available bytes */
> - if (buffer->r_ptr < buffer->w_ptr)
> - buffer->avail = buffer->w_ptr - buffer->r_ptr;
> - else if (buffer->r_ptr == buffer->w_ptr)
> - buffer->avail = 0; /* empty */
> - else
> - buffer->avail = buffer->size - (buffer->r_ptr -
> buffer->w_ptr);
> -
> - /* calculate free bytes */
> - buffer->free = buffer->size - buffer->avail;
> -
> - tracev_buffer("con");
> - tracev_value((buffer->avail << 16) | buffer->free);
> - tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer-
> >size);
> - tracev_value((buffer->r_ptr - buffer->addr) << 16 | (buffer-
> >w_ptr - buffer->addr));
> -}
> -
> -/* get the max number of bytes that can be copied between sink and
> source */
> -static inline int comp_buffer_can_copy_bytes(struct comp_buffer
> *source,
> - struct comp_buffer *sink, uint32_t bytes)
> -{
> - /* check for underrun */
> - if (source->avail < bytes)
> - return -1;
> -
> - /* check for overrun */
> - if (sink->free < bytes)
> - return 1;
> -
> - /* we are good to copy */
> - return 0;
> -}
> -
> -static inline uint32_t comp_buffer_get_copy_bytes(struct comp_buffer
> *source,
> - struct comp_buffer *sink)
> -{
> - if (source->avail < sink->free)
> - return sink->free;
> - else
> - return source->avail;
> -}
> -
> -static inline void buffer_reset_pos(struct comp_buffer *buffer)
> -{
> - /* reset read and write pointer to buffer bas */
> - buffer->w_ptr = buffer->r_ptr = buffer->addr;
> -
> - /* free space is buffer size */
> - buffer->free = buffer->size;
> -
> - /* ther are no avail samples at reset */
> - buffer->avail = 0;
> -
> - /* clear buffer contents */
> - bzero(buffer->r_ptr, buffer->avail);
> -}
> -
> -/* 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;
> - if (size == 0)
> - return -EINVAL;
> -
> - buffer->end_addr = buffer->addr + size;
> - buffer->size = size;
> - return 0;
> -}
> +void comp_update_buffer_produce(struct comp_buffer *buffer,
> + uint32_t bytes);
> +void comp_update_buffer_consume(struct comp_buffer *buffer,
> + uint32_t bytes);
> +int comp_buffer_can_copy_bytes(struct comp_buffer *source,
> + struct comp_buffer *sink, uint32_t bytes);
> +uint32_t comp_buffer_get_copy_bytes(struct comp_buffer *source,
> + struct comp_buffer *sink);
> +void buffer_reset_pos(struct comp_buffer *buffer);
> +int buffer_set_size(struct comp_buffer *buffer, uint32_t size);
>
> #endif
More information about the Sound-open-firmware
mailing list