import time, logging
from twisted.internet import reactor
from light9 import Submaster, dmxclient
from louie import dispatcher
log = logging.getLogger("output")
class Output(object):
lastsendtime = 0
lastsendlevs = None
def __init__(self, graph, session, music, curveset, currentSubterms):
self.graph, self.session, self.music = graph, session, music
self.currentSubterms = currentSubterms
self.curveset = curveset
self.recent_t = []
self.later = None
self.update()
def update(self):
d = self.music.current_time()
d.addCallback(self.update2)
d.addErrback(self.updateerr)
def updateerr(self, e):
print(e.getTraceback())
dispatcher.send("update status", val=e.getErrorMessage())
if self.later and not self.later.cancelled and not self.later.called:
self.later.cancel()
self.later = reactor.callLater(1, self.update)
def update2(self, t):
# spot alsa soundcard offset is always 0, we get times about a
# second ahead of what's really getting played
#t = t - .7
dispatcher.send("update status",
val="ok: receiving time from music player")
if self.later and not self.later.cancelled and not self.later.called:
self.later.cancel()
self.later = reactor.callLater(.02, self.update)
self.recent_t = self.recent_t[-50:] + [t]
period = (self.recent_t[-1] - self.recent_t[0]) / len(self.recent_t)
dispatcher.send("update period", val=period)
self.send_dmx(t)
def send_dmx(self, t):
dispatcher.send("curves to sliders", t=t)
if not self.currentSubterms:
return
scaledsubs = []
for st in self.currentSubterms:
scl = st.scaled(t)
scaledsubs.append(scl)
out = Submaster.sub_maxes(*scaledsubs)
levs = out.get_levels()
now = time.time()
if now - self.lastsendtime > 5 or levs != self.lastsendlevs:
dispatcher.send("output levels", val=levs)
dmxclient.outputlevels(out.get_dmx_list(),
twisted=1,
clientid='curvecalc')
self.lastsendtime = now
self.lastsendlevs = levs