void VarioSynthesiser::SetSilence() { mutex.lock(); UnsafeSetSilence(); mutex.unlock(); }
void VarioSynthesiser::SetVario(unsigned sample_rate, fixed vario) { mutex.lock(); const int ivario = Clamp((int)(vario * 100), min_vario, max_vario); if (dead_band_enabled && InDeadBand(ivario)) { /* inside the "dead band" */ UnsafeSetSilence(); mutex.unlock(); return; } /* update the ToneSynthesiser base class */ SetTone(sample_rate, VarioToFrequency(ivario)); if (ivario > 0) { /* while climbing, the vario sound gets interrupted by silence periodically */ const unsigned period_ms = sample_rate * (min_period_ms + (max_vario - ivario) * (max_period_ms - min_period_ms) / max_vario) / 1000; silence_count = period_ms / 3; audible_count = period_ms - silence_count; /* preserve the old "_remaining" values as much as possible, to avoid chopping off the previous tone */ if (audible_remaining > audible_count) audible_remaining = audible_count; if (silence_remaining > silence_count) silence_remaining = silence_count; } else { /* continuous tone while sinking */ audible_count = 1; silence_count = 0; } mutex.unlock(); }
void VarioSynthesiser::SetSilence() { const ScopeLock protect(mutex); UnsafeSetSilence(); }