Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > список доступных звуковых карт в системе


Автор: gl42 7.11.2011, 23:43
Добрый вечер, 
подскажите, как можно получить список доступных звуковых карт? и информацию о них?
функций winapi, как я поняла, для этого нет.
может через реестр? тогда в каком каталоге находится звуковая карта?

Автор: Keeper89 8.11.2011, 01:08
Код

//-----------------------------------------------------------------------------------------------------
//     This code was generated by the Wmi Delphi Code Creator [URL=http://theroadtodelphi.wordpress.com]http://theroadtodelphi.wordpress.com[/URL]
//     Version: 1.1.2.170 
//
//
//
//     LIABILITY DISCLAIMER
//     THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
//     YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
//     DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//
//
//----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
  

    
// The Win32_SoundDevice class represents the properties of a sound device on a 
// Win32 computer system.

procedure  GetWin32_SoundDeviceInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_SoundDevice','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Availability                   %d',[Integer(FWbemObject.Availability)]));// Uint16
    Writeln(Format('Caption                        %s',[String(FWbemObject.Caption)]));// String
    Writeln(Format('ConfigManagerErrorCode         %d',[Integer(FWbemObject.ConfigManagerErrorCode)]));// Uint32
    Writeln(Format('ConfigManagerUserConfig        %s',[String(FWbemObject.ConfigManagerUserConfig)]));// Boolean
    Writeln(Format('CreationClassName              %s',[String(FWbemObject.CreationClassName)]));// String
    Writeln(Format('Description                    %s',[String(FWbemObject.Description)]));// String
    Writeln(Format('DeviceID                       %s',[String(FWbemObject.DeviceID)]));// String
    Writeln(Format('DMABufferSize                  %d',[Integer(FWbemObject.DMABufferSize)]));// Uint16
    Writeln(Format('ErrorCleared                   %s',[String(FWbemObject.ErrorCleared)]));// Boolean
    Writeln(Format('ErrorDescription               %s',[String(FWbemObject.ErrorDescription)]));// String
    Writeln(Format('InstallDate                    %s',[String(FWbemObject.InstallDate)]));// Datetime
    Writeln(Format('LastErrorCode                  %d',[Integer(FWbemObject.LastErrorCode)]));// Uint32
    Writeln(Format('Manufacturer                   %s',[String(FWbemObject.Manufacturer)]));// String
    Writeln(Format('MPU401Address                  %d',[Integer(FWbemObject.MPU401Address)]));// Uint32
    Writeln(Format('Name                           %s',[String(FWbemObject.Name)]));// String
    Writeln(Format('PNPDeviceID                    %s',[String(FWbemObject.PNPDeviceID)]));// String
    Writeln(Format('PowerManagementCapabilities    %d',[Integer(FWbemObject.PowerManagementCapabilities)]));// Uint16
    Writeln(Format('PowerManagementSupported       %s',[String(FWbemObject.PowerManagementSupported)]));// Boolean
    Writeln(Format('ProductName                    %s',[String(FWbemObject.ProductName)]));// String
    Writeln(Format('Status                         %s',[String(FWbemObject.Status)]));// String
    Writeln(Format('StatusInfo                     %d',[Integer(FWbemObject.StatusInfo)]));// Uint16
    Writeln(Format('SystemCreationClassName        %s',[String(FWbemObject.SystemCreationClassName)]));// String
    Writeln(Format('SystemName                     %s',[String(FWbemObject.SystemName)]));// String
        
    Writeln('');
    FWbemObject:=Unassigned;
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetWin32_SoundDeviceInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;      
end.

Автор: Yanis 8.11.2011, 16:22
Какая конкретно нужна информация от звуковой карты?

Получить количество карт и наименование очень просто:
Код

uses MMSystem;

var
  NumDevs: Integer;
  wc: TWaveOutCaps;
  i: Integer;
begin
  // количество звуковых карт
  NumDevs := waveOutGetNumDevs;

  // узнаём про каждую звуковух
  for i := 0 to NumDevs - 1 do
  begin
    waveOutGetDevCaps(i, @wc, SizeOf(wc));

    MessageDlg(Format('Product name: "%s"', [wc.szPname]), mtInformation,
      [mbOK], 0);
  end;

Автор: gl42 8.11.2011, 19:03
Цитата(Yanis @ 8.11.2011,  16:22)
Какая конкретно нужна информация от звуковой карты?

Получить количество карт и наименование очень просто:
Код

uses MMSystem;

var
  NumDevs: Integer;
  wc: TWaveOutCaps;
  i: Integer;
