Преглед на файлове

obs-filters: Add "Invert Polarity" audio filter

Allows inverting the polarity of the audio data, which can be useful for
ether purposefully canceling out audio or preventing audio cancellation.

Amends pull request obsproject/obs-studio#1404
Philip Loche преди 7 години
родител
ревизия
7cfbdcf184

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

@@ -48,6 +48,7 @@ set(obs-filters_SOURCES
 	gain-filter.c
 	noise-gate-filter.c
 	mask-filter.c
+	invert-audio-polarity.c
 	compressor-filter.c)
 
 add_library(obs-filters MODULE

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

@@ -12,6 +12,7 @@ GPUDelayFilter="Render Delay"
 UndistortCenter="Undistort center of image when scaling from ultrawide"
 NoiseGate="Noise Gate"
 NoiseSuppress="Noise Suppression"
+InvertPolarity="Invert Polarity"
 Gain="Gain"
 DelayMs="Delay (milliseconds)"
 Type="Type"

+ 49 - 0
plugins/obs-filters/invert-audio-polarity.c

@@ -0,0 +1,49 @@
+#include <obs-module.h>
+
+static const char *invert_polarity_name(void *unused)
+{
+	UNUSED_PARAMETER(unused);
+	return obs_module_text("InvertPolarity");
+}
+
+static void invert_polarity_destroy(void *data)
+{
+	UNUSED_PARAMETER(data);
+}
+
+static void *invert_polarity_create(obs_data_t *settings, obs_source_t *filter)
+{
+	UNUSED_PARAMETER(settings);
+	return filter;
+}
+
+static struct obs_audio_data *invert_polarity_filter_audio(void *unused,
+		struct obs_audio_data *audio)
+{
+	float **adata = (float**)audio->data;
+
+	for (size_t c = 0; c < MAX_AV_PLANES; c++) {
+		register float *channel_data = adata[c];
+		register float *channel_end = channel_data + audio->frames;
+
+		if (!channel_data)
+			break;
+
+		while (channel_data < channel_end) {
+			*(channel_data++) *= -1.0f;
+		}
+	}
+
+	UNUSED_PARAMETER(unused);
+	return audio;
+}
+
+struct obs_source_info invert_polarity_filter = {
+	.id = "invert_polarity_filter",
+	.type = OBS_SOURCE_TYPE_FILTER,
+	.output_flags = OBS_SOURCE_AUDIO,
+	.get_name = invert_polarity_name,
+	.create = invert_polarity_create,
+	.destroy = invert_polarity_destroy,
+	.filter_audio = invert_polarity_filter_audio,
+};

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

@@ -20,6 +20,7 @@ extern struct obs_source_info async_delay_filter;
 #if SPEEXDSP_ENABLED
 extern struct obs_source_info noise_suppress_filter;
 #endif
+extern struct obs_source_info invert_polarity_filter;
 extern struct obs_source_info noise_gate_filter;
 extern struct obs_source_info compressor_filter;
 
@@ -40,6 +41,7 @@ bool obs_module_load(void)
 #if SPEEXDSP_ENABLED
 	obs_register_source(&noise_suppress_filter);
 #endif
+	obs_register_source(&invert_polarity_filter);
 	obs_register_source(&noise_gate_filter);
 	obs_register_source(&compressor_filter);
 	return true;