Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

47 wiersze
1.4KB

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "os"
  8. cfgpkg "github.com/jan/fm-rds-tx/internal/config"
  9. ctrlpkg "github.com/jan/fm-rds-tx/internal/control"
  10. drypkg "github.com/jan/fm-rds-tx/internal/dryrun"
  11. )
  12. func main() {
  13. configPath := flag.String("config", "", "path to JSON config")
  14. printConfig := flag.Bool("print-config", false, "print effective config and exit")
  15. dryRun := flag.Bool("dry-run", false, "run no-hardware dry-run output")
  16. dryOutput := flag.String("dry-output", "-", "dry-run output path or - for stdout")
  17. flag.Parse()
  18. cfg, err := cfgpkg.Load(*configPath)
  19. if err != nil {
  20. log.Fatalf("load config: %v", err)
  21. }
  22. if *printConfig {
  23. fmt.Printf("backend=%s freq=%.1fMHz stereo=%t rds=%t listen=%s\n", cfg.Backend.Kind, cfg.FM.FrequencyMHz, cfg.FM.StereoEnabled, cfg.RDS.Enabled, cfg.Control.ListenAddress)
  24. return
  25. }
  26. if *dryRun {
  27. frame := drypkg.Generate(cfg)
  28. if err := drypkg.WriteJSON(*dryOutput, frame); err != nil {
  29. log.Fatalf("dry-run failed: %v", err)
  30. }
  31. if *dryOutput != "" && *dryOutput != "-" {
  32. fmt.Fprintf(os.Stderr, "dry run frame written to %s\n", *dryOutput)
  33. }
  34. return
  35. }
  36. srv := ctrlpkg.NewServer(cfg)
  37. log.Printf("fm-rds-tx listening on %s", cfg.Control.ListenAddress)
  38. log.Fatal(http.ListenAndServe(cfg.Control.ListenAddress, srv.Handler()))
  39. }