bool obs_fader_set_mul(obs_fader_t *fader, const float mul) { if (!fader) return false; return obs_fader_set_db(fader, mul_to_db(mul)); }
static float cubic_def_to_db(const float def) { if (def == 1.0f) return 0.0f; else if (def <= 0.0f) return -INFINITY; return mul_to_db(def * def * def); }
static inline void process_expansion(const struct expander_data *cd, float **samples, uint32_t num_samples) { for (size_t i = 0; i < num_samples; ++i) { float env_db = mul_to_db(cd->envelope_buf[i]); float gain = fmaxf(cd->slope * (cd->threshold - env_db), -60.0); gain = db_to_mul(fminf(0, gain)); for (size_t c = 0; c < cd->num_channels; ++c) { if (samples[c]) { samples[c][i] *= gain * cd->output_gain; } } } }
static void fader_source_volume_changed(void *vptr, calldata_t *calldata) { struct obs_fader *fader = (struct obs_fader *) vptr; pthread_mutex_lock(&fader->mutex); if (fader->ignore_next_signal) { fader->ignore_next_signal = false; pthread_mutex_unlock(&fader->mutex); return; } signal_handler_t *sh = fader->signals; const float mul = (float)calldata_float(calldata, "volume"); const float db = mul_to_db(mul); fader->cur_db = db; pthread_mutex_unlock(&fader->mutex); signal_volume_changed(sh, fader, db); }
bool obs_fader_attach_source(obs_fader_t *fader, obs_source_t *source) { signal_handler_t *sh; if (!fader || !source) return false; obs_fader_detach_source(fader); pthread_mutex_lock(&fader->mutex); sh = obs_source_get_signal_handler(source); signal_handler_connect(sh, "volume", fader_source_volume_changed, fader); signal_handler_connect(sh, "destroy", fader_source_destroyed, fader); fader->source = source; fader->cur_db = mul_to_db(obs_source_get_volume(source)); pthread_mutex_unlock(&fader->mutex); return true; }