aboutsummaryrefslogtreecommitdiffstats
path: root/sound/core/pcm_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/core/pcm_lib.c')
-rw-r--r--sound/core/pcm_lib.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index a27545b23ee..b07cc361afb 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,
745 unsigned int rats_count, struct snd_ratnum *rats, 745 unsigned int rats_count, struct snd_ratnum *rats,
746 unsigned int *nump, unsigned int *denp) 746 unsigned int *nump, unsigned int *denp)
747{ 747{
748 unsigned int best_num, best_diff, best_den; 748 unsigned int best_num, best_den;
749 int best_diff;
749 unsigned int k; 750 unsigned int k;
750 struct snd_interval t; 751 struct snd_interval t;
751 int err; 752 int err;
753 unsigned int result_num, result_den;
754 int result_diff;
752 755
753 best_num = best_den = best_diff = 0; 756 best_num = best_den = best_diff = 0;
754 for (k = 0; k < rats_count; ++k) { 757 for (k = 0; k < rats_count; ++k) {
@@ -770,6 +773,8 @@ int snd_interval_ratnum(struct snd_interval *i,
770 den -= r; 773 den -= r;
771 } 774 }
772 diff = num - q * den; 775 diff = num - q * den;
776 if (diff < 0)
777 diff = -diff;
773 if (best_num == 0 || 778 if (best_num == 0 ||
774 diff * best_den < best_diff * den) { 779 diff * best_den < best_diff * den) {
775 best_diff = diff; 780 best_diff = diff;
@@ -784,6 +789,9 @@ int snd_interval_ratnum(struct snd_interval *i,
784 t.min = div_down(best_num, best_den); 789 t.min = div_down(best_num, best_den);
785 t.openmin = !!(best_num % best_den); 790 t.openmin = !!(best_num % best_den);
786 791
792 result_num = best_num;
793 result_diff = best_diff;
794 result_den = best_den;
787 best_num = best_den = best_diff = 0; 795 best_num = best_den = best_diff = 0;
788 for (k = 0; k < rats_count; ++k) { 796 for (k = 0; k < rats_count; ++k) {
789 unsigned int num = rats[k].num; 797 unsigned int num = rats[k].num;
@@ -806,6 +814,8 @@ int snd_interval_ratnum(struct snd_interval *i,
806 den += rats[k].den_step - r; 814 den += rats[k].den_step - r;
807 } 815 }
808 diff = q * den - num; 816 diff = q * den - num;
817 if (diff < 0)
818 diff = -diff;
809 if (best_num == 0 || 819 if (best_num == 0 ||
810 diff * best_den < best_diff * den) { 820 diff * best_den < best_diff * den) {
811 best_diff = diff; 821 best_diff = diff;
@@ -825,10 +835,14 @@ int snd_interval_ratnum(struct snd_interval *i,
825 return err; 835 return err;
826 836
827 if (snd_interval_single(i)) { 837 if (snd_interval_single(i)) {
838 if (best_diff * result_den < result_diff * best_den) {
839 result_num = best_num;
840 result_den = best_den;
841 }
828 if (nump) 842 if (nump)
829 *nump = best_num; 843 *nump = result_num;
830 if (denp) 844 if (denp)
831 *denp = best_den; 845 *denp = result_den;
832 } 846 }
833 return err; 847 return err;
834} 848}