16
16
# along with this program; if not, write to the Free Software
17
17
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
gi.require_version('Gst', '1.0')
21
from gi.repository import Gst
49
51
def __constructPlayer(self):
50
52
""" Create the GStreamer pipeline """
51
53
if self.usePlaybin2:
52
self.player = gst.element_factory_make('playbin2', 'player')
54
self.player = Gst.ElementFactory.make('playbin', None)
53
55
self.player.connect('about-to-finish', self.__onAboutToFinish)
55
self.player = gst.element_factory_make('playbin', 'player')
57
self.player = Gst.ElementFactory.make('playbin', 'player')
58
self.player.set_property('video-sink', gst.element_factory_make('fakesink', 'fakesink'))
60
self.player.set_property('video-sink', Gst.ElementFactory.make('fakesink', 'fakesink'))
60
62
# Change the audio sink to our own bin, so that an equalizer/replay gain element can be added later on if needed
61
self.audiobin = gst.Bin('audiobin')
62
self.audiosink = gst.element_factory_make('autoaudiosink', 'audiosink')
63
self.audiobin = Gst.Bin('audiobin')
64
self.audiosink = Gst.ElementFactory.make('autoaudiosink', 'audiosink')
64
66
# Callback when the source of the playbin is changed
65
67
self.player.connect('notify::source', self.__onNewPlaybinSource)
67
69
self.audiobin.add(self.audiosink)
68
self.audiobin.add_pad(gst.GhostPad('sink', self.audiosink.get_pad('sink')))
70
self.audiobin.add_pad(Gst.GhostPad.new('sink', self.audiosink.get_static_pad('sink')))
69
71
self.player.set_property('audio-sink', self.audiobin)
71
73
# Monitor messages generated by the player
77
79
if self.eqzEnabled:
78
self.equalizer = gst.element_factory_make('equalizer-10bands', 'equalizer')
80
self.equalizer = Gst.ElementFactory.make('equalizer-10bands', 'equalizer')
79
81
self.audiobin.add(self.equalizer)
80
self.audiobin.get_pad('sink').set_target(self.equalizer.get_pad('sink'))
81
self.equalizer.link(self.audiosink)
82
self.audiobin.get_static_pad('sink').set_target(self.equalizer.get_static_pad('sink'))
83
self.equalizer.link_filtered(self.audiosink)
83
85
if self.eqzLevels is not None:
84
86
self.setEqualizerLvls(self.eqzLevels)
88
replaygain = gst.element_factory_make('rgvolume', 'replaygain')
90
replaygain = Gst.ElementFactory.make('rgvolume', 'replaygain')
90
92
self.audiobin.add(replaygain)
91
self.audiobin.get_pad('sink').set_target(replaygain.get_pad('sink'))
93
self.audiobin.get_static_pad('sink').set_target(replaygain.get_static_pad('sink'))
93
if self.equalizer is None: replaygain.link(self.audiosink)
94
else: replaygain.link(self.equalizer)
95
if self.equalizer is None: replaygain.link_filtered(self.audiosink)
96
else: replaygain.link_filtered(self.equalizer)
97
99
def enableEqualizer(self):
143
145
def __onGstMessage(self, bus, msg):
144
146
""" A new message generated by the player """
145
if msg.type == gst.MESSAGE_EOS:
147
if msg.type == Gst.MessageType.EOS:
146
148
self.callbackEnded(False)
147
elif msg.type == gst.MESSAGE_ERROR:
149
elif msg.type == Gst.MessageType.ERROR:
149
151
# It seems that the pipeline may not be able to play again any valid stream when an error occurs
150
152
# We thus create a new one, even if that's quite a ugly solution
167
169
def isPaused(self):
168
170
""" Return whether the player is paused """
169
return self.__getPlayer().get_state()[1] == gst.STATE_PAUSED
171
return self.__getPlayer().get_state()[1] == Gst.State.PAUSED
172
174
def isPlaying(self):
173
175
""" Return whether the player is paused """
174
return self.__getPlayer().get_state()[1] == gst.STATE_PLAYING
176
return self.__getPlayer().get_state()[1] == Gst.State.PLAYING
177
179
def setURI(self, uri):
184
self.__getPlayer().set_state(gst.STATE_PLAYING)
186
self.__getPlayer().set_state(Gst.State.PLAYING)
189
self.__getPlayer().set_state(gst.STATE_PAUSED)
191
self.__getPlayer().set_state(Gst.State.PAUSED
193
195
""" Stop playing """
194
self.__getPlayer().set_state(gst.STATE_NULL)
196
self.__getPlayer().set_state(Gst.State.NULL)
197
199
def seek(self, where):
198
200
""" Jump to the given location """
199
self.__getPlayer().seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, where)
201
self.__getPlayer().seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, where)
202
204
def getPosition(self):
203
205
""" Return the current position """
204
try: return self.__getPlayer().query_position(gst.FORMAT_TIME)[0]
206
try: return self.__getPlayer().query_position(Gst.Format.TIME)[0]
208
210
def getDuration(self):
209
211
""" Return the duration of the current stream """
210
try: return self.__getPlayer().query_duration(gst.FORMAT_TIME)[0]
212
try: return self.__getPlayer().query_duration(Gst.Format.TIME)[0]