Author: titmuss
Date: Tue Jun 17 12:56:08 2008
New Revision: 2580

URL: http://svn.slimdevices.com?rev=2580&root=Jive&view=rev
Log:
Bug: 6683
Description:
Keep current player state in Player object, this ensures that the current 
player is 
never removed from the playerList table.


Modified:
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua?rev=2580&root=Jive&r1=2579&r2=2580&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
 Tue Jun 17 12:56:08 2008
@@ -159,7 +159,8 @@
 local function _squeezeCenterCleanup(self)
        local now = Framework:getTicks()
 
-       local currentServer = self.currentPlayer and 
self.currentPlayer:getSlimServer()
+       local currentPlayer = Player:getCurrentPlayer()
+       local currentServer = currentPlayer and currentPlayer:getSlimServer()
 
        for i, server in SlimServer.iterate() do
                if not server:isConnected() and
@@ -177,9 +178,11 @@
 local function _playerCleanup(self)
        local now = Framework:getTicks()
 
+       local currentPlayer = Player:getCurrentPlayer()
+
        for i, player in Player.iterate() do
                if not player:getSlimServer() and
-                       self.currentPlayer ~= player and
+                       currentPlayer ~= player and
                        now - player:getLastSeen() > DISCOVERY_TIMEOUT then
                
                        log:info("Removing player ", player)
@@ -221,7 +224,6 @@
                          function() obj:_discover() end)
 
        -- initial state
-       obj.currentPlayer = false
        obj.state = 'searching'
 
        -- start discovering
@@ -273,7 +275,9 @@
        if self.state == 'probing' and
                Framework:getTicks() > self.probeUntil then
 
-               if self.currentPlayer and self.currentPlayer:getSlimServer() 
then
+               local currentPlayer = Player:getCurrentPlayer()
+
+               if currentPlayer and currentPlayer:getSlimServer() then
                        self:_setState('connected')
                else
                        self:_setState('searching')
@@ -333,11 +337,13 @@
 function _debug(self)
        local now = Framework:getTicks()
 
+       local currentPlayer = Player:getCurrentPlayer()
+
        log:info("----")
        log:info("State: ", self.state)
-       log:info("CurrentPlayer: ", self.currentPlayer)
-       if self.currentPlayer then
-               log:info("CurrentServer: ", self.currentPlayer:getSlimServer())
+       log:info("CurrentPlayer: ", currentPlayer)
+       if currentPlayer then
+               log:info("CurrentServer: ", currentPlayer:getSlimServer())
        end
        log:info("Servers:")
        for i, server in SlimServer.iterate() do
@@ -369,7 +375,8 @@
 
 -- disconnect from idle servers
 function _idleDisconnect(self)
-       local currentServer = self.currentPlayer and 
self.currentPlayer:getSlimServer()
+       local currentPlayer = Player:getCurrentPlayer()
+       local currentServer = currentPlayer and currentPlayer:getSlimServer()
 
        for i, server in SlimServer:iterate() do
                if server ~= currentServer then
@@ -385,7 +392,7 @@
 function notify_playerDisconnected(self, player)
        log:info("playerDisconnected")
 
-       if self.currentPlayer ~= player then
+       if Player:getCurrentPlayer() ~= player then
                return
        end
 
@@ -398,7 +405,8 @@
 function notify_playerConnected(self, player)
        log:info("playerConnected")
 
-       if self.currentPlayer ~= player then
+       local currentPlayer = Player:getCurrentPlayer()
+       if currentPlayer ~= player then
                return
        end
 
@@ -407,7 +415,7 @@
 
        -- refresh the current player, this means that other applets don't
        -- need to watch the player connection notifications
-       jnt:notify("playerCurrent", self.currentPlayer)
+       Player:setCurrentPlayer(currentPlayer)
 end
 
 
@@ -415,7 +423,8 @@
 function notify_serverDisconnected(self, slimserver)
        log:info("serverDisconnected")
 
-       if not self.currentPlayer or self.currentPlayer:getSlimServer() ~= 
slimserver then
+       local currentPlayer = Player:getCurrentPlayer()
+       if not currentPlayer or currentPlayer:getSlimServer() ~= slimserver then
                return
        end
 
@@ -428,7 +437,8 @@
 function notify_serverConnected(self, slimserver)
        log:info("serverConnected")
 
