static void process_audio(SFSUI* ui, const size_t n_elem, float const * const left, float const * const right) { pthread_mutex_lock(&ui->fft_lock); fftx_run(ui->fa, n_elem, left); bool display = !fftx_run(ui->fb, n_elem, right); if (display) { assert (fftx_bins(ui->fa) == ui->fft_bins); const float db_thresh = 1e-20; for (uint32_t i = 1; i < ui->fft_bins-1; i++) { if (ui->fa->power[i] < db_thresh && ui->fb->power[i] < db_thresh) { ui->lr[i] = 0.5; ui->level[i] = 0; continue; } const float lv = MAX(ui->fa->power[i], ui->fb->power[i]); #if 1 const float lr = .5 + .5 * (sqrtf(ui->fb->power[i]) - sqrtf(ui->fa->power[i])) / sqrtf(lv); #else //XXX TODO log-scale / deflection of fraction //const float lr = .5 + .25 * fast_log10(ui->fb->power[i] / ui->fa->power[i]); float lr; if (ui->fb->power[i] < ui->fa->power[i]) { lr = .5 + .5 * fast_log10(ui->fb->power[i] / ui->fa->power[i]); } else { lr = .5 - .5 * fast_log10(ui->fa->power[i] / ui->fb->power[i]); } #endif ui->level[i] += .1 * (lv - ui->level[i]) + 1e-20; ui->lr[i] += .1 * (lr - ui->lr[i]) + 1e-10; } queue_draw(ui->m0); } pthread_mutex_unlock(&ui->fft_lock); }
static void process_audio(MF2UI* ui, const size_t n_elem, float const * const left, float const * const right) { pthread_mutex_lock(&ui->fft_lock); fftx_run(ui->fa, n_elem, left); bool display = !fftx_run(ui->fb, n_elem, right); if (display) { assert (fftx_bins(ui->fa) == ui->fft_bins); float peak = 0; const float db_thresh = ui->db_thresh; for (uint32_t i = 1; i < ui->fft_bins-1; i++) { if (ui->fa->power[i] < db_thresh || ui->fb->power[i] < db_thresh) { ui->phase[i] = 0; ui->level[i] = -100; continue; } const float phase0 = ui->fa->phase[i]; const float phase1 = ui->fb->phase[i]; float phase = phase1 - phase0; ui->phase[i] = phase; ui->level[i] = MAX(ui->fa->power[i], ui->fb->power[i]); if (ui->level[i] > peak) { peak = ui->level[i]; } } ui->peak += .04 * (peak - ui->peak) + 1e-15; if (isnan (ui->peak)) { ui->peak = 0; } if (ui->peak > 1000) { ui->peak = 1000; } if (robtk_cbtn_get_active(ui->btn_norm)) { robtk_dial_set_value(ui->gain, - fftx_power_to_dB(ui->peak)); } queue_draw(ui->m0); } pthread_mutex_unlock(&ui->fft_lock); }