aduio mail
This commit is contained in:
@@ -31,6 +31,8 @@ type Recorder struct {
|
||||
bufA []int16 // From Radio
|
||||
bufB []int16 // mic
|
||||
twoSrc bool
|
||||
gainA float64 // From Radio gain (1.0 = unity), guarded by srcMu
|
||||
gainB float64 // mic gain
|
||||
|
||||
// Mixed output state (guarded by mu).
|
||||
ring []int16 // last prerollSamples of mixed audio
|
||||
@@ -38,7 +40,36 @@ type Recorder struct {
|
||||
acc []int16 // active QSO accumulation (seeded from ring on BeginQSO)
|
||||
}
|
||||
|
||||
func NewRecorder() *Recorder { return &Recorder{} }
|
||||
func NewRecorder() *Recorder { return &Recorder{gainA: 1, gainB: 1} }
|
||||
|
||||
// SetGains sets the per-source mix levels (1.0 = unity). Use this to balance a
|
||||
// hot mic against quieter rig RX audio. Values ≤0 fall back to unity.
|
||||
func (r *Recorder) SetGains(fromGain, micGain float64) {
|
||||
if fromGain <= 0 {
|
||||
fromGain = 1
|
||||
}
|
||||
if micGain <= 0 {
|
||||
micGain = 1
|
||||
}
|
||||
r.srcMu.Lock()
|
||||
r.gainA, r.gainB = fromGain, micGain
|
||||
r.srcMu.Unlock()
|
||||
}
|
||||
|
||||
// scaleSample applies gain to a sample with clamping.
|
||||
func scaleSample(s int16, g float64) int16 {
|
||||
if g == 1 {
|
||||
return s
|
||||
}
|
||||
v := float64(s) * g
|
||||
if v > 32767 {
|
||||
return 32767
|
||||
}
|
||||
if v < -32768 {
|
||||
return -32768
|
||||
}
|
||||
return int16(v)
|
||||
}
|
||||
|
||||
func (r *Recorder) Running() bool {
|
||||
r.mu.Lock()
|
||||
@@ -128,7 +159,7 @@ func (r *Recorder) mixTick() {
|
||||
if n > 0 {
|
||||
mixed = make([]int16, n)
|
||||
for i := 0; i < n; i++ {
|
||||
mixed[i] = clampSum(r.bufA[i], r.bufB[i])
|
||||
mixed[i] = clampSum(scaleSample(r.bufA[i], r.gainA), scaleSample(r.bufB[i], r.gainB))
|
||||
}
|
||||
r.bufA = append(r.bufA[:0], r.bufA[n:]...)
|
||||
r.bufB = append(r.bufB[:0], r.bufB[n:]...)
|
||||
@@ -142,7 +173,9 @@ func (r *Recorder) mixTick() {
|
||||
}
|
||||
} else if len(r.bufA) > 0 {
|
||||
mixed = make([]int16, len(r.bufA))
|
||||
copy(mixed, r.bufA)
|
||||
for i, s := range r.bufA {
|
||||
mixed[i] = scaleSample(s, r.gainA)
|
||||
}
|
||||
r.bufA = r.bufA[:0]
|
||||
}
|
||||
r.srcMu.Unlock()
|
||||
|
||||
Reference in New Issue
Block a user