fix: write off an audio source that never delivers anything
The operator said it from the start: in CW there is no sidetone, only reception. My previous fix did not cover it — it wrote off a source that STOPPED, but a source that never starts has no last-delivery time, so it stayed forever "not yet dry" and held the mixer at min(A,B)=0. Three empty recordings while the radio audio streamed perfectly. A source with no delivery is now measured from when capture started. Tested both ways: nothing is written off in the first moments, and a source that has never spoken is written off once the grace period has passed.
This commit is contained in:
@@ -51,17 +51,40 @@ func TestMixerStillMixesBothSources(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Before either source has EVER delivered, neither may be written off: at
|
||||
// startup both timestamps are zero, and declaring one dead then would drop the
|
||||
// first moments of every recording.
|
||||
func TestMixerWaitsForBothAtStartup(t *testing.T) {
|
||||
// Just after capture starts, a source that has not delivered yet is NOT written
|
||||
// off: the first samples take a moment to arrive, and declaring the mic dead at
|
||||
// once would drop the opening of every recording.
|
||||
func TestMixerWaitsBrieflyAtStartup(t *testing.T) {
|
||||
r := &Recorder{twoSrc: true, gainA: 1, gainB: 1, running: true, active: true, prerollSamples: sampleRate}
|
||||
r.startedAt = time.Now()
|
||||
r.bufA = []int16{100, 100}
|
||||
// lastA/lastB both zero — nothing has been heard from either yet.
|
||||
|
||||
r.mixTick()
|
||||
|
||||
if len(r.acc) != 0 {
|
||||
t.Errorf("recorded %d samples before the second source was known to be silent", len(r.acc))
|
||||
t.Errorf("recorded %d samples immediately — the second source deserves a moment to start", len(r.acc))
|
||||
}
|
||||
}
|
||||
|
||||
// A source that has NEVER delivered is written off once enough time has passed.
|
||||
//
|
||||
// This is the case that actually happens, and the one the first version missed:
|
||||
// a DAX Mic channel switched off delivers not one sample, so it had no
|
||||
// last-delivery time and stayed forever "not yet dry" — taking the whole
|
||||
// recording down with it while the radio audio streamed perfectly.
|
||||
func TestMixerWritesOffASourceThatNeverSpoke(t *testing.T) {
|
||||
r := &Recorder{twoSrc: true, gainA: 1, gainB: 1, running: true, active: true, prerollSamples: sampleRate}
|
||||
r.startedAt = time.Now().Add(-5 * time.Second)
|
||||
r.bufA = []int16{700, 700, 700}
|
||||
r.lastA = time.Now()
|
||||
// lastB stays zero: the mic has never produced anything at all.
|
||||
|
||||
r.mixTick()
|
||||
|
||||
if len(r.acc) != 3 {
|
||||
t.Fatalf("recorded %d samples, want 3 — the radio was streaming the whole time", len(r.acc))
|
||||
}
|
||||
if r.acc[0] != 700 {
|
||||
t.Errorf("sample = %d, want 700", r.acc[0])
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user