aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/CrossFade.cxx13
-rw-r--r--src/CrossFade.hxx73
-rw-r--r--src/PlayerControl.cxx15
-rw-r--r--src/PlayerControl.hxx13
-rw-r--r--src/PlayerThread.cxx22
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;