Author: adrian
Date: Wed Apr 16 12:32:39 2008
New Revision: 2247

URL: http://svn.slimdevices.com?rev=2247&root=Jive&view=rev
Log:
Bug: N/A
Description: customisable sound effects via download from SC

Modified:
    7.1/trunk/squeezeplay/src/squeezeplay/Makefile.am
    
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsApplet.lua
    
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsMeta.lua
    
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/strings.txt

Modified: 7.1/trunk/squeezeplay/src/squeezeplay/Makefile.am
URL: 
http://svn.slimdevices.com/7.1/trunk/squeezeplay/src/squeezeplay/Makefile.am?rev=2247&root=Jive&r1=2246&r2=2247&view=diff
==============================================================================
--- 7.1/trunk/squeezeplay/src/squeezeplay/Makefile.am (original)
+++ 7.1/trunk/squeezeplay/src/squeezeplay/Makefile.am Wed Apr 16 12:32:39 2008
@@ -101,8 +101,7 @@
        share/jive/AppletMeta.lua \
        share/jive/Iconbar.lua \
        share/jive/global_strings.txt \
-       share/jive/splash.png \
-       share/jive/splash.wav
+       share/jive/splash.png
 
 jiveuidir = $(pkgdatadir)/jive/ui
 dist_jiveui_DATA = \
@@ -520,6 +519,7 @@
        share/applets/DefaultSkin/sounds/pushleft.wav \
        share/applets/DefaultSkin/sounds/pushright.wav \
        share/applets/DefaultSkin/sounds/select.wav \
+       share/applets/DefaultSkin/sounds/splash.wav \
        share/applets/DefaultSkin/sounds/shutdown.wav \
        share/applets/DefaultSkin/sounds/docking.wav
 

Modified: 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsApplet.lua
URL: 
http://svn.slimdevices.com/7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsApplet.lua?rev=2247&root=Jive&r1=2246&r2=2247&view=diff
==============================================================================
--- 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsApplet.lua
 (original)
+++ 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsApplet.lua
 Wed Apr 16 12:32:39 2008
@@ -23,10 +23,16 @@
 local table           = require("table")
 
 local oo              = require("loop.simple")
-
+local os              = require("os")
+local io              = require("io")
+local lfs             = require("lfs")
+
+local AppletManager   = require("jive.AppletManager")
 local Applet          = require("jive.Applet")
 local Audio           = require("jive.ui.Audio")
 local Checkbox        = require("jive.ui.Checkbox")
+local RadioButton     = require("jive.ui.RadioButton")
+local RadioGroup      = require("jive.ui.RadioGroup")
 local Framework       = require("jive.ui.Framework")
 local SimpleMenu      = require("jive.ui.SimpleMenu")
 local Window          = require("jive.ui.Window")
@@ -36,7 +42,12 @@
 local Textarea        = require("jive.ui.Textarea")
 local jul             = require("jive.utils.log")
 
+local RequestHttp     = require("jive.net.RequestHttp")
+local SocketHttp      = require("jive.net.SocketHttp")
+
 local log             = jul.logger("applets.setup")
+
+local jnt             = jnt
 
 local EVENT_WINDOW_POP       = jive.ui.EVENT_WINDOW_POP
 local EVENT_KEY_PRESS        = jive.ui.EVENT_KEY_PRESS
@@ -51,7 +62,24 @@
 oo.class(_M, Applet)
 
 
