148a69a27715044f7d90f0da5aa67c8f26e40987
[gc-dialer] / src / stream_handler.py
1 #!/usr/bin/env python
2
3 from __future__ import with_statement
4 from __future__ import division
5
6 import logging
7
8 from PyQt4 import QtCore
9
10 import util.misc as misc_utils
11 try:
12         import stream_gst
13         stream = stream_gst
14 except ImportError:
15         try:
16                 import stream_osso
17                 stream = stream_osso
18         except ImportError:
19                 import stream_null
20                 stream = stream_null
21
22
23 _moduleLogger = logging.getLogger(__name__)
24
25
26 class StreamToken(QtCore.QObject):
27
28         stateChange = QtCore.pyqtSignal(str)
29         invalidated = QtCore.pyqtSignal()
30         error = QtCore.pyqtSignal(str)
31
32         STATE_PLAY = stream.Stream.STATE_PLAY
33         STATE_PAUSE = stream.Stream.STATE_PAUSE
34         STATE_STOP = stream.Stream.STATE_STOP
35
36         def __init__(self, stream):
37                 QtCore.QObject.__init__(self)
38                 self._stream = stream
39                 self._stream.connect("state-change", self._on_stream_state)
40                 self._stream.connect("eof", self._on_stream_eof)
41                 self._stream.connect("error", self._on_stream_error)
42
43         @property
44         def state(self):
45                 if self.isValid:
46                         return self._stream.state
47                 else:
48                         return self.STATE_STOP
49
50         @property
51         def isValid(self):
52                 return self._stream is not None
53
54         def play(self):
55                 self._stream.play()
56
57         def pause(self):
58                 self._stream.pause()
59
60         def stop(self):
61                 self._stream.stop()
62
63         def invalidate(self):
64                 if self._stream is None:
65                         return
66                 _moduleLogger.info("Playback token invalidated")
67                 self._stream = None
68
69         @misc_utils.log_exception(_moduleLogger)
70         def _on_stream_state(self, s, state):
71                 if not self.isValid:
72                         return
73                 if state == self.STATE_STOP:
74                         self.invalidate()
75                 self.stateChange.emit(state)
76
77         @misc_utils.log_exception(_moduleLogger)
78         def _on_stream_eof(self, s, uri):
79                 if not self.isValid:
80                         return
81                 self.invalidate()
82                 self.stateChange.emit(self.STATE_STOP)
83
84         @misc_utils.log_exception(_moduleLogger)
85         def _on_stream_error(self, s, error, debug):
86                 if not self.isValid:
87                         return
88                 _moduleLogger.info("Error %s %s" % (error, debug))
89                 self.error.emit(str(error))
90
91
92 class StreamHandler(QtCore.QObject):
93
94         def __init__(self):
95                 QtCore.QObject.__init__(self)
96                 self._stream = stream.Stream()
97                 self._token = StreamToken(self._stream)
98
99         def set_file(self, path):
100                 self._token.invalidate()
101                 self._token = StreamToken(self._stream)
102                 self._stream.set_file(path)
103                 return self._token
104
105         @misc_utils.log_exception(_moduleLogger)
106         def _on_stream_state(self, s, state):
107                 _moduleLogger.info("State change %r" % state)
108
109
110 if __name__ == "__main__":
111         pass
112