Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/miniTamTam
diff options
context:
space:
mode:
authoramartin <olpc@xo-02-2E-11.localdomain>2007-06-19 23:39:43 (GMT)
committer amartin <olpc@xo-02-2E-11.localdomain>2007-06-19 23:39:43 (GMT)
commit97b554893c1215a1e35a81b1a13eaf807a3d5220 (patch)
tree13f6a382ca02b5b6251f5d50d66746c269183890 /miniTamTam
parent016b7dfa8db5a70aa5f071b0927f896fad199566 (diff)
network
Diffstat (limited to 'miniTamTam')
-rw-r--r--miniTamTam/miniTamTamMain.py62
1 files changed, 53 insertions, 9 deletions
diff --git a/miniTamTam/miniTamTamMain.py b/miniTamTam/miniTamTamMain.py
index 8a4180d..c14435e 100644
--- a/miniTamTam/miniTamTamMain.py
+++ b/miniTamTam/miniTamTamMain.py
@@ -5,11 +5,14 @@ import gobject
import os
import random
import time
+import xdrlib
+
from types import *
from math import sqrt
from Util.NoteDB import PARAMETER
import Util.Network
+Net = Util.Network # convinience assignment
import Config
@@ -37,9 +40,6 @@ class miniTamTamMain(SubActivity):
def __init__(self, activity, set_mode):
SubActivity.__init__(self, set_mode)
- self.network = Util.Network.Network()
- self.heartbeatStart = time.time()
- self.network.registerHeartbeat( self.nextHeartbeat )
self.set_border_width(Config.MAIN_WINDOW_PADDING)
@@ -92,6 +92,17 @@ class miniTamTamMain(SubActivity):
self.synthLabWindow = None
+ self.heartbeatStart = time.time()
+ self.syncQueryStart = {}
+
+ self.network = Net.Network()
+ self.network.connectMessage( Net.HT_SYNC_REPLY, self.processHT_SYNC_REPLY )
+ self.network.connectMessage( Net.PR_SYNC_QUERY, self.processPR_SYNC_QUERY )
+
+ # data packing classes
+ self.packer = xdrlib.Packer()
+ self.unpacker = xdrlib.Unpacker("")
+
self.updateSync()
self.syncTimeout = gobject.timeout_add( 1000, self.updateSync )
@@ -353,6 +364,9 @@ class miniTamTamMain(SubActivity):
self.csnd.loopSetTempo(self.tempo)
self.sequencer.tempo = widget.get_adjustment().value
self.drumFillin.setTempo(self.tempo)
+
+ if self.network.isHost():
+ self.network.sendUpdateTempo( self.tempo )
img = int(self.scale( self.tempo,
Config.PLAYER_TEMPO_LOWER,Config.PLAYER_TEMPO_UPPER,
@@ -506,6 +520,41 @@ class miniTamTamMain(SubActivity):
else:
return result
+
+ #-----------------------------------------------------------------------
+ # Network
+
+ #-- Senders ------------------------------------------------------------
+
+ def querySync( self ):
+ self.packer.pack_float(random.random())
+ hash = self.packer.get_buffer()
+ self.packer.reset()
+ self.syncQueryStart[hash] = time.time()
+ self.network.send( Net.PR_SYNC_QUERY, hash)
+
+ #-- Handlers -----------------------------------------------------------
+
+ def processHT_SYNC_REPLY( self, sock, message, data ):
+ t = time.time()
+ hash = data[0:4]
+ latency = t - self.syncQueryStart[hash]
+ self.unpacker.reset(data[4:8])
+ nextBeat = self.unpacker.unpack_float()
+ #print "mini:: got sync: next beat in %f, latency %d" % (nextBeat, latency*1000)
+ self.heartbeatStart = t + nextBeat - self.beatDuration - latency/2
+ self.correctSync()
+ self.syncQueryStart.pop(hash)
+
+ def processPR_SYNC_QUERY( self, sock, message, data ):
+ self.packer.pack_float(self.nextHeartbeat())
+ self.network.send( Net.HT_SYNC_REPLY, data + self.packer.get_buffer(), sock )
+ self.packer.reset()
+
+
+ #-----------------------------------------------------------------------
+ # Sync
+
def nextHeartbeat( self ):
delta = time.time() - self.heartbeatStart
return self.beatDuration - (delta % self.beatDuration)
@@ -529,14 +578,9 @@ class miniTamTamMain(SubActivity):
elif self.network.isHost():
self.correctSync()
else:
- self.network.querySync( self.handleSync )
+ self.querySync()
return True
- def handleSync( self, latency, nextBeat ):
- #print "mini:: got sync: next beat in %f, latency %d" % (nextBeat, latency*1000)
- self.heartbeatStart = time.time() + nextBeat - self.beatDuration - latency/2
- self.correctSync()
-
def correctSync( self ):
curTick = self.csnd.loopGetTick()
curTicksIn = curTick % Config.TICKS_PER_BEAT