PlayerControl: move attributes to struct CrossFadeSettings

This commit is contained in:
Max Kellermann 2013-10-29 00:14:27 +01:00
parent 095c390df7
commit 03747ba93e
5 changed files with 74 additions and 64 deletions

View File

@ -87,13 +87,12 @@ mixramp_interpolate(const char *ramp_list, float required_db)
} }
unsigned unsigned
cross_fade_calc(float duration, float total_time, CrossFadeSettings::Calculate(float total_time,
float mixramp_db, float mixramp_delay, float replay_gain_db, float replay_gain_prev_db,
float replay_gain_db, float replay_gain_prev_db, const char *mixramp_start, const char *mixramp_prev_end,
const char *mixramp_start, const char *mixramp_prev_end, const AudioFormat af,
const AudioFormat af, const AudioFormat old_format,
const AudioFormat old_format, unsigned max_chunks) const
unsigned max_chunks)
{ {
unsigned int chunks = 0; unsigned int chunks = 0;
float chunks_f; float chunks_f;

View File

@ -22,33 +22,54 @@
#include "Compiler.h" #include "Compiler.h"
struct AudioFormat; #include <cmath>
struct music_chunk;
/** struct AudioFormat;
* Calculate how many music pipe chunks should be used for crossfading.
* struct CrossFadeSettings {
* @param duration the requested crossfade duration /**
* @param total_time total_time the duration of the new song * The configured cross fade duration [s].
* @param mixramp_db the current mixramp_db setting */
* @param mixramp_delay the current mixramp_delay setting float duration;
* @param replay_gain_db the ReplayGain adjustment used for this song
* @param replay_gain_prev_db the ReplayGain adjustment used on the last song float mixramp_db;
* @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 * The configured MixRapm delay [s].
* @param old_format the audio format of the current song */
* @param max_chunks the maximum number of chunks float mixramp_delay;
* @return the number of chunks for crossfading, or 0 if cross fading
* should be disabled for this song change CrossFadeSettings()
*/ :duration(0),
gcc_pure mixramp_db(0),
unsigned mixramp_delay(std::nanf(""))
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, * Calculate how many music pipe chunks should be used for crossfading.
unsigned max_chunks); *
* @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 #endif

View File

@ -36,15 +36,6 @@ PlayerControl::PlayerControl(unsigned _buffer_chunks,
error_type(PlayerError::NONE), error_type(PlayerError::NONE),
tagged_song(nullptr), tagged_song(nullptr),
next_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), total_play_time(0),
border_pause(false) border_pause(false)
{ {
@ -260,7 +251,7 @@ PlayerControl::SetCrossFade(float _cross_fade_seconds)
{ {
if (_cross_fade_seconds < 0) if (_cross_fade_seconds < 0)
_cross_fade_seconds = 0; _cross_fade_seconds = 0;
cross_fade_seconds = _cross_fade_seconds; cross_fade.duration = _cross_fade_seconds;
idle_add(IDLE_OPTIONS); idle_add(IDLE_OPTIONS);
} }
@ -268,7 +259,7 @@ PlayerControl::SetCrossFade(float _cross_fade_seconds)
void void
PlayerControl::SetMixRampDb(float _mixramp_db) PlayerControl::SetMixRampDb(float _mixramp_db)
{ {
mixramp_db = _mixramp_db; cross_fade.mixramp_db = _mixramp_db;
idle_add(IDLE_OPTIONS); idle_add(IDLE_OPTIONS);
} }
@ -276,7 +267,7 @@ PlayerControl::SetMixRampDb(float _mixramp_db)
void void
PlayerControl::SetMixRampDelay(float _mixramp_delay_seconds) PlayerControl::SetMixRampDelay(float _mixramp_delay_seconds)
{ {
mixramp_delay_seconds = _mixramp_delay_seconds; cross_fade.mixramp_delay = _mixramp_delay_seconds;
idle_add(IDLE_OPTIONS); idle_add(IDLE_OPTIONS);
} }

View File

@ -25,6 +25,7 @@
#include "thread/Cond.hxx" #include "thread/Cond.hxx"
#include "thread/Thread.hxx" #include "thread/Thread.hxx"
#include "util/Error.hxx" #include "util/Error.hxx"
#include "CrossFade.hxx"
#include <stdint.h> #include <stdint.h>
@ -155,9 +156,9 @@ struct PlayerControl {
Song *next_song; Song *next_song;
double seek_where; double seek_where;
float cross_fade_seconds;
float mixramp_db; CrossFadeSettings cross_fade;
float mixramp_delay_seconds;
double total_play_time; double total_play_time;
/** /**
@ -430,19 +431,19 @@ public:
void SetCrossFade(float cross_fade_seconds); void SetCrossFade(float cross_fade_seconds);
float GetCrossFade() const { float GetCrossFade() const {
return cross_fade_seconds; return cross_fade.duration;
} }
void SetMixRampDb(float mixramp_db); void SetMixRampDb(float mixramp_db);
float GetMixRampDb() const { float GetMixRampDb() const {
return mixramp_db; return cross_fade.mixramp_db;
} }
void SetMixRampDelay(float mixramp_delay_seconds); void SetMixRampDelay(float mixramp_delay_seconds);
float GetMixRampDelay() const { float GetMixRampDelay() const {
return mixramp_delay_seconds; return cross_fade.mixramp_delay;
} }
double GetTotalPlayTime() const { double GetTotalPlayTime() const {

View File

@ -779,7 +779,7 @@ Player::PlayNextChunk()
other_chunk->tag); other_chunk->tag);
other_chunk->tag = nullptr; 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) chunk->mix_ratio = ((float)cross_fade_position)
/ cross_fade_chunks; / cross_fade_chunks;
} else { } else {
@ -999,17 +999,15 @@ Player::Run()
calculate how many chunks will be required calculate how many chunks will be required
for it */ for it */
cross_fade_chunks = cross_fade_chunks =
cross_fade_calc(pc.cross_fade_seconds, dc.total_time, pc.cross_fade.Calculate(dc.total_time,
pc.mixramp_db, dc.replay_gain_db,
pc.mixramp_delay_seconds, dc.replay_gain_prev_db,
dc.replay_gain_db, dc.GetMixRampStart(),
dc.replay_gain_prev_db, dc.GetMixRampPreviousEnd(),
dc.GetMixRampStart(), dc.out_audio_format,
dc.GetMixRampPreviousEnd(), play_audio_format,
dc.out_audio_format, buffer.GetSize() -
play_audio_format, pc.buffered_before_play);
buffer.GetSize() -
pc.buffered_before_play);
if (cross_fade_chunks > 0) { if (cross_fade_chunks > 0) {
xfade_state = CrossFadeState::ENABLED; xfade_state = CrossFadeState::ENABLED;
cross_fading = false; cross_fading = false;