c# - 调用 Windows API 函数设置自动增益控制

标签 c# winforms winapi audio core-audio

enter image description here https://learn.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();

本质上,我想禁用(取消选中)此增强功能

最佳答案

answer讨论了“如何在C#中使用C++ DLL导出的接口(interface)指针”。但是,我认为您更想要的是如下所示。

您不需要使用 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();
        }
    }
}

更新:

如果想简单的关闭带有接口(interface)的AGC,可以将所有的接口(interface)程序封装在自己的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;
}

关于c# - 调用 Windows API 函数设置自动增益控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184011/

相关文章:

c# - 为什么我不应该使用 AutoDual?

winforms - System.Windows.Threading.Dispatcher 和 WinForms?

c# - 如何将 datagridview 单元格格式值导出到 Excel?

c++ - 识别 Windows 中连接的驱动器

c++ - GetPrivateProfileInt- 只读取默认值

.net - 了解vs2010的基本windows编程

c# - 在 visual studio 中重建 app.config?

c# - 如何更快地在 Visual Studio 中编写代码?

c# - 如何为所有按钮注册单个事件监听器

c# - 是否可以测量 Winforms 表单出现需要多长时间?