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();
}
Exemple #3
0
void
VarioSynthesiser::SetSilence()
{
  const ScopeLock protect(mutex);
  UnsafeSetSilence();
}