Author: awy
Date: Thu Sep 25 09:09:40 2008
New Revision: 2972

URL: http://svn.slimdevices.com?rev=2972&root=Jive&view=rev
Log:
Implement pause-for-interval (using silence).
Reduce the idle-loop load - most-likely not the final solution.
Compensate for ALSA output-stage delay in STAT messages.

Modified:
    7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
    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_output.c
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua?rev=2972&root=Jive&r1=2971&r2=2972&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua Thu Sep 
25 09:09:40 2008
@@ -156,6 +156,7 @@
                assert(data.outputSize)
                assert(data.outputFull)
                assert(data.elapsed)
+               assert(data.elapsed_jiffies)
 
                return {
                        data.event,
@@ -166,7 +167,7 @@
                        packNumber(data.bytesReceivedH, 4),
                        packNumber(data.bytesReceivedL, 4),
                        packNumber(data.signalStrength or 0, 2),
-                       packNumber(data.jiffies, 4),
+                       packNumber(data.elapsed_jiffies, 4),
                        packNumber(data.outputSize, 4),
                        packNumber(data.outputFull, 4),
                        packNumber(data.elapsed / 1000, 4),

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=2972&root=Jive&r1=2971&r2=2972&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 Thu Sep 25 
09:09:40 2008
@@ -36,6 +36,7 @@
 bool_t decode_first_buffer = FALSE;
 u32_t current_sample_rate = 44100;
 u32_t skip_ahead_bytes = 0;
+u32_t add_silence_bytes = 0;
 
 
 /* decoder fifo used to store decoded samples */
@@ -109,10 +110,13 @@
 
        DEBUG_TRACE("decode_pause_handler interval=%d", interval);
 
-       current_decoder_state &= ~DECODE_STATE_RUNNING;
-       current_audio_state &= ~DECODE_STATE_RUNNING;
-       decode_audio->pause();
-
+       if (interval) {
+               add_silence_bytes = SAMPLES_TO_BYTES((u32_t)((interval * 
current_sample_rate) / 1000));
+       } else {
+               current_decoder_state &= ~DECODE_STATE_RUNNING;
+               current_audio_state &= ~DECODE_STATE_RUNNING;
+               decode_audio->pause();
+       }
        DEBUG_TRACE("pause decode state: %x audio state %x", 
current_decoder_state, current_audio_state);
 }
 
