diff options
author | Max Kellermann <max@musicpd.org> | 2020-07-01 17:20:19 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2020-07-01 17:38:08 +0200 |
commit | 691b6a236ebc769f3d1aaa21ddc3a4c7ad9211be (patch) | |
tree | 0b9c648891bf1dd03c7968f9641010a9c518db9f | |
parent | 5c7243d3add84b0f11da0ebea558b31984b0a65f (diff) |
output/osx: improve sample rate selection
The formula in osx_output_score_sample_rate() to detect multiples of
the source sample rate was broken: when given a 44.1 kHz input file,
it preferred 16 kHz over 48 kHz, because its `frac_portion(16)=0.75`
is smaller than `frac_portion(48)=0.91`.
That formula, introduced by commit 40a1ebee295c569, looks completely
wrong. It doesn't do what the code comment pretends it does.
Instead of using that `frac_portion` to calculate a score, this patch
adds to the score only if `frac_portion` is nearly `0` or `1`. This
means that the factor is nearly integer.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/904
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | src/output/plugins/OSXOutputPlugin.cxx | 3 |
2 files changed, 4 insertions, 1 deletions
@@ -4,6 +4,8 @@ ver 0.21.25 (not yet released) * input - file: detect premature end of file - smbclient: don't send credentials to MPD clients +* output + - osx: improve sample rate selection * Windows/Android: - fix Boost detection after breaking change in Meson 0.54 diff --git a/src/output/plugins/OSXOutputPlugin.cxx b/src/output/plugins/OSXOutputPlugin.cxx index 7f84e6e83..da7bb4f19 100644 --- a/src/output/plugins/OSXOutputPlugin.cxx +++ b/src/output/plugins/OSXOutputPlugin.cxx @@ -342,7 +342,8 @@ osx_output_score_sample_rate(Float64 destination_rate, unsigned source_rate) double int_portion; double frac_portion = modf(source_rate / destination_rate, &int_portion); // prefer sample rates that are multiples of the source sample rate - score += (1 - frac_portion) * 1000; + if (frac_portion < 0.01 || frac_portion >= 0.99) + score += 1000; // prefer exact matches over other multiples score += (int_portion == 1.0) ? 500 : 0; if (source_rate == destination_rate) |