🎉 live server seems to be working now
This commit is contained in:
112
third_party/sendspin-go/internal/server/audio_engine_test.go
vendored
Normal file
112
third_party/sendspin-go/internal/server/audio_engine_test.go
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
// ABOUTME: Regression tests for AudioEngine codec negotiation and resampler setup
|
||||
// ABOUTME: Covers hi-res source + Opus client path (github issue #2)
|
||||
package server
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/Sendspin/sendspin-go/pkg/protocol"
|
||||
)
|
||||
|
||||
// fakeAudioSource is a minimal AudioSource used to drive AudioEngine under test.
|
||||
type fakeAudioSource struct {
|
||||
sampleRate int
|
||||
channels int
|
||||
}
|
||||
|
||||
func (f *fakeAudioSource) Read(samples []int32) (int, error) { return len(samples), nil }
|
||||
func (f *fakeAudioSource) SampleRate() int { return f.sampleRate }
|
||||
func (f *fakeAudioSource) Channels() int { return f.channels }
|
||||
func (f *fakeAudioSource) Metadata() (string, string, string) { return "", "", "" }
|
||||
func (f *fakeAudioSource) Close() error { return nil }
|
||||
|
||||
func newTestEngine(sampleRate, channels int) *AudioEngine {
|
||||
return &AudioEngine{
|
||||
clients: make(map[string]*Client),
|
||||
source: &fakeAudioSource{sampleRate: sampleRate, channels: channels},
|
||||
stopChan: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
|
||||
func newTestClient(id string, formats []protocol.AudioFormat) *Client {
|
||||
return &Client{
|
||||
ID: id,
|
||||
Name: id,
|
||||
Capabilities: &protocol.PlayerV1Support{
|
||||
SupportedFormats: formats,
|
||||
},
|
||||
sendChan: make(chan interface{}, 4),
|
||||
done: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
|
||||
// TestAddClient_HiResSource_OpusClient is a regression test for issue #2:
|
||||
// a 192kHz source with an Opus-capable client must negotiate Opus and attach
|
||||
// a resampler that converts 192kHz -> 48kHz. Previously the server fell back
|
||||
// to PCM in this case, causing ~36x bandwidth usage.
|
||||
func TestAddClient_HiResSource_OpusClient(t *testing.T) {
|
||||
engine := newTestEngine(192000, 2)
|
||||
client := newTestClient("opus-client", []protocol.AudioFormat{
|
||||
{Codec: "opus", Channels: 2, SampleRate: 48000, BitDepth: 16},
|
||||
})
|
||||
|
||||
engine.AddClient(client)
|
||||
defer engine.RemoveClient(client)
|
||||
|
||||
if client.Codec != "opus" {
|
||||
t.Fatalf("expected codec %q, got %q", "opus", client.Codec)
|
||||
}
|
||||
if client.OpusEncoder == nil {
|
||||
t.Fatal("expected OpusEncoder to be attached for 192kHz source + opus client")
|
||||
}
|
||||
if client.Resampler == nil {
|
||||
t.Fatal("expected Resampler to be attached when source rate != 48kHz")
|
||||
}
|
||||
}
|
||||
|
||||
// TestAddClient_HiResSource_PCMNativeClient verifies the lossless hi-res
|
||||
// path: a PCM client advertising the exact source rate should receive PCM
|
||||
// with no resampler, taking precedence over Opus bandwidth savings.
|
||||
func TestAddClient_HiResSource_PCMNativeClient(t *testing.T) {
|
||||
engine := newTestEngine(192000, 2)
|
||||
client := newTestClient("pcm-client", []protocol.AudioFormat{
|
||||
{Codec: "pcm", Channels: 2, SampleRate: 192000, BitDepth: DefaultBitDepth},
|
||||
{Codec: "opus", Channels: 2, SampleRate: 48000, BitDepth: 16},
|
||||
})
|
||||
|
||||
engine.AddClient(client)
|
||||
defer engine.RemoveClient(client)
|
||||
|
||||
if client.Codec != "pcm" {
|
||||
t.Fatalf("expected codec %q, got %q", "pcm", client.Codec)
|
||||
}
|
||||
if client.OpusEncoder != nil {
|
||||
t.Fatal("expected no OpusEncoder for native-rate PCM client")
|
||||
}
|
||||
if client.Resampler != nil {
|
||||
t.Fatal("expected no Resampler for native-rate PCM client")
|
||||
}
|
||||
}
|
||||
|
||||
// TestAddClient_NativeOpusSource verifies the no-resample Opus path: when
|
||||
// the source is already 48kHz, an Opus client should get an encoder but
|
||||
// no resampler.
|
||||
func TestAddClient_NativeOpusSource(t *testing.T) {
|
||||
engine := newTestEngine(48000, 2)
|
||||
client := newTestClient("opus-native", []protocol.AudioFormat{
|
||||
{Codec: "opus", Channels: 2, SampleRate: 48000, BitDepth: 16},
|
||||
})
|
||||
|
||||
engine.AddClient(client)
|
||||
defer engine.RemoveClient(client)
|
||||
|
||||
if client.Codec != "opus" {
|
||||
t.Fatalf("expected codec %q, got %q", "opus", client.Codec)
|
||||
}
|
||||
if client.OpusEncoder == nil {
|
||||
t.Fatal("expected OpusEncoder to be attached")
|
||||
}
|
||||
if client.Resampler != nil {
|
||||
t.Fatal("expected no Resampler when source rate == 48kHz")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user