Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

68 líneas
2.1KB

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "os"
  8. "time"
  9. apppkg "github.com/jan/fm-rds-tx/internal/app"
  10. cfgpkg "github.com/jan/fm-rds-tx/internal/config"
  11. ctrlpkg "github.com/jan/fm-rds-tx/internal/control"
  12. drypkg "github.com/jan/fm-rds-tx/internal/dryrun"
  13. )
  14. func main() {
  15. configPath := flag.String("config", "", "path to JSON config")
  16. printConfig := flag.Bool("print-config", false, "print effective config and exit")
  17. dryRun := flag.Bool("dry-run", false, "run no-hardware dry-run output")
  18. dryOutput := flag.String("dry-output", "-", "dry-run output path or - for stdout")
  19. simulate := flag.Bool("simulate-tx", false, "run simulated Soapy/backend transmit path")
  20. simulateOutput := flag.String("simulate-output", "", "simulated transmit output file")
  21. simulateDuration := flag.Duration("simulate-duration", 500*time.Millisecond, "simulated transmit duration")
  22. flag.Parse()
  23. cfg, err := cfgpkg.Load(*configPath)
  24. if err != nil {
  25. log.Fatalf("load config: %v", err)
  26. }
  27. if *printConfig {
  28. preemph := "off"
  29. if cfg.FM.PreEmphasisUS > 0 {
  30. preemph = fmt.Sprintf("%.0fµs", cfg.FM.PreEmphasisUS)
  31. }
  32. fmt.Printf("backend=%s freq=%.1fMHz stereo=%t rds=%t preemph=%s limiter=%t fmmod=%t deviation=±%.0fHz listen=%s\n",
  33. cfg.Backend.Kind, cfg.FM.FrequencyMHz, cfg.FM.StereoEnabled, cfg.RDS.Enabled,
  34. preemph, cfg.FM.LimiterEnabled, cfg.FM.FMModulationEnabled, cfg.FM.MaxDeviationHz,
  35. cfg.Control.ListenAddress)
  36. return
  37. }
  38. if *dryRun {
  39. frame := drypkg.Generate(cfg)
  40. if err := drypkg.WriteJSON(*dryOutput, frame); err != nil {
  41. log.Fatalf("dry-run failed: %v", err)
  42. }
  43. if *dryOutput != "" && *dryOutput != "-" {
  44. fmt.Fprintf(os.Stderr, "dry run frame written to %s\n", *dryOutput)
  45. }
  46. return
  47. }
  48. if *simulate {
  49. summary, err := apppkg.RunSimulatedTransmit(cfg, *simulateOutput, *simulateDuration)
  50. if err != nil {
  51. log.Fatalf("simulate-tx failed: %v", err)
  52. }
  53. fmt.Println(summary)
  54. return
  55. }
  56. srv := ctrlpkg.NewServer(cfg)
  57. log.Printf("fm-rds-tx listening on %s", cfg.Control.ListenAddress)
  58. log.Fatal(http.ListenAndServe(cfg.Control.ListenAddress, srv.Handler()))
  59. }