@@ -37,17 +37,22 @@ const (
3737)
3838
3939type RTCEngine struct {
40- log protoLogger.Logger
41- pclock sync.Mutex
42- publisher * PCTransport
43- subscriber * PCTransport
44- client * SignalClient
45- dclock sync.RWMutex
46- reliableDC * webrtc.DataChannel
47- lossyDC * webrtc.DataChannel
48- reliableDCSub * webrtc.DataChannel
49- lossyDCSub * webrtc.DataChannel
50- trackPublishedChan chan * livekit.TrackPublishedResponse
40+ log protoLogger.Logger
41+
42+ pclock sync.Mutex
43+ publisher * PCTransport
44+ subscriber * PCTransport
45+ client * SignalClient
46+
47+ dclock sync.RWMutex
48+ reliableDC * webrtc.DataChannel
49+ lossyDC * webrtc.DataChannel
50+ reliableDCSub * webrtc.DataChannel
51+ lossyDCSub * webrtc.DataChannel
52+
53+ trackPublishedListenersLock sync.Mutex
54+ trackPublishedListeners map [string ]chan * livekit.TrackPublishedResponse
55+
5156 subscriberPrimary bool
5257 hasConnected atomic.Bool
5358 hasPublish atomic.Bool
@@ -79,10 +84,10 @@ type RTCEngine struct {
7984
8085func NewRTCEngine () * RTCEngine {
8186 e := & RTCEngine {
82- log : logger ,
83- client : NewSignalClient (),
84- trackPublishedChan : make (chan * livekit.TrackPublishedResponse , 1 ),
85- JoinTimeout : 15 * time .Second ,
87+ log : logger ,
88+ client : NewSignalClient (),
89+ trackPublishedListeners : make (map [ string ] chan * livekit.TrackPublishedResponse ),
90+ JoinTimeout : 15 * time .Second ,
8691 }
8792
8893 e .client .OnParticipantUpdate = func (info []* livekit.ParticipantInfo ) {
@@ -207,10 +212,6 @@ func (e *RTCEngine) Subscriber() (*PCTransport, bool) {
207212 return e .subscriber , e .subscriber != nil
208213}
209214
210- func (e * RTCEngine ) TrackPublishedChan () <- chan * livekit.TrackPublishedResponse {
211- return e .trackPublishedChan
212- }
213-
214215func (e * RTCEngine ) setRTT (rtt uint32 ) {
215216 if subscriber , ok := e .Subscriber (); ok {
216217 subscriber .SetRTT (rtt )
@@ -472,8 +473,26 @@ func (e *RTCEngine) dataPubChannelReady() bool {
472473 return e .reliableDC .ReadyState () == webrtc .DataChannelStateOpen && e .lossyDC .ReadyState () == webrtc .DataChannelStateOpen
473474}
474475
476+ func (e * RTCEngine ) RegisterTrackPublishedListener (cid string , c chan * livekit.TrackPublishedResponse ) {
477+ e .trackPublishedListenersLock .Lock ()
478+ e .trackPublishedListeners [cid ] = c
479+ e .trackPublishedListenersLock .Unlock ()
480+ }
481+
482+ func (e * RTCEngine ) UnregisterTrackPublishedListener (cid string ) {
483+ e .trackPublishedListenersLock .Lock ()
484+ delete (e .trackPublishedListeners , cid )
485+ e .trackPublishedListenersLock .Unlock ()
486+ }
487+
475488func (e * RTCEngine ) handleLocalTrackPublished (res * livekit.TrackPublishedResponse ) {
476- e .trackPublishedChan <- res
489+ e .trackPublishedListenersLock .Lock ()
490+ listener , ok := e .trackPublishedListeners [res .Cid ]
491+ e .trackPublishedListenersLock .Unlock ()
492+
493+ if ok {
494+ listener <- res
495+ }
477496}
478497
479498func (e * RTCEngine ) handleLocalTrackUnpublished (res * livekit.TrackUnpublishedResponse ) {
0 commit comments