Skip to content

Commit 93d5955

Browse files
authored
Fix sdk room composite (#883)
* fix sdk room composite * add helper * rename errors/subscriptionInfo
1 parent 42e0e55 commit 93d5955

1 file changed

Lines changed: 52 additions & 47 deletions

File tree

pkg/pipeline/source/sdk.go

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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

219219
func (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

253253
func (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+
317322
func (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

Comments
 (0)