add mainwindow style
[KRepeater.git] / src / mprocess.py
blobbfcf78e3043c8fe75fc22c6d4b4e01460430ff14
1 #!/usr/bin/env python
3 from PyQt4.QtCore import SIGNAL,SLOT,Qt
5 from PyQt4.QtCore import QProcess
6 from PyQt4.QtCore import QStringList
8 import re
10 class MProcess(QProcess):
11 """ Mplayer process controller
12 Signals: stopped()
13 """
15 STOPPED, PAUSED, PLAYING = range(3)
16 INTERVAL = 200 #For check timer
18 def __init__(self, wid = None, parent = None):
19 super(MProcess, self).__init__(parent)
20 self.playerState = MProcess.STOPPED
21 ##The current file's name.
22 self.fileName = None
24 ##Slider should be a QSlider or its subclass-object
25 ##self.slider will be update it isn't None
26 self.slider = None
28 ##The Widget Id which used to play vedio.
29 self.wid = wid
31 ##Point A and Point B used to circle
32 self.pa = None;
33 self.pb = None;
35 self.timerId = self.startTimer(MProcess.INTERVAL)
37 self.timePos = None
38 self.timeLength = None
40 self.connect(self, SIGNAL("readyReadStandardOutput()"),
41 self.analyseResult)
42 self.connect(self, SIGNAL("readyReadStandardError()"),
43 self.analyseResult)
45 #END def __init__(self, parent = None):
47 def setSlider(self,slider):
48 self.slider = slider
49 self.connect(self.slider,SIGNAL("sliderPressed()"),
50 self.sliderPressed)
51 self.connect(self.slider,SIGNAL("sliderReleased()"),
52 self.sliderReleased)
53 #END def setSlider(self,slider):
55 def sliderPressed(self):
56 if(self.playerState == MProcess.PLAYING):
57 self.pause()
58 #END def sliderPressed(self):
60 def sliderReleased(self):
61 self.timePos = self.slider.value()
62 self.write("seek "+ str(self.slider.value()) + " 2\n")
63 self.pause()
64 #END def sliderReleased(self):
66 def setFileName(self,fileName):
67 self.fileName = fileName
69 #END def setFileName(self,fileName):
71 def play(self):
72 if(self.fileName == None):
73 return
75 cmd = "mplayer"
76 args = QStringList(["-slave",
77 "-quiet",
78 "-wid", str(self.wid), self.fileName])
80 if(self.state() != QProcess.NotRunning):
81 self.terminate()
82 if(not self.waitForFinished()):
83 self.kill()
84 self.timeLength = None
87 self.playerState = MProcess.PLAYING
88 self.start(cmd, args)
89 self.setupTimer()
90 #END def play(self)
92 def setA(self):
93 self.pa = int(self.timePos)/5*5;
95 def setB(self):
96 self.pb = int(self.timePos);
98 def cleanPoints(self):
99 self.pa = None
100 self.pb = None
102 #END def setCirclePoint(self):
104 def setVolume(self,value):
105 if(self.playerState == MProcess.PLAYING):
106 self.write("volume " + str(value) + " 1\n")
107 else:
108 pass
109 #END def setVolume(self,value):
111 def setupTimer(self):
112 if(self.timerId == None):
113 self.timerId = self.startTimer(MProcess.INTERVAL)
114 else:
115 pass
116 #END def setupTimer(self):
118 def closeTimer(self):
119 if(self.timerId != None):
120 self.killTimer(self.timerId)
121 self.timerId = None
122 else:
123 pass
124 #END def closeTimer(self):
126 def pause(self):
127 if(self.playerState == MProcess.PAUSED):
128 self.playerState = MProcess.PLAYING
129 self.setupTimer()
130 elif(self.playerState == MProcess.PLAYING):
131 self.closeTimer()
132 self.playerState = MProcess.PAUSED
133 else: ## if STOPPED, then return directly
134 self.closeTimer()
135 return
136 self.write("pause \n")
137 #END def pause(self):
139 def stop(self):
140 self.closeTimer()
141 self.playerState == MProcess.STOPPED
142 self.timeLength = None
143 self.write("stop \n")
144 #END def stop(self):
146 def analyseResult(self):
147 resStr = self.readAll().data()
148 if(re.search("POSITION",resStr)):
149 self.timePos = float((re.search("\d+\.?\d",resStr).group(0)))
150 elif(re.search("LENGTH",resStr)):
151 self.timeLength = float(re.search("\d+\.?\d",resStr).group(0))
152 if(self.slider != None):
153 self.slider.setRange(0,int(self.timeLength)+1)
154 elif(re.search("End of file",resStr)):
155 self.closeTimer()
156 self.playerState = MProcess.STOPPED
157 self.emit(SIGNAL("stopped()"))
158 else:
159 print resStr
163 if(self.pa == None or self.pb == None):
164 return
166 if( self.pa >= self.pb ):
167 self.pb += 10
169 if(self.timePos > self.pb):
170 self.timePos = self.pa
171 self.write("seek "+ str(self.pa) + " 2\n")
173 #END def analyseResult(self):
175 def timerEvent(self,event):
176 if(event.timerId() != self.timerId):
177 return
179 print self.timePos, " ", self.pa, " ", self.pb
180 if(self.slider != None and self.timePos != None):
181 self.slider.setValue(int(self.timePos))
183 if(self.playerState == MProcess.PAUSED):
184 self.closeTimer()
185 return
187 if(self.state() == QProcess.NotRunning):
188 self.closeTimer()
189 self.playerState = MProcess.STOPPED
190 return
192 self.write("get_time_pos\n")
194 if(self.timeLength == None):
195 self.write("get_time_length\n")
196 else:
197 self.emit(SIGNAL("updateStatus()"))
198 #END def timerEvent(self,event):
200 #END class MProcess(QProcess):