Cancel button stops pre-processing too.

This commit is contained in:
DH4 2017-06-02 00:30:44 -05:00
parent 6bf36d0324
commit 73a0492585
6 changed files with 102 additions and 36 deletions

View File

@ -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

View File

@ -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

View File

@ -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
View File

@ -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)

View File

@ -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>

View File

@ -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()