Author: ayoung
Date: Fri Sep  9 02:10:02 2011
New Revision: 9504

URL: http://svn.slimdevices.com/jive?rev=9504&view=rev
Log:
bug 3639: Crossfade on skip next/play 
Define and implement ImmediateCrossfade capability in SqueezePlay.

Modified:
    7.6/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
    7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
    7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c
    7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h

Modified: 7.6/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
URL: 
http://svn.slimdevices.com/jive/7.6/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua?rev=9504&r1=9503&r2=9504&view=diff
==============================================================================
--- 7.6/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua 
(original)
+++ 7.6/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua Fri Sep 
 9 02:10:02 2011
@@ -116,6 +116,8 @@
                slimproto:capability("spdr")
                slimproto:capability("Spdirect", cap)
        end
+
+       slimproto:capability("ImmediateCrossfade")
 
        slimproto:capability("test")
 

Modified: 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
URL: 
http://svn.slimdevices.com/jive/7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c?rev=9504&r1=9503&r2=9504&view=diff
==============================================================================
--- 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c (original)
+++ 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c Fri Sep  9 
02:10:02 2011
@@ -256,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/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c
URL: 
http://svn.slimdevices.com/jive/7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c?rev=9504&r1=9503&r2=9504&view=diff
==============================================================================
--- 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c 
(original)
+++ 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c Fri 
Sep  9 02:10:02 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/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
URL: 
http://svn.slimdevices.com/jive/7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h?rev=9504&r1=9503&r2=9504&view=diff
==============================================================================
--- 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h 
(original)
+++ 7.6/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h Fri 
Sep  9 02:10:02 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.

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/jive-checkins

Reply via email to