Я СДЕЛАЛ ЭТО!
Я выяснил, почему программа использует MMDevice
вместо IMMDevice
.Разработчик решил использовать библиотеку CSCore , а не собственный Windows Audio API Windows.
Из прочтения документации CSCore MMDeviceEnumerator похоже, что я "Придется создать отдельную программу, которая выводит все конечные точки и соответствующие им строки идентификаторов конечных точек.Затем я могу заменить метод DefaultAudioEndpoint
на метод GetDevice(String id)
, где String id
- это идентификатор любой конечной точки, которую я выбрал из отдельной программы.
Чтобы найти нужную конечную точку, я написал этокороткая программа, чтобы найти всю информацию, которую я хотел:
static void Main(string[] args)
{
MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
MMDeviceCollection collection = enumerator.EnumAudioEndpoints(DataFlow.Render,DeviceState.Active);
Console.WriteLine($"\nNumber of active Devices: {collection.GetCount()}");
int i = 0;
foreach (MMDevice device in collection){
Console.WriteLine($"\n{i} Friendly name: {device.FriendlyName}");
Console.WriteLine($"Endpoint ID: {device.DeviceID}");
i++;
}
Console.ReadKey();
}
Это показало мне, что конечной точкой, которую я хотел, была позиция 3 (2 в массиве) в моем списке, и вместо использования GetDevice(String id)
я использовалItemAt(int deviceIndex)
.
MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
MMDeviceCollection collection = enumerator.EnumAudioEndpoints(DataFlow.Render,DeviceState.Active);
MMDevice captureDevice = collection.ItemAt(2);
Однако в этом случае программа не использовала captureDevice
для ввода аудиоданных.Это были магические строки:
_capture = new WasapiLoopbackCapture(100, new WaveFormat(deviceFormat.SampleRate, deviceFormat.BitsPerSample, i));
_capture.Initialize();
Я обнаружил, что WasapiLoopbackCapture
использует устройство Windows по умолчанию, если оно не изменилось, и код использовал DefaultAudioEndpoint
, чтобы получить свойства устройства по умолчанию.Поэтому я добавил
_capture.Device = captureDevice;
//before
_capture.Initialize();
И теперь программа правильно извлекает аудиоданные из моей конечной точки звука, отличной от используемой по умолчанию.