@@ -89,12 +89,17 @@ static gboolean initScreenSpace() {
89
89
}
90
90
91
91
static void doCleanup () {
92
+ if (pw .loop ) {
93
+ DEBUG_SCREENCAST ("STOPPING loop\n" , NULL );
94
+ fp_pw_thread_loop_stop (pw .loop );
95
+ }
96
+
92
97
for (int i = 0 ; i < screenSpace .screenCount ; ++ i ) {
93
98
struct ScreenProps * screenProps = & screenSpace .screens [i ];
94
99
if (screenProps -> data ) {
95
100
if (screenProps -> data -> stream ) {
96
- fp_pw_stream_disconnect (screenProps -> data -> stream );
97
101
fp_pw_thread_loop_lock (pw .loop );
102
+ fp_pw_stream_disconnect (screenProps -> data -> stream );
98
103
fp_pw_stream_destroy (screenProps -> data -> stream );
99
104
fp_pw_thread_loop_unlock (pw .loop );
100
105
screenProps -> data -> stream = NULL ;
@@ -116,10 +121,7 @@ static void doCleanup() {
116
121
pw .core = NULL ;
117
122
}
118
123
119
- DEBUG_SCREENCAST ("STOPPING loop\n" , NULL )
120
-
121
124
if (pw .loop ) {
122
- fp_pw_thread_loop_stop (pw .loop );
123
125
fp_pw_thread_loop_destroy (pw .loop );
124
126
pw .loop = NULL ;
125
127
}
@@ -130,6 +132,10 @@ static void doCleanup() {
130
132
screenSpace .screenCount = 0 ;
131
133
}
132
134
135
+ if (!sessionClosed ) {
136
+ fp_pw_deinit ();
137
+ }
138
+
133
139
gtk -> g_string_set_size (activeSessionToken , 0 );
134
140
sessionClosed = TRUE;
135
141
}
@@ -571,6 +577,7 @@ static const struct pw_core_events coreEvents = {
571
577
* @return TRUE on success
572
578
*/
573
579
static gboolean doLoop (GdkRectangle requestedArea ) {
580
+ gboolean isLoopLockTaken = FALSE;
574
581
if (!pw .loop && !sessionClosed ) {
575
582
pw .loop = fp_pw_thread_loop_new ("AWT Pipewire Thread" , NULL );
576
583
@@ -599,6 +606,7 @@ static gboolean doLoop(GdkRectangle requestedArea) {
599
606
}
600
607
601
608
fp_pw_thread_loop_lock (pw .loop );
609
+ isLoopLockTaken = TRUE;
602
610
603
611
pw .core = fp_pw_context_connect_fd (
604
612
pw .context ,
@@ -639,12 +647,16 @@ static gboolean doLoop(GdkRectangle requestedArea) {
639
647
DEBUG_SCREEN_PREFIX (screen , "@@@ screen processed %i\n" , i );
640
648
}
641
649
642
- fp_pw_thread_loop_unlock (pw .loop );
650
+ if (isLoopLockTaken ) {
651
+ fp_pw_thread_loop_unlock (pw .loop );
652
+ }
643
653
644
654
return TRUE;
645
655
646
656
fail :
647
- fp_pw_thread_loop_unlock (pw .loop );
657
+ if (isLoopLockTaken ) {
658
+ fp_pw_thread_loop_unlock (pw .loop );
659
+ }
648
660
doCleanup ();
649
661
return FALSE;
650
662
}
@@ -700,6 +712,7 @@ static gboolean loadSymbols() {
700
712
LOAD_SYMBOL (fp_pw_stream_disconnect , "pw_stream_disconnect" );
701
713
LOAD_SYMBOL (fp_pw_stream_destroy , "pw_stream_destroy" );
702
714
LOAD_SYMBOL (fp_pw_init , "pw_init" );
715
+ LOAD_SYMBOL (fp_pw_deinit , "pw_deinit" );
703
716
LOAD_SYMBOL (fp_pw_context_connect_fd , "pw_context_connect_fd" );
704
717
LOAD_SYMBOL (fp_pw_core_disconnect , "pw_core_disconnect" );
705
718
LOAD_SYMBOL (fp_pw_context_new , "pw_context_new" );
@@ -855,6 +868,33 @@ static void arrayToRectangles(JNIEnv *env,
855
868
(* env )-> ReleaseIntArrayElements (env , boundsArray , body , 0 );
856
869
}
857
870
871
+ static int makeScreencast (
872
+ const gchar * token ,
873
+ GdkRectangle * requestedArea ,
874
+ GdkRectangle * affectedScreenBounds ,
875
+ gint affectedBoundsLength
876
+ ) {
877
+ if (!initScreencast (token , affectedScreenBounds , affectedBoundsLength )) {
878
+ return pw .pwFd ;
879
+ }
880
+
881
+ if (!doLoop (* requestedArea )) {
882
+ return RESULT_ERROR ;
883
+ }
884
+
885
+ while (!isAllDataReady ()) {
886
+ fp_pw_thread_loop_lock (pw .loop );
887
+ fp_pw_thread_loop_wait (pw .loop );
888
+ fp_pw_thread_loop_unlock (pw .loop );
889
+ if (hasPipewireFailed ) {
890
+ doCleanup ();
891
+ return RESULT_ERROR ;
892
+ }
893
+ }
894
+
895
+ return RESULT_OK ;
896
+ }
897
+
858
898
/*
859
899
* Class: sun_awt_screencast_ScreencastHelper
860
900
* Method: closeSession
@@ -911,26 +951,22 @@ JNIEXPORT jint JNICALL Java_sun_awt_screencast_ScreencastHelper_getRGBPixelsImpl
911
951
jx , jy , jwidth , jheight , token
912
952
);
913
953
914
- if (!initScreencast (token , affectedScreenBounds , affectedBoundsLength )) {
915
- releaseToken (env , jtoken , token );
916
- return pw .pwFd ;
917
- }
918
-
919
- if (!doLoop (requestedArea )) {
920
- releaseToken (env , jtoken , token );
921
- return RESULT_ERROR ;
922
- }
954
+ int attemptResult = makeScreencast (
955
+ token , & requestedArea , affectedScreenBounds , affectedBoundsLength );
923
956
924
- while (!isAllDataReady ()) {
925
- fp_pw_thread_loop_lock (pw .loop );
926
- fp_pw_thread_loop_wait (pw .loop );
927
- if (hasPipewireFailed ) {
928
- fp_pw_thread_loop_unlock (pw .loop );
929
- doCleanup ();
957
+ if (attemptResult ) {
958
+ if (attemptResult == RESULT_DENIED ) {
930
959
releaseToken (env , jtoken , token );
931
- return RESULT_ERROR ;
960
+ return attemptResult ;
961
+ }
962
+ DEBUG_SCREENCAST ("Screencast attempt failed with %i, re-trying...\n" ,
963
+ attemptResult );
964
+ attemptResult = makeScreencast (
965
+ token , & requestedArea , affectedScreenBounds , affectedBoundsLength );
966
+ if (attemptResult ) {
967
+ releaseToken (env , jtoken , token );
968
+ return attemptResult ;
932
969
}
933
- fp_pw_thread_loop_unlock (pw .loop );
934
970
}
935
971
936
972
DEBUG_SCREENCAST ("\nall data ready\n" , NULL );
0 commit comments