diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 33efdc2ef..5db687b99 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -3408,16 +3408,24 @@ static void process_audio(obs_source_t *source, } void obs_source_output_audio(obs_source_t *source, - const struct obs_source_audio *audio) + const struct obs_source_audio *audio_in) { struct obs_audio_data *output; if (!obs_source_valid(source, "obs_source_output_audio")) return; - if (!obs_ptr_valid(audio, "obs_source_output_audio")) + if (!obs_ptr_valid(audio_in, "obs_source_output_audio")) return; - process_audio(source, audio); + /* sets unused data pointers to NULL automatically because apparently + * some filter plugins aren't checking the actual channel count, and + * instead are checking to see whether the pointer is non-zero. */ + struct obs_source_audio audio = *audio_in; + size_t channels = get_audio_planes(audio.format, audio.speakers); + for (size_t i = channels; i < MAX_AUDIO_CHANNELS; i++) + audio.data[i] = NULL; + + process_audio(source, &audio); pthread_mutex_lock(&source->filter_mutex); output = filter_async_audio(source, &source->audio_data);