diff --git a/internal/offline/generator.go b/internal/offline/generator.go index ff38a4c..9fc2590 100644 --- a/internal/offline/generator.go +++ b/internal/offline/generator.go @@ -142,6 +142,10 @@ func (g *Generator) GenerateFrame(duration time.Duration) *output.CompositeFrame // Stereo encode (produces mono, DSB-SC stereo, pilot) preFrame := audio.NewFrame(audio.Sample(inL), audio.Sample(inR)) comps := stereoEncoder.Encode(preFrame) + if !g.cfg.FM.StereoEnabled { + comps.Stereo = 0 + comps.Pilot = 0 + } // RDS rdsValue := 0.0 diff --git a/internal/offline/generator_test.go b/internal/offline/generator_test.go index 4967736..7e8ab6d 100644 --- a/internal/offline/generator_test.go +++ b/internal/offline/generator_test.go @@ -52,6 +52,33 @@ func TestGenerateFrameCompositeOnly(t *testing.T) { } } +func TestStereoDisabledSuppressesPilotAndStereoDifference(t *testing.T) { + cfgStereo := cfgpkg.Default() + cfgStereo.FM.FMModulationEnabled = false + cfgStereo.FM.StereoEnabled = true + cfgStereo.Audio.ToneLeftHz = 1000 + cfgStereo.Audio.ToneRightHz = 1600 + + cfgMono := cfgStereo + cfgMono.FM.StereoEnabled = false + + stereoFrame := NewGenerator(cfgStereo).GenerateFrame(20 * time.Millisecond) + monoFrame := NewGenerator(cfgMono).GenerateFrame(20 * time.Millisecond) + + if len(stereoFrame.Samples) != len(monoFrame.Samples) { + t.Fatal("frame length mismatch") + } + + var diffEnergy float64 + for i := range stereoFrame.Samples { + d := float64(stereoFrame.Samples[i].I - monoFrame.Samples[i].I) + diffEnergy += d * d + } + if diffEnergy == 0 { + t.Fatal("expected stereo-enabled and stereo-disabled composite output to differ") + } +} + func TestWriteFile(t *testing.T) { cfg := cfgpkg.Default() out := filepath.Join(t.TempDir(), "test.iqf32")