Fix race (concurency) for Track

This commit is contained in:
Alexey Khit
2022-11-22 20:03:36 +03:00
parent 3d6472cfb1
commit 0e281e36d3
6 changed files with 15 additions and 24 deletions

View File

@@ -24,7 +24,7 @@ func (p *Producer) GetTrack(media *streamer.Media, codec *streamer.Codec) *strea
panic("you shall not pass!") panic("you shall not pass!")
} }
track := &streamer.Track{Codec: codec, Direction: media.Direction} track := streamer.NewTrack(codec, media.Direction)
switch media.Direction { switch media.Direction {
case streamer.DirectionSendonly: case streamer.DirectionSendonly:

View File

@@ -75,7 +75,7 @@ func (c *Client) GetTrack(media *streamer.Media, codec *streamer.Codec) *streame
} }
} }
track := &streamer.Track{Codec: codec, Direction: media.Direction} track := streamer.NewTrack(codec, media.Direction)
c.tracks = append(c.tracks, track) c.tracks = append(c.tracks, track)
return track return track
} }

View File

@@ -192,10 +192,7 @@ func (c *Client) getTracks() error {
} }
c.medias = append(c.medias, media) c.medias = append(c.medias, media)
track := &streamer.Track{ track := streamer.NewTrack(codec, streamer.DirectionSendonly)
Direction: streamer.DirectionSendonly,
Codec: codec,
}
c.tracks[msg.TrackID] = track c.tracks[msg.TrackID] = track
case "mp4a": // mp4a.40.2 case "mp4a": // mp4a.40.2

View File

@@ -83,9 +83,7 @@ func (c *Client) Dial() (err error) {
} }
c.medias = append(c.medias, media) c.medias = append(c.medias, media)
track := &streamer.Track{ track := streamer.NewTrack(codec, media.Direction)
Codec: codec, Direction: media.Direction,
}
c.tracks = append(c.tracks, track) c.tracks = append(c.tracks, track)
case av.AAC: case av.AAC:
@@ -108,9 +106,7 @@ func (c *Client) Dial() (err error) {
} }
c.medias = append(c.medias, media) c.medias = append(c.medias, media)
track := &streamer.Track{ track := streamer.NewTrack(codec, media.Direction)
Codec: codec, Direction: media.Direction,
}
c.tracks = append(c.tracks, track) c.tracks = append(c.tracks, track)
default: default:

View File

@@ -429,9 +429,7 @@ func (c *Conn) SetupMedia(
return nil, err return nil, err
} }
track := &streamer.Track{ track := streamer.NewTrack(codec, media.Direction)
Codec: codec, Direction: media.Direction,
}
switch track.Direction { switch track.Direction {
case streamer.DirectionSendonly: case streamer.DirectionSendonly:
@@ -519,9 +517,7 @@ func (c *Conn) Accept() error {
// TODO: fix someday... // TODO: fix someday...
c.channels = map[byte]*streamer.Track{} c.channels = map[byte]*streamer.Track{}
for i, media := range c.Medias { for i, media := range c.Medias {
track := &streamer.Track{ track := streamer.NewTrack(media.Codecs[0], media.Direction)
Codec: media.Codecs[0], Direction: media.Direction,
}
c.tracks = append(c.tracks, track) c.tracks = append(c.tracks, track)
c.channels[byte(i<<1)] = track c.channels[byte(i<<1)] = track
} }

View File

@@ -13,7 +13,11 @@ type Track struct {
Codec *Codec Codec *Codec
Direction string Direction string
sink map[*Track]WriterFunc sink map[*Track]WriterFunc
sinkMu sync.RWMutex sinkMu *sync.RWMutex
}
func NewTrack(codec *Codec, direction string) *Track {
return &Track{Codec: codec, Direction: direction, sinkMu: new(sync.RWMutex)}
} }
func (t *Track) String() string { func (t *Track) String() string {
@@ -40,14 +44,12 @@ func (t *Track) Bind(w WriterFunc) *Track {
t.sink = map[*Track]WriterFunc{} t.sink = map[*Track]WriterFunc{}
} }
clone := &Track{ clone := *t
Codec: t.Codec, Direction: t.Direction, sink: t.sink, t.sink[&clone] = w
}
t.sink[clone] = w
t.sinkMu.Unlock() t.sinkMu.Unlock()
return clone return &clone
} }
func (t *Track) Unbind() { func (t *Track) Unbind() {