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