summaryrefslogtreecommitdiff
path: root/lain/widgets/alsa.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lain/widgets/alsa.lua')
-rw-r--r--lain/widgets/alsa.lua68
1 files changed, 68 insertions, 0 deletions
diff --git a/lain/widgets/alsa.lua b/lain/widgets/alsa.lua
new file mode 100644
index 0000000..a356892
--- /dev/null
+++ b/lain/widgets/alsa.lua
@@ -0,0 +1,68 @@
+
+--[[
+
+ 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 wibox = require("wibox")
+
+local io = { popen = io.popen }
+local string = { match = string.match,
+ format = string.format }
+
+local setmetatable = setmetatable
+
+-- ALSA volume
+-- lain.widgets.alsa
+local alsa = {}
+
+local function worker(args)
+ local args = args or {}
+ local timeout = args.timeout or 5
+ local settings = args.settings or function() end
+
+ alsa.cmd = args.cmd or "amixer"
+ alsa.channel = args.channel or "Master"
+
+ alsa.widget = wibox.widget.textbox('')
+
+ function alsa.update()
+ local f = assert(io.popen(string.format("%s get %s", alsa.cmd, alsa.channel)))
+ local mixer = f:read("*a")
+ f:close()
+
+ 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"
+ end
+
+ if volume_now.status == ""
+ then
+ if volume_now.level == "0"
+ then
+ volume_now.status = "off"
+ else
+ volume_now.status = "on"
+ end
+ end
+
+ widget = alsa.widget
+ settings()
+ end
+
+ newtimer("alsa", timeout, alsa.update)
+
+ return setmetatable(alsa, { __index = alsa.widget })
+end
+
+return setmetatable(alsa, { __call = function(_, ...) return worker(...) end })