PlayerControl: move attributes to struct CrossFadeSettings
This commit is contained in:
parent
095c390df7
commit
03747ba93e
@ -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;
|
||||
|
@ -22,33 +22,54 @@
|
||||
|
||||
#include "Compiler.h"
|
||||
|
||||
struct AudioFormat;
|
||||
struct music_chunk;
|
||||
#include <cmath>
|
||||
|
||||
/**
|
||||
* 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 AudioFormat;
|
||||
|
||||
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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user