123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #include "audio-helpers.h"
- #include <util/dstr.h>
- static inline bool settings_changed(obs_data_t *old_settings, obs_data_t *new_settings)
- {
- const char *old_window = obs_data_get_string(old_settings, "window");
- const char *new_window = obs_data_get_string(new_settings, "window");
- enum window_priority old_priority = obs_data_get_int(old_settings, "priority");
- enum window_priority new_priority = obs_data_get_int(new_settings, "priority");
- // Changes to priority only matter if a window is set
- return (old_priority != new_priority && *new_window) || strcmp(old_window, new_window) != 0;
- }
- static inline void reroute_wasapi_source(obs_source_t *wasapi, obs_source_t *target)
- {
- proc_handler_t *ph = obs_source_get_proc_handler(wasapi);
- calldata_t cd = {0};
- calldata_set_ptr(&cd, "target", target);
- proc_handler_call(ph, "reroute_audio", &cd);
- calldata_free(&cd);
- }
- void setup_audio_source(obs_source_t *parent, obs_source_t **child, const char *window, bool enabled,
- enum window_priority priority)
- {
- if (enabled) {
- obs_data_t *wasapi_settings = NULL;
- if (window) {
- wasapi_settings = obs_data_create();
- obs_data_set_string(wasapi_settings, "window", window);
- obs_data_set_int(wasapi_settings, "priority", priority);
- }
- if (!*child) {
- struct dstr name = {0};
- dstr_printf(&name, "%s (%s)", obs_source_get_name(parent), TEXT_CAPTURE_AUDIO_SUFFIX);
- *child = obs_source_create_private(AUDIO_SOURCE_TYPE, name.array, wasapi_settings);
- // Ensure child gets activated/deactivated properly
- obs_source_add_active_child(parent, *child);
- // Reroute audio to come from window/game capture source
- reroute_wasapi_source(*child, parent);
- // Show source in mixer
- obs_source_set_audio_active(parent, true);
- dstr_free(&name);
- } else if (wasapi_settings) {
- obs_data_t *old_settings = obs_source_get_settings(*child);
- // Only bother updating if settings changed
- if (settings_changed(old_settings, wasapi_settings))
- obs_source_update(*child, wasapi_settings);
- obs_data_release(old_settings);
- }
- obs_data_release(wasapi_settings);
- } else {
- obs_source_set_audio_active(parent, false);
- if (*child) {
- reroute_wasapi_source(*child, NULL);
- obs_source_remove_active_child(parent, *child);
- obs_source_release(*child);
- *child = NULL;
- }
- }
- }
- static inline void encode_dstr(struct dstr *str)
- {
- dstr_replace(str, "#", "#22");
- dstr_replace(str, ":", "#3A");
- }
- void reconfigure_audio_source(obs_source_t *source, HWND window)
- {
- struct dstr title = {0};
- struct dstr class = {0};
- struct dstr exe = {0};
- struct dstr encoded = {0};
- ms_get_window_title(&title, window);
- ms_get_window_class(&class, window);
- ms_get_window_exe(&exe, window);
- encode_dstr(&title);
- encode_dstr(&class);
- encode_dstr(&exe);
- dstr_cat_dstr(&encoded, &title);
- dstr_cat(&encoded, ":");
- dstr_cat_dstr(&encoded, &class);
- dstr_cat(&encoded, ":");
- dstr_cat_dstr(&encoded, &exe);
- obs_data_t *audio_settings = obs_data_create();
- obs_data_set_string(audio_settings, "window", encoded.array);
- obs_data_set_int(audio_settings, "priority", WINDOW_PRIORITY_CLASS);
- obs_source_update(source, audio_settings);
- obs_data_release(audio_settings);
- dstr_free(&encoded);
- dstr_free(&title);
- dstr_free(&class);
- dstr_free(&exe);
- }
- void rename_audio_source(void *param, calldata_t *data)
- {
- obs_source_t *src = *(obs_source_t **)param;
- if (!src)
- return;
- struct dstr name = {0};
- dstr_printf(&name, "%s (%s)", calldata_string(data, "new_name"), TEXT_CAPTURE_AUDIO_SUFFIX);
- obs_source_set_name(src, name.array);
- dstr_free(&name);
- }
|