begin
  // количество звуковых карт
  NumDevs := waveOutGetNumDevs;

  // узнаём про каждую звуковух
  for i := 0 to NumDevs - 1 do
  begin
    waveOutGetDevCaps(i, @wc, SizeOf(wc));

    MessageDlg(Format('Product name: "%s"', [wc.szPname]), mtInformation,
      [mbOK], 0);
  end;

Ну в основном как раз количество и имя.
Эта функция определяет (у меня дословно) "Динамики (Realtek High Definiti". (почему не полностью, не знаю)
Мне нужен вывод названия самой карты, например: Realtek ALC269.

Автор: gl42 8.11.2011, 19:20
Цитата(Keeper89 @ 8.11.2011,  01:08)
Код

//-----------------------------------------------------------------------------------------------------
//     This code was generated by the Wmi Delphi Code Creator [URL=http://theroadtodelphi.wordpress.com]http://theroadtodelphi.wordpress.com[/URL]
//     Version: 1.1.2.170 
//
//
//
//     LIABILITY DISCLAIMER
//     THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
//     YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
//     DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//
//
//----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
  

    
// The Win32_SoundDevice class represents the properties of a sound device on a 
// Win32 computer system.

procedure  GetWin32_SoundDeviceInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_SoundDevice','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Availability                   %d',[Integer(FWbemObject.Availability)]));// Uint16
    Writeln(Format('Caption                        %s',[String(FWbemObject.Caption)]));// String
    Writeln(Format('ConfigManagerErrorCode         %d',[Integer(FWbemObject.ConfigManagerErrorCode)]));// Uint32
    Writeln(Format('ConfigManagerUserConfig        %s',[String(FWbemObject.ConfigManagerUserConfig)]));// Boolean
    Writeln(Format('CreationClassName              %s',[String(FWbemObject.CreationClassName)]));// String
    Writeln(Format('Description                    %s',[String(FWbemObject.Description)]));// String
    Writeln(Format('DeviceID                       %s',[String(FWbemObject.DeviceID)]));// String
    Writeln(Format('DMABufferSize                  %d',[Integer(FWbemObject.DMABufferSize)]));// Uint16
    Writeln(Format('ErrorCleared                   %s',[String(FWbemObject.ErrorCleared)]));// Boolean
    Writeln(Format('ErrorDescription               %s',[String(FWbemObject.ErrorDescription)]));// String
    Writeln(Format('InstallDate                    %s',[String(FWbemObject.InstallDate)]));// Datetime
    Writeln(Format('LastErrorCode                  %d',[Integer(FWbemObject.LastErrorCode)]));// Uint32
    Writeln(Format('Manufacturer                   %s',[String(FWbemObject.Manufacturer)]));// String
    Writeln(Format('MPU401Address                  %d',[Integer(FWbemObject.MPU401Address)]));// Uint32
    Writeln(Format('Name                           %s',[String(FWbemObject.Name)]));// String
    Writeln(Format('PNPDeviceID                    %s',[String(FWbemObject.PNPDeviceID)]));// String
    Writeln(Format('PowerManagementCapabilities    %d',[Integer(FWbemObject.PowerManagementCapabilities)]));// Uint16
    Writeln(Format('PowerManagementSupported       %s',[String(FWbemObject.PowerManagementSupported)]));// Boolean
    Writeln(Format('ProductName                    %s',[String(FWbemObject.ProductName)]));// String
    Writeln(Format('Status                         %s',[String(FWbemObject.Status)]));// String
    Writeln(Format('StatusInfo                     %d',[Integer(FWbemObject.StatusInfo)]));// Uint16
    Writeln(Format('SystemCreationClassName        %s',[String(FWbemObject.SystemCreationClassName)]));// String
    Writeln(Format('SystemName                     %s',[String(FWbemObject.SystemName)]));// String
        
    Writeln('');
    FWbemObject:=Unassigned;
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetWin32_SoundDeviceInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;      
end.

спасибо, но думаю с WMI мне не разобраться.
да и коды слишком громоздкие(

Автор: Yanis 8.11.2011, 20:48
Если вы поставите задачу более полно, то, возможно, найдётся более конкретное решение.
А в общем случае вам надо будет узнавать идентификатор производителя и устройства, а затем искать наименование производителя и устройства по базе, наподобие http://pcidatabase.com/. Либо ждать пока вам ответит кто-то, кто понял в отличие от меня, что вам требуется smile

Автор: Keeper89 8.11.2011, 21:08
Цитата(gl42 @  8.11.2011,  19:20 Найти цитируемый пост)
спасибо, но думаю с WMI мне не разобраться.
да и коды слишком громоздкие( 

Почему не разобраться?

Вырежьте просто что нужно и все. Например:
Код

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;

const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

begin
  try
    CoInitialize(nil);
    try
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_SoundDevice','WQL',wbemFlagForwardOnly);
      oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        Writeln(Format('ProductName: %s',[string(FWbemObject.ProductName)]));
        VarClear(FWbemObject);
      end;
    finally
      CoUninitialize;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


Добавлено через 41 секунду
Цитата(Yanis @  8.11.2011,  20:48 Найти цитируемый пост)
А в общем случае вам надо будет узнавать идентификатор производителя и устройства, а затем искать наименование производителя и устройства по базе, наподобие pcidatabase.com.

+1

Автор: gl42 8.11.2011, 23:58
Цитата(Yanis @ 8.11.2011,  20:48)
Если вы поставите задачу более полно, то, возможно, найдётся более конкретное решение.
А в общем случае вам надо будет узнавать идентификатор производителя и устройства, а затем искать наименование производителя и устройства по базе, наподобие http://pcidatabase.com/. Либо ждать пока вам ответит кто-то, кто понял в отличие от меня, что вам требуется smile

количество звуковых карт (если их несколько, например встроенная в материнку, и отдельная)
их названия (как я поняла, включающих производителя, типо Intel, Genius, Realtek и серию)
вобщем то все.) либо по отдельности производителя и серию.
ну функция waveOutGetDevCaps определяет устройства вывода так? поэтому это будут динамики, наушники.. а не сама звуковая карта.

Добавлено @ 23:59
Цитата(Keeper89 @  8.11.2011,  21:08 Найти цитируемый пост)
Почему не разобраться?

Вырежьте просто что нужно и все. Например:
код Pascal/Delphi
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin
  try
    CoInitialize(nil);
    try
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_SoundDevice','WQL',wbemFlagForwardOnly);
      oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        Writeln(Format('ProductName: %s',[string(FWbemObject.ProductName)]));
        VarClear(FWbemObject);
      end;
    finally
      CoUninitialize;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


я попробую) спасибо)

скажите, для WMI нужно что-нибудь устанавливать дополнительно?

Автор: gl42 9.11.2011, 15:26
FWbemObject.ProductName тоже выдает динамики(

"Realtek High Definition Audio 
Аудио Intel® для дисплеев"

в диспетчере устройств звуковые устройства пишет тоже самое :
Realtek High Definition Audio 
Аудио Intel® для дисплеев

а сама винда не определяет название звуковой карты?

Автор: Keeper89 10.11.2011, 12:54
Цитата(gl42 @  8.11.2011,  23:58 Найти цитируемый пост)
скажите, для WMI нужно что-нибудь устанавливать дополнительно?

Нет, надо только смотреть, поддерживается ли конкретная функция конкретной ОС.
Цитата(gl42 @  9.11.2011,  15:26 Найти цитируемый пост)
а сама винда не определяет название звуковой карты?

Что есть название? Какая-либо программа (типа Everest'а) определяет нужное?

Автор: gl42 10.11.2011, 16:59
Цитата(Keeper89 @  10.11.2011,  12:54 Найти цитируемый пост)
Что есть название? Какая-либо программа (типа Everest'а) определяет нужное? 


да, aida64 Extreme Edition выдает звуковую карту Realtek ALC269  (ну как я поняла, ALC - кодек, а не серия.)

Автор: Keeper89 10.11.2011, 21:06
Попробуйте вбить
Код

Writeln(Format('DeviceID %s',[String(FWbemObject.DeviceID)]));// String

в поисковик. Должен получиться тот же ответ, что и у аиды.

Автор: gl42 10.11.2011, 21:53
Цитата(Keeper89 @  10.11.2011,  21:06 Найти цитируемый пост)
код Pascal/Delphi
1:
Writeln(Format('DeviceID %s',[String(FWbemObject.DeviceID)]));// String

в поисковик. Должен получиться тот же ответ, что и у аиды. 


HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_10431AC3&REV_1001\4&2C5AF439&0&0001
HDAUDIO\FUNC_01&VEN_8086&DEV_2805&SUBSYS_80860101&REV_1000\4&2C5AF439&0&0301
это трудно назвать тем же ответом)

Автор: Keeper89 10.11.2011, 22:23
Цитата(gl42 @  10.11.2011,  21:53 Найти цитируемый пост)

HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_10431AC3&REV_1001\4&2C5AF439&0&0001

HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_10431AC3&REV_1001
Цитата

это трудно назвать тем же ответом)

Вполне =)

Автор: gl42 10.11.2011, 22:46
Цитата(Keeper89 @  10.11.2011,  22:23 Найти цитируемый пост)
HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_10431AC3&REV_1001
Цитата

это трудно назвать тем же ответом)

Вполне =)


ладно, согласна)
спасибо. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)