Files @ b26a1e7fcfbe
Branch filter:

Location: light9/light9/curvecalc/output.py

drewp@bigasterisk.com
dmx out: lots of stats and more reconnection attempts after usb errors
Ignore-this: f0cf3420b6598007e68bc6f237fb8ed7
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