-local effects = {
+local PATH = "applets/DefaultSkin/sounds/"
+
+local REFRESH_TIME = 300
+
+local sounds = {
+       BUMP       = { default = "bump.wav",      chan = 1 },
+       CLICK      = { default = "click.wav",     chan = 0 },
+       JUMP       = { default = "jump.wav",      chan = 0 },
+       WINDOWSHOW = { default = "pushleft.wav",  chan = 1 },
+       WINDOWHIDE = { default = "pushright.wav", chan = 1 },
+       SELECT     = { default = "select.wav",    chan = 0 },
+       PLAYBACK   = { default = "select.wav",    chan = 0 },
+       DOCKING    = { default = "docking.wav",   chan = 1 },
+       STARTUP    = { default = "splash.wav",    chan = 1 },
+       SHUTDOWN   = { default = "shutdown.wav",  chan = 1 }
+}
+
+local groups = {
        SOUND_NAVIGATION = {
                "WINDOWSHOW",
                "WINDOWHIDE",
@@ -113,7 +141,7 @@
 
        -- add sounds
        local effectsEnabled = false
-       for k,v in pairs(effects) do
+       for k,v in pairs(groups) do
                local soundEnabled = Framework:isSoundEnabled(v[1])
                effectsEnabled = effectsEnabled or soundEnabled
 
@@ -140,7 +168,6 @@
                                end
                        end,
                        soundEnabled
-                       
                )
 
                allButtons[button] = v
@@ -175,6 +202,27 @@
        )
 
        window:addWidget(menu)
+
+       self.menu = menu
+       self.server = self:_getCurrentServer()
+
+       -- look for any server based sounds
+       if self.server then
+               log:info("found server - requesting sounds list")
+               self.server.comet:request(
+                       function(chunk, err)
+                               if err then
+                                       log:debug(err)
+                               elseif chunk then
+                                       self:_serverSink(chunk.data)
+                               end
+                       end,
+                       false,
+                       { "jivesounds" }
+               )
+       elseif self:getSettings()["_CUSTOM"] then
+               self:_customMenu({})
+       end
 
        self:tieAndShowWindow(window)
        return window
@@ -230,6 +278,194 @@
 end
 
 
+function _getCurrentServer(self)
+       local manager = AppletManager:getAppletInstance("SlimDiscovery")
+       local server
+       if manager and manager:getCurrentPlayer() then
+               server = manager:getCurrentPlayer():getSlimServer()
+               if server:isSqueezeNetwork() then
+                       server = nil
+               end
+       end
+       return server
+end
+
+
+function _serverSink(self, data)
+       local custom = {}
+       if data.item_loop then
+               for _,entry in pairs(data.item_loop) do
+                       log:info("server sounds: ", entry.name)
+                       custom[entry.name] = entry
+               end
+               self:_customMenu(custom)
+       elseif self:getSettings()["_CUSTOM"] then
+               self:_customMenu({})
+       end
+end
+
+
+function _customMenu(self, custom)
+       self.menu:addItem({
+               text = self:string("SOUND_CUSTOMIZE"),
+               weight = 100,
+               callback = function(event, item)
+                                          local window = Window("window", 
item.text)
+                                          local menu = SimpleMenu("menu")
+                                          
menu:setComparator(menu.itemComparatorAlpha)
+                                          window:addWidget(Textarea("help", 
self:string("SOUND_CUSTOM_HELP")))
+                                          window:addWidget(menu)
+                                          for k,v in pairs(sounds) do
+                                                  menu:addItem({
+                                                                               
        text = self:string("SOUND_" .. k),
+                                                                               
        callback = function() self:_customSoundMenu(k, custom) end
+                                                                               
})
+                                          end
+                                          window:show()
+                                  end
+       })
+end
+
+
+function _customSoundMenu(self, sound, custom)
+       local window = Window("window", self:string("SOUND_" .. sound))
+       local menu = SimpleMenu("menu")
+       local group = RadioGroup()
+       menu:setComparator(menu.itemComparatorWeightAlpha)
+       window:addWidget(Textarea("help", 
self:string("SOUND_CUSTOMSOUND_HELP")))
+       window:addWidget(menu)
+
+       local settings = self:getSettings()
+
+       menu:addItem({
+               weight = 1,
+               text = self:string("SOUND_DEFAULT"),
+               icon = RadioButton("radio",
+                                                  group,
+                                                  function()
+                                                          log:info("setting 
default as active sound for ", sound)
+                                                          
self:_setCustom(sound, nil)
+                                                          
Framework:playSound(sound)
+                                                  end,
+                                                  settings["_CUSTOM"] == nil 
or settings["_CUSTOM"][sound] == nil
+               )
+       })
+
+       for _,v in pairs(custom) do
+               menu:addItem({
+                       weight = 10,
+                       text = v.name,
+                       icon = RadioButton("radio",
+                                                          group,
+                                                          function()
+                                                                  local path = 
Framework:findFile(PATH) .. v.file
+                                                                  local attr = 
lfs.attributes(path)
+                                                                  if attr then
+                                                                          
log:info("setting ", v.file, " as active sound for ", sound)
+                                                                          
self:_setCustom(sound, v.file)
+                                                                          
Framework:playSound(sound)
+                                                                  end
+                                                          end,
+                                                          settings["_CUSTOM"] 
~= nil and settings["_CUSTOM"][sound] == v.file
+                                                  ),
+                       focusGained = function()
+                                                         local path = 
Framework:findFile(PATH) .. v.file
+                                                         local attr = 
lfs.attributes(path)
+                                                         if attr and os.time() 
- attr.modification < REFRESH_TIME then
+                                                                 
log:info("using local copy of: ", v.file)
+                                                         else
+                                                                 
log:info("fetching: ", v.file)
+                                                                 
self:_fetchFile(v.url, path, function() end)
+                                                         end
+                                                 end
+               })
+       end
+
+       window:show()
+end
+
+
+function _setCustom(self, sound, file)
+       local settings = self:getSettings()
+
+       if settings["_CUSTOM"] == nil then
+               settings["_CUSTOM"] = {}
+       end
+       settings["_CUSTOM"][sound] = file
+
+       local cust = 0
+       for k,_ in pairs(settings["_CUSTOM"]) do
+               cust = cust + 1
+       end
+       if cust == 0 then
+               settings["_CUSTOM"] = nil
+       end
+       
+       self:_loadSounds(sound)
+end
+
+
+function _fetchFile(self, url, path, callback)
+       self.last = path
+
+       if self.fetch == nil then
+               self.fetch = {}
+       end
+       if self.fetch[path] then
+               log:warn("already fetching ", path, " not fetching again")
+               return
+       end
+       self.fetch[path] = 1
+
+       local req = RequestHttp(
+               function(chunk, err)
+                       self.fetch[path] = nil
+                       if err then
+                               log:error("error fetching background from 
server: ", path, " ", url)
+                       end
+                       if chunk then
+                               log:info("fetched background from server: ", 
path, " ", url)
+                               local fh = io.open(path, "wb")
+                               if fh then
+                                       fh:write(chunk)
+                                       fh:close()
+                                       if path == self.last then
+                                               callback()
+                                       end
+                               else
+                                       log:error("unable to open ", path, " 
for writing")
+                               end
+                       end
+               end,
+               'GET',
+               url
+       )
+
+       local uri  = req:getURI()
+       local http = SocketHttp(jnt, uri.host, uri.port, uri.host)
+
+       http:fetch(req)
+end
+
+
+function _loadSounds(self, sound)
+       local settings = self:getSettings()
+
+       for k,v in pairs(sounds) do
+               if sound == nil or sound == k then
+                       local file = settings["_CUSTOM"] and 
settings["_CUSTOM"][k] or sounds[k]["default"]
+                       Framework:loadSound(k, PATH .. file, sounds[k]["chan"])
+
+                       local enabled = settings[k]
+                       if enabled == nil then
+                               enabled = true
+                       end
+                       Framework:enableSound(k, enabled)
+               end
+       end
+end
+
+
 --[[
 
 =head1 LICENSE

Modified: 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsMeta.lua
URL: 
http://svn.slimdevices.com/7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsMeta.lua?rev=2247&root=Jive&r1=2246&r2=2247&view=diff
==============================================================================
--- 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsMeta.lua
 (original)
+++ 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/SetupSoundEffectsMeta.lua
 Wed Apr 16 12:32:39 2008
@@ -42,33 +42,22 @@
 end
 
 function registerApplet(meta)
-       
+
+       -- set volume
        local settings = meta:getSettings()
-       for k,v in pairs(settings) do
-               if k == "_VOLUME" then
-                       Audio:setEffectVolume(v)
-               else
-                       Framework:enableSound(k, v)
-               end
-       end
+       Audio:setEffectVolume(settings["_VOLUME"])
 
-       local sndpath = "applets/DefaultSkin/sounds/"
+       -- load sounds
+       local obj = appletManager:loadApplet("SetupSoundEffects")
 
        -- The startup sound needs to be played with the minimum
        -- delay, load and play it first
-       Framework:loadSound("STARTUP", "jive/splash.wav", 1)
+       obj:_loadSounds("STARTUP")
        Framework:playSound("STARTUP")
-
-       -- Load sounds
-       Framework:loadSound("BUMP", sndpath .. "bump.wav", 1)
-       Framework:loadSound("CLICK", sndpath .. "click.wav", 0)
-       Framework:loadSound("JUMP", sndpath .. "jump.wav", 0)
-       Framework:loadSound("WINDOWSHOW", sndpath .. "pushleft.wav", 1)
-       Framework:loadSound("WINDOWHIDE", sndpath .. "pushright.wav", 1)
-       Framework:loadSound("SELECT", sndpath .. "select.wav", 0)
-       Framework:loadSound("PLAYBACK", sndpath .. "select.wav", 0)
-       Framework:loadSound("DOCKING", sndpath .. "docking.wav", 1)
-       Framework:loadSound("SHUTDOWN", sndpath .. "shutdown.wav", 1)
+       
+       -- Load all other sounds
+       obj:_loadSounds(nil) -- nil is default from settings
+       appletManager:freeApplet("SetupSoundEffects")
 
        -- add a menu to load us
        jiveMain:addItem(meta:menuItem('appletSetupSoundEffects', 
'advancedSettings', "SOUND_EFFECTS", function(applet, ...) 
applet:settingsShow(...) end))

Modified: 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/strings.txt
URL: 
http://svn.slimdevices.com/7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/strings.txt?rev=2247&root=Jive&r1=2246&r2=2247&view=diff
==============================================================================
--- 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/strings.txt
 (original)
+++ 
7.1/trunk/squeezeplay/src/squeezeplay/share/applets/SetupSoundEffects/strings.txt
 Wed Apr 16 12:32:39 2008
@@ -83,3 +83,44 @@
        IT      Usare la rotellina per regolare il volume degli effetti sonori.
        NL      Gebruik het wiel om het volume van de geluidseffecten aan te 
passen.
 
+SOUND_CUSTOMIZE
+       EN      Customize Sounds
+
+SOUND_DEFAULT
+       EN      Default
+
+SOUND_BUMP
+       EN      Menu Bump
+
+SOUND_CLICK
+       EN      Click
+
+SOUND_JUMP
+       EN      Jump
+
+SOUND_WINDOWSHOW
+       EN      Show New Window
+
+SOUND_WINDOWHIDE
+       EN      Hide Window
+
+SOUND_SELECT
+       EN      Menu Select Item
+
+SOUND_PLAYBACK
+       EN      Playback
+
+SOUND_DOCKING
+       EN      Docking
+
+SOUND_STARTUP
+       EN      Startup
+
+SOUND_SHUTDOWN
+       EN      Shutdown
+
+SOUND_CUSTOM_HELP
+       EN      Select the action that you would like to customize.
+
+SOUND_CUSTOMSOUND_HELP
+       EN      Select the sound you would like to use for this action.

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

Reply via email to