failed loudness eq experiment

This commit is contained in:
2022-12-14 18:41:31 +01:00
parent 8967846657
commit 7e76c4813d
8 changed files with 100 additions and 13 deletions

View File

@@ -3,7 +3,7 @@
#include "AudioApi.h"
#include <functiondiscoverykeys.h>
AudioDevice::AudioDevice(IMMDevice* device, LPCWSTR deviceId)
AudioDevice::AudioDevice(IMMDevice* device, LPCWSTR deviceId) : device(device)
{
id = std::wstring(deviceId);

View File

@@ -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<AudioDevice>& 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<AudioDevice>& 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();
}

View File

@@ -1,15 +1,18 @@
#include "AudioApi.h"
#include "Util.h"
#include "PolicyConfig.h"
#include <windows.h>
#include <functiondiscoverykeys.h>
#include <endpointvolume.h>
#include <initguid.h>
#include <mmdeviceapi.h>
#include <array>
#include <vector>
#include <algorithm>
#include "Util.h"
#include "AudioApi.h"
#include "PolicyConfig.h"
#include <iostream>
void initAudio(ApplicationData& appData)
{
@@ -184,4 +187,58 @@ bool isMuted(IAudioEndpointVolume* volumeInterface)
void setMuted(IAudioEndpointVolume* volumeInterface, bool newState)
{
volumeInterface->SetMute(static_cast<BOOL>(newState), NULL);
}
}
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();
}
}

View File

@@ -1,9 +1,14 @@
#pragma once
#include <mmdeviceapi.h>
#include "ApplicationData.h"
enum class AudioProcessingState
{
Enabled,
Disabled,
Unknown
};
void initAudio(ApplicationData& appData);
void loadAudioDevices(AudioData& audioData, std::vector<AudioDevice>& deviceList, EDataFlow deviceType);
void reloadDeviceLists(AudioData& audioData);
@@ -17,4 +22,6 @@ void setVolume(IAudioEndpointVolume* volumeInterface, float newVolume);
UINT getMeterValues(IAudioMeterInformation* meterInterface, std::array<float, 2>& levels);
void getVolumeLimit(IAudioEndpointVolume* volumeInterface, float* outMin, float* outMax);
bool isMuted(IAudioEndpointVolume* volumeInterface);
void setMuted(IAudioEndpointVolume* volumeInterface, bool newState);
void setMuted(IAudioEndpointVolume* volumeInterface, bool newState);
AudioProcessingState getAudioProcessing(AudioDevice& device);
void setAudioProcessing(AudioDevice& device, bool newVal);

View File

@@ -1,8 +1,10 @@
#pragma once
#include <memory>
#include <initguid.h>
#include <mmdeviceapi.h>
#include <memory>
class AudioData;
class ApplicationData;
class AudioNotificationListener : public IMMNotificationClient {

View File

@@ -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;

View File

@@ -1,8 +1,8 @@
#pragma once
#include "ImguiBase.h"
#include <imgui_internal.h>
#include "ApplicationData.h"
#include "ImguiBase.h"
#include <imgui_internal.h>
void initSettings(DrawData& drawData, ApplicationData& appData);

View File

@@ -1,6 +1,7 @@
#pragma once
#include <windows.h>
#include <sstream>
bool isError(const HRESULT result, const std::stringstream message);