</packing>
</child>
<child>
- <widget class="GtkToggleButton" id="video_lock">
- <property name="label">gtk-media-pause</property>
+ <widget class="GtkHButtonBox" id="video_buttons">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="use_stock">True</property>
+ <child>
+ <placeholder/>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
+ <child>
+ <widget class="GtkLabel" id="ideo_status">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkToggleButton" id="audio_lock">
- <property name="label">gtk-media-pause</property>
+ <widget class="GtkHButtonBox" id="audio_buttons">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="use_stock">True</property>
+ <child>
+ <placeholder/>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
+ <child>
+ <widget class="GtkLabel" id="audio_status">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
- <widget class="GtkToggleButton" id="talk_lock">
- <property name="label">gtk-media-pause</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="use_stock">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">2</property>
- </packing>
+ <placeholder/>
</child>
</widget>
<packing>
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):