Skip to content

Commit 12bbb5b

Browse files
Remove direct usage of golang.org/x/exp (#852)
1 parent 77b4264 commit 12bbb5b

File tree

4 files changed

+104
-11
lines changed

4 files changed

+104
-11
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ require (
2222
github.com/twitchtv/twirp v8.1.3+incompatible
2323
go.uber.org/atomic v1.11.0
2424
golang.org/x/crypto v0.48.0
25-
golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a
25+
golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a // indirect
2626
google.golang.org/protobuf v1.36.11
2727
)
2828

publication.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ package lksdk
1616

1717
import (
1818
"errors"
19+
"maps"
20+
"slices"
1921
"strings"
2022
"sync"
2123
"time"
2224

23-
"golang.org/x/exp/maps"
24-
2525
"github.com/pion/rtcp"
2626
"github.com/pion/webrtc/v4"
2727
"go.uber.org/atomic"
@@ -339,7 +339,7 @@ func (p *LocalTrackPublication) TrackLocal() webrtc.TrackLocal {
339339
func (p *LocalTrackPublication) TrackLocalForSimulcast() []*LocalTrack {
340340
p.lock.RLock()
341341
defer p.lock.RUnlock()
342-
return maps.Values(p.simulcastTracks)
342+
return slices.Collect(maps.Values(p.simulcastTracks))
343343
}
344344

345345
// GetSimulcastTrack returns the simulcast track for a specific quality level.
@@ -431,7 +431,7 @@ func (p *LocalTrackPublication) setBackupCodecTracksForSimulcast(st []*LocalTrac
431431
func (p *LocalTrackPublication) getBackupCodecTrack() (TrackLocalWithCodec, []*LocalTrack) {
432432
p.lock.RLock()
433433
defer p.lock.RUnlock()
434-
return p.backupCodecTrack, maps.Values(p.backupCodecTracksForSimulcast)
434+
return p.backupCodecTrack, slices.Collect(maps.Values(p.backupCodecTracksForSimulcast))
435435
}
436436

437437
func (p *LocalTrackPublication) setBackupCodecPublished() {
@@ -509,7 +509,11 @@ func (p *LocalTrackPublication) setPublishingCodecsQuality(subscribedCodecs []*l
509509

510510
mainTrack := backupCodecTrack
511511
if len(backupCodecTracksForSimulcast) > 0 {
512-
mainTrack = maps.Values(backupCodecTracksForSimulcast)[0]
512+
iter := maps.Values(backupCodecTracksForSimulcast)
513+
iter(func(l *LocalTrack) bool {
514+
mainTrack = l
515+
return false
516+
})
513517
}
514518
if mainTrack == nil || !strings.HasSuffix(strings.ToLower(mainTrack.Codec().MimeType), subscribedCodec.Codec) {
515519
p.log.Warnw("subscriber requested backup codec but no track found", nil, "trackID", p.SID(), "codec", subscribedCodec.Codec)

room.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,25 @@
1515
package lksdk
1616

1717
import (
18+
"cmp"
1819
"context"
1920
"fmt"
21+
"maps"
2022
"reflect"
21-
"sort"
23+
"slices"
2224
"strings"
2325
"sync"
2426
"time"
2527

2628
"github.com/pion/interceptor"
2729
"github.com/pion/rtcp"
2830
"github.com/pion/webrtc/v4"
29-
"golang.org/x/exp/maps"
3031
"golang.org/x/mod/semver"
3132
"google.golang.org/protobuf/proto"
3233

3334
protoLogger "github.com/livekit/protocol/logger"
3435
protosignalling "github.com/livekit/protocol/signalling"
36+
3537
"github.com/livekit/server-sdk-go/v2/signalling"
3638

3739
"github.com/livekit/mediatransportutil/pkg/pacer"
@@ -978,9 +980,8 @@ func (r *Room) OnSpeakersChanged(speakerUpdates []*livekit.SpeakerInfo) {
978980
}
979981
}
980982

981-
activeSpeakers := maps.Values(speakerMap)
982-
sort.Slice(activeSpeakers, func(i, j int) bool {
983-
return activeSpeakers[i].AudioLevel() > activeSpeakers[j].AudioLevel()
983+
activeSpeakers := slices.SortedFunc(maps.Values(speakerMap), func(p1, p2 Participant) int {
984+
return cmp.Compare(p2.AudioLevel(), p1.AudioLevel())
984985
})
985986
r.lock.Lock()
986987
r.activeSpeakers = activeSpeakers

room_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package lksdk
2+
3+
import (
4+
"testing"
5+
6+
"github.com/livekit/protocol/livekit"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestOnSpeakersChanged(t *testing.T) {
11+
room := NewRoom(nil)
12+
13+
// Set up the local participant with a SID.
14+
room.LocalParticipant.updateInfo(&livekit.ParticipantInfo{
15+
Sid: "local",
16+
Identity: "local-identity",
17+
})
18+
19+
// Add three remote participants.
20+
room.addRemoteParticipant(&livekit.ParticipantInfo{
21+
Sid: "remote-1",
22+
Identity: "remote-1-identity",
23+
}, false)
24+
room.addRemoteParticipant(&livekit.ParticipantInfo{
25+
Sid: "remote-2",
26+
Identity: "remote-2-identity",
27+
}, false)
28+
room.addRemoteParticipant(&livekit.ParticipantInfo{
29+
Sid: "remote-3",
30+
Identity: "remote-3-identity",
31+
}, false)
32+
33+
t.Run("active speakers sorted by audio level descending", func(t *testing.T) {
34+
room.OnSpeakersChanged([]*livekit.SpeakerInfo{
35+
{Sid: "remote-2", Level: 0.8, Active: true},
36+
{Sid: "local", Level: 0.5, Active: true},
37+
{Sid: "remote-1", Level: 0.2, Active: true},
38+
{Sid: "remote-3", Level: 0.9, Active: true},
39+
})
40+
41+
speakers := room.ActiveSpeakers()
42+
require.Len(t, speakers, 4)
43+
require.Equal(t, float32(0.9), speakers[0].AudioLevel())
44+
require.Equal(t, float32(0.8), speakers[1].AudioLevel())
45+
require.Equal(t, float32(0.5), speakers[2].AudioLevel())
46+
require.Equal(t, float32(0.2), speakers[3].AudioLevel())
47+
48+
require.Equal(t, "remote-3", speakers[0].SID())
49+
require.Equal(t, "remote-2", speakers[1].SID())
50+
require.Equal(t, "local", speakers[2].SID())
51+
require.Equal(t, "remote-1", speakers[3].SID())
52+
})
53+
54+
t.Run("inactive speaker removed from list", func(t *testing.T) {
55+
room.OnSpeakersChanged([]*livekit.SpeakerInfo{
56+
{Sid: "remote-2", Level: 0, Active: false},
57+
})
58+
59+
speakers := room.ActiveSpeakers()
60+
require.Len(t, speakers, 3)
61+
for _, s := range speakers {
62+
require.NotEqual(t, "remote-2", s.SID())
63+
}
64+
})
65+
66+
t.Run("updated levels re-sort speakers", func(t *testing.T) {
67+
// remote-1 was 0.2, now bump it to 1.0 so it becomes the loudest.
68+
room.OnSpeakersChanged([]*livekit.SpeakerInfo{
69+
{Sid: "remote-1", Level: 1.0, Active: true},
70+
})
71+
72+
speakers := room.ActiveSpeakers()
73+
require.Len(t, speakers, 3)
74+
require.Equal(t, "remote-1", speakers[0].SID())
75+
require.Equal(t, "remote-3", speakers[1].SID())
76+
require.Equal(t, "local", speakers[2].SID())
77+
})
78+
79+
t.Run("unknown participant is ignored", func(t *testing.T) {
80+
room.OnSpeakersChanged([]*livekit.SpeakerInfo{
81+
{Sid: "unknown", Level: 0.5, Active: true},
82+
})
83+
84+
// List should be unchanged from the previous subtest.
85+
speakers := room.ActiveSpeakers()
86+
require.Len(t, speakers, 3)
87+
})
88+
}

0 commit comments

Comments
 (0)