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