From 257e63fde492f46f3826dccb06259d7d721a0664 Mon Sep 17 00:00:00 2001 From: Victor Lazzarini Date: Fri, 21 Mar 2008 20:24:51 +0000 Subject: added playfile.activity added focus in/out capabilities to release soundcard --- (limited to 'csndsugui.py') diff --git a/csndsugui.py b/csndsugui.py index eb84ec0..8281b19 100755 --- a/csndsugui.py +++ b/csndsugui.py @@ -37,7 +37,8 @@ import csnd import math import locale import os - +import sugar.logger +import time class BasicGUI: """Basic GUI with boxes, sliders, spins, buttons etc @@ -62,7 +63,7 @@ class BasicGUI: def get_slider_value(self,name): """returns the slider value - name: slider name (which should also be the attached bus channel name""" + name: slider name (which should also be the attached bus channel name""" for i in self.sliders: if i[1] == name: return i[2] @@ -92,6 +93,24 @@ class BasicGUI: if i[1] == name: return i[0] return 0 + + def set_focus(self): + """ called whenever the focus changes """ + print self.focus + + def focus_out(self, widget, event): + if(self.focus): + self.focus = False + self.set_focus() + + def focus_in(self, widget, event): + if(not self.focus): + self.focus = True + self.set_focus() + + def focus_back(self, widget, event): + self.window.disconnect(self.fback) + self.connect_focus() def buttcallback(self, widget, data=None): for i in self.buttons: @@ -107,7 +126,7 @@ class BasicGUI: self.set_channel(i[1], i[2]) def mbuttcallback(self, widget, data=None): - for i in self.buttons: + for i in self.mbuttons: if i[0] == widget: self.set_message(i[2]) @@ -133,19 +152,29 @@ class BasicGUI: def filecallback(self,widget): name = self.curfile[0].get_filename() - self.set_filechannel(self.curfile[1], name) - self.filenames.update({self.curfile[1] : name}) + self.set_filechannel(self.curfile[2], name) + for i in self.buttons: + if i[0] == self.curfile[1]: + i[2] = name + self.filenames.update({self.curfile[2] : name}) self.curfile[0].destroy() + + def destroy_chooser(self,widget): + self.curfile[0].destroy() + + # internal callback def fbuttcallback(self, widget, data=None): + self.focus_disconnect() + self.fback = self.window.connect('focus_in_event', self.focus_back) for i in self.buttons: if i[0] == widget: chooser = gtk.FileSelection(i[1]) - self.curfile = (chooser, i[1]) + self.curfile = (chooser, i[0], i[1]) chooser.set_filename(self.data_path) chooser.ok_button.connect("clicked", self.filecallback) - chooser.cancel_button.connect("clicked", lambda h: chooser.destroy()) + chooser.cancel_button.connect("clicked", self.destroy_chooser) chooser.show() @@ -204,7 +233,7 @@ class BasicGUI: butt.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x0FFF,0,0x00FF, 1)) butt.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0xFFFF,0xFFFF,0x0000, 2)) box.pack_start(butt, False, False, 5) - self.buttons.append([butt,title,mess]) + self.mbuttons.append([butt,title,mess]) butt.connect("clicked", self.mbuttcallback) butt.show() return butt @@ -238,7 +267,7 @@ class BasicGUI: else: name = label butt = gtk.Button(name) box.pack_start(butt, False, False, 5) - self.buttons.append([butt,title]) + self.buttons.append([butt,title,"0"]) butt.connect("clicked", self.fbuttcallback) self.set_filechannel(title,"0") self.filenames.update({title:"0"}) @@ -435,6 +464,32 @@ class BasicGUI: """Returns the Activity toolbox""" return self.toolbox + def channels_reinit(self): + """ resets channel to current widget values""" + for i in self.channel_widgets: + for j in i: + if(j[1] != "pause"): + if(j[1] != "play"): + if(j[1] != "reset"): + self.set_channel(j[1],j[2]) + self.logger.debug(j[1]) + + def nofocus(self): + pass + + def focus_connect(self): + if not self.connected: + self.focus = True + self.in_id = self.window.connect('focus_in_event', self.focus_in) + self.out_id = self.window.connect('focus_out_event', self.focus_out) + self.connected = True + + def focus_disconnect(self): + if self.connected: + self.window.disconnect(self.in_id) + self.window.disconnect(self.out_id) + self.connected = False + def __init__(self,act,colour=(-1,-1,-1),vert=True,toolbox=None): """Constructor act: activity object @@ -453,6 +508,8 @@ class BasicGUI: self.mbuttons = [] self.mbutts = 0 self.boxes = [] + self.connected = False + self.channel_widgets = [self.sliders, self.spins, self.buttons] self.filenames = dict() self.window = act if toolbox == None: @@ -470,6 +527,8 @@ class BasicGUI: self.window.set_canvas(self.outbox) self.data_path = os.path.join(act.get_activity_root(),"data/") self.outbox.show() + self.logger = sugar.logger.logging.getLogger('csndsugui') + class CsoundGUI(BasicGUI): @@ -495,13 +554,26 @@ class CsoundGUI(BasicGUI): def set_filechannel(self,chan,name): """overrides the base method, setting the channel string""" if not self.ready: - self.csound.SetChannel(chan,name) + self.csound.SetChannel(chan,name) else: - BasicGUI.set_filechannel(self,chan,name) + BasicGUI.set_filechannel(self,chan,name) def set_message(self, mess): """overrides the base method, sends a score message""" - self.perf.InputMessage(mess) + self.perf.InputMessage(mess) + + def set_focus(self): + """overrides the base class method, resetting/recompiling Csound""" + if self.focus: + self.compile() + self.channels_reinit() + if self.replay and not self.on: + self.play() + self.logger.debug("focus_off and playing") + else: + self.replay = self.on + self.logger.debug("focus_out and stopping") + self.reset() def play(self): """Starts a performance. """ @@ -524,19 +596,16 @@ class CsoundGUI(BasicGUI): self.paused = False self.perf.Play() - def csd(self, name, extra=None): + def csd(self, name): """Sets the source CSD and compiles it. name: CSD filename - extra: a single extra parameter returns zero if successful""" - self.extra = extra path = activity.get_bundle_path() if self.ready: - if self.extra != None: - res = self.csound.Compile("%s/%s" % (path,name), extra) - else: res = self.csound.Compile("%s/%s" % (path,name)) - if not res: self.ready = False + if not res: + self.ready = False + self.focus_connect() self.path = path self.name = name return res @@ -552,38 +621,44 @@ class CsoundGUI(BasicGUI): self.perf = csnd.CsoundPerformanceThread(self.csound) if self.arglist != None: res = self.csound.Compile(self.arglist.argc(),self.arglist.argv()) - elif self.extra != None: - res = self.csound.Compile("%s/%s" % (self.path,self.name), self.extra) else: res = self.csound.Compile("%s/%s" % (self.path,self.name)) if(res): self.ready = True return res - def compile(self,name,args): + def compile(self,name=None,args=[]): """Compiles Csound code. - name: CSD filename + name: CSD filename if given args: list of arguments (as strings) returns 0 if successful , non-zero if not.""" if self.ready: - self.arglist = csnd.CsoundArgVList() + if args != []: + self.arglist = csnd.CsoundArgVList() self.path = activity.get_bundle_path() - self.name = name - self.arglist.Append("csound") - self.arglist.Append("%s/%s" % (self.path,self.name)) - for i in args: - self.arglist.Append(i) - res = self.csound.Compile(self.arglist.argc(),self.arglist.argv()) - if not res: self.ready = False + if name != None: self.name = name + elif self.name == "0": return -1 + if self.arglist != None: + if name != None: + self.arglist.Append("csound") + self.arglist.Append("%s/%s" % (self.path,self.name)) + for i in args: + self.arglist.Append(i) + res = self.csound.Compile(self.arglist.argc(),self.arglist.argv()) + else: res = self.csound.Compile("%s/%s" % (self.path,self.name)) + if not res: + self.ready = False + self.focus_connect() + else: + self.arglist = None return res - # resets Csound ready for a new CSD def reset(self): """Resets Csound, ready for a new CSD""" if not self.ready: self.perf.Stop() self.perf.Join() self.on = False - self.pause = False + self.paused = False self.perf = csnd.CsoundPerformanceThread(self.csound) self.ready = True @@ -605,3 +680,5 @@ class CsoundGUI(BasicGUI): self.paused = False self.name = "0" self.arglist = None + self.replay = False + -- cgit v0.9.1