From fdc224fb0597bf34b4e0bf4ec169c0b87b5312cc Mon Sep 17 00:00:00 2001 From: Simon Schampijer Date: Tue, 10 Jul 2007 20:39:04 +0000 Subject: - Adopt to API changes in sugar - use csound instance instead of server --- diff --git a/controller.py b/controller.py index 0ae704f..495aeec 100644 --- a/controller.py +++ b/controller.py @@ -9,15 +9,16 @@ from dbus.service import method, signal from dbus.gobject_service import ExportedGObject from model import Model +from csound.csoundserver import CsoundServer -# XXX: I'm not convinced this is in the right namespace SERVICE = "org.freedesktop.Telepathy.Tube.Memosono" IFACE = SERVICE PATH = "/org/freedesktop/Telepathy/Tube/Memosono" - GAME_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit') +IMAGES_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/images') +SOUNDS_PATH = os.path.join(os.path.dirname(__file__),'games/drumgit/sounds') MAX_NUM_PLAYERS = 2 _logger = logging.getLogger('controller') @@ -43,6 +44,10 @@ class Controller(ExportedGObject): self.numplayers = 0 self.turn = 0 + self.cs = CsoundServer() + gtk.gdk.threads_init() + self.cs.start() + if self.is_initiator: self.init_game() @@ -93,6 +98,8 @@ class Controller(ExportedGObject): path=PATH, sender_keyword='sender') self.tube.add_signal_receiver(self.flip_cb, 'Flip', IFACE, path=PATH, sender_keyword='sender') + self.tube.add_signal_receiver(self.play_cb, 'Play', IFACE, + path=PATH, sender_keyword='sender') self.tube.add_signal_receiver(self.points_cb, 'Points', IFACE, path=PATH, sender_keyword='sender') @@ -120,11 +127,26 @@ class Controller(ExportedGObject): def selected_cb(self, tilenum, sender=None): _logger.debug('MA: %s flipped tile %d', sender, tilenum) - obj, color = self.model.gettile(tilenum) if self.model.grid[tilenum][2] == 1: self.Info('selected already') else: - self.Flip(tilenum, obj, color) + pairkey, moch, state = self.model.grid[tilenum] + color = self.model.pairs[pairkey].props.color + + if moch == 0: + if self.model.pairs[pairkey].props.aimg != None: + img = os.path.join(IMAGES_PATH, self.model.pairs[pairkey].props.aimg) + self.Flip(tilenum, img, color) + if self.model.pairs[pairkey].props.asnd != None: + snd = os.path.join(SOUNDS_PATH, self.model.pairs[pairkey].props.asnd) + self.Play(tilenum, snd, color) + elif moch == 1: + if self.model.pairs[pairkey].props.bimg != None: + img = os.path.join(IMAGES_PATH, self.model.pairs[pairkey].props.bimg) + self.Flip(tilenum, img, color) + if self.model.pairs[pairkey].props.bsnd != None: + snd = os.path.join(SOUNDS_PATH, self.model.pairs[pairkey].props.bsnd) + self.Play(tilenum, snd, color) self.model.count+=1 if self.model.count == 1: @@ -171,10 +193,21 @@ class Controller(ExportedGObject): def flip_cb(self, tilenum, obj, color, sender=None): handle = self.tube.bus_name_to_handle[sender] - _logger.debug('Flipped tile(%d) from %s', tilenum, sender) + _logger.debug('Flipped tile(%d) from %s. Show image.', tilenum, sender) self.pv.flip(tilenum, os.path.join(os.path.dirname(__file__), obj), color) + @signal(dbus_interface=IFACE, signature='nsn') + def Play(self, tilenum, obj, color): + """Signal that a sound will be played""" + + def play_cb(self, tilenum, obj, color, sender=None): + handle = self.tube.bus_name_to_handle[sender] + _logger.debug('Flipped tile(%d) from %s. Play sound.', tilenum, sender) + _logger.debug(' Sound: %s', obj) + self.cs.perform('i 108 0.0 3.0 "%s" 1 0.7 0.5 0'%(obj)) + + @signal(dbus_interface=IFACE, signature='ss') def Turn(self, playerid, name): """Signal that it is the players turn""" diff --git a/csound/csoundserver.py b/csound/csoundserver.py index c384300..45eca28 100644 --- a/csound/csoundserver.py +++ b/csound/csoundserver.py @@ -1,106 +1,43 @@ #! /usr/bin/env python -import select import os import logging from threading import Thread import csnd -from osc.oscapi import OscApi + +_logger = logging.getLogger('csound') class CsoundServer(Thread): - CSOUND_PORT = 6783 - MAX_PINGS = 3 - TIMEOUT_PING = 10 def __init__(self): Thread.__init__(self) - self.oscapi = OscApi(self.CSOUND_PORT) - self.oscapi.addmethod('/CSOUND/connect', '', self._connect) - self.oscapi.addmethod('/CSOUND/pong', '', self._pong) - self.oscapi.addmethod('/CSOUND/perform', 's', self._perform) - self.oscapi.addmethod('/CSOUND/disconnect', '', self._disconnect) - self.oscapi.addmethod('/CSOUND/quit', '', self._quit) - self.running = 1 - - self.clients = {} - self.start() - - def run(self): - logging.info('start listening...') self.csound = csnd.Csound() - - while self.running: - inputready,outputready,exceptready = select.select([self.oscapi.iosock],[], [], self.TIMEOUT_PING) - for s in inputready: - if s == self.oscapi.iosock: - data, address = s.recvfrom(1024) - self.oscapi.handlemsg(data, address) - if len(inputready) == 0: - self.ping() - - def ping(self): - rm = [] - for client in self.clients: - if self.clients[client] == self.MAX_PINGS: - rm.append(client) - logging.debug('[ping] remove client %s'%str(client)) - else: - self.oscapi.send(client, '/CSOUND/ping', []) - self.clients[client]+=1 - ### print ' [ping] client=%s seq=%s'%(str(client), self.clients[client]) - - for elem in rm: - del self.clients[elem] - if len(self.clients) == 0: - self.perf.Stop() - self.perf.Join() - self.csound.Reset() - logging.debug('[csound] stop csound performance') - - - def _connect(self, *msg): - if msg[1] in self.clients: - logging.debug('[connect_cb] %s already connected'%str(msg[1])) - else: - self.clients[msg[1]]=0 - logging.debug('[connect_cb] %s connected'%str(msg[1])) - if len(self.clients) == 1: - self.perf = csnd.CsoundPerformanceThread(self.csound) - uniorcpath = os.path.join( os.path.dirname(__file__), 'univorc.csd') - if not os.path.exists(uniorcpath): - logging.error('[csound] univorc not found %s'%uniorcpath) - self.csound.Compile(uniorcpath) - self.perf.Play() - logging.debug('[csound] start csound performance %s'%uniorcpath) - - def _disconnect(self, *msg): - if msg[1] not in self.clients: - logging.debug('[disconnect_cb] %s not connected'%str(msg[1])) - else: - del self.clients[msg[1]] - logging.debug('[disconnect_cb] %s disconnected'%str(msg[1])) - if len(self.clients) == 0: - self.perf.Stop() - self.perf.Join() - self.csound.Reset() - logging.debug('[csound] stop csound performance') - - - def _quit(self, *msg): - logging.info('stop listening...') - self.running = 0 + def start(self): + self.perf = csnd.CsoundPerformanceThread(self.csound) + uniorcpath = os.path.join( os.path.dirname(__file__), 'univorc.csd') + if not os.path.exists(uniorcpath): + _logger.error('univorc not found %s'%uniorcpath) + else: + self.csound.Compile(uniorcpath) + self.perf.Play() + _logger.debug('start csound performance %s'%uniorcpath) + + def pause(self): + self.perf.Stop() + self.perf.Join() self.csound.Reset() - self.csound = None - - - def _pong(self, *msg): - self.clients[msg[1]]-=1 - ### print ' [pong_cb] %s'%str(msg) + _logger.debug('stop performance') + def perform(self, msg): + _logger.debug(' [perform_cb] %s'%str(msg)) + self.perf.InputMessage(msg) - def _perform(self, *msg): - logging.debug(' [perform_cb] %s'%str(msg[0][2])) - self.perf.InputMessage(msg[0][2]) + def quit(self): + _logger.info('quit') + self.perf.Stop() + self.perf.Join() + self.csound.Reset() + self.csound = None diff --git a/games/drumgit/drumgit.mson b/games/drumgit/drumgit.mson index f508fa1..0c3aaae 100644 --- a/games/drumgit/drumgit.mson +++ b/games/drumgit/drumgit.mson @@ -1,11 +1,17 @@ - - - + + + + +