@@ -43,7 +43,8 @@ int DEBUG_SCREENCAST_ENABLED = FALSE;
43
43
(*env)->ExceptionDescribe(env); \
44
44
}
45
45
46
- static volatile gboolean sessionClosed = TRUE;
46
+ static gboolean hasPipewireFailed = FALSE;
47
+ static gboolean sessionClosed = TRUE;
47
48
static GString * activeSessionToken ;
48
49
49
50
struct ScreenSpace screenSpace = {0 };
@@ -171,6 +172,7 @@ static gboolean initScreencast(const gchar *token,
171
172
}
172
173
173
174
gtk -> g_string_printf (activeSessionToken , "%s" , token );
175
+ hasPipewireFailed = FALSE;
174
176
sessionClosed = FALSE;
175
177
return TRUE;
176
178
}
@@ -338,6 +340,8 @@ static void onStreamProcess(void *userdata) {
338
340
339
341
DEBUG_SCREEN_PREFIX (screen , "data ready\n" , NULL );
340
342
fp_pw_stream_queue_buffer (data -> stream , pwBuffer );
343
+
344
+ fp_pw_thread_loop_signal (pw .loop , FALSE);
341
345
}
342
346
343
347
static void onStreamStateChanged (
@@ -351,6 +355,12 @@ static void onStreamStateChanged(
351
355
old , fp_pw_stream_state_as_string (old ),
352
356
state , fp_pw_stream_state_as_string (state ),
353
357
error );
358
+ if (state == PW_STREAM_STATE_ERROR
359
+ || state == PW_STREAM_STATE_UNCONNECTED ) {
360
+
361
+ hasPipewireFailed = TRUE;
362
+ fp_pw_thread_loop_signal (pw .loop , FALSE);
363
+ }
354
364
}
355
365
356
366
static const struct pw_stream_events streamEvents = {
@@ -473,15 +483,18 @@ static gboolean connectStream(int index) {
473
483
474
484
while (!data -> hasFormat ) {
475
485
fp_pw_thread_loop_wait (pw .loop );
486
+ fp_pw_thread_loop_accept (pw .loop );
487
+ if (hasPipewireFailed ) {
488
+ fp_pw_thread_loop_unlock (pw .loop );
489
+ return FALSE;
490
+ }
476
491
}
477
492
478
493
DEBUG_SCREEN_PREFIX (data -> screenProps ,
479
494
"frame size: %dx%d\n" ,
480
495
data -> rawFormat .size .width , data -> rawFormat .size .height
481
496
);
482
497
483
- fp_pw_thread_loop_accept (pw .loop );
484
-
485
498
return TRUE;
486
499
}
487
500
@@ -539,7 +552,12 @@ static void onCoreError(
539
552
"!!! pipewire error: id %u, seq: %d, res: %d (%s): %s\n" ,
540
553
id , seq , res , strerror (res ), message
541
554
);
542
- fp_pw_thread_loop_unlock (pw .loop );
555
+ if (id == PW_ID_CORE ) {
556
+ fp_pw_thread_loop_lock (pw .loop );
557
+ hasPipewireFailed = TRUE;
558
+ fp_pw_thread_loop_signal (pw .loop , FALSE);
559
+ fp_pw_thread_loop_unlock (pw .loop );
560
+ }
543
561
}
544
562
545
563
static const struct pw_core_events coreEvents = {
@@ -904,7 +922,15 @@ JNIEXPORT jint JNICALL Java_sun_awt_screencast_ScreencastHelper_getRGBPixelsImpl
904
922
}
905
923
906
924
while (!isAllDataReady ()) {
925
+ fp_pw_thread_loop_lock (pw .loop );
907
926
fp_pw_thread_loop_wait (pw .loop );
927
+ if (hasPipewireFailed ) {
928
+ fp_pw_thread_loop_unlock (pw .loop );
929
+ doCleanup ();
930
+ releaseToken (env , jtoken , token );
931
+ return RESULT_ERROR ;
932
+ }
933
+ fp_pw_thread_loop_unlock (pw .loop );
908
934
}
909
935
910
936
DEBUG_SCREENCAST ("\nall data ready\n" , NULL );
0 commit comments