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

Reply via email to