Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.4KB

  1. package aoiprxkit
  2. import (
  3. "bytes"
  4. "context"
  5. "io"
  6. "testing"
  7. "time"
  8. )
  9. type readCloser struct{ io.Reader }
  10. func (r readCloser) Close() error { return nil }
  11. func TestSRTReceiverWithCustomOpener(t *testing.T) {
  12. var stream bytes.Buffer
  13. samples := []int32{1, 2, 3, 4}
  14. if err := WritePCM32Packet(&stream, 2, 48000, 2, 1, 480, samples); err != nil {
  15. t.Fatalf("unexpected write error: %v", err)
  16. }
  17. got := make(chan PCMFrame, 1)
  18. rx, err := NewSRTReceiverWithOpener(SRTConfig{
  19. URL: "srt://example:9000?mode=listener",
  20. SampleRateHz: 48000,
  21. Channels: 2,
  22. }, func(ctx context.Context, cfg SRTConfig) (io.ReadCloser, error) {
  23. _ = ctx
  24. _ = cfg
  25. return readCloser{Reader: bytes.NewReader(stream.Bytes())}, nil
  26. }, func(frame PCMFrame) {
  27. select {
  28. case got <- frame:
  29. default:
  30. }
  31. })
  32. if err != nil {
  33. t.Fatalf("unexpected constructor error: %v", err)
  34. }
  35. if err := rx.Start(context.Background()); err != nil {
  36. t.Fatalf("unexpected start error: %v", err)
  37. }
  38. defer rx.Stop()
  39. select {
  40. case frame := <-got:
  41. if len(frame.Samples) != len(samples) {
  42. t.Fatalf("unexpected sample len: %d", len(frame.Samples))
  43. }
  44. for i := range samples {
  45. if frame.Samples[i] != samples[i] {
  46. t.Fatalf("sample %d mismatch: got=%d want=%d", i, frame.Samples[i], samples[i])
  47. }
  48. }
  49. case <-time.After(500 * time.Millisecond):
  50. t.Fatalf("timeout waiting for frame")
  51. }
  52. }