yolobs-studio/plugins/obs-filters/gain-filter.c

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

99 lines
2.2 KiB
C
Raw Normal View History

2016-02-23 23:16:51 +00:00
#include <obs-module.h>
#include <media-io/audio-math.h>
#include <math.h>
2019-09-22 21:19:10 +00:00
#define do_log(level, format, ...) \
2016-02-23 23:16:51 +00:00
blog(level, "[gain filter: '%s'] " format, \
2019-09-22 21:19:10 +00:00
obs_source_get_name(gf->context), ##__VA_ARGS__)
2016-02-23 23:16:51 +00:00
2019-09-22 21:19:10 +00:00
#define warn(format, ...) do_log(LOG_WARNING, format, ##__VA_ARGS__)
#define info(format, ...) do_log(LOG_INFO, format, ##__VA_ARGS__)
2016-02-23 23:16:51 +00:00
2019-09-22 21:19:10 +00:00
#define S_GAIN_DB "db"
2016-02-23 23:16:51 +00:00
#define MT_ obs_module_text
2019-09-22 21:19:10 +00:00
#define TEXT_GAIN_DB MT_("Gain.GainDB")
2016-02-23 23:16:51 +00:00
struct gain_data {
obs_source_t *context;
2018-02-19 19:54:37 +00:00
size_t channels;
2016-02-23 23:16:51 +00:00
float multiple;
};
static const char *gain_name(void *unused)
{
UNUSED_PARAMETER(unused);
return obs_module_text("Gain");
}
static void gain_destroy(void *data)
{
struct gain_data *gf = data;
bfree(gf);
}
static void gain_update(void *data, obs_data_t *s)
{
struct gain_data *gf = data;
double val = obs_data_get_double(s, S_GAIN_DB);
2018-02-19 19:54:37 +00:00
gf->channels = audio_output_get_channels(obs_get_audio());
2016-02-23 23:16:51 +00:00
gf->multiple = db_to_mul((float)val);
}
static void *gain_create(obs_data_t *settings, obs_source_t *filter)
{
struct gain_data *gf = bzalloc(sizeof(*gf));
gf->context = filter;
gain_update(gf, settings);
return gf;
}
static struct obs_audio_data *gain_filter_audio(void *data,
2019-09-22 21:19:10 +00:00
struct obs_audio_data *audio)
2016-02-23 23:16:51 +00:00
{
struct gain_data *gf = data;
2018-02-19 19:54:37 +00:00
const size_t channels = gf->channels;
2019-09-22 21:19:10 +00:00
float **adata = (float **)audio->data;
2016-02-23 23:16:51 +00:00
const float multiple = gf->multiple;
2018-02-19 19:54:37 +00:00
for (size_t c = 0; c < channels; c++) {
2016-02-23 23:16:51 +00:00
if (audio->data[c]) {
for (size_t i = 0; i < audio->frames; i++) {
adata[c][i] *= multiple;
}
}
}
return audio;
}
static void gain_defaults(obs_data_t *s)
{
obs_data_set_default_double(s, S_GAIN_DB, 0.0f);
}
static obs_properties_t *gain_properties(void *data)
{
obs_properties_t *ppts = obs_properties_create();
2019-09-22 21:19:10 +00:00
obs_property_t *p = obs_properties_add_float_slider(
ppts, S_GAIN_DB, TEXT_GAIN_DB, -30.0, 30.0, 0.1);
obs_property_float_set_suffix(p, " dB");
2016-02-23 23:16:51 +00:00
UNUSED_PARAMETER(data);
return ppts;
}
struct obs_source_info gain_filter = {
.id = "gain_filter",
.type = OBS_SOURCE_TYPE_FILTER,
.output_flags = OBS_SOURCE_AUDIO,
.get_name = gain_name,
.create = gain_create,
.destroy = gain_destroy,
.update = gain_update,
.filter_audio = gain_filter_audio,
.get_defaults = gain_defaults,
.get_properties = gain_properties,
};