@@ -4,6 +4,7 @@ package native
4
4
5
5
import (
6
6
"fmt"
7
+ "sync"
7
8
"unsafe"
8
9
9
10
"github.com/rs/zerolog"
@@ -45,6 +46,8 @@ static inline void jetkvm_cgo_setup_rpc_handler() {
45
46
*/
46
47
import "C"
47
48
49
+ var cgoLock sync.Mutex
50
+
48
51
//export jetkvm_go_video_state_handler
49
52
func jetkvm_go_video_state_handler (state * C.jetkvm_video_state_t ) {
50
53
videoState := VideoState {
@@ -100,6 +103,9 @@ func uiEventCodeToName(code int) string {
100
103
}
101
104
102
105
func setUpNativeHandlers () {
106
+ cgoLock .Lock ()
107
+ defer cgoLock .Unlock ()
108
+
103
109
C .jetkvm_cgo_setup_log_handler ()
104
110
C .jetkvm_cgo_setup_video_state_handler ()
105
111
C .jetkvm_cgo_setup_video_handler ()
@@ -108,17 +114,26 @@ func setUpNativeHandlers() {
108
114
}
109
115
110
116
func uiInit (rotation uint16 ) {
117
+ cgoLock .Lock ()
118
+ defer cgoLock .Unlock ()
119
+
111
120
cRotation := C .u_int16_t (rotation )
112
121
defer C .free (unsafe .Pointer (& cRotation ))
113
122
114
123
C .jetkvm_ui_init (cRotation )
115
124
}
116
125
117
126
func uiTick () {
127
+ cgoLock .Lock ()
128
+ defer cgoLock .Unlock ()
129
+
118
130
C .jetkvm_ui_tick ()
119
131
}
120
132
121
133
func videoInit () error {
134
+ cgoLock .Lock ()
135
+ defer cgoLock .Unlock ()
136
+
122
137
ret := C .jetkvm_video_init ()
123
138
if ret != 0 {
124
139
return fmt .Errorf ("failed to initialize video: %d" , ret )
@@ -127,18 +142,30 @@ func videoInit() error {
127
142
}
128
143
129
144
func videoShutdown () {
145
+ cgoLock .Lock ()
146
+ defer cgoLock .Unlock ()
147
+
130
148
C .jetkvm_video_shutdown ()
131
149
}
132
150
133
151
func videoStart () {
152
+ cgoLock .Lock ()
153
+ defer cgoLock .Unlock ()
154
+
134
155
C .jetkvm_video_start ()
135
156
}
136
157
137
158
func videoStop () {
159
+ cgoLock .Lock ()
160
+ defer cgoLock .Unlock ()
161
+
138
162
C .jetkvm_video_stop ()
139
163
}
140
164
141
165
func uiSetVar (name string , value string ) {
166
+ cgoLock .Lock ()
167
+ defer cgoLock .Unlock ()
168
+
142
169
nameCStr := C .CString (name )
143
170
defer C .free (unsafe .Pointer (nameCStr ))
144
171
@@ -149,38 +176,68 @@ func uiSetVar(name string, value string) {
149
176
}
150
177
151
178
func uiGetVar (name string ) string {
179
+ cgoLock .Lock ()
180
+ defer cgoLock .Unlock ()
181
+
152
182
nameCStr := C .CString (name )
153
183
defer C .free (unsafe .Pointer (nameCStr ))
154
184
155
185
return C .GoString (C .jetkvm_ui_get_var (nameCStr ))
156
186
}
157
187
158
188
func uiSwitchToScreen (screen string ) {
189
+ cgoLock .Lock ()
190
+ defer cgoLock .Unlock ()
191
+
159
192
screenCStr := C .CString (screen )
160
193
defer C .free (unsafe .Pointer (screenCStr ))
161
194
C .jetkvm_ui_load_screen (screenCStr )
162
195
}
163
196
164
197
func uiGetCurrentScreen () string {
198
+ cgoLock .Lock ()
199
+ defer cgoLock .Unlock ()
200
+
165
201
screenCStr := C .jetkvm_ui_get_current_screen ()
166
202
return C .GoString (screenCStr )
167
203
}
168
204
169
- func uiObjSetState (objName string , state string ) (bool , error ) {
205
+ func uiObjAddState (objName string , state string ) (bool , error ) {
206
+ cgoLock .Lock ()
207
+ defer cgoLock .Unlock ()
208
+
209
+ objNameCStr := C .CString (objName )
210
+ defer C .free (unsafe .Pointer (objNameCStr ))
211
+ stateCStr := C .CString (state )
212
+ defer C .free (unsafe .Pointer (stateCStr ))
213
+ C .jetkvm_ui_add_state (objNameCStr , stateCStr )
214
+ return true , nil
215
+ }
216
+
217
+ func uiObjClearState (objName string , state string ) (bool , error ) {
218
+ cgoLock .Lock ()
219
+ defer cgoLock .Unlock ()
220
+
170
221
objNameCStr := C .CString (objName )
171
222
defer C .free (unsafe .Pointer (objNameCStr ))
172
223
stateCStr := C .CString (state )
173
224
defer C .free (unsafe .Pointer (stateCStr ))
174
- C .jetkvm_ui_set_state (objNameCStr , stateCStr )
225
+ C .jetkvm_ui_clear_state (objNameCStr , stateCStr )
175
226
return true , nil
176
227
}
177
228
178
229
func uiGetLVGLVersion () string {
230
+ cgoLock .Lock ()
231
+ defer cgoLock .Unlock ()
232
+
179
233
return C .GoString (C .jetkvm_ui_get_lvgl_version ())
180
234
}
181
235
182
236
// TODO: use Enum instead of string but it's not a hot path and performance is not a concern now
183
237
func uiObjAddFlag (objName string , flag string ) (bool , error ) {
238
+ cgoLock .Lock ()
239
+ defer cgoLock .Unlock ()
240
+
184
241
objNameCStr := C .CString (objName )
185
242
defer C .free (unsafe .Pointer (objNameCStr ))
186
243
flagCStr := C .CString (flag )
@@ -190,6 +247,9 @@ func uiObjAddFlag(objName string, flag string) (bool, error) {
190
247
}
191
248
192
249
func uiObjClearFlag (objName string , flag string ) (bool , error ) {
250
+ cgoLock .Lock ()
251
+ defer cgoLock .Unlock ()
252
+
193
253
objNameCStr := C .CString (objName )
194
254
defer C .free (unsafe .Pointer (objNameCStr ))
195
255
flagCStr := C .CString (flag )
@@ -207,6 +267,9 @@ func uiObjShow(objName string) (bool, error) {
207
267
}
208
268
209
269
func uiObjSetOpacity (objName string , opacity int ) (bool , error ) {
270
+ cgoLock .Lock ()
271
+ defer cgoLock .Unlock ()
272
+
210
273
objNameCStr := C .CString (objName )
211
274
defer C .free (unsafe .Pointer (objNameCStr ))
212
275
@@ -215,6 +278,9 @@ func uiObjSetOpacity(objName string, opacity int) (bool, error) {
215
278
}
216
279
217
280
func uiObjFadeIn (objName string , duration uint32 ) (bool , error ) {
281
+ cgoLock .Lock ()
282
+ defer cgoLock .Unlock ()
283
+
218
284
objNameCStr := C .CString (objName )
219
285
defer C .free (unsafe .Pointer (objNameCStr ))
220
286
@@ -224,6 +290,9 @@ func uiObjFadeIn(objName string, duration uint32) (bool, error) {
224
290
}
225
291
226
292
func uiObjFadeOut (objName string , duration uint32 ) (bool , error ) {
293
+ cgoLock .Lock ()
294
+ defer cgoLock .Unlock ()
295
+
227
296
objNameCStr := C .CString (objName )
228
297
defer C .free (unsafe .Pointer (objNameCStr ))
229
298
@@ -233,6 +302,9 @@ func uiObjFadeOut(objName string, duration uint32) (bool, error) {
233
302
}
234
303
235
304
func uiLabelSetText (objName string , text string ) (bool , error ) {
305
+ cgoLock .Lock ()
306
+ defer cgoLock .Unlock ()
307
+
236
308
objNameCStr := C .CString (objName )
237
309
defer C .free (unsafe .Pointer (objNameCStr ))
238
310
@@ -247,6 +319,9 @@ func uiLabelSetText(objName string, text string) (bool, error) {
247
319
}
248
320
249
321
func uiImgSetSrc (objName string , src string ) (bool , error ) {
322
+ cgoLock .Lock ()
323
+ defer cgoLock .Unlock ()
324
+
250
325
objNameCStr := C .CString (objName )
251
326
defer C .free (unsafe .Pointer (objNameCStr ))
252
327
@@ -259,6 +334,9 @@ func uiImgSetSrc(objName string, src string) (bool, error) {
259
334
}
260
335
261
336
func uiDispSetRotation (rotation uint16 ) (bool , error ) {
337
+ cgoLock .Lock ()
338
+ defer cgoLock .Unlock ()
339
+
262
340
nativeLogger .Info ().Uint16 ("rotation" , rotation ).Msg ("setting rotation" )
263
341
264
342
cRotation := C .u_int16_t (rotation )
@@ -269,21 +347,33 @@ func uiDispSetRotation(rotation uint16) (bool, error) {
269
347
}
270
348
271
349
func videoGetStreamQualityFactor () (float64 , error ) {
350
+ cgoLock .Lock ()
351
+ defer cgoLock .Unlock ()
352
+
272
353
factor := C .jetkvm_video_get_quality_factor ()
273
354
return float64 (factor ), nil
274
355
}
275
356
276
357
func videoSetStreamQualityFactor (factor float64 ) error {
358
+ cgoLock .Lock ()
359
+ defer cgoLock .Unlock ()
360
+
277
361
C .jetkvm_video_set_quality_factor (C .float (factor ))
278
362
return nil
279
363
}
280
364
281
365
func videoGetEDID () (string , error ) {
366
+ cgoLock .Lock ()
367
+ defer cgoLock .Unlock ()
368
+
282
369
edidCStr := C .jetkvm_video_get_edid_hex ()
283
370
return C .GoString (edidCStr ), nil
284
371
}
285
372
286
373
func videoSetEDID (edid string ) error {
374
+ cgoLock .Lock ()
375
+ defer cgoLock .Unlock ()
376
+
287
377
edidCStr := C .CString (edid )
288
378
defer C .free (unsafe .Pointer (edidCStr ))
289
379
C .jetkvm_video_set_edid (edidCStr )
0 commit comments