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
This commit is contained in:
Philip Loche
2018-09-13 02:49:21 -07:00
committed by jp9000
parent 179239b471
commit 7cfbdcf184
4 changed files with 53 additions and 0 deletions

View File

@@ -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

View File

@@ -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"

View File

@@ -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,
};

View File

@@ -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;