🎉 live server seems to be working now
This commit is contained in:
123
third_party/sendspin-go/internal/server/flac_encoder_test.go
vendored
Normal file
123
third_party/sendspin-go/internal/server/flac_encoder_test.go
vendored
Normal file
@@ -0,0 +1,123 @@
|
||||
// ABOUTME: Tests for the FLAC encoder
|
||||
// ABOUTME: Verifies round-trip encode produces valid FLAC frames with compression
|
||||
package server
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestFLACEncoder_RoundTrip(t *testing.T) {
|
||||
const (
|
||||
sampleRate = 48000
|
||||
channels = 2
|
||||
bitDepth = 24
|
||||
blockSize = 960 // 20ms at 48kHz
|
||||
)
|
||||
|
||||
enc, err := NewFLACEncoder(sampleRate, channels, bitDepth, blockSize)
|
||||
if err != nil {
|
||||
t.Fatalf("NewFLACEncoder: %v", err)
|
||||
}
|
||||
defer enc.Close()
|
||||
|
||||
header := enc.CodecHeader()
|
||||
if len(header) < 42 {
|
||||
t.Fatalf("codec header too short: %d bytes (min 42)", len(header))
|
||||
}
|
||||
if string(header[:4]) != "fLaC" {
|
||||
t.Errorf("codec header missing fLaC marker, got %q", header[:4])
|
||||
}
|
||||
|
||||
// Create a simple test signal
|
||||
samples := make([]int32, blockSize*channels)
|
||||
for i := range samples {
|
||||
samples[i] = int32((i % 256) << 16)
|
||||
}
|
||||
|
||||
flacBytes, err := enc.Encode(samples)
|
||||
if err != nil {
|
||||
t.Fatalf("Encode: %v", err)
|
||||
}
|
||||
if len(flacBytes) == 0 {
|
||||
t.Fatal("Encode returned empty bytes")
|
||||
}
|
||||
|
||||
pcmSize := len(samples) * 3 // 24-bit = 3 bytes per sample
|
||||
t.Logf("Encoded %d samples → %d FLAC bytes (%.1f%% of PCM %d bytes)",
|
||||
len(samples), len(flacBytes), float64(len(flacBytes))/float64(pcmSize)*100, pcmSize)
|
||||
}
|
||||
|
||||
func TestFLACEncoder_MultipleBlocks(t *testing.T) {
|
||||
enc, err := NewFLACEncoder(48000, 2, 24, 960)
|
||||
if err != nil {
|
||||
t.Fatalf("NewFLACEncoder: %v", err)
|
||||
}
|
||||
defer enc.Close()
|
||||
|
||||
samples := make([]int32, 960*2)
|
||||
for i := 0; i < 10; i++ {
|
||||
data, err := enc.Encode(samples)
|
||||
if err != nil {
|
||||
t.Fatalf("Encode block %d: %v", i, err)
|
||||
}
|
||||
if len(data) == 0 {
|
||||
t.Fatalf("Encode block %d returned empty", i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestFLACEncoder_16Bit(t *testing.T) {
|
||||
enc, err := NewFLACEncoder(44100, 2, 16, 882)
|
||||
if err != nil {
|
||||
t.Fatalf("NewFLACEncoder: %v", err)
|
||||
}
|
||||
defer enc.Close()
|
||||
|
||||
header := enc.CodecHeader()
|
||||
if string(header[:4]) != "fLaC" {
|
||||
t.Errorf("missing fLaC marker")
|
||||
}
|
||||
|
||||
samples := make([]int32, 882*2)
|
||||
data, err := enc.Encode(samples)
|
||||
if err != nil {
|
||||
t.Fatalf("Encode: %v", err)
|
||||
}
|
||||
if len(data) == 0 {
|
||||
t.Fatal("empty encode")
|
||||
}
|
||||
}
|
||||
|
||||
func TestFLACEncoder_Compression(t *testing.T) {
|
||||
// Silence should compress extremely well with prediction analysis enabled
|
||||
enc, err := NewFLACEncoder(48000, 2, 24, 960)
|
||||
if err != nil {
|
||||
t.Fatalf("NewFLACEncoder: %v", err)
|
||||
}
|
||||
defer enc.Close()
|
||||
|
||||
silence := make([]int32, 960*2) // all zeros
|
||||
data, err := enc.Encode(silence)
|
||||
if err != nil {
|
||||
t.Fatalf("Encode: %v", err)
|
||||
}
|
||||
|
||||
pcmSize := 960 * 2 * 3 // 24-bit stereo
|
||||
ratio := float64(len(data)) / float64(pcmSize) * 100
|
||||
t.Logf("Silence: %d PCM bytes → %d FLAC bytes (%.1f%%)", pcmSize, len(data), ratio)
|
||||
|
||||
// Silence should compress to well under 10% of PCM size
|
||||
if ratio > 20 {
|
||||
t.Errorf("silence compression ratio %.1f%% is too high — prediction analysis may not be working", ratio)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFLACEncoder_Close(t *testing.T) {
|
||||
enc, err := NewFLACEncoder(48000, 2, 24, 960)
|
||||
if err != nil {
|
||||
t.Fatalf("NewFLACEncoder: %v", err)
|
||||
}
|
||||
if err := enc.Close(); err != nil {
|
||||
t.Errorf("Close: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user