[Sound-open-firmware] [PATCH 2/2] SRC: Bug fix for issuing xru and xro errors

Liam Girdwood liam.r.girdwood at linux.intel.com
Tue Nov 21 01:59:03 CET 2017


On Mon, 2017-11-20 at 19:56 +0200, Seppo Ingalsuo wrote:
> This patch prevents SRC to stall due to too demanding criteria of
> function comp_buffer_can_copy_bytes. Since the input and output rate and
> period length of SRC are different for source and sink both buffers do
> not need to meet both criteria.

These functions only check that there is enough avail bytes in source
and free bytes in sink before we do any copy, what errors did you see ?

Liam

> 
> Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo at linux.intel.com>
> ---
>  src/audio/src.c | 27 +++++++++++----------------
>  1 file changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/src/audio/src.c b/src/audio/src.c
> index 3378065..0103e2e 100644
> --- a/src/audio/src.c
> +++ b/src/audio/src.c
> @@ -496,7 +496,6 @@ static int src_copy(struct comp_dev *dev)
>  	int need_sink;
>  	size_t consumed = 0;
>  	size_t produced = 0;
> -	int res;
>  
>  	trace_src("SRC");
>  
> @@ -519,30 +518,26 @@ static int src_copy(struct comp_dev *dev)
>  	/* make sure source component buffer has enough data available and that
>  	 * the sink component buffer has enough free bytes for copy. Also
>  	 * check for XRUNs */
> -	res = comp_buffer_can_copy_bytes(source, sink, need_source);
> -	if (res) {
> +	if (source->avail < need_source) {
>  		trace_src_error("xru");
>  		return -EIO;	/* xrun */
>  	}
> -	res = comp_buffer_can_copy_bytes(source, sink, need_sink);
> -	if (res) {
> +	if (sink->free < need_sink) {
>  		trace_src_error("xro");
>  		return -EIO;	/* xrun */
>  	}
>  
> -	/* Run SRC function if buffers avail and free allow */
> -	if (((int) source->avail >= need_source) && ((int) sink->free >= need_sink)) {
> -		cd->src_func(dev, source, sink, &consumed, &produced);
> +	cd->src_func(dev, source, sink, &consumed, &produced);
>  
> -		/* Calc new free and available if data was processed. These
> -		 * functions must not be called with 0 consumed/produced.
> -		 */
> -		if (consumed > 0)
> -			comp_update_buffer_consume(source, consumed);
> +	/* Calc new free and available if data was processed. These
> +	 * functions must not be called with 0 consumed/produced.
> +	 */
> +	if (consumed > 0)
> +		comp_update_buffer_consume(source, consumed);
> +
> +	if (produced > 0)
> +		comp_update_buffer_produce(sink, produced);
>  
> -		if (produced > 0)
> -			comp_update_buffer_produce(sink, produced);
> -	}
>  	return 0;
>  }
>  




More information about the Sound-open-firmware mailing list