diff --git a/src/audio-capture-helper.cpp b/src/audio-capture-helper.cpp index 7b3e546..dfbbfc3 100644 --- a/src/audio-capture-helper.cpp +++ b/src/audio-capture-helper.cpp @@ -13,15 +13,41 @@ #include "audio-capture-helper.hpp" #include "format-conversion.hpp" -AUDIOCLIENT_ACTIVATION_PARAMS AudioCaptureHelper::GetParams() +bool system_supported = false; +bool AudioCaptureHelper::TestPluginAvailable() { - auto mode = PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE; + try { + auto params = AudioCaptureHelper::GetParams( + GetCurrentProcessId(), PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE); + auto propvariant = AudioCaptureHelper::GetPropvariant(¶ms); + + wil::com_ptr async_op; + CompletionHandler completion_handler; + + THROW_IF_FAILED(ActivateAudioInterfaceAsync(VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, + __uuidof(IAudioClient), &propvariant, + &completion_handler, &async_op)); + completion_handler.event_finished.wait(); + THROW_IF_FAILED(completion_handler.activate_hr); + + info("Plugin can be used"); + return true; + + } catch (wil::ResultException e) { + warn("Plugin is unavailable because of OS limit"); + return false; + } +} + +AUDIOCLIENT_ACTIVATION_PARAMS AudioCaptureHelper::GetParams(DWORD process_id, + PROCESS_LOOPBACK_MODE mode) +{ return { .ActivationType = AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK, .ProcessLoopbackParams = { - .TargetProcessId = pid, + .TargetProcessId = process_id, .ProcessLoopbackMode = mode, }, }; @@ -42,7 +68,7 @@ AudioCaptureHelper::GetPropvariant(AUDIOCLIENT_ACTIVATION_PARAMS *params) void AudioCaptureHelper::InitClient() { - auto params = GetParams(); + auto params = GetParams(pid, PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE); auto propvariant = GetPropvariant(¶ms); wil::com_ptr async_op; @@ -178,4 +204,4 @@ AudioCaptureHelper::~AudioCaptureHelper() events[HelperEvents::Shutdown].SetEvent(); capture_thread.join(); -} \ No newline at end of file +} diff --git a/src/audio-capture-helper.hpp b/src/audio-capture-helper.hpp index 61358e1..63ab05a 100644 --- a/src/audio-capture-helper.hpp +++ b/src/audio-capture-helper.hpp @@ -69,8 +69,9 @@ class AudioCaptureHelper { std::array events; std::thread capture_thread; - AUDIOCLIENT_ACTIVATION_PARAMS GetParams(); - PROPVARIANT GetPropvariant(AUDIOCLIENT_ACTIVATION_PARAMS *params); + static AUDIOCLIENT_ACTIVATION_PARAMS GetParams(DWORD process_id, + PROCESS_LOOPBACK_MODE mode); + static PROPVARIANT GetPropvariant(AUDIOCLIENT_ACTIVATION_PARAMS *params); void InitClient(); void InitCapture(); @@ -82,6 +83,8 @@ class AudioCaptureHelper { void CaptureSafe(); public: + static bool TestPluginAvailable(); + DWORD GetPid() { return pid; } AudioCaptureHelper(Mixer *mixer, WAVEFORMATEX format, DWORD pid); diff --git a/src/audio-capture.cpp b/src/audio-capture.cpp index e71ce7b..b0091e4 100644 --- a/src/audio-capture.cpp +++ b/src/audio-capture.cpp @@ -25,6 +25,8 @@ #include "audio-capture.hpp" #include "audio-capture-helper-manager.hpp" +extern bool system_supported; + AudioCaptureHelperManager helper_manager; void AudioCapture::StartCapture(const std::set &new_pids) @@ -513,6 +515,14 @@ static obs_properties_t *audio_capture_properties(void *data) obs_properties_add_group(ps, SETTING_ACTIVE_SESSION_GROUP, TEXT_ACTIVE_SESSION_GROUP, OBS_GROUP_NORMAL, active_session_group); + if (!system_supported) { + obs_property_t *el = obs_properties_first(ps); + while (el != nullptr) { + obs_property_set_enabled(el, false); + obs_property_next(&el); + } + } + return ps; } diff --git a/src/plugin.cpp b/src/plugin.cpp index 0c037dc..ee0cb1c 100644 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -1,5 +1,5 @@ #include - +#include "audio-capture-helper.hpp" #include "common.hpp" #include "plugin-macros.generated.hpp" @@ -7,10 +7,12 @@ OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE("win-capture-audio", "en-GB") extern struct obs_source_info audio_capture_info; +extern bool system_supported; bool obs_module_load(void) { blog(LOG_INFO, "[win-capture-audio] Version %s (%s)", PLUGIN_VERSION, GIT_HASH); + system_supported = AudioCaptureHelper::TestPluginAvailable(); obs_register_source(&audio_capture_info); return true; }