diff --git a/libobs/obs-audio.c b/libobs/obs-audio.c index 1af88f1d8..367d212db 100644 --- a/libobs/obs-audio.c +++ b/libobs/obs-audio.c @@ -48,37 +48,52 @@ static inline bool is_individual_audio_source(obs_source_t *source) !(source->info.output_flags & OBS_SOURCE_COMPOSITE); } +extern bool devices_match(const char *id1, const char *id2); + static inline void check_audio_output_source_is_monitoring_device(obs_source_t *s, void *p) { struct obs_core_audio *audio = p; if (!audio->monitoring_device_name) return; - if (strcmp(s->info.id, "wasapi_output_capture") == 0 || strcmp(s->info.id, "pulse_output_capture") == 0 || - strcmp(s->info.id, "coreaudio_output_capture") == 0) { - const char *dev_id = NULL; - obs_data_t *settings = obs_source_get_settings(s); - bool is_pulse = strcmp(s->info.id, "pulse_output_capture") == 0; - if (settings) { - dev_id = obs_data_get_string(settings, "device_id"); - bool id_match = strcmp(dev_id, audio->monitoring_device_id) == 0; - if (is_pulse) { - // pulse may append '.monitor' - size_t count = strlen(audio->monitoring_device_id) - 9; - id_match = id_match || strncmp(dev_id, audio->monitoring_device_id, count) == 0; - } - if (id_match) { - audio->prevent_monitoring_duplication = true; - audio->monitoring_duplicating_source = s; - if (!audio->monitoring_duplication_prevented_on_prev_tick) - blog(LOG_INFO, - "Device for 'Audio Output Capture' source is also used for audio" - " monitoring:\nDeduplication logic is being applied to all monitored" - " sources.\n"); - } - obs_data_release(settings); - } + const char *id = s->info.id; + if (strcmp(id, "wasapi_output_capture") != 0 && strcmp(id, "pulse_output_capture") != 0 && + strcmp(id, "coreaudio_output_capture") != 0) + return; + + obs_data_t *settings = obs_source_get_settings(s); + if (!settings) + return; + + const char *device_id = obs_data_get_string(settings, "device_id"); + const char *mon_id = audio->monitoring_device_id; + bool id_match = false; + +#ifdef __APPLE__ + extern void get_desktop_default_id(char **p_id); + if (device_id && strcmp(device_id, "default") == 0) { + char *def_id = NULL; + get_desktop_default_id(&def_id); + id_match = devices_match(def_id, mon_id); + if (def_id) + bfree(def_id); + } else { + id_match = devices_match(device_id, mon_id); } +#else + id_match = devices_match(device_id, mon_id); +#endif + + if (id_match) { + audio->prevent_monitoring_duplication = true; + audio->monitoring_duplicating_source = s; + if (!audio->monitoring_duplication_prevented_on_prev_tick) + blog(LOG_INFO, "Device for 'Audio Output Capture' source is also used for audio" + " monitoring:\nDeduplication logic is being applied to all monitored" + " sources.\n"); + } + + obs_data_release(settings); } /*