c# - 调用 Windows API 函数来设置自动增益控制
问题描述
https://docs.microsoft.com/en-us/windows/desktop/api/devicetopology/nf-devicetopology-iaudioautogaincontrol-setenabled
我正在尝试做一个 C# 包装器/调用来设置这个低级设备设置值。它基本上禁用/启用 AGC 麦克风设置。我找到了这个链接,但我不知道如何连接它看起来像这样:
// http://msdn.microsoft.com/en-us/library/dd757304%28VS.85%29.aspx
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
public static extern Int32 mixerGetNumDevs();
本质上,我想禁用(取消选中)此增强功能
解决方案
这个答案讨论了“如何在 C# 中使用 C++ DLL 导出的接口指针”。但是,我认为你想要的更多如下。
你不需要使用winapi。自动增益控制功能在AudioQualityEnhancer
类中实现,这是一个媒体处理程序。它使用AutoGainControl
bool 属性来启用或禁用增益控制功能。
C# 中的自动增益控制示例:
using System;
using Ozeki.Media;
namespace Automatic_Gain_Control
{
class Program
{
static Microphone microphone;
static Speaker speaker;
static MediaConnector connector;
static AudioQualityEnhancer audioProcessor;
static void Main(string[] args)
{
microphone = Microphone.GetDefaultDevice();
speaker = Speaker.GetDefaultDevice();
connector = new MediaConnector();
audioProcessor = new AudioQualityEnhancer();
audioProcessor.AutoGainControl = true;//enable
audioProcessor.GainSpeed = 12;
audioProcessor.MaxGain = 30;
connector.Connect(microphone, audioProcessor);
connector.Connect(audioProcessor, speaker);
microphone.Start();
speaker.Start();
Console.ReadLine();
}
}
}
更新:
要简单地禁用带接口的 AGC,您可以将所有接口过程封装在自己的 DLL 函数中,例如:
HRESULT EnableAGC()
{
CComPtr<IMMDeviceEnumerator> m_pIMMEnumerator;
CComPtr<IAudioVolumeLevel> m_pMicBoost;
CComPtr<IAudioAutoGainControl> m_pAGC;
HRESULT hr = S_OK;
hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, (void**)&m_pIMMEnumerator);
if (FAILED(hr)) return hr;
CComPtr<IMMDevice> pIMMDeivce = NULL;
std::wstring strEndPointID;//String of the Device ID
if (strEndPointID.empty())
{
hr = m_pIMMEnumerator->GetDefaultAudioEndpoint(eCapture, eConsole, &pIMMDeivce);
}
else
{
hr = m_pIMMEnumerator->GetDevice(strEndPointID.c_str(), &pIMMDeivce);
}
if (FAILED(hr)) return hr;
CComPtr<IDeviceTopology> pTopo = NULL;
hr = pIMMDeivce->Activate(IID_IDeviceTopology, CLSCTX_INPROC_SERVER, 0, (void**)&pTopo);
if (FAILED(hr)) return hr;
CComPtr<IConnector> pConn = NULL;
hr = pTopo->GetConnector(0, &pConn);
if (FAILED(hr)) return hr;
CComPtr<IConnector> pConnNext = NULL;
hr = pConn->GetConnectedTo(&pConnNext);
if (FAILED(hr)) return hr;
CComPtr<IPart> pPart = NULL;
hr = pConnNext->QueryInterface(IID_IPart, (void**)&pPart);
if (FAILED(hr)) return hr;
hr = pPart->Activate(CLSCTX_INPROC_SERVER, IID_IAudioAutoGainControl, (void**)&m_pAGC);
if (SUCCEEDED(hr) && m_pAGC)
{
//Hardware Supports Microphone AGC
BOOL bEnable = TRUE;
hr = m_pAGC->SetEnabled(bEnable, NULL);
}
else
{
//Hardware not Supports Microphone AGC
}
return hr;
}
推荐阅读
- java - IBM MQ 的组件之间的逻辑关系是什么?
- python - 网站中自然问题的更系统的代码
- vue.js - 在 vue-recaptcha 上绕过 Recaptcha
- django - 如何在 django shell 中以现有用户身份登录
- python - 如何使用 Tweepy 和 Python 遍历用户列表?
- angular - Angular MSAL Guard:已调用 RenewIdToken
- html - 缩放时定位(.5)
- c# - 你如何使用 `BeApproximately` 的值在循环的每次迭代中都会发生变化?
- python - 我们是否评估 cross_val_score 的准确性,然后评估测试数据的准确性?
- reactjs - Cannot connect component inside React Route to redux store