aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--components/original.py9
-rw-r--r--components/text.py6
-rw-r--r--core.py9
-rw-r--r--main.py31
-rw-r--r--mainwindow.ui3
-rw-r--r--video_thread.py82
6 files changed, 103 insertions, 37 deletions
diff --git a/components/original.py b/components/original.py
index 382c3ab..e1240e9 100644
--- a/components/original.py
+++ b/components/original.py
@@ -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
diff --git a/components/text.py b/components/text.py
index 9237167..da2706b 100644
--- a/components/text.py
+++ b/components/text.py
@@ -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 \ No newline at end of file
diff --git a/core.py b/core.py
index 5478f93..0bbe001 100644
--- a/core.py
+++ b/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
diff --git a/main.py b/main.py
index bb42d1f..94020b2 100644
--- a/main.py
+++ b/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)
diff --git a/mainwindow.ui b/mainwindow.ui
index 808073b..6119e63 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -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>
diff --git a/video_thread.py b/video_thread.py
index 2e9eb13..504102a 100644
--- a/video_thread.py
+++ b/video_thread.py
@@ -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
-
- 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
+ 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()
+
+ 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()