Вызов функции Windows API для установки автоматического управления усилением - PullRequest
7 голосов
/ 17 мая 2019

enter image description herehttps://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();

По сути, я хочу отключить (снять флажок) это улучшение

Ответы [ 2 ]

4 голосов
/ 20 мая 2019

В этом ответе обсуждалось «Как использовать указатель интерфейса, экспортируемый C ++ DLL в C #». Но я думаю, что вы хотите больше, как показано ниже.

Вам не нужно использовать винапи. Функциональность автоматической регулировки усиления реализована в классе 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();
        }
    }
}

UPDATE:

Чтобы просто отключить 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;
}
0 голосов
/ 23 мая 2019

Вот чистый пример консольного приложения C #, эквивалентный коду C / C ++ @ Drake.Я написал его, используя код из проекта с открытым исходным кодом DirectN , который определяет тысячи типов взаимодействия Windows c (DirectX и т. Д.), Включая Code Audio API и т. Д.

class Program
{
    static void Main(string[] args)
    {
        // using DirectN
        var enumerator = (IMMDeviceEnumerator)new MMDeviceEnumerator();

        // or call GetDevice(...) with an id
        enumerator.GetDefaultAudioEndpoint(
            __MIDL___MIDL_itf_mmdeviceapi_0000_0000_0001.eCapture,
            __MIDL___MIDL_itf_mmdeviceapi_0000_0000_0002.eConsole,
            out var device).ThrowOnError();

        const int CLSCTX_ALL = 23;
        device.Activate(typeof(IDeviceTopology).GUID, CLSCTX_ALL, null, out var iface).ThrowOnError();

        var topology = (IDeviceTopology)iface;
        topology.GetConnector(0, out var connector).ThrowOnError();

        var part = (IPart)connector;
        if (part.Activate(CLSCTX_ALL, typeof(IAudioAutoGainControl).GUID, out iface).IsError)
        {
            Console.WriteLine("AGC not supported.");
            return;
        }

        var control = (IAudioAutoGainControl)iface;
        control.SetEnabled(true, IntPtr.Zero);
    }

    [ComImport]
    [Guid("bcde0395-e52f-467c-8e3d-c4579291692e")] // CLSID_MMDeviceEnumerator
    class MMDeviceEnumerator
    {
    }
}

Вы можете использовать пакет nuget в DirectN или скопировать в свой проект только необходимые файлы .cs (и их зависимости).Здесь вам понадобится следующее:

HRESULT.cs                                          
HRESULTS.cs                                         
IAudioAutoGainControl.cs                            
IAudioVolumeLevel.cs                                
IConnector.cs                                       
IControlChangeNotify.cs                             
IControlInterface.cs                                
IDeviceTopology.cs                                  
IMMDevice.cs                                        
IMMDeviceCollection.cs                              
IMMDeviceEnumerator.cs                              
IMMNotificationClient.cs                            
IPart.cs                                            
IPartsList.cs                                       
IPerChannelDbLevel.cs                               
ISubunit.cs                                         
PROPERTYKEY.cs                                      
PropertyType.cs                                     
PropVariant.cs                                      
_tagpropertykey.cs                                  
__MIDL___MIDL_itf_devicetopology_0000_0000_0011.cs  
__MIDL___MIDL_itf_devicetopology_0000_0000_0012.cs  
__MIDL___MIDL_itf_devicetopology_0000_0000_0013.cs  
__MIDL___MIDL_itf_mmdeviceapi_0000_0000_0001.cs     
__MIDL___MIDL_itf_mmdeviceapi_0000_0000_0002.cs   
...