Merge release 0.15.9 from branch 'v0.15.x'
Conflicts: NEWS configure.ac src/cue/cue_tag.c src/decoder/mpcdec_decoder_plugin.c src/player_thread.c
This commit is contained in:
@@ -92,6 +92,13 @@ struct player {
|
||||
*/
|
||||
unsigned cross_fade_chunks;
|
||||
|
||||
/**
|
||||
* The tag of the "next" song during cross-fade. It is
|
||||
* postponed, and sent to the output thread when the new song
|
||||
* really begins.
|
||||
*/
|
||||
struct tag *cross_fade_tag;
|
||||
|
||||
/**
|
||||
* The current audio format for the audio outputs.
|
||||
*/
|
||||
@@ -649,6 +656,14 @@ play_next_chunk(struct player *player)
|
||||
chunk = music_pipe_shift(player->pipe);
|
||||
assert(chunk != NULL);
|
||||
|
||||
/* don't send the tags of the new song (which
|
||||
is being faded in) yet; postpone it until
|
||||
the current song is faded out */
|
||||
player->cross_fade_tag =
|
||||
tag_merge_replace(player->cross_fade_tag,
|
||||
other_chunk->tag);
|
||||
other_chunk->tag = NULL;
|
||||
|
||||
if (isnan(pc.mixramp_delay_seconds)) {
|
||||
mix_ratio = ((float)cross_fade_position)
|
||||
/ player->cross_fade_chunks;
|
||||
@@ -687,6 +702,14 @@ play_next_chunk(struct player *player)
|
||||
|
||||
assert(chunk != NULL);
|
||||
|
||||
/* insert the postponed tag if cross-fading is finished */
|
||||
|
||||
if (player->xfade != XFADE_ENABLED && player->cross_fade_tag != NULL) {
|
||||
chunk->tag = tag_merge_replace(chunk->tag,
|
||||
player->cross_fade_tag);
|
||||
player->cross_fade_tag = NULL;
|
||||
}
|
||||
|
||||
/* play the current chunk */
|
||||
|
||||
success = play_chunk(player->song, chunk, &player->play_audio_format);
|
||||
@@ -769,6 +792,7 @@ static void do_play(struct decoder_control *dc)
|
||||
.xfade = XFADE_UNKNOWN,
|
||||
.cross_fading = false,
|
||||
.cross_fade_chunks = 0,
|
||||
.cross_fade_tag = NULL,
|
||||
.elapsed_time = 0.0,
|
||||
};
|
||||
|
||||
@@ -939,6 +963,9 @@ static void do_play(struct decoder_control *dc)
|
||||
music_pipe_clear(player.pipe, player_buffer);
|
||||
music_pipe_free(player.pipe);
|
||||
|
||||
if (player.cross_fade_tag != NULL)
|
||||
tag_free(player.cross_fade_tag);
|
||||
|
||||
player_lock();
|
||||
|
||||
if (player.queued) {
|
||||
|
Reference in New Issue
Block a user