Author: awy
Date: Fri Aug 22 03:20:23 2008
New Revision: 2883

URL: http://svn.slimdevices.com?rev=2883&root=Jive&view=rev
Log:
Handle skipAhead (strm-a)

Modified:
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c?rev=2883&root=Jive&r1=2882&r2=2883&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c (original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c Fri Aug 22 
03:20:23 2008
@@ -35,6 +35,7 @@
 u32_t decode_elapsed_samples = 0;
 bool_t decode_first_buffer = FALSE;
 u32_t current_sample_rate = 44100;
+u32_t skip_ahead_bytes = 0;
 
 
 /* decoder fifo used to store decoded samples */
@@ -123,8 +124,8 @@
        mqueue_read_complete(&decode_mqueue);
 
        DEBUG_TRACE("decode_skip_ahead_handler interval=%d", interval);
-
-       // XXXX
+       
+       skip_ahead_bytes = SAMPLES_TO_BYTES((u32_t)((interval * 
current_sample_rate) / 1000));
 }
 
 

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c?rev=2883&root=Jive&r1=2882&r2=2883&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c Fri 
Aug 22 03:20:23 2008
@@ -42,7 +42,7 @@
  */
 static void callback(void *outputBuffer,
                    unsigned long framesPerBuffer) {
-       size_t bytes_used, len;
+       size_t bytes_used, len, skip_bytes = 0;
        bool_t reached_start_point;
        Uint8 *outputArray = (u8_t *)outputBuffer;
 
@@ -60,7 +60,14 @@
                return;
        }
 
-       bytes_used = fifo_bytes_used(&decode_fifo);     
+       bytes_used = fifo_bytes_used(&decode_fifo);
+       
+       /* only skip if it will not cause an underrun */
+       if (bytes_used + skip_ahead_bytes >= len) {
+               skip_bytes = skip_ahead_bytes;
+               bytes_used -= skip_bytes;
+       }
+
        if (bytes_used > len) {
                bytes_used = len;
        }
@@ -69,6 +76,7 @@
        if (bytes_used == 0) {
                current_audio_state |= DECODE_STATE_UNDERRUN;
                memset(outputArray, 0, len);
+               DEBUG_ERROR("Audio underrun: used 0 bytes");
 
                return;
        }
@@ -76,9 +84,29 @@
        if (bytes_used < len) {
                current_audio_state |= DECODE_STATE_UNDERRUN;
                memset(outputArray + bytes_used, 0, len - bytes_used);
+               DEBUG_ERROR("Audio underrun: used %d bytes , requested %d 
bytes", bytes_used, len);
        }
        else {
                current_audio_state &= ~DECODE_STATE_UNDERRUN;
+       }
+       
+       if (skip_bytes) {
+               size_t wrap;
+
+               DEBUG_TRACE("Skipping %d bytes", skip_bytes);
+               
+               wrap = fifo_bytes_until_rptr_wrap(&decode_fifo);
+
+               if (wrap < skip_bytes) {
+                       fifo_rptr_incby(&decode_fifo, wrap);
+                       skip_bytes -= wrap;
+                       skip_ahead_bytes -= wrap;
+                       decode_elapsed_samples += BYTES_TO_SAMPLES(wrap);
+               }
+
+               fifo_rptr_incby(&decode_fifo, skip_bytes);
+               skip_ahead_bytes -= skip_bytes;
+               decode_elapsed_samples += BYTES_TO_SAMPLES(skip_bytes);
        }
 
        while (bytes_used) {

Modified: 
7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c?rev=2883&root=Jive&r1=2882&r2=2883&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c 
Fri Aug 22 03:20:23 2008
@@ -40,7 +40,7 @@
                    const PaStreamCallbackTimeInfo *timeInfo,
                    PaStreamCallbackFlags statusFlags,
                    void *userData) {
-       size_t bytes_used, len;
+       size_t bytes_used, len, skip_bytes = 0;
        bool_t reached_start_point;
        Uint8 *outputArray = (u8_t *)outputBuffer;
 
@@ -65,6 +65,13 @@
        fifo_lock(&decode_fifo);
 
        bytes_used = fifo_bytes_used(&decode_fifo);     
+
+       /* only skip if it will not cause an underrun */
+       if (bytes_used + skip_ahead_bytes >= len) {
+               skip_bytes = skip_ahead_bytes;
+               bytes_used -= skip_bytes;
+       }
+
        if (bytes_used > len) {
                bytes_used = len;
        }
@@ -84,6 +91,25 @@
        }
        else {
                current_audio_state &= ~DECODE_STATE_UNDERRUN;
+       }
+
+       if (skip_bytes) {
+               size_t wrap;
+
+               DEBUG_TRACE("Skipping %d bytes", skip_bytes);
+               
+               wrap = fifo_bytes_until_rptr_wrap(&decode_fifo);
+
+               if (wrap < skip_bytes) {
+                       fifo_rptr_incby(&decode_fifo, wrap);
+                       skip_bytes -= wrap;
+                       skip_ahead_bytes -= wrap;
+                       decode_elapsed_samples += BYTES_TO_SAMPLES(wrap);
+               }
+
+               fifo_rptr_incby(&decode_fifo, skip_bytes);
+               skip_ahead_bytes -= skip_bytes;
+               decode_elapsed_samples += BYTES_TO_SAMPLES(skip_bytes);
        }
 
        while (bytes_used) {

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h?rev=2883&root=Jive&r1=2882&r2=2883&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h Fri 
Aug 22 03:20:23 2008
@@ -120,6 +120,7 @@
 extern u32_t decode_elapsed_samples;
 extern bool_t decode_first_buffer;
 extern u32_t current_sample_rate;
+extern u32_t skip_ahead_bytes;
 
 /* The fifo used to store decoded samples */
 extern u8_t decode_fifo_buf[DECODE_FIFO_SIZE];

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

Reply via email to