Author: titmuss
Date: Fri Jun 13 04:30:41 2008
New Revision: 2561

URL: http://svn.slimdevices.com?rev=2561&root=Jive&view=rev
Log:
Bug: 6683
Description:
Refactored Player class, fixed some bugs.


Modified:
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/NowPlaying/NowPlayingApplet.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/Iconbar.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/Player.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/NowPlaying/NowPlayingApplet.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/NowPlaying/NowPlayingApplet.lua?rev=2561&root=Jive&r1=2560&r2=2561&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/NowPlaying/NowPlayingApplet.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/NowPlaying/NowPlayingApplet.lua
 Fri Jun 13 04:30:41 2008
@@ -151,14 +151,14 @@
        local mode = self.player:getPlayMode()
 
        -- hide this window if the player is turned off
-       if power == 0 then
+       if not power then
                if self['browse'] and self['browse'].window then
                        self['browse'].titleGroup:setWidgetValue("title", 
self:string(modeTokens['off']))
                end
                if self['ss'] and self['ss'].window then
                        self['ss'].titleGroup:setWidgetValue("title", 
self:string(modeTokens['off']))
                end
-       elseif power == 1 then
+       else
                if self['browse'] and self['browse'].window then
                        self['browse'].titleGroup:setWidgetValue("title", 
self:string(modeTokens[mode]))
                end
@@ -383,11 +383,10 @@
                return 
        end
 
-       local power = self.player:getPlayerPower()
        local token = mode
        -- sometimes there is a race condition here between updating player 
mode and power, 
        -- so only set the title to 'off' if the mode is also not 'play'
-       if token != 'play' and power == 0 then
+       if token != 'play' and not self.player:isPowerOn() then
                token = 'off'
        end
        if ws.titleGroup then

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua?rev=2561&root=Jive&r1=2560&r2=2561&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
 Fri Jun 13 04:30:41 2008
@@ -170,8 +170,8 @@
 
 
 function _addPlayerItem(self, player)
-       local mac = player.id
-       local playerName = player.name
+       local mac = player:getId()
+       local playerName = player:getName()
        local playerWeight = PLAYER_WEIGHT
 
        -- if waiting for a SN pin modify name

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua?rev=2561&root=Jive&r1=2560&r2=2561&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
 Fri Jun 13 04:30:41 2008
@@ -1916,9 +1916,8 @@
                -- if there is only one item in the playlist, bring the 
selected item to top
                local playerStatus = _player:getPlayerStatus()
                local playlistSize = _player:getPlaylistSize() 
-               local playerPower = _player:getPlayerPower()
-
-               if playerPower == 0 then
+
+               if not _player:isPowerOn() then
                        _statusStep.window:setTitle(_string(modeTokens['off']))
                        _statusStep.window:setTitleStyle("currentplaylisttitle")
                end
@@ -1983,12 +1982,12 @@
 
        if step.menu then
                -- show 'OFF' in playlist window title when the player is off
-               if power == 0 then
+               if not power then
                        if step.window then
                                step.window:setTitle(_string("SLIMBROWSER_OFF"))
                                
step.window:setTitleStyle("currentplaylisttitle")
                        end
-               elseif power == 1 then
+               else
                        if step.window then
                                if emptyStep then
                                        step.window:replace(emptyStep.window, 
Window.transitionFadeIn)
@@ -2007,9 +2006,8 @@
        end
 
        local step = _statusStep
-       local power = player:getPlayerPower()
        local token = mode
-       if mode != 'play' and power == 0 then
+       if mode != 'play' and not player:isPowerOn() then
                token = 'off'
        end
 
@@ -2024,14 +2022,13 @@
                return
        end
 
-       local power        = _player:getPlayerPower()
        local playerStatus = player:getPlayerStatus()
        local playlistSize = _player:getPlaylistSize()
        local step         = _statusStep
        local emptyStep    = _emptyStep
 
        -- display 'NOTHING' if the player is on and there aren't any tracks in 
