diff options
author | Rafael Ortiz <rafael@activitycentral.com> | 2012-08-07 23:06:25 (GMT) |
---|---|---|
committer | Rafael Ortiz <rafael@activitycentral.com> | 2012-08-07 23:06:25 (GMT) |
commit | 24d236b3b0719d9b49486463737ad654aa15e6d9 (patch) | |
tree | 1793a6c6803921b3be9793205ae3da86a15b7ee3 | |
parent | a8c2f7b88a28f1ba5ef4c92b7fbb9cebdf565f80 (diff) |
merging flavio's changes to fix gstreamer
-rw-r--r-- | activity.py | 46 | ||||
-rw-r--r-- | chat.py | 4 | ||||
-rw-r--r-- | chatbox.py | 10 | ||||
-rw-r--r-- | espeak.py | 134 | ||||
-rw-r--r-- | roundbox.py | 28 |
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) @@ -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 @@ -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 @@ -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) |