import gtk.glade
class mediaplayer(object):
+ PLAY_IMAGE = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
+ PAUSE_IMAGE = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON)
+
def __init__( self ):
self.playbin = gst.element_factory_make('playbin2')
self.spinner.set_range(0, 100)
self.spinner.set_increments(1, 10)
- self.spinner.connect('change-value', self.on_seeker_change)
+ self.spinner.connect('value-changed', self.on_spinner_change)
self.seeker.set_range(0, 100)
self.seeker.set_increments(1, 10)
self.seeker.connect('button-press-event', self.on_button_press)
self.seeker.connect('button-release-event', self.on_button_release)
+ self.play_button = gtk.Button()
+ self.play_button.set_image(self.PLAY_IMAGE)
+ self.play_button.connect('clicked', self.on_play_clicked)
+ self.bbox.pack_start(self.play_button, False)
+
+ self.begin_button = gtk.Button()
+ self.begin_button.set_image(self.PLAY_IMAGE)
+ self.begin_button.connect('clicked', self.on_begin_clicked)
+ self.bbox.pack_start(self.begin_button, False)
+
+ self.end_button = gtk.Button()
+ self.end_button.set_image(self.PLAY_IMAGE)
+ self.end_button.connect('clicked', self.on_end_clicked)
+ self.bbox.pack_start(self.end_button, False)
+
+ self.bbox.show_all()
+
+ self.is_loaded = False
self.is_playing = False
self.known_range = False
self.playbin.set_property('uri', uri)
self.playbin.set_state(gst.STATE_PLAYING)
self.label.label = 'f';
- gobject.timeout_add(100, self.update_slider)
+ gobject.timeout_add(500, self.update_slider)
self.is_playing = True
+ self.is_loaded = True
self.known_range = False
+ self.label.set_text(uri)
def on_finish(self, bus, message):
self.playbin.set_state(gst.STATE_PAUSED);
def update_slider(self):
if not self.is_playing:
- return False # cancel timeout
+ return True
try:
if not self.known_range:
# 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)
+ self.spinner.handler_block_by_func(self.on_spinner_change)
value = float(nanosecs) / gst.SECOND;
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)
+ self.spinner.handler_unblock_by_func(self.on_spinner_change)
except gst.QueryError:
# pipeline must not be ready and does not know position
def on_seeker_change(self, element, a, b):
- print 'on_seeker_change'
seek_time_secs = element.get_value()
+ self.mseek(seek_time_secs)
+
+ def on_spinner_change(self, element):
+ seek_time_secs = float(element.get_value())
+ self.mseek(seek_time_secs)
+
+ def mplay(self):
+ self.playbin.set_state(gst.STATE_PLAYING)
+
+ def mpause(self):
+ self.playbin.set_state(gst.STATE_PAUSED)
+
+ def mseek(self, seek_time_secs):
+ print 'seek: %f' % (seek_time_secs)
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);
+ if self.is_playing:
+ self.mpause()
def on_button_release(self, element, a):
- self.playbin.set_state(gst.STATE_PLAYING)
-
+ if self.is_playing:
+ self.mplay()
+
+ def on_play_clicked(self, element):
+ if self.is_playing:
+ self.mpause()
+ self.play_button.set_image(self.PLAY_IMAGE)
+ self.is_playing = False;
+ else:
+ self.mplay()
+ self.play_button.set_image(self.PAUSE_IMAGE)
+ self.is_playing = True;
+
+ def on_begin_clicked(self, element):
+
+ def on_end_clicked(self, element):