@@ -222,7 +226,15 @@
 
 
 static Uint32 decode_timer_interval(void) {
+       size_t used;
+
        if (decoder) {
+               used = decode_output_percent_used();
+               if (used > 80) {
+                       return DECODE_MAX_INTERVAL;
+               } else if (used > 50) {
+                       return DECODE_MAX_INTERVAL / 2;
+               }
                return decoder->period(decoder_data);
        }
        return DECODE_MAX_INTERVAL;
@@ -492,7 +504,7 @@
 static int decode_status(lua_State *L) {
        size_t size, usedbytes;
        u32_t bytesL, bytesH;
-
+       
        lua_newtable(L);
 
        fifo_lock(&decode_fifo);
@@ -502,10 +514,15 @@
 
        lua_pushinteger(L, decode_fifo.size);
        lua_setfield(L, -2, "outputSize");
-
-       lua_pushinteger(L, (u32_t)(((u64_t)decode_elapsed_samples * 1000) / 
current_sample_rate));
+       
+       lua_pushinteger(L, (u32_t)(((u64_t)(decode_elapsed_samples - 
+                       (decode_audio->delay ? decode_audio->delay() : 0)) * 
1000) / current_sample_rate));
        lua_setfield(L, -2, "elapsed");
-
+       
+       /* get jiffies here so they correlate with "elapsed" as closely as 
possible */
+       lua_pushinteger(L, (u32_t)SDL_GetTicks());
+       lua_setfield(L, -2, "elapsed_jiffies");
+       
        lua_pushinteger(L, decode_num_tracks_started);
        lua_setfield(L, -2, "tracksStarted");
 

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=2972&root=Jive&r1=2971&r2=2972&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 Thu 
Sep 25 09:09:40 2008
@@ -42,7 +42,7 @@
  */
 static void callback(void *outputBuffer,
                    unsigned long framesPerBuffer) {
-       size_t bytes_used, len, skip_bytes = 0;
+       size_t bytes_used, len, skip_bytes = 0, add_bytes = 0;
        bool_t reached_start_point;
        Uint8 *outputArray = (u8_t *)outputBuffer;
 
@@ -58,6 +58,16 @@
                decode_sample_mix(outputArray, len);
 
                return;
+       }
+       
+       if (add_silence_bytes) {
+               add_bytes = add_silence_bytes;
+               if (add_bytes > len) add_bytes = len;
+               memset(outputBuffer, 0, add_bytes);
+               outputBuffer += add_bytes;
+               len -= add_bytes;
+               add_silence_bytes -= add_bytes;
+               if (!len) return;
        }
 
        bytes_used = fifo_bytes_used(&decode_fifo);
@@ -84,7 +94,7 @@
        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);
+               DEBUG_ERROR("Audio underrun: used %d bytes , requested %d 
bytes", (int)bytes_used, (int)len);
        }
        else {
                current_audio_state &= ~DECODE_STATE_UNDERRUN;
@@ -93,7 +103,7 @@
        if (skip_bytes) {
                size_t wrap;
 
-               DEBUG_TRACE("Skipping %d bytes", skip_bytes);
+               DEBUG_TRACE("Skipping %d bytes", (int)skip_bytes);
                
                wrap = fifo_bytes_until_rptr_wrap(&decode_fifo);
 
@@ -369,12 +379,25 @@
        if (pcm_sample_rate != current_sample_rate) {
                new_sample_rate = current_sample_rate;
        }
+       // snd_pcm_pause(handle, 1);
        fifo_unlock(&decode_fifo);
 }
 
 
 static void decode_alsa_pause(void) {
        DEBUG_TRACE("decode_alsa_pause");
+
+       fifo_lock(&decode_fifo);
+//     snd_pcm_pause(handle, 0);
+       if (pcm_sample_rate != 44100) {
+               new_sample_rate = 44100;
+       }
+       fifo_unlock(&decode_fifo);
+}
+
+
+static void decode_alsa_stop(void) {
+       DEBUG_TRACE("decode_alsa_stop");
 
        fifo_lock(&decode_fifo);
        if (pcm_sample_rate != 44100) {
@@ -384,17 +407,6 @@
 }
 
 
-static void decode_alsa_stop(void) {
-       DEBUG_TRACE("decode_alsa_stop");
-
-       fifo_lock(&decode_fifo);
-       if (pcm_sample_rate != 44100) {
-               new_sample_rate = 44100;
-       }
-       fifo_unlock(&decode_fifo);
-}
-
-
 static int decode_alsa_init(void) {
        int err;
 
@@ -414,6 +426,16 @@
        audio_thread = SDL_CreateThread(audio_thread_execute, NULL);
 
        return 1;
+}
+
+static u32_t decode_alsa_delay(void)
+{
+    snd_pcm_status_t* status;
+    
+    snd_pcm_status_alloca(&status);
+    snd_pcm_status(handle, status);
+
+    return (u32_t)snd_pcm_status_get_delay(status);
 }
 
 
@@ -423,6 +445,7 @@
        decode_alsa_pause,
        decode_alsa_resume,
        decode_alsa_stop,
+       decode_alsa_delay,
 };
 
 #endif // HAVE_LIBASOUND

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c?rev=2972&root=Jive&r1=2971&r2=2972&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_output.c Thu 
Sep 25 09:09:40 2008
@@ -456,6 +456,20 @@
        }
 
        return FALSE;
+}
+
+u32_t decode_output_percent_used(void) {
+       size_t usedbytes;
+       size_t freebytes;
+
+       fifo_lock(&decode_fifo);
+
+       usedbytes = fifo_bytes_free(&decode_fifo);
+       freebytes = fifo_bytes_free(&decode_fifo);
+
+       fifo_unlock(&decode_fifo);
+
+       return (usedbytes * 100) / (usedbytes + freebytes);
 }
 
 

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=2972&root=Jive&r1=2971&r2=2972&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 Thu 
Sep 25 09:09:40 2008
@@ -49,6 +49,8 @@
 
 extern bool_t decode_output_can_write(u32_t buffer_size, u32_t sample_rate);
 
+extern u32_t decode_output_percent_used(void);
+
 extern void decode_output_samples(sample_t *buffer, u32_t samples, int 
sample_rate,
                                   bool_t copyright_asserted);
 
@@ -82,7 +84,6 @@
 
 extern void decode_queue_metadata(struct decode_metadata *metadata);
 
-
 /* Audio output api */
 struct decode_audio {
        int (*init)(void);
@@ -90,6 +91,7 @@
        void (*pause)(void);
        void (*resume)(void);
        void (*stop)(void);
+       u32_t (*delay)(void);
 };
 
 extern struct decode_audio decode_alsa;
@@ -121,6 +123,7 @@
 extern bool_t decode_first_buffer;
 extern u32_t current_sample_rate;
 extern u32_t skip_ahead_bytes;
+extern u32_t add_silence_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