~turicas/decibel-audio-player/gstreamer-1.0

« back to all changes in this revision

Viewing changes to src/media/audioplayer.py

  • Committer: Álvaro Justen (@turicas)
  • Date: 2015-09-23 00:28:06 UTC
  • Revision ID: alvarojusten@gmail.com-20150923002806-23dwkcj0qg0xojc7
Migrate modules, media and tools

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
18
18
 
19
 
import gst
 
19
import gi
 
20
gi.require_version('Gst', '1.0')
 
21
from gi.repository import Gst
20
22
 
21
23
 
22
24
class AudioPlayer:
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)
54
56
        else:
55
 
            self.player = gst.element_factory_make('playbin', 'player')
 
57
            self.player = Gst.ElementFactory.make('playbin', 'player')
56
58
 
57
59
        # No video
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'))
59
61
 
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')
63
65
 
64
66
        # Callback when the source of the playbin is changed
65
67
        self.player.connect('notify::source', self.__onNewPlaybinSource)
66
68
 
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)
70
72
 
71
73
        # Monitor messages generated by the player
75
77
 
76
78
        # Add equalizer?
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)
82
84
 
83
85
            if self.eqzLevels is not None:
84
86
                self.setEqualizerLvls(self.eqzLevels)
85
87
 
86
88
        # Add replay gain?
87
89
        if self.rgEnabled:
88
 
            replaygain = gst.element_factory_make('rgvolume', 'replaygain')
 
90
            replaygain = Gst.ElementFactory.make('rgvolume', 'replaygain')
89
91
 
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'))
92
94
 
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)
95
97
 
96
98
 
97
99
    def enableEqualizer(self):
142
144
 
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:
148
150
            self.stop()
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
166
168
 
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
170
172
 
171
173
 
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
175
177
 
176
178
 
177
179
    def setURI(self, uri):
181
183
 
182
184
    def play(self):
183
185
        """ Play """
184
 
        self.__getPlayer().set_state(gst.STATE_PLAYING)
 
186
        self.__getPlayer().set_state(Gst.State.PLAYING)
185
187
 
186
188
 
187
189
    def pause(self):
188
190
        """ Pause """
189
 
        self.__getPlayer().set_state(gst.STATE_PAUSED)
 
191
        self.__getPlayer().set_state(Gst.State.PAUSED
190
192
 
191
193
 
192
194
    def stop(self):
193
195
        """ Stop playing """
194
 
        self.__getPlayer().set_state(gst.STATE_NULL)
 
196
        self.__getPlayer().set_state(Gst.State.NULL)
195
197
 
196
198
 
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)
200
202
 
201
203
 
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]
205
207
        except: return 0
206
208
 
207
209
 
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]
211
213
        except: return 0