the playlist
-       if power and playlistSize == 0 then
+       if _player:isPowerOn() and playlistSize == 0 then
                local customWindow = showEmptyPlaylist('SLIMBROWSER_NOTHING') 
                if emptyStep then
                        customWindow:replace(emptyStep.window, 
Window.transitionFadeIn)
@@ -2065,8 +2062,7 @@
                return
        end
 
-       local power = player:getPlayerPower()
-       if power == 0 then
+       if not player:isPowerOn() then
                return
        end
 
@@ -2189,9 +2185,7 @@
 
        -- look to see if the playlist has size and the state of player power
        -- if playlistSize is 0 or power is off, we show and empty playlist
-       local playerPower = _player:getPlayerPower()
-       log:info('power: ', playerPower)
-       if playerPower == 0 then
+       if not _player:isPowerOn() then
                if _statusStep.window then
                        _statusStep.window:setTitle(_string("SLIMBROWSER_OFF"))
                        _statusStep.window:setTitleStyle("currentplaylisttitle")
@@ -2252,6 +2246,7 @@
 
 
 function notify_serverDisconnected(self, server, numPendingRequests)
+
        if _server ~= server then
                return
        end

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=2561&root=Jive&r1=2560&r2=2561&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
 Fri Jun 13 04:30:41 2008
@@ -39,7 +39,7 @@
 local SlimServer    = require("jive.slim.SlimServer")
 
 local debug         = require("jive.utils.debug")
-local log           = require("jive.utils.log").logger("applets.setup")
+local log           = require("jive.utils.log").logger("slimserver")
 
 local jnt           = jnt
 local jiveMain      = jiveMain
@@ -134,8 +134,9 @@
                end
        end
 
-       -- XXXX debug
-       self:_debug()
+       if log:isDebug() then
+               self:_debug()
+       end
 end
 
 
@@ -240,29 +241,30 @@
                log:error("unknown state=", state)
        end
 
-       -- XXXX debug
-       self:_debug()
+       if log:isDebug() then
+               self:_debug()
+       end
 end
 
 
 function _debug(self)
        local now = Framework:getTicks()
 
-       log:warn("----")
-       log:warn("State: ", self.state)
-       log:warn("CurrentPlayer: ", self.currentPlayer)
+       log:info("----")
+       log:info("State: ", self.state)
+       log:info("CurrentPlayer: ", self.currentPlayer)
        if self.currentPlayer then
-               log:warn("ActiveServer: ", self.currentPlayer:getSlimServer())
-       end
-       log:warn("Servers:")
+               log:info("ActiveServer: ", self.currentPlayer:getSlimServer())
+       end
+       log:info("Servers:")
        for i, server in SlimServer.iterate() do
-               log:warn("\t", server:getName(), " connected=", 
server:isConnected(), " timeout=", DISCOVERY_TIMEOUT - (now - 
server:getLastSeen()))
-       end
-       log:warn("Players:")
+               log:info("\t", server:getName(), " connected=", 
server:isConnected(), " timeout=", DISCOVERY_TIMEOUT - (now - 
server:getLastSeen()))
+       end
+       log:info("Players:")
        for i, player in Player.iterate() do
-               log:warn("\t", player:getName(), " server=", 
player:getSlimServer())
-       end
-       log:warn("----")
+               log:info("\t", player:getName(), " server=", 
player:getSlimServer(), " connected=", player:isConnected())
+       end
+       log:info("----")
 end
 
 
@@ -297,11 +299,32 @@
 
 
 -- restart discovery if the player is disconnect from SqueezeCenter
-function notify_playerDelete(self, player)
-       log:info("playerDelete")
+function notify_playerDisconnected(self, player)
+       log:info("playerDisconnected")
+
+       if self.currentPlayer ~= player then
+               return
+       end
 
        -- start discovery looking for the player
        self:_setState('searching')
+end
+
+
+-- stop discovery if the player is reconnects
+function notify_playerConnected(self, player)
+       log:info("playerConnected")
+
+       if self.currentPlayer ~= player then
+               return
+       end
+
+       -- stop discovery, we have the player
+       self:_setState('connected')
+
+       -- refresh the current player, this means that other applets don't
+       -- need to watch the player connection notifications
+       jnt:notify("playerCurrent", self.currentPlayer)
 end
 
 
