UI: Add option to disable audio ducking on windows
The audio subsystem of windows is by default configured to lower the volume of other things while a communications device (mic) is currently active. This patch prevents that from being enabled with OBS. If the user needs audio ducking enabled again for whatever reason, there is now an option to re-enable it in advanced settings. Closes jp9000/obs-studio#884master
parent
4684294bcd
commit
9efd2b87aa
|
@ -610,6 +610,7 @@ Basic.Settings.Advanced.Video.ColorRange.Partial="Partial"
|
||||||
Basic.Settings.Advanced.Video.ColorRange.Full="Full"
|
Basic.Settings.Advanced.Video.ColorRange.Full="Full"
|
||||||
Basic.Settings.Advanced.Audio.MonitoringDevice="Audio Monitoring Device"
|
Basic.Settings.Advanced.Audio.MonitoringDevice="Audio Monitoring Device"
|
||||||
Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Default"
|
Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Default"
|
||||||
|
Basic.Settings.Advanced.Audio.DisableAudioDucking="Disable Windows audio ducking"
|
||||||
Basic.Settings.Advanced.StreamDelay="Stream Delay"
|
Basic.Settings.Advanced.StreamDelay="Stream Delay"
|
||||||
Basic.Settings.Advanced.StreamDelay.Duration="Duration (seconds)"
|
Basic.Settings.Advanced.StreamDelay.Duration="Duration (seconds)"
|
||||||
Basic.Settings.Advanced.StreamDelay.Preserve="Preserve cutoff point (increase delay) when reconnecting"
|
Basic.Settings.Advanced.StreamDelay.Preserve="Preserve cutoff point (increase delay) when reconnecting"
|
||||||
|
|
|
@ -3755,6 +3755,13 @@
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QComboBox" name="monitoringDevice"/>
|
<widget class="QComboBox" name="monitoringDevice"/>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QCheckBox" name="disableAudioDucking">
|
||||||
|
<property name="text">
|
||||||
|
<string>Basic.Settings.Advanced.Audio.DisableAudioDucking</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -410,6 +410,11 @@ bool OBSApp::InitGlobalConfigDefaults()
|
||||||
config_set_default_bool(globalConfig, "BasicWindow",
|
config_set_default_bool(globalConfig, "BasicWindow",
|
||||||
"ShowStatusBar", true);
|
"ShowStatusBar", true);
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
config_set_default_bool(globalConfig, "Audio", "DisableAudioDucking",
|
||||||
|
true);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
config_set_default_bool(globalConfig, "Video", "DisableOSXVSync", true);
|
config_set_default_bool(globalConfig, "Video", "DisableOSXVSync", true);
|
||||||
config_set_default_bool(globalConfig, "Video", "ResetOSXVSyncOnExit",
|
config_set_default_bool(globalConfig, "Video", "ResetOSXVSyncOnExit",
|
||||||
|
@ -733,6 +738,13 @@ OBSApp::OBSApp(int &argc, char **argv, profiler_name_store_t *store)
|
||||||
|
|
||||||
OBSApp::~OBSApp()
|
OBSApp::~OBSApp()
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
bool disableAudioDucking = config_get_bool(globalConfig, "Audio",
|
||||||
|
"DisableAudioDucking");
|
||||||
|
if (disableAudioDucking)
|
||||||
|
DisableAudioDucking(false);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
bool vsyncDiabled = config_get_bool(globalConfig, "Video",
|
bool vsyncDiabled = config_get_bool(globalConfig, "Video",
|
||||||
"DisableOSXVSync");
|
"DisableOSXVSync");
|
||||||
|
@ -851,6 +863,13 @@ void OBSApp::AppInit()
|
||||||
config_set_default_string(globalConfig, "Basic", "SceneCollectionFile",
|
config_set_default_string(globalConfig, "Basic", "SceneCollectionFile",
|
||||||
Str("Untitled"));
|
Str("Untitled"));
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
bool disableAudioDucking = config_get_bool(globalConfig, "Audio",
|
||||||
|
"DisableAudioDucking");
|
||||||
|
if (disableAudioDucking)
|
||||||
|
DisableAudioDucking(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
if (config_get_bool(globalConfig, "Video", "DisableOSXVSync"))
|
if (config_get_bool(globalConfig, "Video", "DisableOSXVSync"))
|
||||||
EnableOSXVSync(false);
|
EnableOSXVSync(false);
|
||||||
|
|
|
@ -30,6 +30,11 @@ using namespace std;
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
#include <Dwmapi.h>
|
#include <Dwmapi.h>
|
||||||
|
#include <mmdeviceapi.h>
|
||||||
|
#include <audiopolicy.h>
|
||||||
|
|
||||||
|
#include <util/windows/HRError.hpp>
|
||||||
|
#include <util/windows/ComPtr.hpp>
|
||||||
|
|
||||||
static inline bool check_path(const char* data, const char *path,
|
static inline bool check_path(const char* data, const char *path,
|
||||||
string &output)
|
string &output)
|
||||||
|
@ -216,3 +221,41 @@ void SetWin32DropStyle(QWidget *window)
|
||||||
ex_style |= WS_EX_ACCEPTFILES;
|
ex_style |= WS_EX_ACCEPTFILES;
|
||||||
SetWindowLongPtr(hwnd, GWL_EXSTYLE, ex_style);
|
SetWindowLongPtr(hwnd, GWL_EXSTYLE, ex_style);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DisableAudioDucking(bool disable)
|
||||||
|
{
|
||||||
|
ComPtr<IMMDeviceEnumerator> devEmum;
|
||||||
|
ComPtr<IMMDevice> device;
|
||||||
|
ComPtr<IAudioSessionManager2> sessionManager2;
|
||||||
|
ComPtr<IAudioSessionControl> sessionControl;
|
||||||
|
ComPtr<IAudioSessionControl2> sessionControl2;
|
||||||
|
|
||||||
|
HRESULT result = CoCreateInstance(__uuidof(MMDeviceEnumerator),
|
||||||
|
nullptr, CLSCTX_INPROC_SERVER,
|
||||||
|
__uuidof(IMMDeviceEnumerator),
|
||||||
|
(void **)&devEmum);
|
||||||
|
if (FAILED(result))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = devEmum->GetDefaultAudioEndpoint(eRender, eConsole, &device);
|
||||||
|
if (FAILED(result))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = device->Activate(__uuidof(IAudioSessionManager2),
|
||||||
|
CLSCTX_INPROC_SERVER, nullptr,
|
||||||
|
(void **)&sessionManager2);
|
||||||
|
if (FAILED(result))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = sessionManager2->GetAudioSessionControl(nullptr, 0,
|
||||||
|
&sessionControl);
|
||||||
|
if (FAILED(result))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = sessionControl->QueryInterface(&sessionControl2);
|
||||||
|
if (FAILED(result))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
result = sessionControl2->SetDuckingPreference(disable);
|
||||||
|
return SUCCEEDED(result);
|
||||||
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ uint32_t GetWindowsVersion();
|
||||||
void SetAeroEnabled(bool enable);
|
void SetAeroEnabled(bool enable);
|
||||||
void SetProcessPriority(const char *priority);
|
void SetProcessPriority(const char *priority);
|
||||||
void SetWin32DropStyle(QWidget *window);
|
void SetWin32DropStyle(QWidget *window);
|
||||||
|
bool DisableAudioDucking(bool disable);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
|
|
@ -392,6 +392,9 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
||||||
HookWidget(ui->resetOSXVSync, CHECK_CHANGED, ADV_CHANGED);
|
HookWidget(ui->resetOSXVSync, CHECK_CHANGED, ADV_CHANGED);
|
||||||
#if defined(_WIN32) || defined(__APPLE__)
|
#if defined(_WIN32) || defined(__APPLE__)
|
||||||
HookWidget(ui->monitoringDevice, COMBO_CHANGED, ADV_CHANGED);
|
HookWidget(ui->monitoringDevice, COMBO_CHANGED, ADV_CHANGED);
|
||||||
|
#endif
|
||||||
|
#ifdef _WIN32
|
||||||
|
HookWidget(ui->disableAudioDucking, CHECK_CHANGED, ADV_CHANGED);
|
||||||
#endif
|
#endif
|
||||||
HookWidget(ui->filenameFormatting, EDIT_CHANGED, ADV_CHANGED);
|
HookWidget(ui->filenameFormatting, EDIT_CHANGED, ADV_CHANGED);
|
||||||
HookWidget(ui->overwriteIfExists, CHECK_CHANGED, ADV_CHANGED);
|
HookWidget(ui->overwriteIfExists, CHECK_CHANGED, ADV_CHANGED);
|
||||||
|
@ -461,6 +464,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
||||||
delete ui->advancedGeneralGroupBox;
|
delete ui->advancedGeneralGroupBox;
|
||||||
delete ui->enableNewSocketLoop;
|
delete ui->enableNewSocketLoop;
|
||||||
delete ui->enableLowLatencyMode;
|
delete ui->enableLowLatencyMode;
|
||||||
|
delete ui->disableAudioDucking;
|
||||||
ui->rendererLabel = nullptr;
|
ui->rendererLabel = nullptr;
|
||||||
ui->renderer = nullptr;
|
ui->renderer = nullptr;
|
||||||
ui->adapterLabel = nullptr;
|
ui->adapterLabel = nullptr;
|
||||||
|
@ -470,6 +474,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
||||||
ui->advancedGeneralGroupBox = nullptr;
|
ui->advancedGeneralGroupBox = nullptr;
|
||||||
ui->enableNewSocketLoop = nullptr;
|
ui->enableNewSocketLoop = nullptr;
|
||||||
ui->enableLowLatencyMode = nullptr;
|
ui->enableLowLatencyMode = nullptr;
|
||||||
|
ui->disableAudioDucking = nullptr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
|
@ -2065,6 +2070,10 @@ void OBSBasicSettings::LoadAdvancedSettings()
|
||||||
ui->resetOSXVSync->setChecked(resetOSXVSync);
|
ui->resetOSXVSync->setChecked(resetOSXVSync);
|
||||||
ui->resetOSXVSync->setEnabled(disableOSXVSync);
|
ui->resetOSXVSync->setEnabled(disableOSXVSync);
|
||||||
#elif _WIN32
|
#elif _WIN32
|
||||||
|
bool disableAudioDucking = config_get_bool(App()->GlobalConfig(),
|
||||||
|
"Audio", "DisableAudioDucking");
|
||||||
|
ui->disableAudioDucking->setChecked(disableAudioDucking);
|
||||||
|
|
||||||
const char *processPriority = config_get_string(App()->GlobalConfig(),
|
const char *processPriority = config_get_string(App()->GlobalConfig(),
|
||||||
"General", "ProcessPriority");
|
"General", "ProcessPriority");
|
||||||
bool enableNewSocketLoop = config_get_bool(main->Config(), "Output",
|
bool enableNewSocketLoop = config_get_bool(main->Config(), "Output",
|
||||||
|
@ -2585,6 +2594,16 @@ void OBSBasicSettings::SaveAdvancedSettings()
|
||||||
SaveCombo(ui->monitoringDevice, "Audio", "MonitoringDeviceName");
|
SaveCombo(ui->monitoringDevice, "Audio", "MonitoringDeviceName");
|
||||||
SaveComboData(ui->monitoringDevice, "Audio", "MonitoringDeviceId");
|
SaveComboData(ui->monitoringDevice, "Audio", "MonitoringDeviceId");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (WidgetChanged(ui->disableAudioDucking)) {
|
||||||
|
bool disable = ui->disableAudioDucking->isChecked();
|
||||||
|
config_set_bool(App()->GlobalConfig(),
|
||||||
|
"Audio", "DisableAudioDucking", disable);
|
||||||
|
DisableAudioDucking(disable);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SaveEdit(ui->filenameFormatting, "Output", "FilenameFormatting");
|
SaveEdit(ui->filenameFormatting, "Output", "FilenameFormatting");
|
||||||
SaveEdit(ui->simpleRBPrefix, "SimpleOutput", "RecRBPrefix");
|
SaveEdit(ui->simpleRBPrefix, "SimpleOutput", "RecRBPrefix");
|
||||||
SaveEdit(ui->simpleRBSuffix, "SimpleOutput", "RecRBSuffix");
|
SaveEdit(ui->simpleRBSuffix, "SimpleOutput", "RecRBSuffix");
|
||||||
|
|
Loading…
Reference in New Issue