[module/pulseaudio] somewhat experimental immediate update
try to immediately update pulseaudio, if pactl subscribe exists & allows us to monitor update. see #913
This commit is contained in:
parent
b1fd18b9af
commit
ae04cc9897
1 changed files with 46 additions and 0 deletions
|
@ -33,12 +33,17 @@ Requires the following executable:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import os
|
||||||
import logging
|
import logging
|
||||||
import functools
|
import functools
|
||||||
|
import threading
|
||||||
|
import subprocess
|
||||||
|
import select
|
||||||
|
|
||||||
import core.module
|
import core.module
|
||||||
import core.widget
|
import core.widget
|
||||||
import core.input
|
import core.input
|
||||||
|
import core.event
|
||||||
|
|
||||||
import util.cli
|
import util.cli
|
||||||
import util.graph
|
import util.graph
|
||||||
|
@ -103,6 +108,42 @@ class Module(core.module.Module):
|
||||||
for event in events:
|
for event in events:
|
||||||
core.input.register(self, button=event["button"], cmd=event["action"])
|
core.input.register(self, button=event["button"], cmd=event["action"])
|
||||||
|
|
||||||
|
self.__monitor = threading.Thread(target=self.__subscribe, args=())
|
||||||
|
self.__monitor.start()
|
||||||
|
|
||||||
|
def __subscribe(self):
|
||||||
|
self.update2()
|
||||||
|
core.event.trigger("update", [self.id], redraw_only=True)
|
||||||
|
core.event.trigger("draw")
|
||||||
|
try:
|
||||||
|
proc = subprocess.Popen("pactl subscribe",
|
||||||
|
stdout = subprocess.PIPE,
|
||||||
|
stderr = subprocess.PIPE,
|
||||||
|
shell = True
|
||||||
|
)
|
||||||
|
except:
|
||||||
|
return
|
||||||
|
os.set_blocking(proc.stdout.fileno(), False)
|
||||||
|
while threading.main_thread().is_alive():
|
||||||
|
r, w, e = select.select([proc.stdout], [], [], 1)
|
||||||
|
|
||||||
|
if not (r or w or e):
|
||||||
|
continue # timeout
|
||||||
|
|
||||||
|
line = 'test'
|
||||||
|
update = False
|
||||||
|
while line:
|
||||||
|
line = proc.stdout.readline().decode("ascii", errors="ignore")
|
||||||
|
if "client" in line:
|
||||||
|
update = True
|
||||||
|
|
||||||
|
if update:
|
||||||
|
self.update2()
|
||||||
|
core.event.trigger("update", [self.id], redraw_only=True)
|
||||||
|
core.event.trigger("draw")
|
||||||
|
while proc.stdout.readline().decode("ascii", errors="ignore"):
|
||||||
|
pass
|
||||||
|
|
||||||
def set_volume(self, amount):
|
def set_volume(self, amount):
|
||||||
util.cli.execute(
|
util.cli.execute(
|
||||||
"pactl set-{}-{} @DEFAULT_{}@ {}".format(
|
"pactl set-{}-{} @DEFAULT_{}@ {}".format(
|
||||||
|
@ -200,6 +241,11 @@ class Module(core.module.Module):
|
||||||
return output
|
return output
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
|
if self.__monitor.is_alive():
|
||||||
|
return
|
||||||
|
self.update2()
|
||||||
|
|
||||||
|
def update2(self):
|
||||||
try:
|
try:
|
||||||
self._failed = False
|
self._failed = False
|
||||||
channel = "sinks" if self._channel == "sink" else "sources"
|
channel = "sinks" if self._channel == "sink" else "sources"
|
||||||
|
|
Loading…
Reference in a new issue