Author: titmuss
Date: Tue May 13 08:35:09 2008
New Revision: 2449

URL: http://svn.slimdevices.com?rev=2449&root=Jive&view=rev
Log:
Bug: N/A
Description:
Improve flac playback.


Modified:
    7.2/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.h

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua?rev=2449&root=Jive&r1=2448&r2=2449&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua Tue May 
13 08:35:09 2008
@@ -201,7 +201,7 @@
 end
 
 
-function _streamDisconnect(self)
+function _streamDisconnect(self, flush)
        if not self.stream then
                return
        end
@@ -212,6 +212,9 @@
        self.jnt:t_removeRead(self.stream)
 
        self.stream:disconnect()
+       if flush then
+               self.stream:flush()
+       end
        self.stream = nil
 
        -- XXXX do we need to notify SqueezeCenter
@@ -265,8 +268,9 @@
        if data.command == 's' then
                -- start
 
-               -- disconnect any existing stream
-               self:_streamDisconnect()
+               -- if we aborted the stream early, or there's any junk left 
+               -- over, flush out whatever's left.
+               self:_streamDisconnect(true)
 
                Decode:start(string.byte(data.mode),
                             string.byte(data.transitionType),

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c?rev=2449&root=Jive&r1=2448&r2=2449&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c Tue 
May 13 08:35:09 2008
@@ -34,6 +34,7 @@
 
        struct decode_flac *self = (struct decode_flac *) data;
        const size_t requested_bytes = *bytes;
+       bool_t streaming;
 
        if (self->error_occurred) {
                return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
@@ -44,14 +45,17 @@
                return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
        }
 
-       *bytes = streambuf_read(buffer, 0, requested_bytes);
+       *bytes = streambuf_read(buffer, 0, requested_bytes, &streaming);
        if (*bytes == 0) {
                current_decoder_state |= DECODE_STATE_UNDERRUN;
+
+               if (!streaming) {
+                       return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
+               }
        }
        else {
                current_decoder_state &= ~DECODE_STATE_UNDERRUN;
        }
-
 
        return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
 }
@@ -142,11 +146,7 @@
        const FLAC__StreamDecoderErrorStatus status,
        void *data) {
 
-       struct decode_flac *self = (struct decode_flac *) data;
-
-       DEBUG_ERROR("FLAC error: %s\n", 
FLAC__StreamDecoderErrorStatusString[status]);
-
-       self->error_occurred = TRUE;
+       DEBUG_TRACE("FLAC error: %s\n", 
FLAC__StreamDecoderErrorStatusString[status]);
 }
 
 
@@ -167,7 +167,7 @@
        state = FLAC__stream_decoder_get_state(self->decoder);
        if (state == FLAC__STREAM_DECODER_ABORTED ||
            state == FLAC__STREAM_DECODER_END_OF_STREAM) {
-               DEBUG_ERROR("FLAC error %d", state);
+               DEBUG_TRACE("FLAC error: %s", 
FLAC__StreamDecoderStateString[state]);
                current_decoder_state |= DECODE_STATE_ERROR;
        }
 

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c?rev=2449&root=Jive&r1=2448&r2=2449&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c Tue May 
13 08:35:09 2008
@@ -170,7 +170,7 @@
                return FALSE;
        }
 
-       sz = streambuf_read(self->read_buffer + self->leftover, 0, BLOCKSIZE - 
self->leftover);
+       sz = streambuf_read(self->read_buffer + self->leftover, 0, BLOCKSIZE - 
self->leftover, NULL);
        if (!sz) {
                current_decoder_state |= DECODE_STATE_UNDERRUN;
                return FALSE;

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c?rev=2449&root=Jive&r1=2448&r2=2449&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.c Tue May 13 
08:35:09 2008
@@ -37,7 +37,7 @@
 static struct fifo streambuf_fifo;
 static size_t streambuf_lptr = 0;
 static bool_t streambuf_loop = FALSE;
-
+static bool_t streambuf_streaming = FALSE;
 
 
 size_t streambuf_get_size(void) {
@@ -117,6 +117,8 @@
        size_t n;
 
        fifo_lock(&streambuf_fifo);
+
+       streambuf_streaming = TRUE;
 
        while (size) {
                n = fifo_bytes_until_wptr_wrap(&streambuf_fifo);
@@ -138,6 +140,8 @@
        size_t n, size;
 
        fifo_lock(&streambuf_fifo);
+
+       streambuf_streaming = TRUE;
 
        size = fifo_bytes_free(&streambuf_fifo);
        if (size < 4096) {
@@ -152,11 +156,15 @@
 
        n = recv(fd, streambuf_buf + streambuf_fifo.wptr, n, 0);
        if (n < 0) {
+               streambuf_streaming = FALSE;
+
                fifo_unlock(&streambuf_fifo);
                return -SOCKETERROR;
        }
-
-       if (n > 0) {
+       else if (n == 0) {
+               streambuf_streaming = FALSE;
+       }
+       else {
                fifo_wptr_incby(&streambuf_fifo, n);
        }
 
@@ -165,16 +173,19 @@
 }
 
 
-size_t streambuf_read(u8_t *buf, size_t min, size_t max) {
+size_t streambuf_read(u8_t *buf, size_t min, size_t max, bool_t *streaming) {
        size_t sz, w;
 
 
        fifo_lock(&streambuf_fifo);
+
+       if (streaming) {
+               *streaming = streambuf_streaming;
+       }
 
        sz = streambuf_get_usedbytes();
        if (sz < min) {
                fifo_unlock(&streambuf_fifo);
-
                return 0; /* underrun */
        }
 
@@ -340,8 +351,6 @@
         * 1: self
         */
 
-       // XXXX adjust tcp window size?
-
        stream = lua_touserdata(L, 1);
 
 
@@ -359,7 +368,7 @@
                        return 1;
                }
 
-               if (n < 0 && n != -ENOSPC) {
+               if (n < 0) {
                        CLOSESOCKET(stream->fd);
 
                        lua_pushnil(L);

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.h
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.h?rev=2449&root=Jive&r1=2448&r2=2449&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.h (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/streambuf.h Tue May 13 
08:35:09 2008
@@ -19,7 +19,7 @@
 
 extern void streambuf_flush(void);
 
-extern size_t streambuf_read(u8_t *buf, size_t min, size_t max);
+extern size_t streambuf_read(u8_t *buf, size_t min, size_t max, bool_t 
*streaming);
 
 extern int streambuf_openL(lua_State *L);
 

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

Reply via email to