Как перечислить аудио устройства в c # - PullRequest
10 голосов
/ 06 октября 2009

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

ОС: Windows (XP, Vista, 7) Framework: .Net 3.5 Язык: c #

При просмотре этого списка я хотел бы получить такую ​​информацию, как идентификатор, производитель, ... для каждого устройства.

Есть подсказки?

Ответы [ 5 ]

16 голосов
/ 06 октября 2009

Вот код для перечисления аудиоустройств в C # с использованием WMI (ссылка System.Management).

    ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(
           "SELECT * FROM Win32_SoundDevice");

    ManagementObjectCollection objCollection = objSearcher.Get();

    foreach (ManagementObject obj in objCollection)
    {
        foreach (PropertyData property in obj.Properties)
        {
            Console.Out.WriteLine(String.Format("{0}:{1}", property.Name, property.Value));
        }
    }

Что приводит к выводу что-то вроде:

Availability:
Caption:USB Audio Device
ConfigManagerErrorCode:0
ConfigManagerUserConfig:False
CreationClassName:Win32_SoundDevice
Description:USB Audio Device
DeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000
DMABufferSize:
ErrorCleared:
ErrorDescription:
InstallDate:
LastErrorCode:
Manufacturer:(Generic USB Audio)
MPU401Address:
Name:USB Audio Device
PNPDeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000
PowerManagementCapabilities:
PowerManagementSupported:False
ProductName:USB Audio Device
Status:OK
StatusInfo:3
SystemCreationClassName:Win32_ComputerSystem
SystemName:
Availability:

Caption:Realtek AC'97 Audio for VIA (R) Audio Controller
ConfigManagerErrorCode:0
ConfigManagerUserConfig:False
CreationClassName:Win32_SoundDevice
Description:Realtek AC'97 Audio for VIA (R) Audio Controller
DeviceID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D
DMABufferSize:
ErrorCleared:
ErrorDescription:
InstallDate:
LastErrorCode:
Manufacturer:Realtek
MPU401Address:
Name:Realtek AC'97 Audio for VIA (R) Audio Controller
PNPDeviceID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D
PowerManagementCapabilities:
PowerManagementSupported:False
ProductName:Realtek AC'97 Audio for VIA (R) Audio Controller
Status:OK
StatusInfo:3
SystemCreationClassName:Win32_ComputerSystem
SystemName:
Availability:

WMI, к сожалению, не различает просто устройства ввода и вывода звука. Однако, используя управляемый интерфейс DirectSound и класс DevicesCollection, как показано ниже (см. Microsoft.DirectX.DirectSound), мы можем получить гораздо больше информации, ориентированной на звук.

        DevicesCollection devColl = new DevicesCollection();
        foreach (DeviceInformation devInfo in devColl)
        {
            Device dev = new Device(devInfo.DriverGuid);   

            //use dev.Caps, devInfo to access a fair bit of info about the sound device
        }
7 голосов
/ 14 июня 2014

В Windows Vista и выше вы можете использовать IMMDeviceEnumerator, который обернут для вас NAudio , чтобы перечислять аудио конечные устройства. Например:

var enumerator = new MMDeviceEnumerator();
foreach (var endpoint in 
         enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active))
{
    Console.WriteLine(endpoint.FriendlyName);
}
3 голосов
/ 06 октября 2009

вот пример

Добавить ссылку на System.Management

ManagementObjectSearcher mo = new ManagementObjectSearcher("select * from Win32_SoundDevice");

foreach (ManagementObject soundDevice in mo.Get())
{
     Console.WriteLine(soundDevice.GetPropertyValue("DeviceId"));
     Console.WriteLine(soundDevice.GetPropertyValue("Manufacturer"));
     // etc                       
} 
0 голосов
/ 02 октября 2013
        /// <summary>
        /// The DirectSoundEnumerate function enumerates the DirectSound Odrivers installed in the system.
        /// </summary>
        /// <param name="lpDSEnumCallback">callback function</param>
        /// <param name="lpContext">User context</param>
        [DllImport("dsound.dll", EntryPoint = "DirectSoundEnumerateA", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        static extern void DirectSoundEnumerate(DevicesEnumCallback lpDSEnumCallback, IntPtr lpContext);

И обратный вызов должен выглядеть следующим образом:

  private static bool DevicesEnumCallbackHandler(IntPtr lpGuid, IntPtr lpcstrDescription, IntPtr lpcstrModule, IntPtr lpContext)
0 голосов
/ 22 сентября 2011

Проверка waveOutGetNumDevs API

[DllImport("winmm.dll", SetLastError = true)]
public static extern uint waveOutGetNumDevs();

Возвращает количество устройств. Возвращаемое значение, равное нулю, означает, что устройства отсутствуют или что произошла ошибка. http://msdn.microsoft.com/en-us/library/dd743860(v=vs.85).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...