X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/4bde4b5eea6ad1352078228c0d146f41b4c893e4..1c43f4df29de9e15f629a7f0beaa355875305916:/widgets/alsa.lua?ds=sidebyside

diff --git a/widgets/alsa.lua b/widgets/alsa.lua
index 3e025bb..7500097 100644
--- a/widgets/alsa.lua
+++ b/widgets/alsa.lua
@@ -1,63 +1,57 @@
 
 --[[
-                                                      
-     Licensed under GNU General Public License v2     
-      * (c) 2013, Luke Bonham                         
-      * (c) 2010, Adrian C. <anrxc@sysphere.org>      
-                                                      
+                                                  
+     Licensed under GNU General Public License v2 
+      * (c) 2013, Luke Bonham                     
+      * (c) 2010, Adrian C. <anrxc@sysphere.org>  
+                                                  
 --]]
 
-local newtimer        = require("lain.helpers").newtimer
+local newtimer     = require("lain.helpers").newtimer
+local read_pipe    = require("lain.helpers").read_pipe
 
-local wibox           = require("wibox")
+local wibox        = require("wibox")
 
-local io              = { popen  = io.popen }
-local string          = { match  = string.match }
+local string       = { match  = string.match,
+                       format = string.format }
 
-local setmetatable    = setmetatable
+local setmetatable = setmetatable
 
 -- ALSA volume
 -- lain.widgets.alsa
-local alsa = {}
+local alsa = { last_level = "0", last_status = "" }
 
 local function worker(args)
     local args     = args or {}
     local timeout  = args.timeout or 5
-    local channel  = args.channel or "Master"
     local settings = args.settings or function() end
 
-    alsa.widget = wibox.widget.textbox('')
+    alsa.cmd           = args.cmd or "amixer"
+    alsa.channel       = args.channel or "Master"
+    alsa.togglechannel = args.togglechannel
+    alsa.widget        = wibox.widget.textbox('')
 
     function alsa.update()
-        local f = assert(io.popen('amixer get ' .. channel))
-        local mixer = f:read("*all")
-        f:close()
+        mixer = read_pipe(string.format("%s get %s", alsa.cmd, alsa.channel))
+        l,s   = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
 
-        volume_now = {}
-
-        volume_now.level, volume_now.status = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
-
-        if volume_now.level == nil
-        then
-            volume_now.level  = "0"
-            volume_now.status = "off"
+        -- HDMIs can have a channel different from Master for toggling mute
+        if alsa.togglechannel then
+            s = string.match(read_pipe(string.format("%s get %s", alsa.cmd, alsa.togglechannel)), "%[(%a+)%]")
         end
 
-        if volume_now.status == ""
-        then
-            if volume_now.level == "0"
-            then
-                volume_now.status = "off"
-            else
-                volume_now.status = "on"
-            end
-        end
+        if alsa.last_level ~= l or alsa.last_status ~= s then
+            volume_now = { level = l, status = s }
+            alsa.last_level  = l
+            alsa.last_status = s
 
-        widget = alsa.widget
-        settings()
+            widget = alsa.widget
+            settings()
+        end
     end
 
-    newtimer("alsa", timeout, alsa.update)
+    timer_id = string.format("alsa-%s-%s", alsa.cmd, alsa.channel)
+    newtimer(timer_id, timeout, alsa.update)
 
     return setmetatable(alsa, { __index = alsa.widget })
 end