package decoder import ( "encoding/binary" "math" "time" "github.com/jan/fm-rds-tx/internal/ingest" ) const defaultSampleRateHz = 44100 func ResolveSampleRate(decodedSampleRateHz int, meta StreamMeta) int { if decodedSampleRateHz > 0 { return decodedSampleRateHz } if meta.SampleRateHz > 0 { return meta.SampleRateHz } return defaultSampleRateHz } func BuildChunk(samples []int32, channels, sampleRateHz int, seq uint64, sourceID string) ingest.PCMChunk { return ingest.PCMChunk{ Samples: samples, Channels: channels, SampleRateHz: sampleRateHz, Sequence: seq, Timestamp: time.Now(), SourceID: sourceID, } } func PCM16LEToPCM32(in []byte) []int32 { out := make([]int32, 0, len(in)/2) for i := 0; i+1 < len(in); i += 2 { v := int16(binary.LittleEndian.Uint16(in[i : i+2])) out = append(out, int32(v)<<16) } return out } func Float32ToPCM32(in []float32) []int32 { out := make([]int32, len(in)) for i, sample := range in { if sample > 1 { sample = 1 } else if sample < -1 { sample = -1 } if sample == -1 { out[i] = math.MinInt32 continue } out[i] = int32(sample * math.MaxInt32) } return out }