[alsa-devel] [PATCH] refine rate selection in snd_interval_ratnum()

Takashi Iwai tiwai at suse.de
Tue Dec 22 08:17:49 CET 2009


At Mon, 21 Dec 2009 17:07:08 +0100,
Krzysztof Helt wrote:
> 
> From: Krzysztof Helt <krzysztof.h1 at wp.pl>
> 
> Refine the rate selection by choosing the rate
> closer to the requested one in case of selecting
> single frequency. Previously, the higher rate was
> always selected.
> 
> Also, fix problem with the best_diff unsigned int
> value wrapping (turning negative).
> 
> Signed-off-by: Krzysztof Helt <krzysztof.h1 at wp.pl>

Applied now.  Thanks.


Takashi

> ---
>  sound/core/pcm_lib.c |   20 +++++++++++++++++---
>  1 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
> index a27545b..b07cc36 100644
> --- a/sound/core/pcm_lib.c
> +++ b/sound/core/pcm_lib.c
> @@ -745,10 +745,13 @@ int snd_interval_ratnum(struct snd_interval *i,
>  			unsigned int rats_count, struct snd_ratnum *rats,
>  			unsigned int *nump, unsigned int *denp)
>  {
> -	unsigned int best_num, best_diff, best_den;
> +	unsigned int best_num, best_den;
> +	int best_diff;
>  	unsigned int k;
>  	struct snd_interval t;
>  	int err;
> +	unsigned int result_num, result_den;
> +	int result_diff;
>  
>  	best_num = best_den = best_diff = 0;
>  	for (k = 0; k < rats_count; ++k) {
> @@ -770,6 +773,8 @@ int snd_interval_ratnum(struct snd_interval *i,
>  				den -= r;
>  		}
>  		diff = num - q * den;
> +		if (diff < 0)
> +			diff = -diff;
>  		if (best_num == 0 ||
>  		    diff * best_den < best_diff * den) {
>  			best_diff = diff;
> @@ -784,6 +789,9 @@ int snd_interval_ratnum(struct snd_interval *i,
>  	t.min = div_down(best_num, best_den);
>  	t.openmin = !!(best_num % best_den);
>  	
> +	result_num = best_num;
> +	result_diff = best_diff;
> +	result_den = best_den;
>  	best_num = best_den = best_diff = 0;
>  	for (k = 0; k < rats_count; ++k) {
>  		unsigned int num = rats[k].num;
> @@ -806,6 +814,8 @@ int snd_interval_ratnum(struct snd_interval *i,
>  				den += rats[k].den_step - r;
>  		}
>  		diff = q * den - num;
> +		if (diff < 0)
> +			diff = -diff;
>  		if (best_num == 0 ||
>  		    diff * best_den < best_diff * den) {
>  			best_diff = diff;
> @@ -825,10 +835,14 @@ int snd_interval_ratnum(struct snd_interval *i,
>  		return err;
>  
>  	if (snd_interval_single(i)) {
> +		if (best_diff * result_den < result_diff * best_den) {
> +			result_num = best_num;
> +			result_den = best_den;
> +		}
>  		if (nump)
> -			*nump = best_num;
> +			*nump = result_num;
>  		if (denp)
> -			*denp = best_den;
> +			*denp = result_den;
>  	}
>  	return err;
>  }
> -- 
> 1.6.4
> 
> 
> ----------------------------------------------------------------------
> Milosc, praca, pieniadze.
> Sprawdz swoj horoskop na dzis >> http://link.interia.pl/f2531
> 
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list