b2741b046a02e7629161cde524517ef1f3cb14e9
[talkcutter.git] / src / mediaplayer.py
1 import os
2 import gst, gtk, gobject
3 import sys
4 import pygtk
5 import gtk
6 import gtk.glade
7
8 class mediaplayer(object):
9     def __init__( self ):
10         self.playbin = gst.element_factory_make('playbin2')
11
12         self.bus = self.playbin.get_bus()
13         self.bus.add_signal_watch()
14         self.bus.connect("message::eos", self.on_finish)
15
16         self.spinner.set_range(0, 100)
17         self.spinner.set_increments(1, 10)
18         self.spinner.connect('change-value', self.on_seeker_change)
19
20         self.seeker.set_range(0, 100)
21         self.seeker.set_increments(1, 10)
22         self.seeker.connect('change-value', self.on_seeker_change)
23         self.seeker.connect('button-press-event', self.on_button_press)
24         self.seeker.connect('button-release-event', self.on_button_release)
25
26         self.is_playing = False
27         self.known_range = False
28
29     def play(self, uri):
30         self.playbin.set_property('uri', uri)
31         self.playbin.set_state(gst.STATE_PLAYING)
32         self.label.label = 'f';
33         gobject.timeout_add(100, self.update_slider)
34         self.is_playing = True
35         self.known_range = False
36
37     def on_finish(self, bus, message):
38         self.playbin.set_state(gst.STATE_PAUSED);
39         self.spinner.set_value(0);
40         self.seeker.set_value(0);
41
42     def on_video_realized(self, sender):
43         self.sink.set_xwindow_id(self.drawingarea.window.xid)
44
45     def update_slider(self):
46         if not self.is_playing:
47             return False # cancel timeout
48
49         try:
50             if not self.known_range:
51                 duration_nanosecs, format = self.playbin.query_duration(gst.FORMAT_TIME)
52                 if duration_nanosecs > 0:
53                   duration_secs = float(duration_nanosecs) / gst.SECOND
54                   print duration_secs
55                   self.seeker.set_range(0, duration_secs)
56                   self.spinner.set_range(0, duration_secs)
57                   self.known_range = True
58                   print "Duration: %f" % (duration_secs) 
59
60             nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
61
62             # block seek handler so we don't seek when we set_value()
63             self.seeker.handler_block_by_func(self.on_seeker_change)
64             self.spinner.handler_block_by_func(self.on_seeker_change)
65
66             value = float(nanosecs) / gst.SECOND;
67
68             #print "Trigger: %f" % (value) 
69
70             self.seeker.set_value(value)
71             self.spinner.set_text("%f" %(value))
72
73             self.seeker.handler_unblock_by_func(self.on_seeker_change)
74             self.spinner.handler_unblock_by_func(self.on_seeker_change)
75
76         except gst.QueryError:
77             # pipeline must not be ready and does not know position
78             pass
79
80         return True # continue calling every 30 milliseconds
81
82
83     def on_seeker_change(self, element, a, b):
84         print 'on_seeker_change'
85         seek_time_secs = element.get_value()
86         self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND)
87
88     def on_button_press(self, element, a):
89         self.playbin.set_state(gst.STATE_PAUSED);
90
91     def on_button_release(self, element, a):
92         self.playbin.set_state(gst.STATE_PLAYING)
93
94