diff options
| -rw-r--r-- | 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 a27545b23ee9..b07cc361afb1 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 | } |
