Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

77 行
1.9KB

  1. package factory
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "github.com/jan/fm-rds-tx/internal/audio"
  7. "github.com/jan/fm-rds-tx/internal/config"
  8. "github.com/jan/fm-rds-tx/internal/ingest"
  9. )
  10. func TestHTTPRawFactoryToRuntimeSmoke(t *testing.T) {
  11. cfg := config.Default()
  12. cfg.Ingest.Kind = "http-raw"
  13. cfg.Ingest.HTTPRaw.SampleRateHz = 44100
  14. cfg.Ingest.HTTPRaw.Channels = 2
  15. src, ingress, err := BuildSource(cfg, Deps{})
  16. if err != nil {
  17. t.Fatalf("build source: %v", err)
  18. }
  19. if src == nil || ingress == nil {
  20. t.Fatalf("expected source and ingress for kind=http-raw")
  21. }
  22. sink := audio.NewStreamSource(128, cfg.Ingest.HTTPRaw.SampleRateHz)
  23. rt := ingest.NewRuntime(sink, src)
  24. if err := rt.Start(context.Background()); err != nil {
  25. t.Fatalf("runtime start: %v", err)
  26. }
  27. defer rt.Stop()
  28. // Two stereo frames: L1,R1,L2,R2 (S16LE).
  29. frames, err := ingress.WritePCM16([]byte{
  30. 0xE8, 0x03, 0x18, 0xFC,
  31. 0xD0, 0x07, 0x30, 0xF8,
  32. })
  33. if err != nil {
  34. t.Fatalf("write pcm16: %v", err)
  35. }
  36. if frames != 2 {
  37. t.Fatalf("frames=%d want 2", frames)
  38. }
  39. waitForSinkFrames(t, sink, 2)
  40. stats := rt.Stats()
  41. if stats.Active.Kind != "http-raw" {
  42. t.Fatalf("active kind=%q want http-raw", stats.Active.Kind)
  43. }
  44. if stats.Source.ChunksIn != 1 {
  45. t.Fatalf("source chunksIn=%d want 1", stats.Source.ChunksIn)
  46. }
  47. if stats.Source.SamplesIn != 4 {
  48. t.Fatalf("source samplesIn=%d want 4", stats.Source.SamplesIn)
  49. }
  50. if stats.Runtime.State != "running" {
  51. t.Fatalf("runtime state=%q want running", stats.Runtime.State)
  52. }
  53. if stats.Runtime.LastChunkAt.IsZero() {
  54. t.Fatalf("runtime lastChunkAt should be set")
  55. }
  56. }
  57. func waitForSinkFrames(t *testing.T, sink *audio.StreamSource, minFrames int) {
  58. t.Helper()
  59. deadline := time.Now().Add(1 * time.Second)
  60. for time.Now().Before(deadline) {
  61. if sink.Available() >= minFrames {
  62. return
  63. }
  64. time.Sleep(10 * time.Millisecond)
  65. }
  66. t.Fatalf("timeout waiting for sink frames: have=%d want>=%d", sink.Available(), minFrames)
  67. }