Add vidi/MidiUtils.py to share some utilities to analyze midi files
[vidi-player.git] / vidi / Player.py
1 #!/usr/bin/env python3
2 #
3 # Player - a very simple GStreamer player
4 #
5 # Copyright (C) 2016  Antonio Ospite <ao2@ao2.it>
6 #
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
20 import gi
21
22 gi.require_version('Gst', '1.0')
23 from gi.repository import Gst
24 Gst.init(None)
25
26 from gi.repository import GObject
27 GObject.threads_init()
28
29
30 class Player(object):
31     def __init__(self, pipeline):
32         self.pipeline = pipeline
33
34         bus = self.pipeline.get_bus()
35         bus.add_signal_watch()
36         bus.connect("message::eos", self.on_eos)
37         bus.connect('message::error', self.on_error)
38
39         self.mainloop = GObject.MainLoop()
40
41     @staticmethod
42     def from_pipeline_string(pipeline_string):
43         pipeline = Gst.parse_launch(pipeline_string)
44         return Player(pipeline)
45
46     def on_eos(self, bus, message):
47         self.stop()
48
49     def on_error(self, bus, msg):
50         (err, debug) = msg.parse_error()
51         print("Error: %s" % err)
52         self.stop()
53
54     def play(self):
55         self.pipeline.set_state(Gst.State.PLAYING)
56         self.mainloop.run()
57
58     def stop(self):
59         self.mainloop.quit()
60         self.pipeline.set_state(Gst.State.NULL)