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