X-Git-Url: http://git.asbjorn.biz/?p=talkcutter.git;a=blobdiff_plain;f=src%2Fmediaplayer.py;fp=src%2Fmediaplayer.py;h=b2741b046a02e7629161cde524517ef1f3cb14e9;hp=0000000000000000000000000000000000000000;hb=6958c5bcc833e071bb8b0cae1483c02c00c7099b;hpb=66912d768e1245aaaf77728af7c38bf299e0bb8d diff --git a/src/mediaplayer.py b/src/mediaplayer.py new file mode 100644 index 0000000..b2741b0 --- /dev/null +++ b/src/mediaplayer.py @@ -0,0 +1,94 @@ +import os +import gst, gtk, gobject +import sys +import pygtk +import gtk +import gtk.glade + +class mediaplayer(object): + def __init__( self ): + self.playbin = gst.element_factory_make('playbin2') + + self.bus = self.playbin.get_bus() + self.bus.add_signal_watch() + self.bus.connect("message::eos", self.on_finish) + + self.spinner.set_range(0, 100) + self.spinner.set_increments(1, 10) + self.spinner.connect('change-value', self.on_seeker_change) + + self.seeker.set_range(0, 100) + self.seeker.set_increments(1, 10) + self.seeker.connect('change-value', self.on_seeker_change) + self.seeker.connect('button-press-event', self.on_button_press) + self.seeker.connect('button-release-event', self.on_button_release) + + self.is_playing = False + self.known_range = False + + def play(self, uri): + self.playbin.set_property('uri', uri) + self.playbin.set_state(gst.STATE_PLAYING) + self.label.label = 'f'; + gobject.timeout_add(100, self.update_slider) + self.is_playing = True + self.known_range = False + + def on_finish(self, bus, message): + self.playbin.set_state(gst.STATE_PAUSED); + self.spinner.set_value(0); + self.seeker.set_value(0); + + def on_video_realized(self, sender): + self.sink.set_xwindow_id(self.drawingarea.window.xid) + + def update_slider(self): + if not self.is_playing: + return False # cancel timeout + + try: + if not self.known_range: + duration_nanosecs, format = self.playbin.query_duration(gst.FORMAT_TIME) + if duration_nanosecs > 0: + duration_secs = float(duration_nanosecs) / gst.SECOND + print duration_secs + self.seeker.set_range(0, duration_secs) + self.spinner.set_range(0, duration_secs) + self.known_range = True + print "Duration: %f" % (duration_secs) + + nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME) + + # block seek handler so we don't seek when we set_value() + self.seeker.handler_block_by_func(self.on_seeker_change) + self.spinner.handler_block_by_func(self.on_seeker_change) + + value = float(nanosecs) / gst.SECOND; + + #print "Trigger: %f" % (value) + + self.seeker.set_value(value) + self.spinner.set_text("%f" %(value)) + + self.seeker.handler_unblock_by_func(self.on_seeker_change) + self.spinner.handler_unblock_by_func(self.on_seeker_change) + + except gst.QueryError: + # pipeline must not be ready and does not know position + pass + + return True # continue calling every 30 milliseconds + + + def on_seeker_change(self, element, a, b): + print 'on_seeker_change' + seek_time_secs = element.get_value() + self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND) + + def on_button_press(self, element, a): + self.playbin.set_state(gst.STATE_PAUSED); + + def on_button_release(self, element, a): + self.playbin.set_state(gst.STATE_PLAYING) + +