Author: titmuss
Date: Tue May 20 07:41:25 2008
New Revision: 2496

URL: http://svn.slimdevices.com?rev=2496&root=Jive&view=rev
Log:
Bug: N/A
Description:
Send bytesReceived in the STAT command.
Implemented RESP and cont commands.

This initial support for direct streaming allows SN sound effects to be played.


Modified:
    7.2/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
    7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
    7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.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=2496&root=Jive&r1=2495&r2=2496&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 
20 07:41:25 2008
@@ -42,14 +42,15 @@
                status.event = event
                status.serverTimestamp = serverTimestamp
                
-               -- XXXX fix this missing status field
-               status.bytesReceived = 0
-
                return status
        end)
 
        obj.slimproto:subscribe("strm", function(_, data)
                return obj:_strm(data)
+       end)
+
+       obj.slimproto:subscribe("cont", function(_, data)
+               return obj:_cont(data)
        end)
 
        obj.timer = Timer(100, function()
@@ -84,9 +85,6 @@
 function _timerCallback(self)
        local status = Decode:status()
 
-
-       -- XXXX fix this missing status field
-       status.bytesReceived = 0
 
        -- enable stream reads when decode buffer is not full
        if status.decodeFull < status.decodeSize and self.stream then
@@ -179,6 +177,7 @@
                        self.sentResume = true
 
                elseif not self.sentDecoderFullEvent then
+                       -- Tell SC decoder buffer is full
                        log:info("status FULL")
                        self:sendStatus(status, "STMl")
 
@@ -217,7 +216,8 @@
        end
        self.stream = nil
 
-       -- XXXX do we need to notify SqueezeCenter
+       -- Notify SqueezeCenter the stream is closed
+       self.slimproto:sendStatus('STMf')
 end
 
 
@@ -228,7 +228,7 @@
                return
        end
 
-       local status, err = self.stream:write(self.header)
+       local status, err = self.stream:write(self, self.header)
        self.jnt:t_removeWrite(self.stream)
 
        if err then
@@ -244,21 +244,28 @@
                return
        end
 
-       local n = self.stream:read()
+       local n = self.stream:read(self)
        while n do
                if n == 0 then
                        -- buffer full
                        self.jnt:t_removeRead(self.stream)
                end
 
-               -- XXXX handle autostart
-
                _, networkErr = Task:yield(false)
 
                n = self.stream:read()
        end
 
        self:_streamDisconnect()
+end
+
+
+function _streamHttpHeaders(self, headers)
+       -- send stream http headers to SqueezeCenter
+       self.slimproto:send({
+               opcode = "RESP",
+               headers = headers,
+       })
 end
 
 
@@ -349,6 +356,19 @@
 end
 
 
+function _cont(self, data)
+       log:info("cont loop=", data.loop)
+
+       if data.loop then
+               self.stream:markLoop()
+       end
+
+       -- XXXX icy metainterval
+       -- XXXX wma guid's
+
+       self.autostart = (self.autostart == '2') and '0' or '1'
+end
+
 
 --[[
 

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua?rev=2496&root=Jive&r1=2495&r2=2496&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua Tue May 
20 07:41:25 2008
@@ -151,7 +151,8 @@
                assert(#data.event == 4)
                assert(data.decodeSize)
                assert(data.decodeFull)
-               assert(data.bytesReceived)
+               assert(data.bytesReceivedL)
+               assert(data.bytesReceivedH)
                assert(data.outputSize)
                assert(data.outputFull)
                assert(data.elapsed)
@@ -162,7 +163,8 @@
                        packNumber(0, 2), -- unused (mas parameters)
                        packNumber(data.decodeSize, 4),
                        packNumber(data.decodeFull, 4),
-                       packNumber(data.bytesReceived, 8),
+                       packNumber(data.bytesReceivedH, 4),
+                       packNumber(data.bytesReceivedL, 4),
                        packNumber(data.signalStrength or 0, 2),
                        packNumber(data.jiffies, 4),
                        packNumber(data.outputSize, 4),
@@ -183,16 +185,27 @@
                }
        end,
 
+       RESP = function(self, data)
+               assert(data.headers)
+
+               return {
+                       data.headers
+               }
+       end,
+
        META = function(self, data)
                -- XXXX
+               log:warn("TODO")
        end,
 
        BODY = function(self, data)
                -- XXXX
+               log:warn("TODO")
        end,
 
        DSCO = function(self, data)
                -- XXXX
+               log:warn("TODO")
        end,
 
        aude = function(self, packet)
@@ -252,22 +265,30 @@
 
        body = function(self, packet)
                -- XXXX
+               log:warn("TODO")
        end,
 
        cont = function(self, packet)
-               -- XXXX
+               return {
+                       metainterval = unpackNumber(packet, 5, 4),
+                       loop = unpackNumber(packet, 9, 1),
+                       -- XXXX read wma guid's
+               }
        end,
 
        dsco = function(self, packet)
                -- XXXX
+               log:warn("TODO")
        end,
 
        serv = function(self, packet)
                -- XXXX
+               log:warn("TODO")
        end,
 
        http = function(self, packet)
                -- XXXX
+               log:warn("TODO")
        end,
 }
 

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c?rev=2496&root=Jive&r1=2495&r2=2496&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c Tue May 20 
07:41:25 2008
@@ -397,6 +397,9 @@
 }
 
 static int decode_status(lua_State *L) {
+       size_t size, usedbytes;
+       u32_t bytesL, bytesH;
+
        lua_newtable(L);
 
        fifo_lock(&decode_fifo);
@@ -416,11 +419,19 @@
        fifo_unlock(&decode_fifo);
 
 
-       lua_pushinteger(L, streambuf_get_usedbytes());
+       streambuf_get_status(&size, &usedbytes, &bytesL, &bytesH);
+
+       lua_pushinteger(L, size);
+       lua_setfield(L, -2, "decodeSize");
+
+       lua_pushinteger(L, usedbytes);
        lua_setfield(L, -2, "decodeFull");
 
-       lua_pushinteger(L, streambuf_get_size());
-       lua_setfield(L, -2, "decodeSize");
+       lua_pushinteger(L, bytesL);
+       lua_setfield(L, -2, "bytesReceivedL");
+
+       lua_pushinteger(L, bytesH);
+       lua_setfield(L, -2, "bytesReceivedH");
 
 
        lua_pushinteger(L, current_decoder_state);

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=2496&root=Jive&r1=2495&r2=2496&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 20 
07:41:25 2008
@@ -38,6 +38,7 @@
 static size_t streambuf_lptr = 0;
 static bool_t streambuf_loop = FALSE;
 static bool_t streambuf_streaming = FALSE;
+static u64_t streambuf_bytes_received = 0;
 
 
 size_t streambuf_get_size(void) {
@@ -71,6 +72,19 @@
 }
 
 
+void streambuf_get_status(size_t *size, size_t *usedbytes, u32_t *bytesL, 
u32_t *bytesH) {
+
+       fifo_lock(&streambuf_fifo);
+
+       *size = STREAMBUF_SIZE;
+       *usedbytes = fifo_bytes_used(&streambuf_fifo);
+       *bytesL = streambuf_bytes_received & 0xFFFFFFFF;
+       *bytesH = streambuf_bytes_received >> 32;
+
+       fifo_unlock(&streambuf_fifo);
+}
+
+
 void streambuf_mark_loop(void) {
        fifo_lock(&streambuf_fifo);
 
@@ -119,6 +133,8 @@
        fifo_lock(&streambuf_fifo);
 
        streambuf_streaming = TRUE;
+
+       streambuf_bytes_received += size;
 
        while (size) {
                n = fifo_bytes_until_wptr_wrap(&streambuf_fifo);
@@ -166,6 +182,8 @@
        }
        else {
                fifo_wptr_incby(&streambuf_fifo, n);
+
+               streambuf_bytes_received += n;
        }
 
        fifo_unlock(&streambuf_fifo);
@@ -223,7 +241,7 @@
 };
 
 
-int stream_connectL(lua_State *L) {
+static int stream_connectL(lua_State *L) {
 
        /*
         * 1: self
@@ -294,11 +312,13 @@
        luaL_getmetatable(L, "squeezeplay.stream");
        lua_setmetatable(L, -2);
 
+       streambuf_bytes_received = 0;
+
        return 1;
 }
 
 
-int stream_disconnectL(lua_State *L) {
+static int stream_disconnectL(lua_State *L) {
        struct stream *stream;
 
        /*
@@ -307,22 +327,28 @@
 
        stream = lua_touserdata(L, 1);
 
+       if (stream->body) {
+               free(stream->body);
+       }
+
        if (stream->fd) {
                CLOSESOCKET(stream->fd);
                stream->fd = 0;
        }
 
+       streambuf_bytes_received = 0;
+
        return 0;
 }
 
 
-int stream_flushL(lua_State *L) {
+static int stream_flushL(lua_State *L) {
        streambuf_flush();
        return 0;
 }
 
 
-int stream_getfdL(lua_State *L) {
+static int stream_getfdL(lua_State *L) {
        struct stream *stream;
 
        /*
@@ -341,14 +367,16 @@
 }
 
 
-int stream_readL(lua_State *L) {
+static int stream_readL(lua_State *L) {
        struct stream *stream;
        u8_t buf[1024];
        u8_t *buf_ptr, *body_ptr;
-       int n, header_len;
+       size_t header_len;
+       int n;
 
        /*
-        * 1: self
+        * 1: Stream (self)
+        * 2: Playback (self)
         */
 
        stream = lua_touserdata(L, 1);
@@ -433,8 +461,11 @@
 
                                //DEBUG_TRACE("headers %d %*s\n", header_len, 
header_len, stream->body);
 
-                               // XXXX send end-of-header event
-                               // XXXX send headers to SC
+                               /* Send headers to SqueezeCenter */
+                               lua_getfield(L, 2, "_streamHttpHeaders");
+                               lua_pushvalue(L, 2);
+                               lua_pushlstring(L, (char *)stream->body, 
header_len);
+                               lua_call(L, 2, 0);
 
                                free(stream->body);
                                stream->body = NULL;
@@ -452,24 +483,24 @@
        /* feed remaining buffer */
        streambuf_feed(buf_ptr, n);
 
-
        lua_pushboolean(L, TRUE);
        return 1;
 }
 
 
-int stream_writeL(lua_State *L) {
+static int stream_writeL(lua_State *L) {
        struct stream *stream;
        const char *header;
        int n, len;
 
        /*
-        * 1: self
-        * 2: header
+        * 1: Stream (self)
+        * 2: Playback (self)
+        * 3: header
         */
 
        stream = lua_touserdata(L, 1);
-       header = luaL_checkstring(L, 2);
+       header = luaL_checkstring(L, 3);
 
        len = strlen(header);
        while (len > 0) {
@@ -496,6 +527,13 @@
 
        lua_pushboolean(L, TRUE);
        return 1;
+}
+
+
+static int stream_mark_loopL(lua_State *L) {
+       streambuf_mark_loop();
+
+       return 0;
 }
 
 
@@ -511,6 +549,7 @@
        { "getfd", stream_getfdL },
        { "read", stream_readL },
        { "write", stream_writeL },
+       { "markLoop", stream_mark_loopL },
        { NULL, NULL }
 };
 

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=2496&root=Jive&r1=2495&r2=2496&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 20 
07:41:25 2008
@@ -10,6 +10,8 @@
 extern size_t streambuf_get_freebytes(void);
 
 extern size_t streambuf_get_usedbytes(void);
+
+extern void streambuf_get_status(size_t *size, size_t *usedbytes, u32_t 
*bytesL, u32_t *bytesH);
 
 extern void streambuf_mark_loop(void);
 

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

Reply via email to