@@ -326,8 +349,14 @@
                return
        end
 
-       -- start discovery looking for the player
+       -- stop discovery, we have the player
        self:_setState('connected')
+
+       -- 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)
+       end
 end
 
 
@@ -335,17 +364,20 @@
 function notify_networkConnected(self)
        log:info("networkConnected")
 
-       if not self.currentPlayer or not self.currentPlayer:getSlimServer() then
+       if self.state == 'disconnected' then
+               return
+       end
+
+       if self.state == 'connected' then
+               -- force re-connection to the current player
+               self.currentPlayer:getSlimServer():disconnect()
+               self.currentPlayer:getSlimServer():connect()
+       else
                -- force re-connection to all servers
                self:_disconnect()
                self:_connect()
-       else
-               -- force re-connection to the current player
-               self.currentPlayer:getSlimServer():disconnect()
-               self.currentPlayer:getSlimServer():connect()
-       end
-end
-
+       end
+end
 
 
 function getCurrentPlayer(self)

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/Iconbar.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/Iconbar.lua?rev=2561&root=Jive&r1=2560&r2=2561&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/Iconbar.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/Iconbar.lua
 Fri Jun 13 04:30:41 2008
@@ -113,12 +113,12 @@
 
        self.wirelessSignal = val
 
-       if val == nil or val == "ERROR" then
-               self.iconWireless:setStyle("iconWireless" .. string.upper((val 
or "NONE")))
+       if val == "ERROR" then
+               self.iconWireless:setStyle("iconWireless" .. val)
        elseif self.serverError == "ERROR" then
                self.iconWireless:setStyle("iconWirelessSERVERERROR")
        else
-               self.iconWireless:setStyle("iconWireless" .. val)
+               self.iconWireless:setStyle("iconWireless" .. (val or "NONE"))
        end
 end
 

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=2561&root=Jive&r1=2560&r2=2561&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
 Fri Jun 13 04:30:41 2008
@@ -70,14 +70,18 @@
 module(..., oo.class)
 
 
--- list of players index by id.
-local players = {}
-setmetatable(players, { __mode = 'v' })
+-- list of players index by id. this weak table is used to enforce
+-- object equality with the server name.
+local playerIds = {}
+setmetatable(playerIds, { __mode = 'v' })
+
+-- list of player that are active
+local playerList = {}
 
 
 -- class function to iterate over all players
 function iterate(class)
-       return pairs(players)
+       return pairs(playerList)
 end
 
 
@@ -105,49 +109,6 @@
 end
 
 
--- _setConnected(connected)
--- sets the connected state from the player
--- sends an appropriate notification on change
-local function _setConnected(self, connected)
-       log:debug("_setConnected(", connected, ")")
-       
-       -- use tostring to handle nil case (in either)
-       if tostring(connected) != tostring(self.connected) then
-               self.connected = connected
-               if connected == 1 then
-                       self.jnt:notify('playerConnected', self)
-               else
-                       self.jnt:notify('playerDisconnected', self)
-               end
-       end
-end
-
--- _setPlayerName()
--- sets the name of the player
--- sends an appropriate notification on change
-local function _setPlayerName(self, playerName)
-       log:debug("_setPlayerName(", playerName, ")")
-
-       -- convert to string, in case SC sends a nil player name
-       playerName = tostring(playerName)
-
-       -- make sure this is a new name
-       if playerName != self.name then
-               self.name = playerName
-               self.jnt:notify('playerNewName', self, playerName)
-       end
-end
-
-local function _setPlayerPower(self, power)
-       log:debug("_setPlayerPower")
-
-       power = tonumber(power)
-       if power != self.power then
-               self.power = power
-               self.jnt:notify('playerPower', self, power)
-       end
-end
-
 local function _formatShowBrieflyText(msg)
        log:debug("_formatShowBrieflyText")
 
