Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/csndsugui.py
diff options
context:
space:
mode:
authorVictor Lazzarini <Victor.Lazzarini@nuim.ie>2008-03-21 20:24:51 (GMT)
committer Victor Lazzarini <Victor.Lazzarini@nuim.ie>2008-03-21 20:24:51 (GMT)
commit257e63fde492f46f3826dccb06259d7d721a0664 (patch)
tree40cc62df4d08634b41dd0e8095f04c99e1ff6092 /csndsugui.py
parent1d0533df58544d9f644d597529187a8a6293abf2 (diff)
added playfile.activity
added focus in/out capabilities to release soundcard
Diffstat (limited to 'csndsugui.py')
-rwxr-xr-xcsndsugui.py143
1 files changed, 110 insertions, 33 deletions
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
+