Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Ortiz <rafael@activitycentral.com>2012-08-07 23:06:25 (GMT)
committer Rafael Ortiz <rafael@activitycentral.com>2012-08-07 23:06:25 (GMT)
commit24d236b3b0719d9b49486463737ad654aa15e6d9 (patch)
tree1793a6c6803921b3be9793205ae3da86a15b7ee3
parenta8c2f7b88a28f1ba5ef4c92b7fbb9cebdf565f80 (diff)
merging flavio's changes to fix gstreamer
-rw-r--r--activity.py46
-rw-r--r--chat.py4
-rw-r--r--chatbox.py10
-rw-r--r--espeak.py134
-rw-r--r--roundbox.py28
5 files changed, 127 insertions, 95 deletions
diff --git a/activity.py b/activity.py
index 33a683e..2ef0cbe 100644
--- a/activity.py
+++ b/activity.py
@@ -35,7 +35,7 @@ from sugar3.graphics.toolbarbox import ToolbarBox
from sugar3.activity.widgets import ActivityToolbarButton
from sugar3.activity.widgets import StopButton
-#from shared_activity import SharedActivity
+from shared_activity import SharedActivity
from sugar3.activity import activity
from combobox import ComboBox
from messenger import Messenger, SERVICE
@@ -79,16 +79,15 @@ class CursorFactory:
return self.cursors[cur_type]
-class SpeakActivity(activity.Activity):
+class SpeakActivity(SharedActivity):
def __init__(self, handle):
- activity.Activity.__init__(self, handle)
self.notebook = Gtk.Notebook()
self.notebook.connect_after('map', self.__map_canvasactivity_cb)
-
- #SharedActivity.__init__(self, self.notebook, SERVICE, handle)
-
+
+ SharedActivity.__init__(self, self.notebook, SERVICE, handle)
+
self._cursor = None
self.set_cursor(Gdk.CursorType.LEFT_PTR)
self.__resume_filename = None
@@ -97,10 +96,10 @@ class SpeakActivity(activity.Activity):
self.__state = _NEW_INSTANCE
self._mode = MODE_TYPE
self.numeyesadj = None
-
+
# make an audio device for playing back and rendering audio
self.connect("notify::active", self._activeCb)
-
+
# make a box to type into - combo for user to type
self.entrycombo = Gtk.ComboBoxText.new_with_entry()
self.entrycombo.connect("changed", self._combo_changed_cb)
@@ -130,8 +129,8 @@ class SpeakActivity(activity.Activity):
# desktop
self.notebook.show()
- self.notebook.props.show_border = False
- self.notebook.props.show_tabs = False
+ self.notebook.set_show_border(False)
+ self.notebook.set_show_tabs(False)
box.show_all()
self.notebook.append_page(box, Gtk.Label(""))
@@ -210,8 +209,7 @@ class SpeakActivity(activity.Activity):
toolbox.toolbar.insert(separator, -1)
toolbox.toolbar.insert(StopButton(self), -1)
-
- self.set_canvas(self.notebook)
+
toolbox.show_all()
self.toolbar_box = toolbox
@@ -305,7 +303,7 @@ class SpeakActivity(activity.Activity):
self.eye_shape_combo.select(status.eyes[0])
self.numeyesadj.set_value(len(status.eyes))
- self.entry.props.text = cfg['text'].encode('utf-8', 'ignore')
+ self.entry.set_text(cfg['text'].encode('utf-8', 'ignore'))
for i in cfg['history']:
self.entrycombo.append_text(i.encode('utf-8', 'ignore'))
@@ -313,7 +311,7 @@ class SpeakActivity(activity.Activity):
def save_instance(self, file_path):
cfg = {'status': self.face.status.serialize(),
- 'text': unicode(self.entry.props.text, 'utf-8', 'ignore'),
+ 'text': unicode(self.entry.get_text(), 'utf-8', 'ignore'),
'history': [unicode(i[0], 'utf-8', 'ignore') \
for i in self.entrycombo.get_model()],
}
@@ -324,10 +322,10 @@ class SpeakActivity(activity.Activity):
def _cursor_moved_cb(self, entry, *ignored):
# make the eyes track the motion of the text cursor
- index = entry.props.cursor_position
+ index = entry.get_property('cursor_position')
layout = entry.get_layout()
pos = layout.get_cursor_pos(index)
- x = pos[0].x / Pango.SCALE - entry.props.scroll_offset
+ x = pos[0].x / Pango.SCALE - entry.get_property('scroll_offset')
y = entry.get_allocation().y
self.face.look_at(pos=(x, y))
@@ -482,14 +480,14 @@ class SpeakActivity(activity.Activity):
def _entry_activate_cb(self, entry):
# the user pressed Return, say the text and clear it out
- text = entry.props.text
+ text = entry.get_text()
if text:
self.face.look_ahead()
# speak the text
if self._mode == MODE_BOT:
self.face.say(
- brain.respond(self.voices.props.value, text))
+ brain.respond(self.voices.get_value(), text))
else:
self.face.say(text)
@@ -500,7 +498,7 @@ class SpeakActivity(activity.Activity):
self.entrycombo.append_text(text)
# don't let the history get too big
while len(history) > 20:
- self.entrycombo.remove_text(0)
+ self.entrycombo.remove(0)
# select the new item
self.entrycombo.set_active(len(history) - 1)
# select the whole text
@@ -508,7 +506,7 @@ class SpeakActivity(activity.Activity):
def _activeCb(self, widget, pspec):
# only generate sound when this activity is active
- if not self.props.active:
+ if not self.is_active():
self.face.shut_up()
self.chat.shut_up()
@@ -529,7 +527,7 @@ class SpeakActivity(activity.Activity):
self.face.shut_up()
self.notebook.set_current_page(0)
- old_voice = self.voices.props.value
+ old_voice = self.voices.get_value()
self.voices.set_model(voices_model)
self._set_voice(old_voice)
@@ -542,7 +540,7 @@ class SpeakActivity(activity.Activity):
self.face.shut_up()
self.notebook.set_current_page(0)
- old_voice = self.voices.props.value
+ old_voice = self.voices.get_value()
self.voices.set_model(voices_model)
new_voice = [i[0] for i in voices_model
@@ -560,7 +558,7 @@ class SpeakActivity(activity.Activity):
self._set_voice(new_voice)
- if not brain.load(self, self.voices.props.value, sorry):
+ if not brain.load(self, self.voices.get_value(), sorry):
if sorry:
self.face.say_notification(sorry)
@@ -574,7 +572,7 @@ class SpeakActivity(activity.Activity):
self.face.shut_up()
self.notebook.set_current_page(1)
- old_voice = self.voices.props.value
+ old_voice = self.voices.get_value()
self.voices.set_model(voices_model)
self._set_voice(old_voice)
diff --git a/chat.py b/chat.py
index 8f8bb28..ce07faa 100644
--- a/chat.py
+++ b/chat.py
@@ -56,7 +56,7 @@ class View(Gtk.EventBox):
# buddies box
self._buddies_list = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self._buddies_list.set_homogeneous(False)
- self._buddies_list.props.spacing = ENTRY_YPAD
+ self._buddies_list.set_spacing(ENTRY_YPAD)
self._buddies_box = Gtk.ScrolledWindow()
self._buddies_box.set_policy(Gtk.PolicyType.ALWAYS,
@@ -79,7 +79,7 @@ class View(Gtk.EventBox):
chat_post.modify_base(Gtk.StateType.INSENSITIVE,
style.COLOR_WHITE.get_gdk_color())
chat_post.connect('key-press-event', self._key_press_cb)
- chat_post.props.wrap_mode = Gtk.WrapMode.WORD_CHAR
+ chat_post.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
chat_post.set_size_request(-1, BUDDY_SIZE - ENTRY_YPAD * 2)
chat_post_box = RoundBox()
chat_post_box.background_color = style.COLOR_WHITE
diff --git a/chatbox.py b/chatbox.py
index 0046475..d948647 100644
--- a/chatbox.py
+++ b/chatbox.py
@@ -199,7 +199,7 @@ class ColorLabel(Gtk.Label):
Gtk.Label.__init__(self)
self.set_use_markup(True)
self.set_markup(text)
- self.props.selectable = True
+ self.set_selectable(True)
class ChatBox(Gtk.ScrolledWindow):
@@ -219,8 +219,8 @@ class ChatBox(Gtk.ScrolledWindow):
self._conversation = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self._conversation.set_homogeneous(False)
- self._conversation.props.spacing = style.LINE_WIDTH
- self._conversation.props.border_width = style.LINE_WIDTH
+ self._conversation.set_spacing(style.LINE_WIDTH)
+ self._conversation.set_border_width(style.LINE_WIDTH)
evbox = Gtk.EventBox()
evbox.modify_bg(Gtk.StateType.NORMAL, style.COLOR_WHITE.get_gdk_color())
@@ -306,8 +306,8 @@ class ChatBox(Gtk.ScrolledWindow):
screen_width = Gdk.Screen.width()
# keep space to the scrollbar
rb.set_size_request(screen_width - 50, -1)
- rb.props.border_width = style.DEFAULT_PADDING
- rb.props.spacing = style.DEFAULT_SPACING
+ rb.set_border_width(style.DEFAULT_PADDING)
+ rb.set_spacing(style.DEFAULT_SPACING)
rb.background_color = color_fill
rb.border_color = color_stroke
self._last_msg_sender = buddy
diff --git a/espeak.py b/espeak.py
index d4dc236..8923e33 100644
--- a/espeak.py
+++ b/espeak.py
@@ -41,8 +41,8 @@ class BaseAudioGrab(GObject.GObject):
def __init__(self):
GObject.GObject.__init__(self)
self.pipeline = None
- self.handle1 = None
- self.handle2 = None
+ self.handle = None
+ self._was_message = False
def speak(self, status, text):
# 175 is default value, min is 80
@@ -57,70 +57,108 @@ class BaseAudioGrab(GObject.GObject):
self.make_pipeline(wavpath)
- # play
- self.restart_sound_device()
-
def restart_sound_device(self):
- self.pipeline.set_state(Gst.State.NULL)
- self.pipeline.set_state(Gst.State.PLAYING)
+ try:
+ self.pipeline.set_state(Gst.State.NULL)
+ self.pipeline.set_state(Gst.State.READY)
+ self.pipeline.set_state(Gst.State.PLAYING)
+ except:
+ pass
def stop_sound_device(self):
if self.pipeline is None:
return
- self.pipeline.set_state(Gst.State.NULL)
- self._new_buffer('')
+ try:
+ self.pipeline.set_state(Gst.State.NULL)
+ self.pipeline.set_state(Gst.State.READY)
+ self._new_buffer('')
+ except:
+ pass
def make_pipeline(self, wavpath):
if self.pipeline is not None:
- self.stop_sound_device()
- del self.pipeline
-
+ self.pipeline.set_state(Gst.State.NULL)
+ del(self.pipeline)
+
self.pipeline = Gst.Pipeline()
- self.player = Gst.ElementFactory.make("playbin", "espeak")
- self.pipeline.add(self.player)
- self.player.set_property("uri", Gst.filename_to_uri(wavpath))
- self.pipeline.set_state(Gst.State.PLAYING)
- def on_buffer(element, buffer, pad):
- if self.handle1:
- GObject.source_remove(self.self.andle1)
- self.handle1 = GObject.timeout_add(100,
- self._new_buffer, str(buffer))
- return True
+ file = Gst.ElementFactory.make("filesrc", "espeak")
+ wavparse = Gst.ElementFactory.make("wavparse", "wavparse")
+ audioconvert = Gst.ElementFactory.make("audioconvert", "audioconvert")
+ tee = Gst.ElementFactory.make('tee', "tee")
+ # FIXME: alsasink no more, pulseaudio causes:
+ # gst_object_unref: assertion `((GObject *) object)->ref_count > 0' failed
+ playsink = Gst.ElementFactory.make("playsink", "playsink")
+ queue1 = Gst.ElementFactory.make("queue", "queue1")
+ fakesink = Gst.ElementFactory.make("fakesink", "fakesink")
+ queue2 = Gst.ElementFactory.make("queue", "queue2")
+
+ self.pipeline.add(file)
+ self.pipeline.add(wavparse)
+ self.pipeline.add(audioconvert)
+ self.pipeline.add(tee)
+ self.pipeline.add(queue1)
+ self.pipeline.add(playsink)
+ self.pipeline.add(queue2)
+ self.pipeline.add(fakesink)
+
+ file.link(wavparse)
+ wavparse.link(tee)
+
+ tee.link(queue1)
+ queue1.link(audioconvert)
+ audioconvert.link(playsink)
+
+ tee.link(queue2)
+ queue2.link(fakesink)
+
+ file.set_property("location", wavpath)
+
+ fakesink.connect('handoff', self.on_buffer)
- def gstmessage_cb(bus, message):
- self._was_message = True
-
- if message.type == Gst.MessageType.WARNING:
- def check_after_warnings():
- if not self._was_message:
- self.stop_sound_device()
- return True
-
- logger.debug(message.type)
- self._was_message = False
- if self.handle2:
- GObject.source_remove(self.self.andle2)
- self.handle2 = GObject.timeout_add(500,
- self._new_buffer, str(buffer))
-
- elif message.type == Gst.MessageType.EOS:
- pass
-
- elif message.type == Gst.MessageType.ERROR:
- logger.debug(message.type)
- self.stop_sound_device()
-
self._was_message = False
bus = self.pipeline.get_bus()
bus.add_signal_watch()
- bus.connect('message', gstmessage_cb)
+ bus.connect('message', self.gstmessage_cb)
+ self.pipeline.set_state(Gst.State.PLAYING)
+
+ def gstmessage_cb(self, bus, message):
+ self._was_message = True
+
+ if message.type == Gst.MessageType.WARNING:
+ def check_after_warnings():
+ if not self._was_message:
+ self.stop_sound_device()
+ return True
+
+ logger.debug(message.type)
+ self._was_message = False
+ if self.handle:
+ GObject.source_remove(self.handle)
+ self.handle = GObject.timeout_add(500,
+ self._new_buffer, str(buffer))
+
+ elif message.type == Gst.MessageType.EOS:
+ self.pipeline.set_state(Gst.State.NULL)
+
+ elif message.type == Gst.MessageType.ERROR:
+ err, debug = message.parse_error()
+ logger.debug(err)
+ self.stop_sound_device()
+
+ def on_buffer(self, element, buffer, pad):
+ # FIXME: currently not running handoff
+ if self.handle:
+ GObject.source_remove(self.handle)
+ self.handle = GObject.timeout_add(100,
+ self._new_buffer, str(buffer))
+ return True
+
def _new_buffer(self, buf):
self.emit("new-buffer", buf)
return False
-
-
+
def voices():
out = []
result = subprocess.Popen(["espeak", "--voices"],
diff --git a/roundbox.py b/roundbox.py
index 76c657a..807385d 100644
--- a/roundbox.py
+++ b/roundbox.py
@@ -32,34 +32,30 @@ class RoundBox(Gtk.Box):
self._y = allocation.y
self._width = allocation.width
self._height = allocation.height
-
- def do_draw(self, context):
- rect = self.get_allocation()
- # set a clip region for the expose event
- context.rectangle(rect.x, rect.y,
- rect.width, rect.height)
- context.clip()
- self.draw(context)
- return False
-
- def draw(self, cr):
+
+ def do_draw(self, cr):
rect = self.get_allocation()
+ cr.rectangle(rect.x, rect.y, rect.width, rect.height)
+ cr.clip()
+
x = rect.x + self._BORDER_DEFAULT / 2
y = rect.y + self._BORDER_DEFAULT / 2
width = rect.width - self._BORDER_DEFAULT
height = rect.height - self._BORDER_DEFAULT
cr.move_to(x + self._radius, y)
+
cr.arc(x + width - self._radius, y + self._radius,
- self._radius, math.pi * 1.5, math.pi * 2)
+ self._radius, math.pi * 1.5, math.pi * 2)
cr.arc(x + width - self._radius, y + height - self._radius,
- self._radius, 0, math.pi * 0.5)
+ self._radius, 0, math.pi * 0.5)
cr.arc(x + self._radius, y + height - self._radius,
- self._radius, math.pi * 0.5, math.pi)
+ self._radius, math.pi * 0.5, math.pi)
cr.arc(x + self._radius, y + self._radius, self._radius,
- math.pi, math.pi * 1.5)
+ math.pi, math.pi * 1.5)
+
cr.close_path()
-
+
if self.background_color is not None:
r, g, b, __ = self.background_color.get_rgba()
cr.set_source_rgb(r, g, b)