@@ -164,15 +125,6 @@
        return text2
 end
 
--- _setPlayerModeChange()
--- sends notifications when changes in the play mode (e.g., moves from play to 
paused)
-local function _setPlayerModeChange(self, mode)
-       log:debug("_setPlayerModeChange")
-       if mode != self.mode then
-               self.mode = mode
-               self.jnt:notify('playerModeChange', self, mode)
-       end
-end
 
 -- _whatsPlaying(obj)
 -- returns the track_id from a playerstatus structure
@@ -192,80 +144,46 @@
        return whatsPlaying
 end
 
--- _setPlayerPlaylistChange()
--- sends notifications when anything gets sent about the playlist changing
-local function _setPlayerPlaylistChange(self, timestamp)
-       log:debug("Player:_setPlayerPlaylistChange")
-       if self.playlist_timestamp != timestamp then
-               self.playlist_timestamp = timestamp
-               self.jnt:notify('playerPlaylistChange', self)
-       end
-end
-
--- _setPlayerTrackChange()
--- sends notifications when a change occurs to the currently playing track
-local function _setPlayerTrackChange(self, nowPlaying)
-       log:debug("Player:_setPlayerTrackChange")
-
-       if self.nowPlaying != nowPlaying then
-               self.nowPlaying = nowPlaying
-               self.jnt:notify('playerTrackChange', self, nowPlaying)
-       end
-end
-
---[[
-
-=head2 jive.slim.Player(server, jnt, playerInfo)
-
-Create a Player object for server I<server>.
-
-=cut
---]]
-
-function __init(self, jnt, slimServer, playerInfo)
-       log:debug("Player:__init(", playerInfo.playerid, ")")
-
-       _assert(slimServer, "Needs slimServer")
-       _assert(playerInfo, "Needs playerInfo")
+
+--[[
+
+=head2 jive.slim.Player(server, jnt, playerId)
+
+Create a Player object with playerId.
+
+=cut
+--]]
+function __init(self, jnt, playerId)
+       log:debug("Player:__init(", playerId, ")")
 
        -- Only create one player object per id. This avoids duplicates
        -- when moving between servers
 
-       local obj = players[playerInfo.playerid]
-       if  obj then
-               obj:update(slimServer, playerInfo)
-               return obj
+       if playerIds[playerId] then
+               return playerIds[playerId]
        end
 
        local obj = oo.rawnew(self,{
-               
-               slimServer = slimServer,
                jnt = jnt,
 
-               id = playerInfo.playerid,
-               uuid = playerInfo.uuid,
-               name = tostring(playerInfo.name),
-               model = playerInfo.model,
-               connected = playerInfo.connected,
-               power = playerInfo.power,
-               needsUpgrade = (tonumber(playerInfo.player_needs_upgrade) == 1),
-               playerIsUpgrading = (tonumber(playerInfo.player_is_upgrading) 
== 1),
-               pin = playerInfo.pin,
-
-               -- menu item of home menu that represents this player
-               homeMenuItem = false,
-               
+               id = playerId,
+
+               uuid = false,
+               slimServer = false,
+
+               -- player info from SC
+               info = {},
+
+               -- player state from SC
+               state = {},
+
                isOnStage = false,
 
                -- current song info
                currentSong = {}
        })
 
-       players[obj.id] = obj
-
-       -- notify of new player
-       log:info(obj, " new for ", obj.slimServer)
-       obj.slimServer:_addPlayer(obj)
+       playerIds[obj.id] = obj
 
        return obj
 end
@@ -273,13 +191,14 @@
 
 --[[
 
-=head2 jive.slim.Player:update(playerInfo)
+=head2 jive.slim.Player:updatePlayerInfo(squeezeCenter, playerInfo)
 
 Updates the player with fresh data from SS.
 
 =cut
 --]]
-function update(self, slimServer, playerInfo)
+function updatePlayerInfo(self, slimServer, playerInfo)
+
        -- ignore updates from a different server if the player
        -- is not connected to it
        if self.slimServer ~= slimServer 
