Cancel button stops pre-processing too.
This commit is contained in:
parent
6bf36d0324
commit
73a0492585
|
@ -27,6 +27,7 @@ class Component(__base__.Component):
|
|||
page.pushButton_visColor.setStyleSheet(btnStyle)
|
||||
page.lineEdit_visColor.textChanged.connect(self.update)
|
||||
self.page = page
|
||||
self.canceled = False
|
||||
return page
|
||||
|
||||
def update(self):
|
||||
|
@ -59,6 +60,8 @@ class Component(__base__.Component):
|
|||
self.spectrumArray = {}
|
||||
|
||||
for i in range(0, len(self.completeAudioArray), self.sampleSize):
|
||||
if self.canceled:
|
||||
break
|
||||
self.lastSpectrum = self.transformData(i, self.completeAudioArray, self.sampleSize,
|
||||
self.smoothConstantDown, self.smoothConstantUp, self.lastSpectrum)
|
||||
self.spectrumArray[i] = copy(self.lastSpectrum)
|
||||
|
@ -142,3 +145,9 @@ class Component(__base__.Component):
|
|||
im.paste(imTop, (0, y), mask=imTop)
|
||||
|
||||
return im
|
||||
|
||||
def cancel(self):
|
||||
self.canceled = True
|
||||
|
||||
def reset(self):
|
||||
self.canceled = False
|
||||
|
|
|
@ -141,3 +141,9 @@ class Component(__base__.Component):
|
|||
return
|
||||
self.page.lineEdit_textColor.setText(RGBstring)
|
||||
self.page.pushButton_textColor.setStyleSheet(btnStyle)
|
||||
|
||||
def cancel(self):
|
||||
self.canceled = True
|
||||
|
||||
def reset(self):
|
||||
self.canceled = False
|
9
core.py
9
core.py
|
@ -7,6 +7,7 @@ from PIL import Image
|
|||
import tempfile
|
||||
from shutil import rmtree
|
||||
import atexit
|
||||
import time
|
||||
|
||||
class Core():
|
||||
|
||||
|
@ -67,6 +68,8 @@ class Core():
|
|||
completeAudioArray = numpy.empty(0, dtype="int16")
|
||||
|
||||
while True:
|
||||
if self.canceled:
|
||||
break
|
||||
# read 2 seconds of audio
|
||||
raw_audio = in_pipe.stdout.read(88200*4)
|
||||
if len(raw_audio) == 0:
|
||||
|
@ -110,3 +113,9 @@ class Core():
|
|||
shell=True
|
||||
)
|
||||
return sorted([os.path.join(self.tempDir, f) for f in os.listdir(self.tempDir)])
|
||||
|
||||
def cancel(self):
|
||||
self.canceled = True
|
||||
|
||||
def reset(self):
|
||||
self.canceled = False
|
||||
|
|
31
main.py
31
main.py
|
@ -253,14 +253,15 @@ class Main(QtCore.QObject):
|
|||
|
||||
def stopVideo(self):
|
||||
print('stop')
|
||||
try:
|
||||
self.videoWorker.stopVideo()
|
||||
except:
|
||||
pass
|
||||
self.videoWorker.cancel()
|
||||
self.canceled = True
|
||||
|
||||
def createAudioVisualisation(self):
|
||||
# create output video if mandatory settings are filled in
|
||||
if self.window.lineEdit_audioFile.text() and self.window.lineEdit_outputFile.text():
|
||||
self.canceled = False
|
||||
self.startExport = True
|
||||
self.progressBarUpdated(-1)
|
||||
ffmpeg_cmd = self.settings.value("ffmpeg_cmd", expanduser("~"))
|
||||
|
||||
self.videoThread = QtCore.QThread(self)
|
||||
|
@ -281,7 +282,27 @@ class Main(QtCore.QObject):
|
|||
self.showMessage("You must select an audio file and output filename.")
|
||||
|
||||
def progressBarUpdated(self, value):
|
||||
self.window.progressBar_createVideo.setValue(value)
|
||||
if value != -1:
|
||||
self.window.progressBar_createVideo.setValue(value)
|
||||
|
||||
if self.canceled:
|
||||
self.window.pushButton_createVideo.setEnabled(True)
|
||||
self.window.pushButton_Cancel.setEnabled(False)
|
||||
self.startExport = False
|
||||
return
|
||||
|
||||
if value == 100 or value == 0:
|
||||
if not self.startExport:
|
||||
self.window.pushButton_createVideo.setEnabled(True)
|
||||
self.window.pushButton_Cancel.setEnabled(False)
|
||||
else:
|
||||
if value == -1:
|
||||
self.startExport = True
|
||||
else:
|
||||
self.startExport = False
|
||||
self.window.pushButton_createVideo.setEnabled(False)
|
||||
self.window.pushButton_Cancel.setEnabled(True)
|
||||
|
||||
|
||||
def progressBarSetText(self, value):
|
||||
self.window.progressBar_createVideo.setFormat(value)
|
||||
|
|
|
@ -711,6 +711,9 @@
|
|||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_Cancel">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Cancel</string>
|
||||
</property>
|
||||
|
|
|
@ -82,20 +82,16 @@ class Worker(QtCore.QObject):
|
|||
)
|
||||
layer = self.core.drawBaseImage(self.backgroundFrames[i])
|
||||
background.paste(layer)
|
||||
return background
|
||||
|
||||
def stopVideo(self):
|
||||
print('Stop Export')
|
||||
self.canceled = True
|
||||
self.out_pipe.send_signal(signal.SIGINT)
|
||||
return background
|
||||
|
||||
@pyqtSlot(str, str, str, list)
|
||||
def createVideo(self, backgroundImage, inputFile, outputFile, components):
|
||||
self.components = components
|
||||
self.outputFile = outputFile
|
||||
self.reset()
|
||||
self.width = int(self.core.settings.value('outputWidth'))
|
||||
self.height = int(self.core.settings.value('outputHeight'))
|
||||
# print('worker thread id: {}'.format(QtCore.QThread.currentThreadId()))
|
||||
self.components = components
|
||||
progressBarValue = 0
|
||||
self.progressBarUpdate.emit(progressBarValue)
|
||||
self.progressBarSetText.emit('Loading background image…')
|
||||
|
@ -154,14 +150,14 @@ class Worker(QtCore.QObject):
|
|||
|
||||
# initialize components
|
||||
print('loaded components:',
|
||||
["%s%s" % (num, str(component)) for num, component in enumerate(components)])
|
||||
["%s%s" % (num, str(component)) for num, component in enumerate(self.components)])
|
||||
self.staticComponents = {}
|
||||
for compNo, comp in enumerate(components):
|
||||
for compNo, comp in enumerate(self.components):
|
||||
properties = None
|
||||
properties = comp.preFrameRender(
|
||||
worker=self,
|
||||
completeAudioArray=self.completeAudioArray,
|
||||
sampleSize=self.sampleSize
|
||||
sampleSize=self.sampleSize,
|
||||
)
|
||||
|
||||
if properties and 'static' in properties:
|
||||
|
@ -189,29 +185,29 @@ class Worker(QtCore.QObject):
|
|||
|
||||
frameBuffer = {}
|
||||
self.lastPreview = 0.0
|
||||
if not self.canceled:
|
||||
for i in range(0, len(self.completeAudioArray), self.sampleSize):
|
||||
while True:
|
||||
if i in frameBuffer:
|
||||
# if frame's in buffer, pipe it to ffmpeg
|
||||
break
|
||||
# else fetch the next frame & add to the buffer
|
||||
data = self.renderQueue.get()
|
||||
frameBuffer[data[0]] = data[1]
|
||||
self.renderQueue.task_done()
|
||||
|
||||
for i in range(0, len(self.completeAudioArray), self.sampleSize):
|
||||
while True:
|
||||
if i in frameBuffer:
|
||||
# if frame's in buffer, pipe it to ffmpeg
|
||||
try:
|
||||
self.out_pipe.stdin.write(frameBuffer[i].tobytes())
|
||||
self.previewQueue.put([i, frameBuffer[i]])
|
||||
del frameBuffer[i]
|
||||
except:
|
||||
break
|
||||
# else fetch the next frame & add to the buffer
|
||||
data = self.renderQueue.get()
|
||||
frameBuffer[data[0]] = data[1]
|
||||
self.renderQueue.task_done()
|
||||
|
||||
try:
|
||||
self.out_pipe.stdin.write(frameBuffer[i].tobytes())
|
||||
self.previewQueue.put([i, frameBuffer[i]])
|
||||
del frameBuffer[i]
|
||||
except:
|
||||
break
|
||||
|
||||
# increase progress bar value
|
||||
if progressBarValue + 1 <= (i / len(self.completeAudioArray)) * 100:
|
||||
progressBarValue = numpy.floor((i / len(self.completeAudioArray)) * 100)
|
||||
self.progressBarUpdate.emit(progressBarValue)
|
||||
self.progressBarSetText.emit('%s%%' % str(int(progressBarValue)))
|
||||
# increase progress bar value
|
||||
if progressBarValue + 1 <= (i / len(self.completeAudioArray)) * 100:
|
||||
progressBarValue = numpy.floor((i / len(self.completeAudioArray)) * 100)
|
||||
self.progressBarUpdate.emit(progressBarValue)
|
||||
self.progressBarSetText.emit('%s%%' % str(int(progressBarValue)))
|
||||
|
||||
numpy.seterr(all='print')
|
||||
|
||||
|
@ -224,7 +220,10 @@ class Worker(QtCore.QObject):
|
|||
self.out_pipe.wait()
|
||||
if self.canceled:
|
||||
print("Export Canceled")
|
||||
os.remove(self.outputFile)
|
||||
try:
|
||||
os.remove(self.outputFile)
|
||||
except:
|
||||
pass
|
||||
self.progressBarUpdate.emit(0)
|
||||
self.progressBarSetText.emit('Export Canceled')
|
||||
else:
|
||||
|
@ -243,3 +242,22 @@ class Worker(QtCore.QObject):
|
|||
self.core.deleteTempDir()
|
||||
|
||||
self.videoCreated.emit()
|
||||
|
||||
def cancel(self):
|
||||
self.canceled = True
|
||||
self.core.cancel()
|
||||
|
||||
for comp in self.components:
|
||||
comp.cancel()
|
||||
|
||||
try:
|
||||
self.out_pipe.send_signal(signal.SIGINT)
|
||||
except:
|
||||
pass
|
||||
|
||||
def reset(self):
|
||||
self.core.reset()
|
||||
|
||||
self.canceled = False
|
||||
for comp in self.components:
|
||||
comp.reset()
|
||||
|
|
Reference in New Issue