diff -r 9d968fbcaa2a -r 0d7dac03c1a0 utils/pianoroll-client.py --- a/utils/pianoroll-client.py Tue Jan 20 12:00:40 2015 +0100 +++ b/utils/pianoroll-client.py Tue Jan 20 18:37:51 2015 +0100 @@ -7,6 +7,7 @@ import argparse import csv +import signal import time import ntplib @@ -19,7 +20,7 @@ """ Example that sends UDP messages. """ - def __init__(self, port, host, address, rows, shift): + def __init__(self, port, host, address, rows, shift, token): self.port = port self.host = host self.client = async.DatagramClientProtocol() @@ -27,6 +28,7 @@ self.rows = rows self.address = address self.shift = shift + self.token = token reactor.callLater(0, self.send_messages) def _send(self, element): @@ -36,19 +38,31 @@ def send_messages(self): t0 = time.time() + #tc = 0 for row in self.rows: + if not self.token.running: + break if self.shift: - row[0] = ntplib.system_to_ntp_time(t0 + float(row[1])/10**3) + row[0] = ntplib.system_to_ntp_time(t0 + float(row[1])/1000.0) row_conv = [ osc.TimeTagArgument(float(row[0]))] + [osc.IntArgument(int(a)) for a in row[1:]] - #time.sleep((row_conv[1].value-tc)/10**3) - time.sleep(0.1) - #tc = row_conv[1].value + #time.sleep((row_conv[1].value-tc)/1000.0) + sleep_time = t0+float(row[1])/1000.0-time.time() + if sleep_time > 0: + time.sleep(sleep_time) + #time.sleep(0.1) + tc = row_conv[1].value self._send(osc.Message(self.address,*row_conv)) print("Goodbye.") reactor.callLater(0.1, reactor.stop) +class Token(object): + def __init__(self): + self.running = True + if __name__ == "__main__": + token = Token() + parser = argparse.ArgumentParser(description='Simulate an (osc) pianoroll client.') parser.add_argument('datafile', metavar='DATAFILE', help='The file containing the pianoroll data (CSV).') parser.add_argument('-e', '--event', dest='event', metavar='EVENT', required=True, help='the event code.') @@ -56,8 +70,16 @@ args = parser.parse_args() + def customHandler(signum, _): + print("Got signal: %s" % signum) + token.running = False + if reactor.running: + reactor.callFromThread(reactor.stop) # to stop twisted code when in the reactor loop + signal.signal(signal.SIGINT, customHandler) + + with open(args.datafile, 'rU') as datafile: reader = csv.reader(datafile, delimiter=' ') - app = UDPSenderApplication(9090, "127.0.0.1", "/pianoroll/%s/" % args.event, list(reader), args.shift) + app = UDPSenderApplication(9090, "127.0.0.1", "/pianoroll/%s/" % args.event, list(reader), args.shift, token) reactor.run()