Index: src/squeezeplay/share/jive/audio/Playback.lua =================================================================== --- src/squeezeplay/share/jive/audio/Playback.lua (revision 9297) +++ src/squeezeplay/share/jive/audio/Playback.lua (working copy) @@ -118,6 +118,8 @@ slimproto:capability("Spdirect", cap) end + slimproto:capability("ImmediateCrossfade") + Rtmp:init(slimproto) self.mode = 0 Index: src/squeezeplay/src/audio/decode/decode_output.c =================================================================== --- src/squeezeplay/src/audio/decode/decode_output.c (revision 9296) +++ src/squeezeplay/src/audio/decode/decode_output.c (working copy) @@ -285,6 +285,18 @@ if (decode_transition_type & TRANSITION_CROSSFADE) { size_t crossfadeBytes; + fft_fixed interval; + + if (decode_transition_type & TRANSITION_IMMEDIATE) { + size_t wanted = SAMPLES_TO_BYTES(decode_transition_period * decode_audio->track_sample_rate); + size_t used = fifo_bytes_used(&decode_audio->fifo); + + if (used > wanted) { + size_t skip = used - wanted; + if (skip > decode_audio->fifo.wptr) decode_audio->fifo.wptr += decode_audio->fifo.size; + decode_audio->fifo.wptr -= skip; + } + } /* We are being asked to do a crossfade. Find out * if it is possible. @@ -289,7 +301,7 @@ /* We are being asked to do a crossfade. Find out * if it is possible. */ - fft_fixed interval = determine_transition_interval(sample_rate, decode_transition_period, &crossfadeBytes); + interval = determine_transition_interval(sample_rate, decode_transition_period, &crossfadeBytes); if (interval) { LOG_DEBUG(log_audio_decode, "Starting CROSSFADE over %d seconds, requiring %d bytes", fixed_to_s32(interval), (unsigned int)crossfadeBytes); @@ -298,7 +310,8 @@ crossfade_ptr = decode_audio->fifo.wptr; /* Buffer position to start crossfade */ - decode_audio->fifo.wptr = (crossfadeBytes <= decode_audio->fifo.wptr) ? (decode_audio->fifo.wptr - crossfadeBytes) : (decode_audio->fifo.wptr - crossfadeBytes + decode_audio->fifo.size); + if (crossfadeBytes > decode_audio->fifo.wptr) decode_audio->fifo.wptr += decode_audio->fifo.size; + decode_audio->fifo.wptr -= crossfadeBytes; /* Gain steps */ transition_gain_step = fixed_div(FIXED_ONE, fixed_mul(interval, s32_to_fixed(TRANSITION_STEPS_PER_SECOND))); @@ -491,6 +504,9 @@ /* Halve the period for fade in/fade out */ decode_transition_period >>= 1; break; + case 5: + decode_transition_type = TRANSITION_CROSSFADE | TRANSITION_IMMEDIATE; + break; } } Index: src/squeezeplay/src/audio/decode/decode.c =================================================================== --- src/squeezeplay/src/audio/decode/decode.c (revision 9296) +++ src/squeezeplay/src/audio/decode/decode.c (working copy) @@ -265,6 +265,15 @@ } mqueue_read_complete(&decode_mqueue); + if (decoder) { + decoder->stop(decoder_data); + + decoder = NULL; + decoder_data = NULL; + + current_decoder_state = 0; + } + for (i=0; i<(sizeof(all_decoders)/sizeof(struct decode_module *)); i++) { if (all_decoders[i]->id == decoder_id) { decoder = all_decoders[i]; Index: src/squeezeplay/src/audio/decode/decode_priv.h =================================================================== --- src/squeezeplay/src/audio/decode/decode_priv.h (revision 9296) +++ src/squeezeplay/src/audio/decode/decode_priv.h (working copy) @@ -20,6 +20,7 @@ #define TRANSITION_CROSSFADE 0x1 #define TRANSITION_FADE_IN 0x2 #define TRANSITION_FADE_OUT 0x4 +#define TRANSITION_IMMEDIATE 0x8 /* Transition steps per second should be a common factor * of all supported sample rates.