diff options
-rw-r--r-- | src/CrossFade.cxx | 13 | ||||
-rw-r--r-- | src/CrossFade.hxx | 73 | ||||
-rw-r--r-- | src/PlayerControl.cxx | 15 | ||||
-rw-r--r-- | src/PlayerControl.hxx | 13 | ||||
-rw-r--r-- | src/PlayerThread.cxx | 22 |
5 files changed, 73 insertions, 63 deletions
diff --git a/src/CrossFade.cxx b/src/CrossFade.cxx index b66f96adf..76820fb45 100644 --- a/src/CrossFade.cxx +++ b/src/CrossFade.cxx @@ -87,13 +87,12 @@ mixramp_interpolate(const char *ramp_list, float required_db) } unsigned -cross_fade_calc(float duration, float total_time, - float mixramp_db, float mixramp_delay, - float replay_gain_db, float replay_gain_prev_db, - const char *mixramp_start, const char *mixramp_prev_end, - const AudioFormat af, - const AudioFormat old_format, - unsigned max_chunks) +CrossFadeSettings::Calculate(float total_time, + float replay_gain_db, float replay_gain_prev_db, + const char *mixramp_start, const char *mixramp_prev_end, + const AudioFormat af, + const AudioFormat old_format, + unsigned max_chunks) const { unsigned int chunks = 0; float chunks_f; diff --git a/src/CrossFade.hxx b/src/CrossFade.hxx index d30d06320..3bc1f707a 100644 --- a/src/CrossFade.hxx +++ b/src/CrossFade.hxx @@ -22,33 +22,54 @@ #include "Compiler.h" +#include <cmath> + struct AudioFormat; -struct music_chunk; -/** - * Calculate how many music pipe chunks should be used for crossfading. - * - * @param duration the requested crossfade duration - * @param total_time total_time the duration of the new song - * @param mixramp_db the current mixramp_db setting - * @param mixramp_delay the current mixramp_delay setting - * @param replay_gain_db the ReplayGain adjustment used for this song - * @param replay_gain_prev_db the ReplayGain adjustment used on the last song - * @param mixramp_start the next songs mixramp_start tag - * @param mixramp_prev_end the last songs mixramp_end setting - * @param af the audio format of the new song - * @param old_format the audio format of the current song - * @param max_chunks the maximum number of chunks - * @return the number of chunks for crossfading, or 0 if cross fading - * should be disabled for this song change - */ -gcc_pure -unsigned -cross_fade_calc(float duration, float total_time, - float mixramp_db, float mixramp_delay, - float replay_gain_db, float replay_gain_prev_db, - const char *mixramp_start, const char *mixramp_prev_end, - AudioFormat af, AudioFormat old_format, - unsigned max_chunks); +struct CrossFadeSettings { + /** + * The configured cross fade duration [s]. + */ + float duration; + + float mixramp_db; + + /** + * The configured MixRapm delay [s]. + */ + float mixramp_delay; + + CrossFadeSettings() + :duration(0), + mixramp_db(0), + mixramp_delay(std::nanf("")) + {} + + + /** + * Calculate how many music pipe chunks should be used for crossfading. + * + * @param duration the requested crossfade duration + * @param total_time total_time the duration of the new song + * @param mixramp_db the current mixramp_db setting + * @param mixramp_delay the current mixramp_delay setting + * @param replay_gain_db the ReplayGain adjustment used for this song + * @param replay_gain_prev_db the ReplayGain adjustment used on the last song + * @param mixramp_start the next songs mixramp_start tag + * @param mixramp_prev_end the last songs mixramp_end setting + * @param af the audio format of the new song + * @param old_format the audio format of the current song + * @param max_chunks the maximum number of chunks + * @return the number of chunks for crossfading, or 0 if cross fading + * should be disabled for this song change + */ + gcc_pure + unsigned Calculate(float total_time, + float replay_gain_db, float replay_gain_prev_db, + const char *mixramp_start, + const char *mixramp_prev_end, + AudioFormat af, AudioFormat old_format, + unsigned max_chunks) const; +}; #endif diff --git a/src/PlayerControl.cxx b/src/PlayerControl.cxx index c6fb7ad06..f180874b0 100644 --- a/src/PlayerControl.cxx +++ b/src/PlayerControl.cxx @@ -36,15 +36,6 @@ PlayerControl::PlayerControl(unsigned _buffer_chunks, error_type(PlayerError::NONE), tagged_song(nullptr), next_song(nullptr), - cross_fade_seconds(0), - mixramp_db(0), -#if defined(__GLIBCXX__) && !defined(_GLIBCXX_USE_C99_MATH_TR1) - /* workaround: on MacPorts, this option is disabled on gcc47, - and therefore std::nanf() is not available */ - mixramp_delay_seconds(nanf("")), -#else - mixramp_delay_seconds(std::nanf("")), -#endif total_play_time(0), border_pause(false) { @@ -260,7 +251,7 @@ PlayerControl::SetCrossFade(float _cross_fade_seconds) { if (_cross_fade_seconds < 0) _cross_fade_seconds = 0; - cross_fade_seconds = _cross_fade_seconds; + cross_fade.duration = _cross_fade_seconds; idle_add(IDLE_OPTIONS); } @@ -268,7 +259,7 @@ PlayerControl::SetCrossFade(float _cross_fade_seconds) void PlayerControl::SetMixRampDb(float _mixramp_db) { - mixramp_db = _mixramp_db; + cross_fade.mixramp_db = _mixramp_db; idle_add(IDLE_OPTIONS); } @@ -276,7 +267,7 @@ PlayerControl::SetMixRampDb(float _mixramp_db) void PlayerControl::SetMixRampDelay(float _mixramp_delay_seconds) { - mixramp_delay_seconds = _mixramp_delay_seconds; + cross_fade.mixramp_delay = _mixramp_delay_seconds; idle_add(IDLE_OPTIONS); } diff --git a/src/PlayerControl.hxx b/src/PlayerControl.hxx index 97e15b06c..38ba21a53 100644 --- a/src/PlayerControl.hxx +++ b/src/PlayerControl.hxx @@ -25,6 +25,7 @@ #include "thread/Cond.hxx" #include "thread/Thread.hxx" #include "util/Error.hxx" +#include "CrossFade.hxx" #include <stdint.h> @@ -155,9 +156,9 @@ struct PlayerControl { Song *next_song; double seek_where; - float cross_fade_seconds; - float mixramp_db; - float mixramp_delay_seconds; + + CrossFadeSettings cross_fade; + double total_play_time; /** @@ -430,19 +431,19 @@ public: void SetCrossFade(float cross_fade_seconds); float GetCrossFade() const { - return cross_fade_seconds; + return cross_fade.duration; } void SetMixRampDb(float mixramp_db); float GetMixRampDb() const { - return mixramp_db; + return cross_fade.mixramp_db; } void SetMixRampDelay(float mixramp_delay_seconds); float GetMixRampDelay() const { - return mixramp_delay_seconds; + return cross_fade.mixramp_delay; } double GetTotalPlayTime() const { diff --git a/src/PlayerThread.cxx b/src/PlayerThread.cxx index 7273a3300..79efe7a9d 100644 --- a/src/PlayerThread.cxx +++ b/src/PlayerThread.cxx @@ -779,7 +779,7 @@ Player::PlayNextChunk() other_chunk->tag); other_chunk->tag = nullptr; - if (std::isnan(pc.mixramp_delay_seconds)) { + if (std::isnan(pc.cross_fade.mixramp_delay)) { chunk->mix_ratio = ((float)cross_fade_position) / cross_fade_chunks; } else { @@ -999,17 +999,15 @@ Player::Run() calculate how many chunks will be required for it */ cross_fade_chunks = - cross_fade_calc(pc.cross_fade_seconds, dc.total_time, - pc.mixramp_db, - pc.mixramp_delay_seconds, - dc.replay_gain_db, - dc.replay_gain_prev_db, - dc.GetMixRampStart(), - dc.GetMixRampPreviousEnd(), - dc.out_audio_format, - play_audio_format, - buffer.GetSize() - - pc.buffered_before_play); + pc.cross_fade.Calculate(dc.total_time, + dc.replay_gain_db, + dc.replay_gain_prev_db, + dc.GetMixRampStart(), + dc.GetMixRampPreviousEnd(), + dc.out_audio_format, + play_audio_format, + buffer.GetSize() - + pc.buffered_before_play); if (cross_fade_chunks > 0) { xfade_state = CrossFadeState::ENABLED; cross_fading = false; |