@@ -287,44 +206,104 @@
                return
        end
 
-       -- Update player state
-       local lastNeedsUpgrade = self.needsUpgrade
-       self.needsUpgrade = (tonumber(playerInfo.player_needs_upgrade) == 1)
-       local lastIsUpgrading = self.playerIsUpgrading
-       self.playerIsUpgrading = (tonumber(playerInfo.player_is_upgrading) == 1)
-
-       -- FIXME the object state needs setting before any notifications
-       -- this is now changed for needsUpgrade and playerIsUpgrading, but 
still needs to be done
-       -- for all other player state
-
-
-       -- Send player notifications
+       -- Save old player info
+       local oldInfo = self.info
+       self.info = {}
+
+       -- Update player info, cast to fix perl bugs :)
+       self.info.uuid = tostring(playerInfo.uuid)
+       self.info.name = tostring(playerInfo.name)
+       self.info.model = tostring(playerInfo.model)
+       self.info.connected = tonumber(playerInfo.connected) == 1
+       self.info.power = tonumber(playerInfo.power) == 1
+       self.info.needsUpgrade = tonumber(playerInfo.player_needs_upgrade) == 1
+       self.info.isUpgrading = tonumber(playerInfo.player_is_upgrading) == 1
+       self.info.pin = tostring(playerInfo.pin)
+
+-- XXXX
+       debug.dump(self.info)
+
+       -- PIN is removed from serverstatus after a player is linked
+       if self.info.pin and not playerInfo.pin then
+               self.info.pin = nil
+       end
+
+       -- Check have we changed SqueezeCenter
        if self.slimServer ~= slimServer then
                -- delete from old server
                if self.slimServer then
                        self:free(self.slimServer)
                end
 
+               -- the
+               oldInfo.connected = false
+
+               -- player is now active
+               playerList[self.id] = self
+
                -- add to new server
+               log:info(self, " new for ", slimServer)
                self.slimServer = slimServer
                self.slimServer:_addPlayer(self)
-               log:info(self, " new for ", self.slimServer)
-       end
-       
-       self.model = playerInfo.model
-
-       if lastNeedsUpgrade != self.needsUpgrade or lastIsUpgrading != 
self.playerIsUpgrading then
+
+               self.jnt:notify('playerNew', self)
+       end
+
+       -- Check for player firmware upgrades
+       if oldInfo.needsUpgrade ~= self.info.needsUpgrade or 
oldInfo.isUpgrading ~= self.info.isUpgrading then
                self.jnt:notify('playerNeedsUpgrade', self, 
self:isNeedsUpgrade(), self:isUpgrading())
        end
 
-       _setPlayerName(self, playerInfo.name)
-       _setPlayerPower(self, tonumber(playerInfo.power))
-       _setConnected(self, playerInfo.connected)
-
-       -- PIN is removed from serverstatus after a player is linked
-       if self.pin and not playerInfo.pin then
-               self.pin = nil
-       end
+       -- Check if the player name has changed
+       if oldInfo.playerName ~= self.state.playerName then
+               self.jnt:notify('playerNewName', self, self.info.playerName)
+       end
+
+       -- Check if the player power status has changed
+       if oldInfo.power ~= self.info.power then
+               self.jnt:notify('playerPower', self, self.info.power)
+       end
+
+       -- use tostring to handle nil case (in either)
+       if oldInfo.connected ~= self.info.connected then
+               if self.info.connected then
+                       self.jnt:notify('playerConnected', self)
+               else
+                       self.jnt:notify('playerDisconnected', self)
+               end
+       end
+end
+
+
+--[[
+
+=head2 jive.slim.Player:free(slimServer)
+
+Deletes the player, if connect to the given slimServer
+
+=cut
+--]]
+function free(self, slimServer)
+       _assert(slimServer)
+
+       if self.slimServer ~= slimServer then
+               -- ignore, we are not connected to this server
+               return
+       end
+
+       log:info(self, " delete for ", self.slimServer)
+
+       -- player is no longer active
+       playerList[self.id] = nil
+
+       self.jnt:notify('playerDelete', self)
+
+       self.slimServer:_deletePlayer(self)
+       self:offStage()
+       self.slimServer = nil
+
+       -- The global players table uses weak values, it will be removed
+       -- when all references are freed.
 end
 
 
