Author: ayoung
Date: Sun Mar 25 02:46:56 2012
New Revision: 9677
URL: http://svn.slimdevices.com/jive?rev=9677&view=rev
Log:
Task B0020: Player control over UDP
Extend UDAP with pause, set_volume and get_ip methods that will be acted upon
if a local player exists (regardless of configuration state).
Extend Slimproto audg to carry controller-id in addition to sequence number.
Sequence numbers associated with a controller-id are from a disjoint space with
normal sequence numbers and are used only to reconcile the order of received
volume commands that might come via UDA or Slimproto.
Modified:
7.8/trunk/squeezeplay/src/squeezeplay/share/applets/UdapControl/UdapControlApplet.lua
7.8/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/Udap.lua
7.8/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua
Modified:
7.8/trunk/squeezeplay/src/squeezeplay/share/applets/UdapControl/UdapControlApplet.lua
URL:
http://svn.slimdevices.com/jive/7.8/trunk/squeezeplay/src/squeezeplay/share/applets/UdapControl/UdapControlApplet.lua?rev=9677&r1=9676&r2=9677&view=diff
==============================================================================
---
7.8/trunk/squeezeplay/src/squeezeplay/share/applets/UdapControl/UdapControlApplet.lua
(original)
+++
7.8/trunk/squeezeplay/src/squeezeplay/share/applets/UdapControl/UdapControlApplet.lua
Sun Mar 25 02:46:56 2012
@@ -22,6 +22,8 @@
local SocketUdp = require("jive.net.SocketUdp")
local Udap = require("jive.net.Udap")
+local Player = require("jive.slim.Player")
+local hasNetworking, Networking = pcall(require, "jive.net.Networking")
local debug = require("jive.utils.debug")
@@ -71,6 +73,46 @@
if ownMacAddress == pkt.source then
log:debug("UDAP: self origined packet - discard packet")
return
+ end
+
+ -- There are some requests we can and will handle without a current
player
+ -- but we do need a LocalPlayer
+ local localPlayer = Player:getLocalPlayer()
+
+ if localPlayer and pkt.dest == ownMacAddress then
+ if pkt.uapMethod == "get_ip" then
+ log:debug("UDAP - get_ip request received - sending
answer...")
+
+ local ip_address, ip_subnet
+ local ifObj = hasNetworking and
Networking:activeInterface()
+
+ if ifObj then
+ ip_address, ip_subnet =
ifObj:getIPAddressAndSubnet()
+ if not ip_address then
+ log:warn('Cannot get ip_address for
active network interface ', ifObj)
+ end
+ else
+ log:warn('Cannot find active network interface')
+ end
+
+ if not ip_address then return end
+
+ local packet = Udap.createGetIpResponse(ownMacAddress,
pkt.source, pkt.seqno, ip_address)
+ self.udap:send(function() return packet end, chunk.ip,
chunk.port)
+
+ return
+
+ elseif pkt.uapMethod == "pause" then
+ log:debug("UDAP - pause request received")
+ localPlayer:pause(false, true)
+ return
+
+ elseif pkt.uapMethod == "set_volume" then
+ log:debug("UDAP - set_volume request received: seq=",
pkt.data.seq, ", vol=", pkt.data.volume)
+ localPlayer:volumeFromController(pkt.data.volume,
pkt.source, pkt.data.seq)
+ return
+
+ end
end
local acceptPacket = false
Modified: 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
URL:
http://svn.slimdevices.com/jive/7.8/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua?rev=9677&r1=9676&r2=9677&view=diff
==============================================================================
--- 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
(original)
+++ 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua Sun Mar
25 02:46:56 2012
@@ -6,6 +6,7 @@
local string = require("string")
local table = require("table")
+local math = require("math")
local hasDecode, decode = pcall(require, "squeezeplay.decode")
local hasSprivate, spprivate = pcall(require, "spprivate")
@@ -1087,9 +1088,22 @@
return self.sequenceNumber
end
-function isSequenceNumberInSync(self, serverSequenceNumber)
- if serverSequenceNumber ~= self.sequenceNumber then
- log:debug("server sequence # out of sync. server: ",
serverSequenceNumber, " local: ", self.sequenceNumber)
+function isSequenceNumberInSync(self, sequenceNumber, sequenceController)
+ if sequenceController and sequenceNumber then
+ if self.sequenceController ~= sequenceController then
+ self.sequenceController = sequenceController
+ self.sequenceControllerNumber = sequenceNumber
+ return true
+ elseif sequenceNumber > (self.sequenceControllerNumber or 0)
+ or math.abs(self.sequenceControllerNumber -
sequenceNumber) > 100
+ then
+ self.sequenceControllerNumber = sequenceNumber
+ return true
+ else
+ return false
+ end
+ elseif sequenceNumber ~= self.sequenceNumber then
+ log:debug("server sequence # out of sync. server: ",
sequenceNumber, " local: ", self.sequenceNumber)
return false
end
return true
@@ -1113,9 +1127,15 @@
_defaultVolumeToGain = value
end
-function setVolume(self, volume, stateOnly)
+function setVolume(self, volume, stateOnly, controller, sequenceNumber)
log:debug("setVolume: ", volume)
+ if controller and sequenceNumber
+ and not self:isSequenceNumberInSync(sequenceNumber, controller)
+ then
+ return
+ end
+
self.volume = volume
if (not stateOnly) then
self:_setGain(self:_getGainFromVolume(volume))
@@ -1148,7 +1168,7 @@
local gain, volume = self:translateServerGain(data.gainL)
local serverSequenceNumber = data.sequenceNumber
- if serverSequenceNumber and not
self:isSequenceNumberInSync(serverSequenceNumber) then
+ if serverSequenceNumber and not
self:isSequenceNumberInSync(serverSequenceNumber, data.controller) then
--ignore since not in sync
return
end
Modified: 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
URL:
http://svn.slimdevices.com/jive/7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua?rev=9677&r1=9676&r2=9677&view=diff
==============================================================================
--- 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
(original)
+++ 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua Sun Mar
25 02:46:56 2012
@@ -231,7 +231,7 @@
end,
audg = function(self, packet)
- local gainL, gainR, fixedDigital, preampAtten, sequenceNumber
+ local gainL, gainR, fixedDigital, preampAtten, sequenceNumber,
controller
gainL = unpackNumber(packet, 5, 4) << 9
gainR = unpackNumber(packet, 9, 4) << 9
@@ -251,6 +251,9 @@
if #packet > 22 then
sequenceNumber = unpackNumber(packet, 23, 4)
end
+ if #packet > 28 then
+ controller = unpackNumber(packet, 27, 6)
+ end
return {
gainL = gainL,
@@ -258,6 +261,7 @@
fixedDigital = fixedDigital,
preampAtten = preampAtten,
sequenceNumber = sequenceNumber,
+ controller = controller,
}
end,
Modified: 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/Udap.lua
URL:
http://svn.slimdevices.com/jive/7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/Udap.lua?rev=9677&r1=9676&r2=9677&view=diff
==============================================================================
--- 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/Udap.lua (original)
+++ 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/net/Udap.lua Sun Mar 25
02:46:56 2012
@@ -52,17 +52,19 @@
-- ucp methods
local ucpMethods = {
- "discover",
- "get_ip",
- "set_ip",
- "reset",
- "get_data",
- "set_data",
- "error",
- "credentials_error",
- "adv_discover",
- nil,
- "get_uuid"
+ "discover", -- 1
+ "get_ip", -- 2
+ "set_ip", -- 3
+ "reset", -- 4
+ "get_data", -- 5
+ "set_data", -- 6
+ "error", -- 7
+ "credentials_error", -- 8
+ "adv_discover", -- 9
+ nil, -- 10
+ "get_uuid", -- 11
+ "set_volume", -- 12
+ "pause", -- 13
}
@@ -266,6 +268,13 @@
pkt.uuid = table.concat(pkt.uuid)
end
+function parseSetVolume(pkt, recv, offset)
+ pkt.data = {}
+
+ pkt.data.volume, offset = unpackNumber(recv, offset, 1)
+ pkt.data.seq, offset = unpackNumber(recv, offset, 4)
+end
+
-- Handlers for udap responses we receive upon requests we've sent
local ucpMethodHandlers = {
[ "discover" ] = parseDiscover,
@@ -292,6 +301,8 @@
[ "credentials_error" ] = nil,
[ "adv_discover" ] = parseDiscover,
[ "get_uuid" ] = nil,
+ [ "set_volume" ] = parseSetVolume,
+ [ "pause" ] = nil,
}
@@ -539,6 +550,17 @@
packNumber(0x00001, 2),
table.concat({...})
}
+end
+
+function createGetIpResponse(srcmac, destmac, seq, ip)
+ return createUdapResponse(srcmac,
+ destmac,
+ seq,
+ packNumber(0x0002, 2), --
get_ip
+ packNumber(0x05, 1), --
ip_addr
+ packNumber(#ip, 1), --
ip_addr len
+ ip,
+ )
end
function createDiscoverResponse(srcmac, destmac, seq, devName, devType)
Modified: 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua
URL:
http://svn.slimdevices.com/jive/7.8/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua?rev=9677&r1=9676&r2=9677&view=diff
==============================================================================
--- 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua
(original)
+++ 7.8/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua Sun
Mar 25 02:46:56 2012
@@ -336,6 +336,9 @@
self.playback:setVolume(vol, stateOnly)
end
+function volumeFromController(self, vol, controller, sequenceNumber)
+ self.playback:setVolume(vol, false, controller, sequenceNumber)
+end
function mute(self, mute)
local vol = self:getVolume()
@@ -354,14 +357,14 @@
end
-function pause(self, useBackgroundRequest)
+function pause(self, useBackgroundRequest, localActionOnly)
local active = self.playback:isLocalPauseOrStopTimeoutActive()
if not active then
self.playback:startLocalPauseTimeout()
self.mode = "pause"
self:updateIconbar()
- Player.pause(self, useBackgroundRequest)
+ if not localActionOnly then Player.pause(self,
useBackgroundRequest) end
else
log:debug("discarding pause while timeout active")
end
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/jive-checkins