77 "github.com/matrix-org/waterfall/pkg/common"
88 "github.com/matrix-org/waterfall/pkg/peer"
99 "github.com/pion/webrtc/v3"
10+ "golang.org/x/exp/slices"
1011 "maunium.net/go/mautrix/event"
1112)
1213
@@ -85,7 +86,7 @@ func (c *Conference) processPeerMessage(message common.Message[ParticipantID, pe
8586 }
8687
8788 case peer.NewICECandidate :
88- participant .logger .Info ("Received a new local ICE candidate" )
89+ participant .logger .Debug ("Received a new local ICE candidate" )
8990
9091 // Convert WebRTC ICE candidate to Matrix ICE candidate.
9192 jsonCandidate := msg .Candidate .ToJSON ()
@@ -111,7 +112,7 @@ func (c *Conference) processPeerMessage(message common.Message[ParticipantID, pe
111112 })
112113
113114 case peer.DataChannelMessage :
114- participant .logger .Info ( "Sent data channel message" )
115+ participant .logger .Debug ( "Received data channel message" )
115116 var sfuMessage event.SFUMessage
116117 if err := json .Unmarshal ([]byte (msg .Message ), & sfuMessage ); err != nil {
117118 c .logger .Errorf ("Failed to unmarshal SFU message: %v" , err )
@@ -136,30 +137,44 @@ func (c *Conference) processPeerMessage(message common.Message[ParticipantID, pe
136137func (c * Conference ) handleDataChannelMessage (participant * Participant , sfuMessage event.SFUMessage ) {
137138 switch sfuMessage .Op {
138139 case event .SFUOperationSelect :
139- participant .logger .Info ("Sent select request over DC" )
140-
141- // Get the tracks that correspond to the tracks that the participant wants to receive.
142- for _ , track := range c .getTracks (sfuMessage .Start ) {
143- if track == nil {
144- participant .logger .Errorf ("Bug, track is nil" )
140+ participant .logger .Info ("Received select request over DC" )
141+
142+ // Find tracks based on what we were asked for.
143+ tracks := c .getTracks (sfuMessage .Start )
144+
145+ // Let's check if we have all the tracks that we were asked for are there.
146+ // If not, we will list which are not available (later on we must inform participant
147+ // about it unless the participant retries it).
148+ if len (tracks ) != len (sfuMessage .Start ) {
149+ for _ , expected := range sfuMessage .Start {
150+ found := slices .IndexFunc (tracks , func (track * webrtc.TrackLocalStaticRTP ) bool {
151+ return track .StreamID () == expected .StreamID && track .ID () == expected .TrackID
152+ })
153+
154+ if found == - 1 {
155+ c .logger .Warnf ("Track not found: %s" , expected .TrackID )
156+ }
145157 }
158+ }
146159
160+ // Subscribe to the found tracks.
161+ for _ , track := range tracks {
147162 if err := participant .peer .SubscribeTo (track ); err != nil {
148163 participant .logger .Errorf ("Failed to subscribe to track: %v" , err )
149164 return
150165 }
151166 }
152167
153168 case event .SFUOperationAnswer :
154- participant .logger .Info ("Sent SDP answer over DC" )
169+ participant .logger .Info ("Received SDP answer over DC" )
155170
156171 if err := participant .peer .ProcessSDPAnswer (sfuMessage .SDP ); err != nil {
157172 participant .logger .Errorf ("Failed to set SDP answer: %v" , err )
158173 return
159174 }
160175
161176 case event .SFUOperationPublish :
162- participant .logger .Info ("Sent SDP offer over DC" )
177+ participant .logger .Info ("Received SDP offer over DC" )
163178
164179 answer , err := participant .peer .ProcessSDPOffer (sfuMessage .SDP )
165180 if err != nil {
@@ -173,13 +188,13 @@ func (c *Conference) handleDataChannelMessage(participant *Participant, sfuMessa
173188 })
174189
175190 case event .SFUOperationUnpublish :
176- participant .logger .Info ("Sent unpublish over DC" )
191+ participant .logger .Info ("Received unpublish over DC" )
177192
178193 // TODO: Clarify the semantics of unpublish.
179194 case event .SFUOperationAlive :
180195 // FIXME: Handle the heartbeat message here (updating the last timestamp etc).
181196 case event .SFUOperationMetadata :
182- participant .logger .Info ("Sent metadata over DC" )
197+ participant .logger .Info ("Received metadata over DC" )
183198
184199 participant .streamMetadata = sfuMessage .Metadata
185200 c .resendMetadataToAllExcept (participant .id )
0 commit comments