Author: titmuss
Date: Thu Jan 17 15:49:04 2008
New Revision: 1495
URL: http://svn.slimdevices.com?rev=1495&root=Jive&view=rev
Log:
Bug: N/A
Description:
Allow the player to move between servers in the Music Source menu. This is work
in
progress, it usually works ok.
Modified:
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt
trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua
trunk/jive/src/pkg/jive/share/jive/slim/Player.lua
trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua
Modified:
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
URL:
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua?rev=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
---
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
(original)
+++
trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/SetupSlimServersApplet.lua
Thu Jan 17 15:49:04 2008
@@ -39,9 +39,13 @@
local Popup = require("jive.ui.Popup")
local Icon = require("jive.ui.Icon")
+local debug = require("jive.utils.debug")
local log = require("jive.utils.log").logger("applets.setup")
local EVENT_WINDOW_POP = jive.ui.EVENT_WINDOW_POP
+local EVENT_KEY_PRESS = jive.ui.EVENT_KEY_PRESS
+local EVENT_CONSUME = jive.ui.EVENT_CONSUME
+local EVENT_UNUSED = jive.ui.EVENT_UNUSED
local jnt = jnt
local jiveMain = jiveMain
@@ -98,6 +102,10 @@
}
menu:addItem(item)
+ --[[
+ -- Remove auto discovery, most of the time Jive now is only
+ -- connected to the same server as the current player, so
+ -- this is less relevant.
item = {
text = self:string("SLIMSERVER_AUTO_DISCOVERY"),
sound = "WINDOWSHOW",
@@ -114,6 +122,7 @@
weight = 4
}
menu:addItem(item)
+ --]]
-- Discover slimservers in this window
window:addTimer(1000, function() self.sdApplet:discover() end)
@@ -150,14 +159,12 @@
local currentPlayer = self.sdApplet:getCurrentPlayer()
if currentPlayer then
local currentServer = currentPlayer:getSlimServer()
- local thisServer = id .. ':' .. (port or 0)
- if currentServer.id == thisServer then
+ if currentServer:getIpPort() == id then
item.style = 'checked'
end
end
self.serverMenu:addItem(item)
-
self.serverList[id] = item
end
@@ -165,7 +172,7 @@
function _delServerItem(self, id, server)
-- remove entry
if self.serverList[id] then
- server.serverMenu:removeItem(self.serverList[id])
+ self.serverMenu:removeItem(self.serverList[id])
self.serverList[id] = nil
end
@@ -182,7 +189,19 @@
local window = Window("window", name)
local menu = SimpleMenu("menu", items)
+ local currentPlayer = self.sdApplet:getCurrentPlayer()
+
if server then
+ if server and currentPlayer and currentPlayer:getSlimServer()
~= server then
+ menu:addItem({
+ text =
self:string("SLIMSERVER_CONNECT", name),
+ callback = function()
+
self:connectPlayer(currentPlayer, server)
+ window:hide()
+ end
+ })
+ end
+
menu:addItem({
text = self:string("SLIMSERVER_ADDRESS"),
icon = Label("value", table.concat({
server:getIpPort() }, ":"))
@@ -211,18 +230,115 @@
function notify_serverNew(self, server)
- log:debug("server new", server)
-
local id = server:getIpPort()
self:_addServerItem(id, server)
end
function notify_serverDelete(self, server)
- log:debug("server delete", server)
-
local id = server:getIpPort()
self:_delServerItem(id, server)
+end
+
+
+function _updateServerList(self, server)
+ for id, item in pairs(self.serverList) do
+ if server and server:getIpPort() == id then
+ item.style = 'checked'
+ else
+ item.style = nil
+ end
+ self.serverMenu:updatedItem(item)
+ end
+end
+
+
+function notify_playerNew(self, player)
+ local currentPlayer = self.sdApplet:getCurrentPlayer()
+ if player ~= currentPlayer then
+ return
+ end
+
+ _updateServerList(self, player:getSlimServer())
+end
+
+
+function notify_playerDelete(self, player)
+ local currentPlayer = self.sdApplet:getCurrentPlayer()
+ if player ~= currentPlayer then
+ return
+ end
+
+ _updateServerList(self, player:getSlimServer())
+end
+
+
+function notify_playerCurrent(self, player)
+ _updateServerList(self, player and player:getSlimServer())
+end
+
+
+-- connect player to server
+function connectPlayer(self, player, server)
+ log:warn("connect ", player, " to ", server)
+
+ -- tell the player to move servers
+ local ip, port = server:getIpPort()
+ player:send({'connect', ip})
+
+
+ local window = Popup("popupIcon")
+ window:addWidget(Icon("iconConnecting"))
+
+ local statusLabel = Label("text",
self:string("SLIMSERVER_CONNECTING_TO", server:getName()))
+ window:addWidget(statusLabel)
+
+ -- disable key presses
+ window:addListener(EVENT_KEY_PRESS,
+ function(event)
+ return EVENT_CONSUME
+ end)
+
+ local timeout = 1
+ window:addTimer(1000,
+ function()
+ -- scan all servers waiting for the player
+ self.sdApplet:discover()
+
+ if player:getSlimServer() == server then
+ self:_connectPlayerDone(player, server)
+ end
+
+ timeout = timeout + 1
+ if timeout == 60 then
+ self:_connectPlayerFailed(player,
server)
+ end
+ end)
+
+ self:tieAndShowWindow(window)
+end
+
+
+-- sucessfully connected player to server
+function _connectPlayerDone(self, player, server)
+ local window = Popup("popupIcon")
+ window:addWidget(Icon("iconConnected"))
+
+ local statusLabel = Label("text",
self:string("SLIMSERVER_CONNECTED_TO", server:getName()))
+ window:addWidget(statusLabel)
+
+ window:addTimer(2000,
+ function()
+ window:hide()
+ end)
+
+ self:tieAndShowWindow(window)
+end
+
+
+-- failed to connect player to server
+function _connectPlayerFailed(self, player, server)
+ log:warn("FAILED")
end
Modified: trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt
URL:
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt?rev=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt
(original)
+++ trunk/jive/src/pkg/jive/share/applets/SetupSlimServers/strings.txt Thu Jan
17 15:49:04 2008
@@ -66,3 +66,21 @@
IT Immettere l'indirizzo IP del computer in cui è in esecuzione
SqueezeCenter
NL Voer het IP-adres in van de computer waarop SqueezeCenter wordt
uitgevoerd
+SLIMSERVER_CONNECTING_TO
+ DE Verbindung mit\n%s
+ EN Connecting to\n%s
+ ES Estableciendo conexión a\n%s
+ FR Connexion à \n%s
+ IT Connessione a\n%s\nin corso
+ NL Bezig verbinding te maken met\n%s
+
+SLIMSERVER_CONNECTED_TO
+ DE Verbunden mit\n%s
+ EN Connected to\n%s
+ ES Conexión a\n%s\nestablecida
+ FR Connecté à \n%s
+ IT Connesso a\n%s
+ NL Verbonden met\n%s
+
+SLIMSERVER_CONNECT
+ EN Use %s
Modified:
trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua
URL:
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua?rev=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua
(original)
+++ trunk/jive/src/pkg/jive/share/applets/SlimDiscovery/SlimDiscoveryApplet.lua
Thu Jan 17 15:49:04 2008
@@ -140,7 +140,7 @@
function setCurrentPlayer(self, player)
local settings = self:getSettings()
- if settings.currentPlayer ~= player then
+ if player and settings.currentPlayer ~= player then
settings.currentPlayer = player and player.id or false
self:storeSettings()
end
@@ -179,9 +179,7 @@
-- notify_playerNew
-- this is called by jnt when the playerNew message is sent
function notify_playerNew(self, player)
- log:warn("playerNew ", player)
-
- if not self.currentPlayer then
+ if not self:getCurrentPlayer() then
local settings = self:getSettings()
if settings.currentPlayer == player.id then
@@ -194,7 +192,7 @@
-- notify_playerDelete
-- this is called by jnt when the playerDelete message is sent
function notify_playerDelete(self, player)
- if self.currentPlayer == player then
+ if self:getCurrentPlayer() == player then
self:setCurrentPlayer(nil)
end
end
Modified: trunk/jive/src/pkg/jive/share/jive/slim/Player.lua
URL:
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/jive/slim/Player.lua?rev=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/jive/slim/Player.lua (original)
+++ trunk/jive/src/pkg/jive/share/jive/slim/Player.lua Thu Jan 17 15:49:04 2008
@@ -63,6 +63,10 @@
-- jive.slim.Player is a base class
module(..., oo.class)
+
+
+-- list of players index by id.
+local players = {}
-- _getSink
@@ -173,11 +177,21 @@
=cut
--]]
-function __init(self, slimServer, jnt, playerInfo)
+function __init(self, jnt, slimServer, playerInfo)
log:debug("Player:__init(", playerInfo.playerid, ")")
- _assert(slimServer, "Cannot create Player without SlimServer object")
-
+ _assert(slimServer, "Needs slimServer")
+ _assert(playerInfo, "Needs playerInfo")
+
+ -- 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
+ end
+
local obj = oo.rawnew(self,{
lastSeen = os.time(),
@@ -202,6 +216,8 @@
currentSong = {}
})
+ players[obj.id] = obj
+
-- notify of new player
jnt:notify('playerNew', obj)
@@ -211,13 +227,30 @@
--[[
-=head2 jive.slim.Player:updateFromSS(playerInfo)
+=head2 jive.slim.Player:update(playerInfo)
Updates the player with fresh data from SS.
=cut
--]]
-function updateFromSS(self, playerInfo)
+function update(self, slimServer, playerInfo)
+ -- ignore updates from a different server if the player
+ -- is not connected to it
+ if self.slimServer ~= slimServer
+ and playerInfo.connected ~= 1 then
+ return
+ end
+
+ if self.slimServer ~= slimServer then
+ -- delete from old server
+ if self.slimServer then
+ self.jnt:notify('playerDelete', self)
+ end
+
+ -- add to new server
+ self.slimServer = slimServer
+ self.jnt:notify('playerNew', self)
+ end
self.model = playerInfo.model
self.needsUpgrade = (tonumber(playerInfo.player_needs_upgrade) == 1)
@@ -230,7 +263,6 @@
if self.pin and not playerInfo.pin then
self.pin = nil
end
-
end
--[[
@@ -298,9 +330,10 @@
--]]
function free(self)
self.jnt:notify('playerDelete', self)
-
self:offStage()
- -- caller has to notify we're gone
+
+ -- FIXME we can't free players, maybe used by other servers
+ -- players[self.id] = nil
end
Modified: trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua
URL:
http://svn.slimdevices.com/trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua?rev=1495&root=Jive&r1=1494&r2=1495&view=diff
==============================================================================
--- trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua (original)
+++ trunk/jive/src/pkg/jive/share/jive/slim/SlimServer.lua Thu Jan 17 15:49:04
2008
@@ -142,13 +142,13 @@
-- create new players
if not self.players[player_info.playerid] then
- player = Player(self, self.jnt, player_info)
+ player = Player(self.jnt, self, player_info)
self.players[player_info.playerid] = player
else
-- update existing players
-
self.players[player_info.playerid]:updateFromSS(player_info)
+ self.players[player_info.playerid]:update(self,
player_info)
end
end
else
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins