Re[3]: Получить из DeviceId имя устройства для waveOutGetDev
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 19.05.06 10:41
Оценка:
Здравствуйте, Ичетник, Вы писали:

И>Боюсь меня неправильно поняли...


Разумеется, коли Вы такую кашу замесили

И>Поставил я драйвер на устройства "USB\XXX&XXX&XXX\XX&XX" и "USB\XXX&XXX&XXX\YY&YY".


Это называется Device Hardware Id. А Device Id, в контексте wave-функций — это параметр для waveXxxGetDevCaps, waveXxxOpen.

И> Они предоставили мне "Устройство" и "Устройство (2)". (Два девайса для waveOut).


Если для waveOut — не стоило упоминать Volume Control. Устройства wave и mixer относятся к разным типам, у одного адаптера они могут иметь разные имена, и иногда возникает задача по одному найти другое. Ваше первое описание именно на это и намекало.

И> Мне дается задача проигрывать звук через "USB\XXX&XXX&XXX\XX&XX". Как определить "waveform-audio output device" для него?


Нужно сделать для wave-устройства запрос DRV_QUERYDEVICEINTERFACE — он возвращает имя интерфейса WDM-устройства. Затем нужно перебрать все интерфейсы (SetupDiEnumDeviceInterfaces) в категории KSCATEGORY_RENDER, найти соответствующий, и запросить для найденного устройства Hardware Id (SetupDiGetDeviceRegistryProperty/SPDRP_HARDWAREID).

Многие драйверы используют в inf-файлах не Hardware Ids, а Compatible Ids — их нужно добывать запросом SPDRP_COMPATIBLEIDS.

Еще нужно учесть, что функция SetupDiGetDeviceRegistryProperty довольно привередлива, и для некоторых запросов (включая упомянутые) требует размера буфера, в точности равного размеру значения. То есть, трюк с подсовыванием заведомо большого буфера не проходит (зависит от системы, но лучше не рисковать).

Вот для примера кусок функции, перебирающей Hardware/Compatible Ids с целью поиска нужного:

      for (UINT KeyType = 0; KeyType < 2 && !Success; KeyType++) {

        DWORD const KeyTypeCode = KeyType? SPDRP_COMPATIBLEIDS : SPDRP_HARDWAREID;

        PSTR Buffer = 0;
        DWORD BufferSize = 0;

        for (;;) {

          DWORD DataType;

          BOOL const Res = SetupDiGetDeviceRegistryProperty (
            DL,
            &DI,
            KeyTypeCode,
            &DataType,
            PBYTE (Buffer),
            BufferSize,
            &BufferSize
          );

          if (!Res) {

            if (GetLastError () == ERROR_INSUFFICIENT_BUFFER) {

              if (Buffer) {

                delete Buffer;
                Buffer = 0;

              }

            } else {

              break;

            }

          }
          
          if (Buffer) {

            break;

          }

          Buffer = new char [BufferSize];

          Assert (Buffer);

        } // for (;;)

        if (!Buffer) {

          continue;

        }

        for (PCSTR p = Buffer; p < Buffer + BufferSize && *p; p += strlen (p) + 1) {

          if (!strcmpi (HardwareId, p)) {

            Success = true;

            break;

          }

        } // for (p)

        delete Buffer;
        Buffer = 0;

      } // for (KeyType)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.