mirror of
https://github.com/jech/galene.git
synced 2024-11-22 16:45:58 +01:00
Use explicit add/remove messages in writerLoop.
This commit is contained in:
parent
e7f9a8f3dc
commit
4b3ce50dac
2 changed files with 33 additions and 15 deletions
30
client.go
30
client.go
|
@ -366,7 +366,7 @@ func addUpConn(c *client, id string) (*upConnection, error) {
|
||||||
rate: estimator.New(time.Second),
|
rate: estimator.New(time.Second),
|
||||||
jitter: jitter.New(remote.Codec().ClockRate),
|
jitter: jitter.New(remote.Codec().ClockRate),
|
||||||
maxBitrate: ^uint64(0),
|
maxBitrate: ^uint64(0),
|
||||||
localCh: make(chan struct{}, 2),
|
localCh: make(chan localTrackAction, 2),
|
||||||
writerDone: make(chan struct{}),
|
writerDone: make(chan struct{}),
|
||||||
}
|
}
|
||||||
u.tracks = append(u.tracks, track)
|
u.tracks = append(u.tracks, track)
|
||||||
|
@ -380,16 +380,16 @@ func addUpConn(c *client, id string) (*upConnection, error) {
|
||||||
}
|
}
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
|
|
||||||
|
go readLoop(conn, track)
|
||||||
|
|
||||||
|
go rtcpUpListener(conn, track, receiver)
|
||||||
|
|
||||||
if tracks != nil {
|
if tracks != nil {
|
||||||
clients := c.group.getClients(c)
|
clients := c.group.getClients(c)
|
||||||
for _, cc := range clients {
|
for _, cc := range clients {
|
||||||
pushConn(cc, u, tracks, u.label)
|
pushConn(cc, u, tracks, u.label)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
go readLoop(conn, track)
|
|
||||||
|
|
||||||
go rtcpUpListener(conn, track, receiver)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return conn, nil
|
return conn, nil
|
||||||
|
@ -469,12 +469,26 @@ func writeLoop(conn *upConnection, track *upTrack, ch <-chan packetIndex) {
|
||||||
buf := make([]byte, packetcache.BufSize)
|
buf := make([]byte, packetcache.BufSize)
|
||||||
var packet rtp.Packet
|
var packet rtp.Packet
|
||||||
|
|
||||||
local := track.getLocal()
|
local := make([]downTrack, 0)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-track.localCh:
|
case action := <-track.localCh:
|
||||||
local = track.getLocal()
|
if action.add {
|
||||||
|
local = append(local, action.track)
|
||||||
|
} else {
|
||||||
|
found := false
|
||||||
|
for i, t := range local {
|
||||||
|
if t == action.track {
|
||||||
|
local = append(local[:i], local[i+1:]...)
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
log.Printf("Deleting unknown track!")
|
||||||
|
}
|
||||||
|
}
|
||||||
case pi, ok := <-ch:
|
case pi, ok := <-ch:
|
||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
|
|
18
conn.go
18
conn.go
|
@ -18,6 +18,11 @@ import (
|
||||||
"github.com/pion/webrtc/v2"
|
"github.com/pion/webrtc/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type localTrackAction struct {
|
||||||
|
add bool
|
||||||
|
track downTrack
|
||||||
|
}
|
||||||
|
|
||||||
type upTrack struct {
|
type upTrack struct {
|
||||||
track *webrtc.Track
|
track *webrtc.Track
|
||||||
label string
|
label string
|
||||||
|
@ -29,17 +34,16 @@ type upTrack struct {
|
||||||
lastSenderReport uint32
|
lastSenderReport uint32
|
||||||
lastSenderReportTime uint32
|
lastSenderReportTime uint32
|
||||||
|
|
||||||
localCh chan struct{} // signals that local has changed
|
localCh chan localTrackAction // signals that local has changed
|
||||||
writerDone chan struct{} // closed when the loop dies
|
writerDone chan struct{} // closed when the loop dies
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
local []downTrack
|
local []downTrack
|
||||||
}
|
}
|
||||||
|
|
||||||
func (up *upTrack) notifyLocal() {
|
func (up *upTrack) notifyLocal(add bool, track downTrack) {
|
||||||
var s struct{}
|
|
||||||
select {
|
select {
|
||||||
case up.localCh <- s:
|
case up.localCh <- localTrackAction{add, track}:
|
||||||
case <-up.writerDone:
|
case <-up.writerDone:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,7 +58,7 @@ func (up *upTrack) addLocal(local downTrack) {
|
||||||
}
|
}
|
||||||
up.local = append(up.local, local)
|
up.local = append(up.local, local)
|
||||||
up.mu.Unlock()
|
up.mu.Unlock()
|
||||||
up.notifyLocal()
|
up.notifyLocal(true, local)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (up *upTrack) delLocal(local downTrack) bool {
|
func (up *upTrack) delLocal(local downTrack) bool {
|
||||||
|
@ -63,7 +67,7 @@ func (up *upTrack) delLocal(local downTrack) bool {
|
||||||
if l == local {
|
if l == local {
|
||||||
up.local = append(up.local[:i], up.local[i+1:]...)
|
up.local = append(up.local[:i], up.local[i+1:]...)
|
||||||
up.mu.Unlock()
|
up.mu.Unlock()
|
||||||
up.notifyLocal()
|
up.notifyLocal(false, l)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue