@@ -38,7 +38,6 @@ struct QJack;
38
38
39
39
typedef enum QJackState {
40
40
QJACK_STATE_DISCONNECTED ,
41
- QJACK_STATE_STOPPED ,
42
41
QJACK_STATE_RUNNING ,
43
42
QJACK_STATE_SHUTDOWN
44
43
}
@@ -57,7 +56,7 @@ typedef struct QJackClient {
57
56
AudiodevJackPerDirectionOptions * opt ;
58
57
59
58
bool out ;
60
- bool finished ;
59
+ bool enabled ;
61
60
bool connect_ports ;
62
61
int packets ;
63
62
@@ -272,9 +271,17 @@ static int qjack_process(jack_nframes_t nframes, void *arg)
272
271
}
273
272
274
273
if (c -> out ) {
275
- qjack_buffer_read_l (& c -> fifo , buffers , nframes );
274
+ if (likely (c -> enabled )) {
275
+ qjack_buffer_read_l (& c -> fifo , buffers , nframes );
276
+ } else {
277
+ for (int i = 0 ; i < c -> nchannels ; ++ i ) {
278
+ memset (buffers [i ], 0 , nframes * sizeof (float ));
279
+ }
280
+ }
276
281
} else {
277
- qjack_buffer_write_l (& c -> fifo , buffers , nframes );
282
+ if (likely (c -> enabled )) {
283
+ qjack_buffer_write_l (& c -> fifo , buffers , nframes );
284
+ }
278
285
}
279
286
280
287
return 0 ;
@@ -315,8 +322,8 @@ static void qjack_client_recover(QJackClient *c)
315
322
if (c -> state == QJACK_STATE_DISCONNECTED &&
316
323
c -> packets % 100 == 0 ) {
317
324
318
- /* if not finished then attempt to recover */
319
- if (! c -> finished ) {
325
+ /* if enabled then attempt to recover */
326
+ if (c -> enabled ) {
320
327
dolog ("attempting to reconnect to server\n" );
321
328
qjack_client_init (c );
322
329
}
@@ -388,7 +395,10 @@ static int qjack_client_init(QJackClient *c)
388
395
char client_name [jack_client_name_size ()];
389
396
jack_options_t options = JackNullOption ;
390
397
391
- c -> finished = false;
398
+ if (c -> state == QJACK_STATE_RUNNING ) {
399
+ return 0 ;
400
+ }
401
+
392
402
c -> connect_ports = true;
393
403
394
404
snprintf (client_name , sizeof (client_name ), "%s-%s" ,
@@ -434,17 +444,6 @@ static int qjack_client_init(QJackClient *c)
434
444
jack_set_xrun_callback (c -> client , qjack_xrun , c );
435
445
jack_on_shutdown (c -> client , qjack_shutdown , c );
436
446
437
- /*
438
- * ensure the buffersize is no smaller then 512 samples, some (all?) qemu
439
- * virtual devices do not work correctly otherwise
440
- */
441
- if (c -> buffersize < 512 ) {
442
- c -> buffersize = 512 ;
443
- }
444
-
445
- /* create a 2 period buffer */
446
- qjack_buffer_create (& c -> fifo , c -> nchannels , c -> buffersize * 2 );
447
-
448
447
/* allocate and register the ports */
449
448
c -> port = g_malloc (sizeof (jack_port_t * ) * c -> nchannels );
450
449
for (int i = 0 ; i < c -> nchannels ; ++ i ) {
@@ -468,6 +467,17 @@ static int qjack_client_init(QJackClient *c)
468
467
jack_activate (c -> client );
469
468
c -> buffersize = jack_get_buffer_size (c -> client );
470
469
470
+ /*
471
+ * ensure the buffersize is no smaller then 512 samples, some (all?) qemu
472
+ * virtual devices do not work correctly otherwise
473
+ */
474
+ if (c -> buffersize < 512 ) {
475
+ c -> buffersize = 512 ;
476
+ }
477
+
478
+ /* create a 2 period buffer */
479
+ qjack_buffer_create (& c -> fifo , c -> nchannels , c -> buffersize * 2 );
480
+
471
481
qjack_client_connect_ports (c );
472
482
c -> state = QJACK_STATE_RUNNING ;
473
483
return 0 ;
@@ -479,13 +489,13 @@ static int qjack_init_out(HWVoiceOut *hw, struct audsettings *as,
479
489
QJackOut * jo = (QJackOut * )hw ;
480
490
Audiodev * dev = (Audiodev * )drv_opaque ;
481
491
482
- if (jo -> c .state != QJACK_STATE_DISCONNECTED ) {
483
- return 0 ;
484
- }
492
+ qjack_client_fini (& jo -> c );
485
493
486
494
jo -> c .out = true;
495
+ jo -> c .enabled = false;
487
496
jo -> c .nchannels = as -> nchannels ;
488
497
jo -> c .opt = dev -> u .jack .out ;
498
+
489
499
int ret = qjack_client_init (& jo -> c );
490
500
if (ret != 0 ) {
491
501
return ret ;
@@ -515,13 +525,13 @@ static int qjack_init_in(HWVoiceIn *hw, struct audsettings *as,
515
525
QJackIn * ji = (QJackIn * )hw ;
516
526
Audiodev * dev = (Audiodev * )drv_opaque ;
517
527
518
- if (ji -> c .state != QJACK_STATE_DISCONNECTED ) {
519
- return 0 ;
520
- }
528
+ qjack_client_fini (& ji -> c );
521
529
522
530
ji -> c .out = false;
531
+ ji -> c .enabled = false;
523
532
ji -> c .nchannels = as -> nchannels ;
524
533
ji -> c .opt = dev -> u .jack .in ;
534
+
525
535
int ret = qjack_client_init (& ji -> c );
526
536
if (ret != 0 ) {
527
537
return ret ;
@@ -549,12 +559,6 @@ static void qjack_client_fini(QJackClient *c)
549
559
{
550
560
switch (c -> state ) {
551
561
case QJACK_STATE_RUNNING :
552
- /* fallthrough */
553
-
554
- case QJACK_STATE_STOPPED :
555
- for (int i = 0 ; i < c -> nchannels ; ++ i ) {
556
- jack_port_unregister (c -> client , c -> port [i ]);
557
- }
558
562
jack_deactivate (c -> client );
559
563
/* fallthrough */
560
564
@@ -575,23 +579,25 @@ static void qjack_client_fini(QJackClient *c)
575
579
static void qjack_fini_out (HWVoiceOut * hw )
576
580
{
577
581
QJackOut * jo = (QJackOut * )hw ;
578
- jo -> c .finished = true;
579
582
qjack_client_fini (& jo -> c );
580
583
}
581
584
582
585
static void qjack_fini_in (HWVoiceIn * hw )
583
586
{
584
587
QJackIn * ji = (QJackIn * )hw ;
585
- ji -> c .finished = true;
586
588
qjack_client_fini (& ji -> c );
587
589
}
588
590
589
591
static void qjack_enable_out (HWVoiceOut * hw , bool enable )
590
592
{
593
+ QJackOut * jo = (QJackOut * )hw ;
594
+ jo -> c .enabled = enable ;
591
595
}
592
596
593
597
static void qjack_enable_in (HWVoiceIn * hw , bool enable )
594
598
{
599
+ QJackIn * ji = (QJackIn * )hw ;
600
+ ji -> c .enabled = enable ;
595
601
}
596
602
597
603
static int qjack_thread_creator (jack_native_thread_t * thread ,
@@ -611,9 +617,6 @@ static int qjack_thread_creator(jack_native_thread_t *thread,
611
617
static void * qjack_init (Audiodev * dev )
612
618
{
613
619
assert (dev -> driver == AUDIODEV_DRIVER_JACK );
614
-
615
- dev -> u .jack .has_in = false;
616
-
617
620
return dev ;
618
621
}
619
622
0 commit comments