X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=audio_mixer.cpp;h=38d80c6bb4405e489e8e064ac49e749a19a9a0ba;hb=bb7eef2994e16fece998bc2c5cf42579d485d67b;hp=401c89bb20ba154cf3f6395236300a7bed441e85;hpb=b4439d47997e11b6f660b99c15657d386a490ff1;p=nageru diff --git a/audio_mixer.cpp b/audio_mixer.cpp index 401c89b..38d80c6 100644 --- a/audio_mixer.cpp +++ b/audio_mixer.cpp @@ -1,19 +1,25 @@ #include "audio_mixer.h" #include -#include #include -#include #include -#include -#include -#ifdef __SSE__ +#include +#ifdef __SSE2__ #include #endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "db.h" #include "flags.h" -#include "mixer.h" #include "state.pb.h" #include "timebase.h" @@ -164,8 +170,6 @@ AudioMixer::AudioMixer(unsigned num_cards) limiter(OUTPUT_FREQUENCY), correlation(OUTPUT_FREQUENCY) { - global_audio_mixer = this; - for (unsigned bus_index = 0; bus_index < MAX_BUSES; ++bus_index) { locut[bus_index].init(FILTER_HPF, 2); eq[bus_index][EQ_BAND_BASS].init(FILTER_LOW_SHELF, 1); @@ -178,7 +182,6 @@ AudioMixer::AudioMixer(unsigned num_cards) } set_limiter_enabled(global_flags.limiter_enabled); set_final_makeup_gain_auto(global_flags.final_makeup_gain_auto); - alsa_pool.init(); if (!global_flags.input_mapping_filename.empty()) { current_mapping_mode = MappingMode::MULTICHANNEL; @@ -204,6 +207,9 @@ AudioMixer::AudioMixer(unsigned num_cards) // hlen=16 is pretty low quality, but we use quite a bit of CPU otherwise, // and there's a limit to how important the peak meter is. peak_resampler.setup(OUTPUT_FREQUENCY, OUTPUT_FREQUENCY * 4, /*num_channels=*/2, /*hlen=*/16, /*frel=*/1.0); + + global_audio_mixer = this; + alsa_pool.init(); } void AudioMixer::reset_resampler(DeviceSpec device_spec) @@ -319,6 +325,7 @@ AudioMixer::BusSettings AudioMixer::get_default_bus_settings() { BusSettings settings; settings.fader_volume_db = 0.0f; + settings.muted = false; settings.locut_enabled = global_flags.locut_enabled; for (unsigned band_index = 0; band_index < NUM_EQ_BANDS; ++band_index) { settings.eq_level_db[band_index] = 0.0f; @@ -335,6 +342,7 @@ AudioMixer::BusSettings AudioMixer::get_bus_settings(unsigned bus_index) const lock_guard lock(audio_mutex); BusSettings settings; settings.fader_volume_db = fader_volume_db[bus_index]; + settings.muted = mute[bus_index]; settings.locut_enabled = locut_enabled[bus_index]; for (unsigned band_index = 0; band_index < NUM_EQ_BANDS; ++band_index) { settings.eq_level_db[band_index] = eq_level_db[bus_index][band_index]; @@ -350,6 +358,7 @@ void AudioMixer::set_bus_settings(unsigned bus_index, const AudioMixer::BusSetti { lock_guard lock(audio_mutex); fader_volume_db[bus_index] = settings.fader_volume_db; + mute[bus_index] = settings.muted; locut_enabled[bus_index] = settings.locut_enabled; for (unsigned band_index = 0; band_index < NUM_EQ_BANDS; ++band_index) { eq_level_db[bus_index][band_index] = settings.eq_level_db[band_index]; @@ -574,13 +583,12 @@ vector AudioMixer::get_output(double pts, unsigned num_samples, Resamplin // (half-time of 30 seconds). double target_loudness_factor, alpha; double loudness_lu = r128.loudness_M() - ref_level_lufs; - double current_makeup_lu = to_db(final_makeup_gain); target_loudness_factor = final_makeup_gain * from_db(-loudness_lu); - // If we're outside +/- 5 LU uncorrected, we don't count it as + // If we're outside +/- 5 LU (after correction), we don't count it as // a normal signal (probably silence) and don't change the // correction factor; just apply what we already have. - if (fabs(loudness_lu - current_makeup_lu) >= 5.0 || !final_makeup_gain_auto) { + if (fabs(loudness_lu) >= 5.0 || !final_makeup_gain_auto) { alpha = 0.0; } else { // Formula adapted from @@ -683,13 +691,14 @@ void AudioMixer::add_bus_to_master(unsigned bus_index, const vector &samp assert(samples_bus.size() == samples_out->size()); assert(samples_bus.size() % 2 == 0); unsigned num_samples = samples_bus.size() / 2; - if (fabs(fader_volume_db[bus_index] - last_fader_volume_db[bus_index]) > 1e-3) { + const float new_volume_db = mute[bus_index] ? -90.0f : fader_volume_db[bus_index].load(); + if (fabs(new_volume_db - last_fader_volume_db[bus_index]) > 1e-3) { // The volume has changed; do a fade over the course of this frame. // (We might have some numerical issues here, but it seems to sound OK.) // For the purpose of fading here, the silence floor is set to -90 dB // (the fader only goes to -84). float old_volume = from_db(max(last_fader_volume_db[bus_index], -90.0f)); - float volume = from_db(max(fader_volume_db[bus_index], -90.0f)); + float volume = from_db(max(new_volume_db, -90.0f)); float volume_inc = pow(volume / old_volume, 1.0 / num_samples); volume = old_volume; @@ -706,8 +715,8 @@ void AudioMixer::add_bus_to_master(unsigned bus_index, const vector &samp volume *= volume_inc; } } - } else { - float volume = from_db(fader_volume_db[bus_index]); + } else if (new_volume_db > -90.0f) { + float volume = from_db(new_volume_db); if (bus_index == 0) { for (unsigned i = 0; i < num_samples; ++i) { (*samples_out)[i * 2 + 0] = samples_bus[i * 2 + 0] * volume; @@ -721,13 +730,13 @@ void AudioMixer::add_bus_to_master(unsigned bus_index, const vector &samp } } - last_fader_volume_db[bus_index] = fader_volume_db[bus_index]; + last_fader_volume_db[bus_index] = new_volume_db; } void AudioMixer::measure_bus_levels(unsigned bus_index, const vector &left, const vector &right) { assert(left.size() == right.size()); - const float volume = from_db(fader_volume_db[bus_index]); + const float volume = mute[bus_index] ? 0.0f : from_db(fader_volume_db[bus_index]); const float peak_levels[2] = { find_peak(left.data(), left.size()) * volume, find_peak(right.data(), right.size()) * volume