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

57 行
1.4KB

  1. package aoiprxkit
  2. import (
  3. "bytes"
  4. "context"
  5. "io"
  6. "testing"
  7. "time"
  8. )
  9. type nopCloser struct{ io.Reader }
  10. func (n nopCloser) Close() error { return nil }
  11. func TestStreamReceiverPCM(t *testing.T) {
  12. var buf bytes.Buffer
  13. samples := []int32{100, -100, 200, -200}
  14. if err := WritePCM32Packet(&buf, 2, 48000, 2, 55, 999, samples); err != nil {
  15. t.Fatalf("unexpected write error: %v", err)
  16. }
  17. got := make(chan PCMFrame, 1)
  18. rx, err := NewStreamReceiver(StreamReceiverConfig{SourceLabel: "test-source"}, func(ctx context.Context) (io.ReadCloser, error) {
  19. _ = ctx
  20. return nopCloser{Reader: bytes.NewReader(buf.Bytes())}, nil
  21. }, func(frame PCMFrame) {
  22. select {
  23. case got <- frame:
  24. default:
  25. }
  26. })
  27. if err != nil {
  28. t.Fatalf("unexpected constructor error: %v", err)
  29. }
  30. if err := rx.Start(context.Background()); err != nil {
  31. t.Fatalf("unexpected start error: %v", err)
  32. }
  33. defer rx.Stop()
  34. select {
  35. case frame := <-got:
  36. if frame.SampleRateHz != 48000 || frame.Channels != 2 || frame.Source != "test-source" {
  37. t.Fatalf("unexpected frame meta: %+v", frame)
  38. }
  39. if len(frame.Samples) != len(samples) {
  40. t.Fatalf("unexpected sample len: %d", len(frame.Samples))
  41. }
  42. for i := range samples {
  43. if frame.Samples[i] != samples[i] {
  44. t.Fatalf("sample %d mismatch: got=%d want=%d", i, frame.Samples[i], samples[i])
  45. }
  46. }
  47. case <-time.After(500 * time.Millisecond):
  48. t.Fatalf("timeout waiting for frame")
  49. }
  50. }