package mpx

// Combiner defines the interface used to merge MPX primitives into a composite waveform.
type Combiner interface {
	Combine(mono, stereo, pilot, rds float64) float64
}

// DefaultCombiner combines components with configurable gains.
type DefaultCombiner struct {
	MonoGain   float64
	StereoGain float64
	PilotGain  float64
	RDSGain    float64
}

// NewDefaultCombiner creates a combiner with sane default gains.
func NewDefaultCombiner() DefaultCombiner {
	return DefaultCombiner{
		MonoGain:   1,
		StereoGain: 1,
		PilotGain:  1,
		RDSGain:    1,
	}
}

// Combine merges the provided MPX components.
func (c DefaultCombiner) Combine(mono, stereo, pilot, rds float64) float64 {
	return c.MonoGain*mono + c.StereoGain*stereo + c.PilotGain*pilot + c.RDSGain*rds
}
