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