@@ -99,12 +99,16 @@ var lastId = 0
9999func goCallback (event C.enum_Event , data unsafe.Pointer , userData unsafe.Pointer ) {
100100 id := int (uintptr (userData ))
101101 mutex .RLock ()
102- defer mutex .RUnlock ()
102+ callback , ok := callbacks [id ]
103+ mutex .RUnlock ()
104+ if ! ok {
105+ return
106+ }
103107
104108 if event == C .CRP_EV_NEW_FRAME {
105109 frame := (* C .struct_Frame )(data )
106110 height := C .frame_get_height (frame )
107- callbacks [ id ] .OnFrame (false , Frame {
111+ callback .OnFrame (false , Frame {
108112 int (C .frame_get_width (frame )),
109113 int (height ),
110114 0 , 0 ,
@@ -120,7 +124,7 @@ func goCallback(event C.enum_Event, data unsafe.Pointer, userData unsafe.Pointer
120124 })
121125 } else if event == C .CRP_EV_NEW_AUDIO {
122126 frame := (* C .struct_Frame )(data )
123- callbacks [ id ] .OnFrame (true , Frame {
127+ callback .OnFrame (true , Frame {
124128 0 , 0 ,
125129 int (C .frame_get_width (frame )),
126130 int (C .frame_get_height (frame )),
@@ -136,9 +140,9 @@ func goCallback(event C.enum_Event, data unsafe.Pointer, userData unsafe.Pointer
136140 })
137141 } else if event == C .CRP_EV_VIDEO_EXTRADATA || event == C .CRP_EV_AUDIO_EXTRADATA {
138142 ed := (* C .struct_ExtraData )(data )
139- callbacks [ id ] .OnEvent (Event (event ), C .GoBytes (unsafe .Pointer (ed .data ), C .int (ed .size )))
143+ callback .OnEvent (Event (event ), C .GoBytes (unsafe .Pointer (ed .data ), C .int (ed .size )))
140144 } else {
141- callbacks [ id ] .OnEvent (Event (event ), int64 (uintptr (data )))
145+ callback .OnEvent (Event (event ), int64 (uintptr (data )))
142146 }
143147}
144148
@@ -151,8 +155,8 @@ func (player Player) Destroy() {
151155 player .handle = nil
152156
153157 mutex .Lock ()
154- defer mutex .Unlock ()
155158 delete (callbacks , player .callbackId )
159+ mutex .Unlock ()
156160}
157161
158162func (player Player ) Auth (username , password string , isMd5 bool ) {
@@ -167,17 +171,16 @@ func (player Player) Auth(username, password string, isMd5 bool) {
167171func (player Player ) Play (url string , option Option , callback Callback ) {
168172 curl := C .CString (url )
169173 defer C .free (unsafe .Pointer (curl ))
170-
171- cHWDevice := C .CString (option .HWDevice )
172- defer C .free (unsafe .Pointer (cHWDevice ))
174+ chwdevice := C .CString (option .HWDevice )
175+ defer C .free (unsafe .Pointer (chwdevice ))
173176
174177 coption := C.struct_Option {
175178 transport : C .int (option .Transport ),
176179 video : C.struct___1 {
177180 width : C .int (option .Width ),
178181 height : C .int (option .Height ),
179182 format : C .int (option .VideoFormat ),
180- hw_device : * (* [32 ]C.char )(unsafe .Pointer (cHWDevice )),
183+ hw_device : * (* [32 ]C.char )(unsafe .Pointer (chwdevice )),
181184 },
182185 enable_audio : C .bool (option .EnableAudio ),
183186 audio : C.struct___2 {
@@ -189,12 +192,12 @@ func (player Player) Play(url string, option Option, callback Callback) {
189192 }
190193
191194 mutex .Lock ()
192- defer mutex .Unlock ()
193-
194195 player .callbackId = lastId
195196 callbacks [lastId ] = callback
196- C .crp_play (player .handle , curl , & coption , C .crp_callback (C .goCallback ), unsafe .Pointer (uintptr (lastId )))
197197 lastId += 1
198+ mutex .Unlock ()
199+
200+ C .crp_play (player .handle , curl , & coption , C .crp_callback (C .goCallback ), unsafe .Pointer (uintptr (id )))
198201}
199202
200203func (player Player ) Replay () {
0 commit comments