@@ -53,7 +53,7 @@ type SDKSource struct {
5353 mu sync.RWMutex
5454 initialized core.Fuse
5555 filenameReplacements map [string ]string
56- errors chan * subscriptionInfo
56+ subs chan * subscriptionResult
5757
5858 writers map [string ]* sdk.AppWriter
5959 subLock sync.RWMutex
@@ -64,7 +64,7 @@ type SDKSource struct {
6464 endRecording chan struct {}
6565}
6666
67- type subscriptionInfo struct {
67+ type subscriptionResult struct {
6868 trackID string
6969 err error
7070}
@@ -81,7 +81,7 @@ func NewSDKSource(ctx context.Context, p *config.PipelineConfig, callbacks *gstr
8181 close (startRecording )
8282 }),
8383 filenameReplacements : make (map [string ]string ),
84- errors : make (chan * subscriptionInfo , 2 ),
84+ subs : make (chan * subscriptionResult , 100 ),
8585 writers : make (map [string ]* sdk.AppWriter ),
8686 startRecording : startRecording ,
8787 endRecording : make (chan struct {}),
@@ -217,37 +217,37 @@ func (s *SDKSource) joinRoom() error {
217217}
218218
219219func (s * SDKSource ) awaitRoomTracks () error {
220- var tracks []lksdk.TrackPublication
221-
222- for _ , p := range s .room .GetRemoteParticipants () {
223- for _ , track := range p .TrackPublications () {
224- if s .shouldSubscribe (track ) {
225- if err := s .subscribe (track ); err != nil {
226- return err
227- }
228-
229- tracks = append (tracks , track )
220+ // await expected subscriptions
221+ expected := 0
222+ for _ , rp := range s .room .GetRemoteParticipants () {
223+ pubs := rp .TrackPublications ()
224+ for _ , pub := range pubs {
225+ if s .shouldSubscribe (pub ) {
226+ expected ++
230227 }
231228 }
232229 }
230+ if err := s .awaitExpected (expected ); err != nil {
231+ return err
232+ }
233233
234- deadline := time .After (subscriptionTimeout )
235- trackCount := len (tracks )
236- loop:
237- for i := 0 ; i < trackCount ; i ++ {
234+ // lock any incoming subscriptions
235+ s .subLock .Lock ()
236+ defer s .subLock .Unlock ()
237+
238+ for {
238239 select {
239- case sub := <- s .errors :
240+ // check errors from any tracks published in the meantime
241+ case sub := <- s .subs :
240242 if sub .err != nil {
241243 return sub .err
242244 }
243- case <- deadline :
244- break loop
245+ default :
246+ // ready
247+ s .initialized .Break ()
248+ return nil
245249 }
246250 }
247-
248- s .initialized .Break ()
249-
250- return nil
251251}
252252
253253func (s * SDKSource ) awaitParticipantTracks (identity string ) (uint32 , uint32 , error ) {
@@ -257,33 +257,15 @@ func (s *SDKSource) awaitParticipantTracks(identity string) (uint32, uint32, err
257257 }
258258
259259 // await expected subscriptions
260- subscribed := 0
261260 pubs := rp .TrackPublications ()
262261 expected := 0
263262 for _ , pub := range pubs {
264263 if s .shouldSubscribe (pub ) {
265264 expected ++
266265 }
267266 }
268-
269- deadline := make (chan struct {})
270- time .AfterFunc (time .Second * 3 , func () {
271- close (deadline )
272- })
273- done := false
274- for ! done {
275- select {
276- case sub := <- s .errors :
277- if sub .err != nil {
278- return 0 , 0 , sub .err
279- }
280- subscribed ++
281- if subscribed == expected {
282- done = true
283- }
284- case <- deadline :
285- done = true
286- }
267+ if err = s .awaitExpected (expected ); err != nil {
268+ return 0 , 0 , err
287269 }
288270
289271 // lock any incoming subscriptions
@@ -293,7 +275,7 @@ func (s *SDKSource) awaitParticipantTracks(identity string) (uint32, uint32, err
293275 for {
294276 select {
295277 // check errors from any tracks published in the meantime
296- case sub := <- s .errors :
278+ case sub := <- s .subs :
297279 if sub .err != nil {
298280 return 0 , 0 , sub .err
299281 }
@@ -314,6 +296,29 @@ func (s *SDKSource) awaitParticipantTracks(identity string) (uint32, uint32, err
314296 }
315297}
316298
299+ func (s * SDKSource ) awaitExpected (expected int ) error {
300+ subscribed := 0
301+ deadline := make (chan struct {})
302+ time .AfterFunc (time .Second * 3 , func () {
303+ close (deadline )
304+ })
305+
306+ for {
307+ select {
308+ case sub := <- s .subs :
309+ if sub .err != nil {
310+ return sub .err
311+ }
312+ subscribed ++
313+ if subscribed == expected {
314+ return nil
315+ }
316+ case <- deadline :
317+ return nil
318+ }
319+ }
320+ }
321+
317322func (s * SDKSource ) getParticipant (identity string ) (* lksdk.RemoteParticipant , error ) {
318323 deadline := time .Now ().Add (subscriptionTimeout )
319324 for time .Now ().Before (deadline ) {
@@ -342,7 +347,7 @@ func (s *SDKSource) awaitTracks(expecting map[string]struct{}) (uint32, uint32,
342347
343348 for i := 0 ; i < trackCount ; i ++ {
344349 select {
345- case sub := <- s .errors :
350+ case sub := <- s .subs :
346351 if sub .err != nil {
347352 return 0 , 0 , sub .err
348353 }
@@ -436,7 +441,7 @@ func (s *SDKSource) onTrackSubscribed(track *webrtc.TrackRemote, pub *lksdk.Remo
436441 s .callbacks .OnError (onSubscribeErr )
437442 }
438443 } else {
439- s .errors <- & subscriptionInfo {
444+ s .subs <- & subscriptionResult {
440445 trackID : pub .SID (),
441446 err : onSubscribeErr ,
442447 }
0 commit comments