30
30
from audio_player import AudioPlayer
31
31
from common_prefs_utils import get_settings , set_settings , read_settings , write_settings
32
32
from common_ui_utils import FilePathLabel , replace_widget , resource_path
33
- from common_ui_utils import Worker , Node , KeyPressHandler , sample_to_name
33
+ from common_ui_utils import Node , KeyPressHandler , sample_to_name
34
+ from tools .worker import Worker
34
35
from sample_utils import Sample
35
36
from waveform_widgets import WaveformDialog , LoopPointDialog
36
37
@@ -47,11 +48,16 @@ def __init__(self, parent=None):
47
48
self .options = Node ()
48
49
49
50
self .player = AudioPlayer ()
51
+ self .player .signals .message .connect (self .update_message )
52
+
50
53
self .temp_audio = Node ()
51
54
self .playback_thread = None
52
55
53
56
self .threadpool = QtCore .QThreadPool (parent = self )
54
57
self .worker = None
58
+ self .active_workers = []
59
+ self .worker_result = None
60
+ self .event_loop = QtCore .QEventLoop ()
55
61
56
62
self .current_dir = Path (__file__ ).parent
57
63
self .base_dir = self .current_dir .parent
@@ -155,11 +161,21 @@ def get_options(self):
155
161
self .options .suffix = ''
156
162
157
163
def as_worker (self , cmd ):
158
- if self .worker :
159
- if self .worker .running :
160
- return False
161
- self .worker = Worker (cmd )
162
- self .threadpool .start (self .worker )
164
+ if not any (worker .running for worker in self .active_workers ):
165
+ self .worker = Worker (cmd )
166
+
167
+ # Worker signals
168
+ self .worker .signals .progress .connect (self .update_progress )
169
+ self .worker .signals .progress_range .connect (self .update_range )
170
+ self .worker .signals .message .connect (self .update_message )
171
+ self .worker .signals .result .connect (self .handle_result )
172
+
173
+ self .worker .signals .finished .connect (lambda : self .cleanup_worker (self .worker ))
174
+
175
+ self .active_workers .append (self .worker )
176
+ self .threadpool .start (self .worker )
177
+ else :
178
+ print ('Task is already running!' )
163
179
164
180
def browse_files (self ):
165
181
self .refresh_lw_items ()
@@ -254,9 +270,7 @@ def play_lw_item(self, *args):
254
270
audio_file = args [0 ].data (Qt .Qt .UserRole )
255
271
if os .path .isfile (audio_file ):
256
272
data , sr = sf .read (audio_file )
257
- self .playback_thread = threading .Thread (target = self .player .play ,
258
- args = (data , sr , None , None , self .progress_pb .setFormat ),
259
- daemon = True )
273
+ self .playback_thread = threading .Thread (target = self .player .play , args = (data , sr , None , None ), daemon = True )
260
274
self .playback_thread .start ()
261
275
262
276
def key_lw_items_event (self , event ):
@@ -295,7 +309,7 @@ def key_lw_items_event(self, event):
295
309
296
310
def play_stop_toggle (self ):
297
311
if self .player .is_playing .is_set ():
298
- self .player .stop (msg = self . progress_pb . setFormat )
312
+ self .player .stop ()
299
313
else :
300
314
items = self .files_lw .selectedItems ()
301
315
if items :
@@ -304,8 +318,7 @@ def play_stop_toggle(self):
304
318
data , sr = sf .read (audio_file )
305
319
info = Sample (audio_file )
306
320
self .playback_thread = threading .Thread (target = self .player .play ,
307
- args = (data , sr , info .loopStart , info .loopEnd ,
308
- self .progress_pb .setFormat ), daemon = True )
321
+ args = (data , sr , info .loopStart , info .loopEnd ), daemon = True )
309
322
self .playback_thread .start ()
310
323
311
324
@staticmethod
@@ -341,7 +354,7 @@ def lw_drop_event(self, event):
341
354
event .ignore ()
342
355
343
356
def closeEvent (self , event ):
344
- self .player .stop (msg = None )
357
+ self .player .stop ()
345
358
self .removeEventFilter (self )
346
359
print (f'{ self .objectName ()} closed' )
347
360
event .accept ()
@@ -393,14 +406,14 @@ def load_settings(self):
393
406
result = read_settings (widget = self , filepath = None , startdir = p , ext = self .settings_ext )
394
407
if result :
395
408
os .chdir (result .parent )
396
- self .progress_pb . setFormat (f'{ result .name } loaded' )
409
+ self .update_message (f'{ result .name } loaded' )
397
410
398
411
def save_settings (self ):
399
412
self .set_settings_path ()
400
413
result = write_settings (widget = self , filepath = None , startdir = self .settings_path , ext = self .settings_ext )
401
414
if result :
402
415
os .chdir (result .parent )
403
- self .progress_pb . setFormat (f'{ result .name } saved' )
416
+ self .update_message (f'{ result .name } saved' )
404
417
405
418
def get_defaults (self ):
406
419
get_settings (self , self .default_settings )
@@ -409,6 +422,24 @@ def restore_defaults(self):
409
422
set_settings (widget = self , node = self .default_settings )
410
423
self .progress_pb .setFormat (f'Default settings restored' )
411
424
425
+ def update_progress (self , value ):
426
+ self .progress_pb .setValue (value )
427
+
428
+ def update_message (self , message ):
429
+ self .progress_pb .setFormat (message )
430
+
431
+ def update_range (self , mn , mx ):
432
+ self .progress_pb .setRange (mn , mx )
433
+ self .progress_pb .update ()
434
+
435
+ def handle_result (self , value ):
436
+ self .worker_result = value
437
+ self .event_loop .quit ()
438
+
439
+ def cleanup_worker (self , worker ):
440
+ if worker in self .active_workers :
441
+ self .active_workers .remove (worker )
442
+
412
443
413
444
def launch (mw , app_id = '' ):
414
445
"""
0 commit comments