@@ -346,7 +325,6 @@
 
        self.slimServer.comet:unsubscribe(...)
 end
-
 
 
 --[[
@@ -373,14 +351,14 @@
                local now = Framework:getTicks() / 1000
 
                -- multiply by rate to allow for trick modes
-               self.trackCorrection = tonumber(self.state.rate) * (now - 
self.trackSeen)
+               self.trackCorrection = self.rate * (now - self.trackSeen)
        end
 
        if self.trackCorrection <= 0 then
-               return tonumber(self.trackTime), tonumber(self.trackDuration)
+               return self.trackTime, self.trackDuration
        else
                local trackElapsed = self.trackTime + self.trackCorrection
-               return tonumber(trackElapsed), tonumber(self.trackDuration)
+               return trackElapsed, self.trackDuration
        end
        
 end
@@ -399,6 +377,7 @@
        return self.playlist_timestamp
 end
 
+
 --[[
 
 =head2 jive.slim.Player:getPlaylistSize()
@@ -408,8 +387,9 @@
 =cut
 --]]
 function getPlaylistSize(self)
-       return tonumber(self.playlistSize)
-end
+       return self.playlistSize
+end
+
 
 --[[
 
@@ -420,20 +400,7 @@
 =cut
 --]]
 function getPlayerMode(self)
-       return self.mode
-end
-
-
---[[
-
-=head2 jive.slim.Player:getPlayerPower()
-
-returns the playerPower for a given player object
-
-=cut
---]]
-function getPlayerPower(self)
-       return tonumber(self.power)
+       return self.state.mode
 end
 
 
@@ -449,69 +416,6 @@
        return self.state
 end
 
---[[
-
-=head2 jive.slim.Player:free(slimServer)
-
-Deletes the player, if connect to the given slimServer
-
-=cut
---]]
-function free(self, slimServer)
-       _assert(slimServer)
-
-       if self.slimServer ~= slimServer then
-               -- ignore, we are not connected to this server
-               return
-       end
-
-       log:info(self, " delete for ", self.slimServer)
-       self.slimServer:_deletePlayer(self)
-       self:offStage()
-       self.slimServer = nil
-
-       -- The global players table uses weak values, it will be removed
-       -- when all references are freed.
-end
-
-
---[[
-
-=head2 jive.slim.Player:getHomeMenuItem()
-
-Returns the home menu menuItem that represents this player. This is
-used by L<jive.applet.SlimDiscovery> to remove the player from the menu
-if/when it disappears.
-
-=cut
---]]
-function getHomeMenuItem(self)
-       -- return nil if self.homeMenuItem is false
-       if self.homeMenuItem then
-               return self.homeMenuItem
-       end
-       return nil
-end
-
-
---[[
-
-=head2 jive.slim.Player:setHomeMenuItem(homeMenuItem)
-
-Stores the main home menuItem that represents this player. This is
-used by L<jive.applet.SlimDiscovery> to manage the home menu item.
-
-=cut
---]]
-function setHomeMenuItem(self, homeMenuItem)
-       -- set self.homeMenuItem to false if sent nil
-       if homeMenuItem then
-               self.homeMenuItem = homeMenuItem
-       else
-               self.homeMenuItem = false
-       end
-end
-
 
 --[[
 
@@ -523,7 +427,7 @@
 =cut
 --]]
 function __tostring(self)
-       return "Player {" .. self.name .. "}"
+       return "Player {" .. self.info.name .. "}"
 end
 
 
@@ -536,7 +440,7 @@
 =cut
 --]]
 function getName(self)
-       return self.name
+       return self.info.name
 end
 
 
@@ -549,7 +453,7 @@
 =cut
 --]]
 function isPowerOn(self)
