Author: titmuss
Date: Tue May 20 14:37:01 2008
New Revision: 2498

URL: http://svn.slimdevices.com?rev=2498&root=Jive&view=rev
Log:
Bug: N/A
Description:
Parse icy meta data from the stream.


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/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=2498&root=Jive&r1=2497&r2=2498&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 14:37:01 2008
@@ -365,7 +365,11 @@
                self.stream:markLoop()
        end
 
-       -- XXXX icy metainterval
+       -- icy metainterval
+       if data.icyMetaInterval then
+               self.stream:icyMetaInterval(data.icyMetaInterval)
+       end
+
        -- XXXX wma guid's
 
        self.autostart = (self.autostart == '2') and '0' or '1'

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=2498&root=Jive&r1=2497&r2=2498&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 14:37:01 2008
@@ -270,7 +270,7 @@
 
        cont = function(self, packet)
                return {
-                       metainterval = unpackNumber(packet, 5, 4),
+                       icyMetaInterval = unpackNumber(packet, 5, 4),
                        loop = unpackNumber(packet, 9, 1),
                        -- XXXX read wma guid's
                }

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=2498&root=Jive&r1=2497&r2=2498&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 
14:37:01 2008
@@ -40,6 +40,13 @@
 static bool_t streambuf_streaming = FALSE;
 static u64_t streambuf_bytes_received = 0;
 
+/* streambuf filter, used to parse metadata */
+static size_t (*streambuf_filter)(u8_t *buf, size_t min, size_t max, bool_t 
*streaming);
+
+/* shoutcast metadata state */
+static u32_t icy_meta_interval;
+static s32_t icy_meta_remaining;
+
 
 size_t streambuf_get_size(void) {
        return STREAMBUF_SIZE;
@@ -191,11 +198,8 @@
 }
 
 
-size_t streambuf_read(u8_t *buf, size_t min, size_t max, bool_t *streaming) {
+size_t streambuf_fast_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;
@@ -203,7 +207,6 @@
 
        sz = fifo_bytes_used(&streambuf_fifo);
        if (sz < min) {
-               fifo_unlock(&streambuf_fifo);
                return 0; /* underrun */
        }
 
@@ -225,9 +228,93 @@
                streambuf_fifo.rptr = streambuf_lptr;
        }
 
-       fifo_unlock(&streambuf_fifo);
-
        return sz;
+}
+
+
+size_t streambuf_read(u8_t *buf, size_t min, size_t max, bool_t *streaming) {
+       size_t n;
+
+       fifo_lock(&streambuf_fifo);
+
+       if (streambuf_filter) {
+               /* filters are called with the streambuf locked */
+               n = streambuf_filter(buf, min, max, streaming);
+       }
+       else {
+               n = streambuf_fast_read(buf, min, max, streaming);
+       }
+
+       fifo_unlock(&streambuf_fifo);
+
+       return n;
+}
+
+
+size_t streambuf_icy_filter(u8_t *buf, size_t min, size_t max, bool_t 
*streaming) {
+       size_t avail, r, n = 0;
+       
+       /* streambuf is locked */
+
+       /* icy is only used with the mp3 decoder, it always uses min=0.
+        * let's use this to make this code simpler.
+        */
+       assert(min == 0);
+
+       avail = fifo_bytes_used(&streambuf_fifo);
+       while (avail && n < max) {
+               if (icy_meta_remaining > 0) {
+                       /* we're waiting for the metadata */
+                       r = icy_meta_remaining;
+                       if (r > max - n) {
+                               r = max - n;
+                       }
+
+                       r = streambuf_fast_read(buf, 0, r, streaming);
+
+                       buf += r;
+                       n += r;
+                       icy_meta_remaining -= r;
+
+               }
+               else if (icy_meta_remaining == 0) {
+                       /* we're reading the metadata length byte */
+                       u8_t len;
+
+                       r = streambuf_fast_read(&len, 1, 1, NULL);
+                       assert(r == 1);
+
+                       icy_meta_remaining = -16 * len;
+                       if (!icy_meta_remaining) {
+                               /* it's a zero length metadata, reset to the 
next interval */
+                               icy_meta_remaining = icy_meta_interval;
+                       }
+               }
+               else {
+                       /* we're reading the metadata */
+                       u32_t icy_len = -icy_meta_remaining;
+                       u8_t *icy_buf;
+
+                       if (avail < icy_len) {
+                               /* wait for more data */
+                               break;
+                       }
+
+                       icy_buf = malloc(icy_len);
+                       r = streambuf_fast_read(icy_buf, icy_len, icy_len, 
NULL);
+                       assert(r == icy_len);
+
+                       // XXXX queue metadata
+                       DEBUG_TRACE("got icy metadata len=%d", icy_len);
+                       free(icy_buf);
+
+                       icy_meta_remaining = icy_meta_interval;
+               }
+
+               avail = fifo_bytes_used(&streambuf_fifo);
+       }
+
+       return n;
 }
 
 
@@ -313,6 +400,7 @@
        lua_setmetatable(L, -2);
 
        streambuf_bytes_received = 0;
+       streambuf_filter = NULL;
 
        return 1;
 }
@@ -532,6 +620,25 @@
 
 static int stream_mark_loopL(lua_State *L) {
        streambuf_mark_loop();
+
+       return 0;
+}
+
+
+static int stream_icy_metaintervalL(lua_State *L) {
+       /*
+        * 1: Stream (self)
+        * 2: meta interval
+        */
+
+       fifo_lock(&streambuf_fifo);
+
+       streambuf_filter = streambuf_icy_filter;
+
+       icy_meta_interval = lua_tointeger(L, 2);
+       icy_meta_remaining = icy_meta_interval;
+
+       fifo_unlock(&streambuf_fifo);
 
        return 0;
 }
@@ -550,6 +657,7 @@
        { "read", stream_readL },
        { "write", stream_writeL },
        { "markLoop", stream_mark_loopL },
+       { "icyMetaInterval", stream_icy_metaintervalL },
        { 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=2498&root=Jive&r1=2497&r2=2498&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 
14:37:01 2008
@@ -21,6 +21,9 @@
 
 extern void streambuf_flush(void);
 
+/* the mutex should be locked when using fast read */
+extern size_t streambuf_fast_read(u8_t *buf, size_t min, size_t max, bool_t 
*streaming);
+
 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