54743c677fe2344837de1883512ead0eb72549fb
[watersofshiloah] / src / player.py
1 import logging
2
3 import gobject
4
5 import util.misc as misc_utils
6 import stream
7 import call_monitor
8
9
10 _moduleLogger = logging.getLogger(__name__)
11
12
13 class Player(gobject.GObject):
14
15         __gsignals__ = {
16                 'state_change' : (
17                         gobject.SIGNAL_RUN_LAST,
18                         gobject.TYPE_NONE,
19                         (gobject.TYPE_PYOBJECT, ),
20                 ),
21                 'title_change' : (
22                         gobject.SIGNAL_RUN_LAST,
23                         gobject.TYPE_NONE,
24                         (gobject.TYPE_PYOBJECT, ),
25                 ),
26                 'error' : (
27                         gobject.SIGNAL_RUN_LAST,
28                         gobject.TYPE_NONE,
29                         (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT),
30                 ),
31         }
32
33         STATE_PLAY = stream.GSTStream.STATE_PLAY
34         STATE_PAUSE = stream.GSTStream.STATE_PAUSE
35         STATE_STOP = stream.GSTStream.STATE_STOP
36
37         def __init__(self, index):
38                 gobject.GObject.__init__(self)
39                 self._index = index
40                 self._node = None
41
42                 self._calls = call_monitor.CallMonitor()
43                 self._calls.connect("call_start", self._on_call_start)
44
45                 self._stream = stream.GSTStream()
46                 self._stream.connect("state-change", self._on_stream_state)
47                 self._stream.connect("eof", self._on_stream_eof)
48                 self._stream.connect("error", self._on_stream_error)
49
50         def set_piece_by_node(self, node):
51                 assert node is None or node.is_leaf(), node
52                 if self._node is node:
53                         return
54                 self._node = node
55                 if self._node is not None:
56                         self._stream.set_file(self._node.uri)
57                 _moduleLogger.info("New node %r" % self._node)
58                 self.emit("title_change", self._node)
59
60         @property
61         def node(self):
62                 return self._node
63
64         @property
65         def title(self):
66                 if self._node is None:
67                         return ""
68                 return self._node.title
69
70         @property
71         def subtitle(self):
72                 if self._node is None:
73                         return ""
74                 return self._node.subtitle
75
76         @property
77         def can_navigate(self):
78                 if self._node is None:
79                         return False
80                 return self.node.can_navigate
81
82         @property
83         def state(self):
84                 return self._stream.state
85
86         def play(self):
87                 _moduleLogger.info("play")
88                 self._stream.play()
89
90                 self._calls.start()
91
92         def pause(self):
93                 _moduleLogger.info("pause")
94                 self._stream.pause()
95
96         def stop(self):
97                 _moduleLogger.info("stop")
98                 self._stream.stop()
99                 self.set_piece_by_node(None)
100
101                 self._calls.stop()
102
103         def back(self):
104                 _moduleLogger.info("back")
105
106         def next(self):
107                 _moduleLogger.info("next")
108
109         @misc_utils.log_exception(_moduleLogger)
110         def _on_stream_state(self, s, state):
111                 _moduleLogger.info("State change %r" % state)
112                 self.emit("state_change", state)
113
114         @misc_utils.log_exception(_moduleLogger)
115         def _on_stream_eof(self, s, uri):
116                 _moduleLogger.info("EOF %s" % uri)
117                 self.next()
118
119         @misc_utils.log_exception(_moduleLogger)
120         def _on_stream_error(self, s, error, debug):
121                 _moduleLogger.info("Error %s %s" % (error, debug))
122                 self.emit("error", error, debug)
123
124         @misc_utils.log_exception(_moduleLogger)
125         def _on_call_start(self, monitor):
126                 _moduleLogger.info("Call in progress, pausing")
127                 self.pause()
128
129
130 gobject.type_register(Player)