Как записать звук с устройства для записи по умолчанию используя NAudio?

237
17 декабря 2018, 16:40

Смотрел код здесь - https://metanit.com/sharp/articles/5.php и здесь - https://toster.ru/q/405123

waveIn.DeviceNumber = 0; // является ли код 0 устройством по умолчанию?
Answer 1

Нет, в общем случае устройство по умолчанию не обязано иметь код 0. Получить код можно так:

using NAudio.CoreAudioApi;
using System.Runtime.InteropServices;
/* ... */
[DllImport("winmm.dll")]
public static extern uint waveInGetNumDevs();
public const uint DRV_RESERVED = 0x0800;
public const uint DRV_QUERYFUNCTIONINSTANCEID = (DRV_RESERVED + 17);
public const uint DRV_QUERYFUNCTIONINSTANCEIDSIZE = (DRV_RESERVED + 18);
public const uint DRV_QUERYDEVICEINTERFACE = (DRV_RESERVED + 12);
public const uint DRV_QUERYDEVICEINTERFACESIZE = (DRV_RESERVED + 13);
[DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "waveInMessage")]
public static extern int waveInMessage1(uint hWaveIn, uint msg,
    ref uint dw1, uint dw2);
[DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "waveInMessage")]
public static extern int waveInMessage2(uint hWaveIn, uint msg,
    [MarshalAs(UnmanagedType.LPWStr)] StringBuilder dw1, uint dw2);
//получает ID (номер) устройства записи по умолчанию
public static uint GetDefaultDeviceId()
{
    string endpid = "";
    var enumerator = new MMDeviceEnumerator();
    using (enumerator)
    {
        var device = enumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Console);
        using (device)
        {
            endpid = device.ID;
        }
    }
    uint num = waveInGetNumDevs();
    StringBuilder sb;
    uint size = 0;
    for (uint i = 0; i < num; i++)
    {
        size = 0;
        waveInMessage1(i, DRV_QUERYFUNCTIONINSTANCEIDSIZE, ref size, 0);
        sb = new StringBuilder((int)size + 10);
        waveInMessage2(i, DRV_QUERYFUNCTIONINSTANCEID, sb, size);
        ;
        if (sb.ToString() == endpid) return i;
    }
    throw new ApplicationException("Default device not found!");
}
READ ALSO
ASP.NET проблемы с кириллицей внутри тега script

ASP.NET проблемы с кириллицей внутри тега script

Создадим строку с русскими символами в любом View

217
Передача id объекта View в метод контроллера ASP.NET MVC

Передача id объекта View в метод контроллера ASP.NET MVC

Есть БД с перечнем кандидатов, с помощью EF создал DbContext -

220
Запуск Тестов на нескольких браузерах Selenium + NUnit

Запуск Тестов на нескольких браузерах Selenium + NUnit

учусь писать автотесты, стал вопрос как запустить параллельное выполнение тестов на нескольких браузерах(допустим на 4х), если использовать...

205
Ошибка запуска Is not a valid Win32 application

Ошибка запуска Is not a valid Win32 application

Есть виртуалка на базе Vmware с Windows 7В ней прикручена папка с основной машины как сетевой диск по адресу Z:\Work\Program\Test\Test

213