|
|
@@ -557,13 +557,22 @@ static inline bool should_silence_monitored_source(obs_source_t *source, struct
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static inline void clear_audio_output_buf(obs_source_t *source)
|
|
|
+static inline void clear_audio_output_buf(obs_source_t *source, struct obs_core_audio *audio)
|
|
|
{
|
|
|
+ if (!audio->monitoring_duplicating_source)
|
|
|
+ return;
|
|
|
+
|
|
|
+ uint32_t aoc_mixers = audio->monitoring_duplicating_source->audio_mixers;
|
|
|
+ uint32_t source_mixers = source->audio_mixers;
|
|
|
+
|
|
|
for (size_t mix = 0; mix < MAX_AUDIO_MIXES; mix++) {
|
|
|
- for (size_t ch = 0; ch < MAX_AUDIO_CHANNELS; ch++) {
|
|
|
- float *buf = source->audio_output_buf[mix][ch];
|
|
|
- if (buf)
|
|
|
- memset(buf, 0, AUDIO_OUTPUT_FRAMES * sizeof(float));
|
|
|
+ uint32_t mix_and_val = (1 << mix);
|
|
|
+ if ((aoc_mixers & mix_and_val) && (source_mixers & mix_and_val)) {
|
|
|
+ for (size_t ch = 0; ch < MAX_AUDIO_CHANNELS; ch++) {
|
|
|
+ float *buf = source->audio_output_buf[mix][ch];
|
|
|
+ if (buf)
|
|
|
+ memset(buf, 0, AUDIO_OUTPUT_FRAMES * sizeof(float));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -648,7 +657,7 @@ bool audio_callback(void *param, uint64_t start_ts_in, uint64_t end_ts_in, uint6
|
|
|
obs_source_t *source = audio->render_order.array[i];
|
|
|
obs_source_audio_render(source, mixers, channels, sample_rate, audio_size);
|
|
|
if (should_silence_monitored_source(source, audio))
|
|
|
- clear_audio_output_buf(source);
|
|
|
+ clear_audio_output_buf(source, audio);
|
|
|
|
|
|
/* if a source has gone backward in time and we can no
|
|
|
* longer buffer, drop some or all of its audio */
|