Add function to remember the last path
[KRepeater.git] / src / mprocess.py
blob2f5ff3e1400f767d55ff26ea5022cb1a28d6a301
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()"),self.pause)
50 self.connect(self.slider,SIGNAL("sliderReleased()"),self.seek)
51 #END def setSlider(self,slider):
53 def seek(self):
54 self.timePos = self.slider.value()
55 self.write("seek "+ str(self.slider.value()) + " 2\n")
56 self.pause()
57 #END def seek(self,value):
59 def setFileName(self,fileName):
60 self.fileName = fileName
62 #END def setFileName(self,fileName):
64 def play(self):
65 if(self.fileName == None):
66 return
68 cmd = "mplayer"
69 args = QStringList(["-slave",
70 "-quiet",
71 "-wid", str(self.wid), self.fileName])
73 if(self.state() != QProcess.NotRunning):
74 print "self.terminate()"
75 self.terminate()
76 if(not self.waitForFinished()):
77 self.kill()
78 self.timeLength = None
81 self.playerState = MProcess.PLAYING
82 self.start(cmd, args)
83 self.setupTimer()
84 #END def play(self)
86 def setA(self):
87 self.pa = int(self.timePos)/10*10;
89 def setB(self):
90 self.pb = int(self.timePos) + 1;
92 def cleanPoints(self):
93 self.pa = None
94 self.pb = None
96 #END def setCirclePoint(self):
98 def setVolume(self,value):
99 if(self.playerState == MProcess.PLAYING):
100 self.write("volume " + str(value) + " 1\n")
101 else:
102 pass
103 #END def setVolume(self,value):
105 def setupTimer(self):
106 if(self.timerId == None):
107 self.timerId = self.startTimer(MProcess.INTERVAL)
108 else:
109 pass
110 #END def setupTimer(self):
112 def closeTimer(self):
113 if(self.timerId != None):
114 self.killTimer(self.timerId)
115 self.timerId = None
116 else:
117 pass
118 #END def closeTimer(self):
120 def pause(self):
121 if(self.playerState == MProcess.PAUSED):
122 self.playerState = MProcess.PLAYING
123 self.setupTimer()
124 elif(self.playerState == MProcess.PLAYING):
125 self.closeTimer()
126 self.playerState = MProcess.PAUSED
127 else: ## if STOPPED, then return directly
128 self.closeTimer()
129 return
130 self.write("pause \n")
131 #END def pause(self):
133 def stop(self):
134 self.closeTimer()
135 self.playerState == MProcess.STOPPED
136 self.timeLength = None
137 self.write("stop \n")
138 #END def stop(self):
140 def analyseResult(self):
141 resStr = self.readAll().data()
142 if(re.search("POSITION",resStr)):
143 self.timePos = float((re.search("\d+\.?\d",resStr).group(0)))
144 elif(re.search("LENGTH",resStr)):
145 self.timeLength = float(re.search("\d+\.?\d",resStr).group(0))
146 if(self.slider != None):
147 self.slider.setRange(0,int(self.timeLength)+1)
148 print self.timeLength
149 elif(re.search("End of file",resStr)):
150 self.closeTimer()
151 self.playerState = MProcess.STOPPED
152 self.emit(SIGNAL("stopped()"))
153 else:
154 print resStr
158 if(self.pa == None or self.pb == None):
159 return
161 if( self.pa >= self.pb ):
162 self.pb += 10
164 if(self.timePos > self.pb):
165 self.timePos = self.pa
166 print "seek "+ str(self.pa) + " 0\n"
167 self.write("seek "+ str(self.pa) + " 2\n")
169 #END def analyseResult(self):
171 def timerEvent(self,event):
172 if(event.timerId() != self.timerId):
173 return
175 print self.timePos, " ", self.pa, " ", self.pb
176 if(self.slider != None and self.timePos != None):
177 self.slider.setValue(int(self.timePos))
180 if(self.playerState == MProcess.PAUSED):
181 self.closeTimer()
182 return
184 if(self.state() == QProcess.NotRunning):
185 self.closeTimer()
186 self.playerState = MProcess.STOPPED
187 self.emit(SIGNAL("stopped()"))
188 return
190 self.write("get_time_pos\n")
191 if(self.timeLength == None):
192 self.write("get_time_length\n")
194 #END def timerEvent(self,event):
196 #END class MProcess(QProcess):