Author: agrundman Date: Fri Sep 9 05:39:58 2011 New Revision: 9505 URL: http://svn.slimdevices.com/jive?rev=9505&view=rev Log: r79552@andy-imac (orig r9503): ayoung | 2011-09-08 11:27:33 -0400 bug 13814: Implement synchronized unpause Improve accuracy of timed start and resume by delaying evaluation of delay interval until where it is used in the output thread/process. r79553@andy-imac (orig r9504): ayoung | 2011-09-09 05:10:02 -0400 bug 3639: Crossfade on skip next/play Define and implement ImmediateCrossfade capability in SqueezePlay.
Modified: 7.6/branches/usb-audio/ (props changed) 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode.c 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_null.c 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h Propchange: 7.6/branches/usb-audio/ ------------------------------------------------------------------------------ --- svk:merge (original) +++ svk:merge Fri Sep 9 05:39:58 2011 @@ -15,7 +15,7 @@ bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.4/trunk:8423 bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.5/private-branches/7.5.3-rc:9282 bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.5/trunk:9408 -bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.6/trunk:9500 +bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.6/trunk:9504 bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/7.0:2013 bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/SN:1083 bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/scrolling:1378 Modified: 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua URL: http://svn.slimdevices.com/jive/7.6/branches/usb-audio/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua?rev=9505&r1=9504&r2=9505&view=diff ============================================================================== --- 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua (original) +++ 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua Fri Sep 9 05:39:58 2011 @@ -116,6 +116,8 @@ slimproto:capability("spdr") slimproto:capability("Spdirect", cap) end + + slimproto:capability("ImmediateCrossfade") slimproto:capability("test") Modified: 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode.c URL: http://svn.slimdevices.com/jive/7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode.c?rev=9505&r1=9504&r2=9505&view=diff ============================================================================== --- 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode.c (original) +++ 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode.c Fri Sep 9 05:39:58 2011 @@ -123,26 +123,18 @@ static void decode_resume_audio_handler(void) { - int start_interval = 0; Uint32 start_jiffies; start_jiffies = mqueue_read_u32(&decode_mqueue); mqueue_read_complete(&decode_mqueue); - if (start_jiffies) { - start_interval = start_jiffies - jive_jiffies(); - } - - LOG_DEBUG(log_audio_decode, "decode_resume_audio_handler start_interval=%d", start_interval); + LOG_DEBUG(log_audio_decode, "decode_resume_audio_handler start_jiffies=%u", start_jiffies); debug_fullness(); decode_audio_lock(); - if (start_interval) { - decode_audio->add_silence_ms = start_interval; - } - if (((decode_audio->state & (DECODE_STATE_RUNNING | DECODE_STATE_AUTOSTART)) == 0)) { + decode_audio->start_at_jiffies = start_jiffies; decode_audio->state = DECODE_STATE_AUTOSTART; decode_audio->f->resume(); } @@ -264,6 +256,13 @@ params[i] = mqueue_read_u8(&decode_mqueue); } mqueue_read_complete(&decode_mqueue); + + if (decoder) { + decoder->stop(decoder_data); + + decoder = NULL; + decoder_data = NULL; + } for (i=0; i<(sizeof(all_decoders)/sizeof(struct decode_module *)); i++) { if (all_decoders[i]->id == decoder_id) { Modified: 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c URL: http://svn.slimdevices.com/jive/7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c?rev=9505&r1=9504&r2=9505&view=diff ============================================================================== --- 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c (original) +++ 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa_backend.c Fri Sep 9 05:39:58 2011 @@ -286,6 +286,12 @@ && decode_frames > (decode_audio->output_threshold * state->pcm_sample_rate / 10) ) { + u32_t now = jive_jiffies(); + + if (decode_audio->start_at_jiffies > now && now > decode_audio->start_at_jiffies - 5000) + /* This does not consider any delay in the ALSA output chain - usually 1 period which is 10ms by default */ + decode_audio->add_silence_ms = decode_audio->start_at_jiffies - now; + decode_audio->state &= ~DECODE_STATE_AUTOSTART; decode_audio->state |= DECODE_STATE_RUNNING; } Modified: 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_null.c URL: http://svn.slimdevices.com/jive/7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_null.c?rev=9505&r1=9504&r2=9505&view=diff ============================================================================== --- 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_null.c (original) +++ 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_null.c Fri Sep 9 05:39:58 2011 @@ -47,6 +47,11 @@ && bytes_used >= SAMPLES_TO_BYTES((u32_t)((decode_audio->output_threshold * stream_sample_rate) / 10)) ) { + u32_t now = jive_jiffies(); + + if (decode_audio->start_at_jiffies > now && now > decode_audio->start_at_jiffies - 5000) + decode_audio->add_silence_ms = decode_audio->start_at_jiffies - now; + decode_audio->state &= ~DECODE_STATE_AUTOSTART; decode_audio->state |= DECODE_STATE_RUNNING; } Modified: 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c URL: http://svn.slimdevices.com/jive/7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c?rev=9505&r1=9504&r2=9505&view=diff ============================================================================== --- 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c (original) +++ 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c Fri Sep 9 05:39:58 2011 @@ -285,11 +285,23 @@ 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. */ - 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; } } Modified: 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c URL: http://svn.slimdevices.com/jive/7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c?rev=9505&r1=9504&r2=9505&view=diff ============================================================================== --- 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c (original) +++ 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c Fri Sep 9 05:39:58 2011 @@ -62,6 +62,12 @@ && bytes_used >= SAMPLES_TO_BYTES((u32_t)((decode_audio->output_threshold * stream_sample_rate) / 10)) ) { + u32_t now = jive_jiffies(); + + if (decode_audio->start_at_jiffies > now && now > decode_audio->start_at_jiffies - 5000) + /* This does not consider any delay in the port-audio output chain */ + decode_audio->add_silence_ms = decode_audio->start_at_jiffies - now; + decode_audio->state &= ~DECODE_STATE_AUTOSTART; decode_audio->state |= DECODE_STATE_RUNNING; } Modified: 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h URL: http://svn.slimdevices.com/jive/7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h?rev=9505&r1=9504&r2=9505&view=diff ============================================================================== --- 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h (original) +++ 7.6/branches/usb-audio/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h Fri Sep 9 05:39:58 2011 @@ -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. @@ -152,6 +153,7 @@ /* sync state */ size_t skip_ahead_bytes; int add_silence_ms; + u32_t start_at_jiffies; /* effect_fifo locks: effect_gain */ struct fifo effect_fifo; _______________________________________________ Jive-checkins mailing list Jive-checkins@lists.slimdevices.com http://lists.slimdevices.com/mailman/listinfo/jive-checkins