-       if not self.currentPlayer or self.currentPlayer:getSlimServer() ~= 
slimserver then
+       local currentPlayer = Player:getCurrentPlayer()
+       if not currentPlayer or currentPlayer:getSlimServer() ~= slimserver then
                return
        end
 
@@ -437,8 +447,8 @@
 
        -- refresh the current player, this means that other applets don't
        -- need to watch the server connection notifications
-       if self.currentPlayer then
-               jnt:notify("playerCurrent", self.currentPlayer)
+       if currentPlayer then
+               Player:setCurrentPlayer(currentPlayer)
        end
 end
 
@@ -453,8 +463,9 @@
 
        if self.state == 'connected' then
                -- force re-connection to the current player
-               self.currentPlayer:getSlimServer():disconnect()
-               self.currentPlayer:getSlimServer():connect()
+               local currentPlayer = Player:getCurrentPlayer()
+               currentPlayer:getSlimServer():disconnect()
+               currentPlayer:getSlimServer():connect()
        else
                -- force re-connection to all servers
                self:_disconnect()
@@ -463,31 +474,36 @@
 end
 
 
-function getCurrentPlayer(self)
-       return self.currentPlayer
-end
-
-
-function setCurrentPlayer(self, player)
-       if self.currentPlayer ~= player then
+function notify_playerCurrent(self, player)
+       local settings = self:getSettings()
+
+       local playerId = player and player:getId() or false
+
+       if settings.currentPlayer ~= playerId then
                -- update player
                log:info("selected player: ", player)
-               self.currentPlayer = player
-
-               local settings = self:getSettings()
-               settings.currentPlayer = player and player:getId() or false
+
+               settings.currentPlayer = playerId
                self:storeSettings()
        end
 
-       -- note: notify even if the player has not changed
-       jnt:notify("playerCurrent", player)
-
        -- restart discovery when we have no player
-       if self.currentPlayer and self.currentPlayer:getSlimServer() then
+       if player and player:getSlimServer() then
                self:_setState('connected')
        else
                self:_setState('searching')
        end
+
+end
+
+
+function getCurrentPlayer(self)
+       return Player:getCurrentPlayer()
+end
+
+
+function setCurrentPlayer(self, player)
+       Player:setCurrentPlayer(player)
 end
 
 
@@ -497,7 +513,9 @@
 
 
 function connectPlayer(self)
-       if self.currentPlayer and self.currentPlayer:getSlimServer() then
+       local player = Player:getCurrentPlayer()
+
+       if currentPlayer and currentPlayer:getSlimServer() then
                self:_setState("connected")
        else
                self:_setState("searching")

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua?rev=2580&root=Jive&r1=2579&r2=2580&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
 Tue Jun 17 12:56:08 2008
@@ -61,6 +61,7 @@
 local EVENT_SCROLL     = jive.ui.EVENT_SCROLL
 local EVENT_CONSUME    = jive.ui.EVENT_CONSUME
 
+local jnt            = jnt
 local iconbar        = iconbar
 
 
@@ -87,10 +88,33 @@
 -- list of player that are active
 local playerList = {}
 
-
--- class function to iterate over all players
+-- current player
+local currentPlayer = nil
+
+
+-- class method to iterate over all players
 function iterate(class)
        return pairs(playerList)
+end
+
+
+-- class method, returns the current player
+function getCurrentPlayer(self)
+       return currentPlayer
+end
+
+
+-- class method, sets the current player
+function setCurrentPlayer(class, player)
+       -- is the current player still active?
+       if currentPlayer and currentPlayer.lastSeen == 0 then
+               playerList[currentPlayer.id] = nil
+       end
+
+       currentPlayer = player
+
+       -- notify even if the player has not changed
+       jnt:notify("playerCurrent", currentPlayer)
 end
 
 
@@ -370,6 +394,13 @@
                return
        end
 
+       -- player is now longer seen
+       self.lastSeen = 0
+
+       if self == currentPlayer then
+               return
+       end
+
        log:info(self, " delete for ", self.slimServer)
 
        -- player is no longer active
@@ -382,6 +413,8 @@
                self:offStage()
                self.slimServer = false
        end
+
+
 
        -- The global players table uses weak values, it will be removed
        -- when all references are freed.

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins

Reply via email to