bulk pre-camp commit
[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     PLAY_IMAGE = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
10     PAUSE_IMAGE = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON)
11
12     def __init__( self ):
13         self.playbin = gst.element_factory_make('playbin2')
14
15         self.bus = self.playbin.get_bus()
16         self.bus.add_signal_watch()
17         self.bus.connect("message::eos", self.on_finish)
18
19         self.spinner.set_range(0, 100)
20         self.spinner.set_increments(1, 10)
21         self.spinner.connect('value-changed', self.on_spinner_change)
22
23         self.seeker.set_range(0, 100)
24         self.seeker.set_increments(1, 10)
25         self.seeker.connect('change-value', self.on_seeker_change)
26         self.seeker.connect('button-press-event', self.on_button_press)
27         self.seeker.connect('button-release-event', self.on_button_release)
28
29         self.play_button = gtk.Button()
30         self.play_button.set_image(self.PLAY_IMAGE)
31         self.play_button.connect('clicked', self.on_play_clicked)
32         self.bbox.pack_start(self.play_button, False)
33
34         self.begin_button = gtk.Button()
35         self.begin_button.set_image(self.PLAY_IMAGE)
36         self.begin_button.connect('clicked', self.on_begin_clicked)
37         self.bbox.pack_start(self.begin_button, False)
38
39         self.end_button = gtk.Button()
40         self.end_button.set_image(self.PLAY_IMAGE)
41         self.end_button.connect('clicked', self.on_end_clicked)
42         self.bbox.pack_start(self.end_button, False)
43
44         self.bbox.show_all()
45
46         self.is_loaded = False
47         self.is_playing = False
48         self.known_range = False
49
50     def play(self, uri):
51         self.playbin.set_property('uri', uri)
52         self.playbin.set_state(gst.STATE_PLAYING)
53         self.label.label = 'f';
54         gobject.timeout_add(500, self.update_slider)
55         self.is_playing = True
56         self.is_loaded = True
57         self.known_range = False
58         self.label.set_text(uri)
59
60     def on_finish(self, bus, message):
61         self.playbin.set_state(gst.STATE_PAUSED);
62         self.spinner.set_value(0);
63         self.seeker.set_value(0);
64
65     def on_video_realized(self, sender):
66         self.sink.set_xwindow_id(self.drawingarea.window.xid)
67
68     def update_slider(self):
69         if not self.is_playing:
70             return True
71
72         try:
73             if not self.known_range:
74                 duration_nanosecs, format = self.playbin.query_duration(gst.FORMAT_TIME)
75                 if duration_nanosecs > 0:
76                   duration_secs = float(duration_nanosecs) / gst.SECOND
77                   print duration_secs
78                   self.seeker.set_range(0, duration_secs)
79                   self.spinner.set_range(0, duration_secs)
80                   self.known_range = True
81                   print "Duration: %f" % (duration_secs) 
82
83             nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
84
85             # block seek handler so we don't seek when we set_value()
86             self.seeker.handler_block_by_func(self.on_seeker_change)
87             self.spinner.handler_block_by_func(self.on_spinner_change)
88
89             value = float(nanosecs) / gst.SECOND;
90
91             #print "Trigger: %f" % (value) 
92
93             self.seeker.set_value(value)
94             self.spinner.set_text("%f" %(value))
95
96             self.seeker.handler_unblock_by_func(self.on_seeker_change)
97             self.spinner.handler_unblock_by_func(self.on_spinner_change)
98
99         except gst.QueryError:
100             # pipeline must not be ready and does not know position
101             pass
102
103         return True # continue calling every 30 milliseconds
104
105
106     def on_seeker_change(self, element, a, b):
107         seek_time_secs = element.get_value()
108         self.mseek(seek_time_secs)
109
110     def on_spinner_change(self, element):
111         seek_time_secs = float(element.get_value())
112         self.mseek(seek_time_secs)
113
114     def mplay(self):
115         self.playbin.set_state(gst.STATE_PLAYING)
116
117     def mpause(self):
118         self.playbin.set_state(gst.STATE_PAUSED)
119
120     def mseek(self, seek_time_secs):
121         print 'seek: %f' % (seek_time_secs)
122         self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND)
123
124     def on_button_press(self, element, a):
125         if self.is_playing:
126           self.mpause()
127
128     def on_button_release(self, element, a):
129         if self.is_playing:
130           self.mplay()
131
132     def on_play_clicked(self, element):
133         if self.is_playing:
134           self.mpause()
135           self.play_button.set_image(self.PLAY_IMAGE)
136           self.is_playing = False;
137         else:
138           self.mplay()
139           self.play_button.set_image(self.PAUSE_IMAGE)
140           self.is_playing = True;
141           
142     def on_begin_clicked(self, element):
143         
144     def on_end_clicked(self, element):
145