-       return tonumber(self.power) == 1
+       return self.info.power
 end
 
 
@@ -575,7 +479,7 @@
 =cut
 --]]
 function getUuid(self)
-       return self.uuid
+       return self.info.uuid
 end
 
 
@@ -588,9 +492,9 @@
 =cut
 --]]
 function getMacAddress(self)
-       if self.model == "squeezebox2"
-               or self.model == "receiver"
-               or self.model == "transporter" then
+       if self.info.model == "squeezebox2"
+               or self.info.model == "receiver"
+               or self.info.model == "transporter" then
 
                return string.gsub(self.id, "[^%x]", "")
        end
@@ -608,7 +512,7 @@
 =cut
 --]]
 function getPin(self)
-       return self.pin
+       return self.info.pin
 end
 
 --[[
@@ -737,7 +641,6 @@
        log:debug("Player:updateIconbar()")
        
        if self.isOnStage and self.state then
-
                -- set the playmode (nil, stop, play, pause)
                iconbar:setPlaymode(self.state["mode"])
                
@@ -760,36 +663,45 @@
                return
        end
 
-       -- update our cache in one go
+       -- update our state in one go
        self.state = event.data
 
-       -- Update player state
-       local lastNeedsUpgrade = (self.needsUpgrade == 1)
-       local lastIsUpgrading = (self.playerIsUpgrading == 1)
-       self.needsUpgrade = (tonumber(event.data.player_needs_upgrade) == 1)
-       self.playerIsUpgrading = (tonumber(event.data.player_is_upgrading) == 1)
-
        -- used for calculating getTrackElapsed(), getTrackRemaining()
+       self.rate = tonumber(event.data.rate)
        self.trackSeen = Framework:getTicks() / 1000
        self.trackCorrection = 0
-       self.trackTime = event.data.time
-       self.trackDuration = event.data.duration
+       self.trackTime = tonumber(event.data.time)
+       self.trackDuration = tonumber(event.data.duration)
        self.playlistSize = tonumber(event.data.playlist_tracks)
 
-       _setConnected(self, self.state["player_connected"])
-       _setPlayerPower(self, tonumber(event.data.power))
-
-       _setPlayerModeChange(self, event.data.mode)
-
-       if self.needsUpgrade ~= lastNeedsUpgrade or self.playerIsUpgrading ~= 
lastIsUpgrading then
-               self.jnt:notify('playerNeedsUpgrade', self, 
self:isNeedsUpgrade(), self:isUpgrading())
-       end
-
+       -- update our player state, and send notifications
+       -- create a playerInfo table, to allow code reuse
+       local playerInfo = {}
+       playerInfo.uuid = self.info.uuid
+       playerInfo.name = event.data.player_name
+       playerInfo.model = self.info.model
+       playerInfo.connected = event.data.player_connected
+       playerInfo.power = event.data.power
+       playerInfo.player_needs_upgrade = event.data.player_needs_upgrade
+       playerInfo.player_is_upgrading = event.data.player_is_upgrading
+       playerInfo.pin = self.info.pin
+
+       self:updatePlayerInfo(self.slimServer, playerInfo)
+
+       -- update track list
        local nowPlaying = _whatsPlaying(event.data)
 
-       _setPlayerTrackChange(self, nowPlaying)
-       _setPlayerPlaylistChange(self, event.data.playlist_timestamp)
-
+       if self.nowPlaying ~= nowPlaying then
+               self.nowPlaying = nowPlaying
+               self.jnt:notify('playerTrackChange', self, nowPlaying)
+       end
+
+       if self.playlist_timestamp ~= timestamp then
+               self.playlist_timestamp = timestamp
+               self.jnt:notify('playerPlaylistChange', self)
+       end
+
+       -- update iconbar
        self:updateIconbar()
 end
 
@@ -855,7 +767,7 @@
 --
 function isPaused(self)
        if self.state then
-               return self.state["mode"] == 'pause'
+               return self.state.mode == 'pause'
        end
 end
 
@@ -864,7 +776,7 @@
 --
 function getPlayMode(self)
        if self.state then
-               return self.state["mode"]
+               return self.state.mode
        end
 end
 
@@ -872,17 +784,17 @@
 --
 function isCurrent(self, index)
        if self.state then
-               return self.state["playlist_cur_index"] == index - 1
+               return self.state.playlist_cur_index == index - 1
        end
 end
 
 
 function isNeedsUpgrade(self)
-       return self.needsUpgrade
+       return self.info.needsUpgrade
 end
 
 function isUpgrading(self)
-       return self.playerIsUpgrading
+       return self.info.isUpgrading
 end
 
 -- play
@@ -896,7 +808,7 @@
        end
 
        self:call({'mode', 'play'})
-       self.state["mode"] = 'play'
+       self.state.mode = 'play'
        self:updateIconbar()
 end
 
@@ -906,7 +818,7 @@
 function stop(self)
        log:debug("Player:stop()")
        self:call({'mode', 'stop'})
-       self.state["mode"] = 'stop'
+       self.state.mode = 'stop'
        self:updateIconbar()
 end
 
@@ -1059,15 +971,15 @@
 
 -- returns true if this player supports udap setup
 function canUdap(self)
-       return self.model == "receiver"
+       return self.info.model == "receiver"
 end
 
 
 -- returns true if this player can connect to another server
 function canConnectToServer(self)
-       return self.model == "squeezebox2"
-               or self.model == "receiver"
-               or self.model == "transporter"
+       return self.info.model == "squeezebox2"
+               or self.info.model == "receiver"
+               or self.info.model == "transporter"
 end
 
 
@@ -1079,7 +991,7 @@
 
 
 function isConnected(self)
-       return self.slimServer and self.slimServer:isConnected() and 
self.connected
+       return self.slimServer and self.slimServer:isConnected() and 
self.info.connected
 end
 
 

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua?rev=2561&root=Jive&r1=2560&r2=2561&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
 Fri Jun 13 04:30:41 2008
@@ -108,9 +108,6 @@
        log:debug(self, ":_serverstatusSink()")
 
        local data = event.data
-
--- XXXX
-       debug.dump(data, 3)
 
        -- check we have a result 
        if not data then
@@ -158,24 +155,22 @@
 
                for i, player_info in ipairs(serverPlayers) do
 
+                       local playerId = player_info.playerid
+
                        if player_info.pin then
                                self.pin = player_info.pin
                        end
 
                        -- remove the player from our list since it is reported 
by the server
-                       selfPlayers[player_info.playerid] = nil
+                       selfPlayers[playerId] = nil
        
                        -- create new players
-                       if not self.players[player_info.playerid] then
-                       
--- XXXX new constructor for player, don't pass server or player_info
-                               player = Player(self.jnt, self, player_info)
-                       
-                       else
-                               -- update existing players
--- XXXX rename method for SC player update
-                               self.players[player_info.playerid]:update(self, 
player_info)
+                       if not self.players[playerId] then
+                               self.players[playerId] = Player(self.jnt, 
playerId)
                        end
+
+                       -- update player state
+                       
self.players[player_info.playerid]:updatePlayerInfo(self, player_info)
                end
        else
                log:info(self, ": has no players!")
@@ -195,13 +190,11 @@
 -- package private method to delete a player
 function _deletePlayer(self, player)
        self.players[player:getId()] = nil
-       self.jnt:notify('playerDelete', player)
 end
 
 
 function _addPlayer(self, player)
        self.players[player:getId()] = player
-       self.jnt:notify('playerNew', player)
 end
 
 
@@ -480,13 +473,13 @@
                return
        end
 
-       if self.netstate ~= 'connected' then
-               return
-       end
-
-       log:info(self, " disconnected")
-
-       self.netstate = 'connecting'
+       if self.netstate == 'connected' then
+               log:info(self, " disconnected")
+
+               self.netstate = 'connecting'
+       end
+
+       -- always send the notification
        self.jnt:notify('serverDisconnected', self, numPendingRequests)
 end
 

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

Reply via email to