From e2f9e28ad317d2c890fb6bc93ed67d41772f385c Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Fri, 3 Apr 2026 10:11:26 +0200 Subject: [PATCH] refactor: remove unused input sample rate config --- docs/config.sample.json | 1 - internal/config/config.go | 16 ++++----- internal/config/config_test.go | 14 +++----- internal/dryrun/dryrun.go | 62 ++++++++++++++++------------------ internal/dryrun/dryrun_test.go | 16 ++++----- 5 files changed, 49 insertions(+), 60 deletions(-) diff --git a/docs/config.sample.json b/docs/config.sample.json index 19da1fa..1bb4e71 100644 --- a/docs/config.sample.json +++ b/docs/config.sample.json @@ -1,7 +1,6 @@ { "audio": { "inputPath": "", - "inputSampleRate": 48000, "gain": 1.0, "toneLeftHz": 1000, "toneRightHz": 1600, diff --git a/internal/config/config.go b/internal/config/config.go index e0f1860..f569af5 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -17,12 +17,11 @@ type Config struct { } type AudioConfig struct { - InputPath string `json:"inputPath"` - InputSampleRate int `json:"inputSampleRate"` // sample rate for WAV/tone source - Gain float64 `json:"gain"` - ToneLeftHz float64 `json:"toneLeftHz"` - ToneRightHz float64 `json:"toneRightHz"` - ToneAmplitude float64 `json:"toneAmplitude"` + InputPath string `json:"inputPath"` + Gain float64 `json:"gain"` + ToneLeftHz float64 `json:"toneLeftHz"` + ToneRightHz float64 `json:"toneRightHz"` + ToneAmplitude float64 `json:"toneAmplitude"` } type RDSConfig struct { @@ -60,7 +59,7 @@ type ControlConfig struct { func Default() Config { return Config{ - Audio: AudioConfig{InputSampleRate: 48000, Gain: 1.0, ToneLeftHz: 1000, ToneRightHz: 1600, ToneAmplitude: 0.4}, + Audio: AudioConfig{Gain: 1.0, ToneLeftHz: 1000, ToneRightHz: 1600, ToneAmplitude: 0.4}, RDS: RDSConfig{Enabled: true, PI: "1234", PS: "FMRTX", RadioText: "fm-rds-tx", PTY: 0}, FM: FMConfig{ FrequencyMHz: 100.0, @@ -111,9 +110,6 @@ func Load(path string) (Config, error) { } func (c Config) Validate() error { - if c.Audio.InputSampleRate < 8000 || c.Audio.InputSampleRate > 384000 { - return fmt.Errorf("audio.inputSampleRate out of range") - } if c.Audio.Gain < 0 || c.Audio.Gain > 4 { return fmt.Errorf("audio.gain out of range") } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 871f710..aee3ada 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -41,12 +41,8 @@ func TestDefaultFMModulation(t *testing.T) { func TestParsePI(t *testing.T) { tests := []struct{ in string; want uint16; ok bool }{ - {"1234", 0x1234, true}, - {"0xBEEF", 0xBEEF, true}, - {"0XCAFE", 0xCAFE, true}, - {" 0x2345 ", 0x2345, true}, - {"", 0, false}, - {"nope", 0, false}, + {"1234", 0x1234, true}, {"0xBEEF", 0xBEEF, true}, {"0XCAFE", 0xCAFE, true}, + {" 0x2345 ", 0x2345, true}, {"", 0, false}, {"nope", 0, false}, } for _, tt := range tests { got, err := ParsePI(tt.in) @@ -58,17 +54,17 @@ func TestParsePI(t *testing.T) { func TestValidateRejectsInvalidPI(t *testing.T) { cfg := Default(); cfg.RDS.PI = "nope" - if err := cfg.Validate(); err == nil { t.Fatal("expected error for invalid PI") } + if err := cfg.Validate(); err == nil { t.Fatal("expected error") } } func TestValidateRejectsEmptyPI(t *testing.T) { cfg := Default(); cfg.RDS.PI = "" - if err := cfg.Validate(); err == nil { t.Fatal("expected error for empty PI") } + if err := cfg.Validate(); err == nil { t.Fatal("expected error") } } func TestEffectiveDeviceRate(t *testing.T) { cfg := Default() - if cfg.EffectiveDeviceRate() != float64(cfg.FM.CompositeRateHz) { t.Fatal("expected composite rate when device rate is 0") } + if cfg.EffectiveDeviceRate() != float64(cfg.FM.CompositeRateHz) { t.Fatal("expected composite rate") } cfg.Backend.DeviceSampleRateHz = 912000 if cfg.EffectiveDeviceRate() != 912000 { t.Fatal("expected 912000") } } diff --git a/internal/dryrun/dryrun.go b/internal/dryrun/dryrun.go index 094322f..526b339 100644 --- a/internal/dryrun/dryrun.go +++ b/internal/dryrun/dryrun.go @@ -10,22 +10,21 @@ import ( ) type FrameSummary struct { - Mode string `json:"mode"` - FrequencyMHz float64 `json:"frequencyMHz"` - StereoEnabled bool `json:"stereoEnabled"` - RDSEnabled bool `json:"rdsEnabled"` - InputSampleRateHz int `json:"inputSampleRateHz"` - CompositeRate int `json:"compositeRateHz"` - DeviceRate float64 `json:"deviceSampleRateHz"` - PilotLevel float64 `json:"pilotLevel"` - RDSInjection float64 `json:"rdsInjection"` - OutputDrive float64 `json:"outputDrive"` - PreEmphasisTauUS float64 `json:"preEmphasisTauUS"` - MaxDeviationHz float64 `json:"maxDeviationHz"` - LimiterEnabled bool `json:"limiterEnabled"` - FMModulation bool `json:"fmModulationEnabled"` - Source string `json:"source"` - PreviewSamples []float64 `json:"previewSamples"` + Mode string `json:"mode"` + FrequencyMHz float64 `json:"frequencyMHz"` + StereoEnabled bool `json:"stereoEnabled"` + RDSEnabled bool `json:"rdsEnabled"` + CompositeRate int `json:"compositeRateHz"` + DeviceRate float64 `json:"deviceSampleRateHz"` + PilotLevel float64 `json:"pilotLevel"` + RDSInjection float64 `json:"rdsInjection"` + OutputDrive float64 `json:"outputDrive"` + PreEmphasisTauUS float64 `json:"preEmphasisTauUS"` + MaxDeviationHz float64 `json:"maxDeviationHz"` + LimiterEnabled bool `json:"limiterEnabled"` + FMModulation bool `json:"fmModulationEnabled"` + Source string `json:"source"` + PreviewSamples []float64 `json:"previewSamples"` } func Generate(cfg cfgpkg.Config) FrameSummary { @@ -43,22 +42,21 @@ func Generate(cfg cfgpkg.Config) FrameSummary { source = cfg.Audio.InputPath } return FrameSummary{ - Mode: "dry-run", - FrequencyMHz: cfg.FM.FrequencyMHz, - StereoEnabled: cfg.FM.StereoEnabled, - RDSEnabled: cfg.RDS.Enabled, - InputSampleRateHz: cfg.Audio.InputSampleRate, - CompositeRate: cfg.FM.CompositeRateHz, - DeviceRate: cfg.EffectiveDeviceRate(), - PilotLevel: cfg.FM.PilotLevel, - RDSInjection: cfg.FM.RDSInjection, - OutputDrive: cfg.FM.OutputDrive, - PreEmphasisTauUS: cfg.FM.PreEmphasisTauUS, - MaxDeviationHz: cfg.FM.MaxDeviationHz, - LimiterEnabled: cfg.FM.LimiterEnabled, - FMModulation: cfg.FM.FMModulationEnabled, - Source: source, - PreviewSamples: preview, + Mode: "dry-run", + FrequencyMHz: cfg.FM.FrequencyMHz, + StereoEnabled: cfg.FM.StereoEnabled, + RDSEnabled: cfg.RDS.Enabled, + CompositeRate: cfg.FM.CompositeRateHz, + DeviceRate: cfg.EffectiveDeviceRate(), + PilotLevel: cfg.FM.PilotLevel, + RDSInjection: cfg.FM.RDSInjection, + OutputDrive: cfg.FM.OutputDrive, + PreEmphasisTauUS: cfg.FM.PreEmphasisTauUS, + MaxDeviationHz: cfg.FM.MaxDeviationHz, + LimiterEnabled: cfg.FM.LimiterEnabled, + FMModulation: cfg.FM.FMModulationEnabled, + Source: source, + PreviewSamples: preview, } } diff --git a/internal/dryrun/dryrun_test.go b/internal/dryrun/dryrun_test.go index 92b2176..ad8e88f 100644 --- a/internal/dryrun/dryrun_test.go +++ b/internal/dryrun/dryrun_test.go @@ -11,17 +11,17 @@ import ( func TestGenerate(t *testing.T) { cfg := cfgpkg.Default() frame := Generate(cfg) - if frame.Mode != "dry-run" { t.Fatalf("unexpected mode: %s", frame.Mode) } - if len(frame.PreviewSamples) != 16 { t.Fatalf("unexpected preview length: %d", len(frame.PreviewSamples)) } - if frame.Source != "tones" { t.Fatalf("unexpected source: %s", frame.Source) } - if frame.PreEmphasisTauUS != 50 { t.Fatalf("unexpected preEmphasisTauUS: %.0f", frame.PreEmphasisTauUS) } - if !frame.FMModulation { t.Fatal("expected fmModulationEnabled=true") } - if frame.DeviceRate != float64(cfg.FM.CompositeRateHz) { t.Fatalf("expected deviceRate=%d, got %.0f", cfg.FM.CompositeRateHz, frame.DeviceRate) } + if frame.Mode != "dry-run" { t.Fatalf("mode: %s", frame.Mode) } + if len(frame.PreviewSamples) != 16 { t.Fatal("preview length") } + if frame.Source != "tones" { t.Fatal("source") } + if frame.PreEmphasisTauUS != 50 { t.Fatal("preemph") } + if !frame.FMModulation { t.Fatal("fm mod") } + if frame.DeviceRate != float64(cfg.FM.CompositeRateHz) { t.Fatal("device rate") } } func TestWriteJSONFile(t *testing.T) { dir := t.TempDir() out := filepath.Join(dir, "frame.json") - if err := WriteJSON(out, Generate(cfgpkg.Default())); err != nil { t.Fatalf("WriteJSON: %v", err) } - if _, err := os.Stat(out); err != nil { t.Fatalf("expected output: %v", err) } + if err := WriteJSON(out, Generate(cfgpkg.Default())); err != nil { t.Fatal(err) } + if _, err := os.Stat(out); err != nil { t.Fatal(err) } }