فهرست منبع

obs-filters: Add gain filter

This filter simply modifies the volume of the signal as a convenient way
of modifying the volume before other filters, or amplify the volume
without having to mess with advanced audio properties.
jp9000 10 سال پیش
والد
کامیت
f8c5c7f55f

+ 1 - 0
plugins/obs-filters/CMakeLists.txt

@@ -9,6 +9,7 @@ set(obs-filters_SOURCES
 	chroma-key-filter.c
 	color-key-filter.c
 	sharpness-filter.c
+	gain-filter.c
 	noise-gate-filter.c
 	mask-filter.c)
 

+ 2 - 0
plugins/obs-filters/data/locale/en-US.ini

@@ -7,6 +7,7 @@ ChromaKeyFilter="Chroma Key"
 ColorKeyFilter="Color Key"
 SharpnessFilter="Sharpen"
 NoiseGate="Noise Gate"
+Gain="Gain"
 DelayMs="Delay (milliseconds)"
 Type="Type"
 MaskBlendType.MaskColor="Alpha Mask (Color Channel)"
@@ -48,3 +49,4 @@ NoiseGate.CloseThreshold="Close Threshold (dB)"
 NoiseGate.AttackTime="Attack Time (milliseconds)"
 NoiseGate.HoldTime="Hold Time (milliseconds)"
 NoiseGate.ReleaseTime="Release Time (milliseconds)"
+Gain.GainDB="Gain (dB)"

+ 95 - 0
plugins/obs-filters/gain-filter.c

@@ -0,0 +1,95 @@
+#include <obs-module.h>
+#include <media-io/audio-math.h>
+#include <math.h>
+
+#define do_log(level, format, ...) \
+	blog(level, "[gain filter: '%s'] " format, \
+			obs_source_get_name(gf->context), ##__VA_ARGS__)
+
+#define warn(format, ...)  do_log(LOG_WARNING, format, ##__VA_ARGS__)
+#define info(format, ...)  do_log(LOG_INFO,    format, ##__VA_ARGS__)
+
+#define S_GAIN_DB                      "db"
+
+#define MT_ obs_module_text
+#define TEXT_GAIN_DB                   MT_("Gain.GainDB")
+
+struct gain_data {
+	obs_source_t *context;
+	float multiple;
+};
+
+static const char *gain_name(void)
+{
+	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);
+
+	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,
+		struct obs_audio_data *audio)
+{
+	struct gain_data *gf = data;
+
+	float *adata[2] = {(float*)audio->data[0], (float*)audio->data[1]};
+	const float multiple = gf->multiple;
+
+	for (size_t c = 0; c < 2; c++) {
+		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();
+
+	obs_properties_add_float_slider(ppts, S_GAIN_DB, TEXT_GAIN_DB,
+			-30.0, 30.0, 0.1);
+
+	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,
+};

+ 2 - 0
plugins/obs-filters/obs-filters.c

@@ -6,6 +6,7 @@ OBS_MODULE_USE_DEFAULT_LOCALE("obs-filters", "en-US")
 
 extern struct obs_source_info mask_filter;
 extern struct obs_source_info crop_filter;
+extern struct obs_source_info gain_filter;
 extern struct obs_source_info color_filter;
 extern struct obs_source_info scroll_filter;
 extern struct obs_source_info color_key_filter;
@@ -18,6 +19,7 @@ bool obs_module_load(void)
 {
 	obs_register_source(&mask_filter);
 	obs_register_source(&crop_filter);
+	obs_register_source(&gain_filter);
 	obs_register_source(&color_filter);
 	obs_register_source(&scroll_filter);
 	obs_register_source(&color_key_filter);