Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

59 行
1.2KB

  1. package decoder
  2. import (
  3. "encoding/binary"
  4. "math"
  5. "time"
  6. "github.com/jan/fm-rds-tx/internal/ingest"
  7. )
  8. const defaultSampleRateHz = 44100
  9. func ResolveSampleRate(decodedSampleRateHz int, meta StreamMeta) int {
  10. if decodedSampleRateHz > 0 {
  11. return decodedSampleRateHz
  12. }
  13. if meta.SampleRateHz > 0 {
  14. return meta.SampleRateHz
  15. }
  16. return defaultSampleRateHz
  17. }
  18. func BuildChunk(samples []int32, channels, sampleRateHz int, seq uint64, sourceID string) ingest.PCMChunk {
  19. return ingest.PCMChunk{
  20. Samples: samples,
  21. Channels: channels,
  22. SampleRateHz: sampleRateHz,
  23. Sequence: seq,
  24. Timestamp: time.Now(),
  25. SourceID: sourceID,
  26. }
  27. }
  28. func PCM16LEToPCM32(in []byte) []int32 {
  29. out := make([]int32, 0, len(in)/2)
  30. for i := 0; i+1 < len(in); i += 2 {
  31. v := int16(binary.LittleEndian.Uint16(in[i : i+2]))
  32. out = append(out, int32(v)<<16)
  33. }
  34. return out
  35. }
  36. func Float32ToPCM32(in []float32) []int32 {
  37. out := make([]int32, len(in))
  38. for i, sample := range in {
  39. if sample > 1 {
  40. sample = 1
  41. } else if sample < -1 {
  42. sample = -1
  43. }
  44. if sample == -1 {
  45. out[i] = math.MinInt32
  46. continue
  47. }
  48. out[i] = int32(sample * math.MaxInt32)
  49. }
  50. return out
  51. }