From 7e76c4813d5c114f82f4f40fe8dba6ff8eb706a1 Mon Sep 17 00:00:00 2001 From: Asuro Date: Wed, 14 Dec 2022 18:41:31 +0100 Subject: [PATCH] failed loudness eq experiment --- AsuroTool/ApplicationData.cpp | 2 +- AsuroTool/AsuroTool.cpp | 17 +++++++ AsuroTool/AudioApi.cpp | 67 +++++++++++++++++++++++++-- AsuroTool/AudioApi.h | 13 ++++-- AsuroTool/AudioNotificationListener.h | 4 +- AsuroTool/PolicyConfig.h | 3 ++ AsuroTool/Settings.h | 6 +-- AsuroTool/Util.h | 1 + 8 files changed, 100 insertions(+), 13 deletions(-) diff --git a/AsuroTool/ApplicationData.cpp b/AsuroTool/ApplicationData.cpp index a74b774..4f9c70f 100644 --- a/AsuroTool/ApplicationData.cpp +++ b/AsuroTool/ApplicationData.cpp @@ -3,7 +3,7 @@ #include "AudioApi.h" #include -AudioDevice::AudioDevice(IMMDevice* device, LPCWSTR deviceId) +AudioDevice::AudioDevice(IMMDevice* device, LPCWSTR deviceId) : device(device) { id = std::wstring(deviceId); diff --git a/AsuroTool/AsuroTool.cpp b/AsuroTool/AsuroTool.cpp index 0a8c08d..c55e138 100644 --- a/AsuroTool/AsuroTool.cpp +++ b/AsuroTool/AsuroTool.cpp @@ -7,6 +7,7 @@ // see https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/Win7Samples/winui/shell/appshellintegration/NotificationIcon/NotificationIcon.cpp #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") #pragma comment(lib, "comctl32.lib") +#pragma comment(lib, "rpcrt4.lib") #include "Util.h" #include "AudioApi.h" @@ -214,6 +215,7 @@ ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector& dev ImGui::TableSetupColumn("Devices", ImGuiTableColumnFlags_WidthStretch, 3.); ImGui::TableSetupColumn("Volume", ImGuiTableColumnFlags_WidthStretch, 1.); ImGui::TableSetupColumn("Defaults", ImGuiTableColumnFlags_WidthFixed, 55.); + //ImGui::TableSetupColumn("Proc", ImGuiTableColumnFlags_WidthFixed, 30.); ImGui::TableHeadersRow(); for (auto& dev : deviceList) @@ -324,6 +326,21 @@ ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector& dev } } + // Advanced + /*ImGui::TableNextColumn(); + + AudioProcessingState procState = getAudioProcessing(dev); + bool procChecked = procState == AudioProcessingState::Enabled; + + std::string procCbId("cb_proc_"); + procCbId.append(deviceIdUtf8.c_str()); + ImGui::PushID(procCbId.c_str()); + if (ImGui::Checkbox("", &procChecked)) + { + setAudioProcessing(dev, procChecked); + } + ImGui::PopID();*/ + ImGui::PopStyleColor(); } diff --git a/AsuroTool/AudioApi.cpp b/AsuroTool/AudioApi.cpp index 5f1d60d..2eba786 100644 --- a/AsuroTool/AudioApi.cpp +++ b/AsuroTool/AudioApi.cpp @@ -1,15 +1,18 @@ +#include "AudioApi.h" +#include "Util.h" +#include "PolicyConfig.h" #include #include #include +#include +#include + #include #include #include - -#include "Util.h" -#include "AudioApi.h" -#include "PolicyConfig.h" +#include void initAudio(ApplicationData& appData) { @@ -184,4 +187,58 @@ bool isMuted(IAudioEndpointVolume* volumeInterface) void setMuted(IAudioEndpointVolume* volumeInterface, bool newState) { volumeInterface->SetMute(static_cast(newState), NULL); -} \ No newline at end of file +} + +void CreateLoudnessEqualizationKey(PROPERTYKEY& key) +{ + // Realtek: const wchar_t* guid = L"E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB"; + const wchar_t* guid = L"FC52A749-4BE9-4510-896E-966BA6525980"; + UuidFromString((RPC_WSTR)guid, &key.fmtid); + key.pid = 3; +} + +AudioProcessingState getAudioProcessing(AudioDevice& device) +{ + return AudioProcessingState::Unknown; + + LPWSTR pwstrEndpointId = NULL; + HRESULT hr = device.device->GetId(&pwstrEndpointId); + + IPolicyConfig* pPolicyConfig; + hr = CoCreateInstance(__uuidof(CPolicyConfigClient), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pPolicyConfig)); + if (SUCCEEDED(hr)) + { + PROPVARIANT var; + PropVariantInit(&var); + + PROPERTYKEY key{}; + CreateLoudnessEqualizationKey(key); + + hr = pPolicyConfig->GetPropertyValue(pwstrEndpointId, TRUE, key, &var); + pPolicyConfig->Release(); + return var.boolVal ? AudioProcessingState::Disabled : AudioProcessingState::Enabled; + } + return AudioProcessingState::Unknown; +} + +void setAudioProcessing(AudioDevice& device, bool newVal) +{ + return; + + LPWSTR pwstrEndpointId = NULL; + HRESULT hr = device.device->GetId(&pwstrEndpointId); + + IPolicyConfig* pPolicyConfig; + hr = CoCreateInstance(__uuidof(CPolicyConfigClient), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pPolicyConfig)); + if (SUCCEEDED(hr)) + { + PROPVARIANT var; + PropVariantInit(&var); + var.vt = VT_UI4; + var.uintVal = newVal ? ENDPOINT_SYSFX_ENABLED : ENDPOINT_SYSFX_DISABLED; + PROPERTYKEY key{}; + CreateLoudnessEqualizationKey(key); + hr = pPolicyConfig->SetPropertyValue(pwstrEndpointId, TRUE, key, &var); + pPolicyConfig->Release(); + } +} diff --git a/AsuroTool/AudioApi.h b/AsuroTool/AudioApi.h index f72ba79..384e0ab 100644 --- a/AsuroTool/AudioApi.h +++ b/AsuroTool/AudioApi.h @@ -1,9 +1,14 @@ #pragma once -#include - #include "ApplicationData.h" +enum class AudioProcessingState +{ + Enabled, + Disabled, + Unknown +}; + void initAudio(ApplicationData& appData); void loadAudioDevices(AudioData& audioData, std::vector& deviceList, EDataFlow deviceType); void reloadDeviceLists(AudioData& audioData); @@ -17,4 +22,6 @@ void setVolume(IAudioEndpointVolume* volumeInterface, float newVolume); UINT getMeterValues(IAudioMeterInformation* meterInterface, std::array& levels); void getVolumeLimit(IAudioEndpointVolume* volumeInterface, float* outMin, float* outMax); bool isMuted(IAudioEndpointVolume* volumeInterface); -void setMuted(IAudioEndpointVolume* volumeInterface, bool newState); \ No newline at end of file +void setMuted(IAudioEndpointVolume* volumeInterface, bool newState); +AudioProcessingState getAudioProcessing(AudioDevice& device); +void setAudioProcessing(AudioDevice& device, bool newVal); diff --git a/AsuroTool/AudioNotificationListener.h b/AsuroTool/AudioNotificationListener.h index 1f3c66e..c4bd10a 100644 --- a/AsuroTool/AudioNotificationListener.h +++ b/AsuroTool/AudioNotificationListener.h @@ -1,8 +1,10 @@ #pragma once -#include +#include #include +#include + class AudioData; class ApplicationData; class AudioNotificationListener : public IMMNotificationClient { diff --git a/AsuroTool/PolicyConfig.h b/AsuroTool/PolicyConfig.h index ff6b2ac..36c7694 100644 --- a/AsuroTool/PolicyConfig.h +++ b/AsuroTool/PolicyConfig.h @@ -115,6 +115,9 @@ public: PCWSTR, INT ); + + virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(PCWSTR pszDeviceName, BOOL bFxStore, const PROPERTYKEY& pKey, PROPVARIANT* pv) = 0; + virtual HRESULT STDMETHODCALLTYPE SetPropertyValue(PCWSTR pszDeviceName, BOOL bFxStore, const PROPERTYKEY& pKey, PROPVARIANT* pv) = 0; }; interface DECLSPEC_UUID("568b9108-44bf-40b4-9006-86afe5b5a620") IPolicyConfigVista; diff --git a/AsuroTool/Settings.h b/AsuroTool/Settings.h index 1768fb6..d7c1996 100644 --- a/AsuroTool/Settings.h +++ b/AsuroTool/Settings.h @@ -1,8 +1,8 @@ #pragma once -#include "ImguiBase.h" -#include - #include "ApplicationData.h" +#include "ImguiBase.h" + +#include void initSettings(DrawData& drawData, ApplicationData& appData); diff --git a/AsuroTool/Util.h b/AsuroTool/Util.h index 8f055d0..503ad8a 100644 --- a/AsuroTool/Util.h +++ b/AsuroTool/Util.h @@ -1,6 +1,7 @@ #pragma once #include + #include bool isError(const HRESULT result, const std::stringstream message);