🎉 live server seems to be working now
This commit is contained in:
50
third_party/sendspin-go/internal/server/test_tone_source.go
vendored
Normal file
50
third_party/sendspin-go/internal/server/test_tone_source.go
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
// ABOUTME: Test tone generator for audio source
|
||||
// ABOUTME: Generates 440Hz sine wave for testing
|
||||
package server
|
||||
|
||||
import (
|
||||
"math"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type TestToneSource struct {
|
||||
sampleIndex uint64
|
||||
sampleMu sync.Mutex
|
||||
frequency float64
|
||||
}
|
||||
|
||||
func NewTestToneSource() *TestToneSource {
|
||||
return &TestToneSource{
|
||||
frequency: 440.0, // A4 note
|
||||
}
|
||||
}
|
||||
|
||||
func (s *TestToneSource) Read(samples []int32) (int, error) {
|
||||
s.sampleMu.Lock()
|
||||
defer s.sampleMu.Unlock()
|
||||
|
||||
numSamples := len(samples) / 2 // Stereo
|
||||
|
||||
for i := 0; i < numSamples; i++ {
|
||||
t := float64(s.sampleIndex+uint64(i)) / float64(DefaultSampleRate)
|
||||
sample := math.Sin(2 * math.Pi * s.frequency * t)
|
||||
|
||||
// 50% amplitude to avoid clipping on a full-scale sine
|
||||
const max24bit = 8388607 // 2^23 - 1
|
||||
pcmValue := int32(sample * max24bit * 0.5)
|
||||
|
||||
samples[i*2] = pcmValue
|
||||
samples[i*2+1] = pcmValue
|
||||
}
|
||||
|
||||
s.sampleIndex += uint64(numSamples)
|
||||
|
||||
return len(samples), nil
|
||||
}
|
||||
|
||||
func (s *TestToneSource) SampleRate() int { return DefaultSampleRate }
|
||||
func (s *TestToneSource) Channels() int { return DefaultChannels }
|
||||
func (s *TestToneSource) Metadata() (string, string, string) {
|
||||
return "Test Tone", "Sendspin Server", "Reference Implementation"
|
||||
}
|
||||
func (s *TestToneSource) Close() error { return nil }
|
||||
Reference in New Issue
Block a user