Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.6KB

  1. package aoiprxkit
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. )
  7. type SRTConfig struct {
  8. URL string
  9. Mode string
  10. SampleRateHz int
  11. Channels int
  12. SourceLabel string
  13. }
  14. func DefaultSRTConfig() SRTConfig {
  15. return SRTConfig{
  16. SampleRateHz: 48000,
  17. Channels: 2,
  18. Mode: "listener",
  19. }
  20. }
  21. func (c SRTConfig) Validate() error {
  22. if c.URL == "" {
  23. return fmt.Errorf("SRT URL must not be empty")
  24. }
  25. if c.SampleRateHz <= 0 {
  26. return fmt.Errorf("SampleRateHz must be > 0")
  27. }
  28. if c.Channels < 1 || c.Channels > 2 {
  29. return fmt.Errorf("Channels must be 1 or 2")
  30. }
  31. return nil
  32. }
  33. type SRTConnOpener func(ctx context.Context, cfg SRTConfig) (io.ReadCloser, error)
  34. type SRTReceiver struct {
  35. cfg SRTConfig
  36. streamRx *StreamReceiver
  37. }
  38. func NewSRTReceiver(cfg SRTConfig, onFrame FrameHandler) (*SRTReceiver, error) {
  39. return NewSRTReceiverWithOpener(cfg, defaultSRTConnOpener, onFrame)
  40. }
  41. func NewSRTReceiverWithOpener(cfg SRTConfig, opener SRTConnOpener, onFrame FrameHandler) (*SRTReceiver, error) {
  42. if err := cfg.Validate(); err != nil {
  43. return nil, err
  44. }
  45. if opener == nil {
  46. return nil, fmt.Errorf("SRT opener must not be nil")
  47. }
  48. src := cfg.SourceLabel
  49. if src == "" {
  50. src = cfg.URL
  51. }
  52. streamRx, err := NewStreamReceiver(StreamReceiverConfig{SourceLabel: src}, func(ctx context.Context) (io.ReadCloser, error) {
  53. return opener(ctx, cfg)
  54. }, onFrame)
  55. if err != nil {
  56. return nil, err
  57. }
  58. return &SRTReceiver{cfg: cfg, streamRx: streamRx}, nil
  59. }
  60. func (r *SRTReceiver) Start(ctx context.Context) error { return r.streamRx.Start(ctx) }
  61. func (r *SRTReceiver) Stop() error { return r.streamRx.Stop() }