Конференция "Media" » Индекс звукового ус-ва под W7/8
 
  • Alex_C (02.10.14 10:30) [0]
    Столкнулся со следующей проблемой:
    есть стотонная библиотека для работы со звуковыми ус-ми. В качестве параметра туда нужно передавать индекс звукового ус-ва в системе. Индекс по имени звукового ус-ва получаю так:


    procedure GetWaveInDevices(DeviceNames: TStrings);
    var
     DNum: integer;
     i:    integer;
     Caps: TWaveInCaps;
    begin
     DNum := waveInGetNumDevs; // Number of Devices
     for i := 0 to DNum - 1 do // Query Devicenames
     begin
       waveInGetDevCaps(i, @Caps, SizeOf(TWaveInCaps));
       DeviceNames.Add(Caps.szPname);
     end;
    end;



    Все прекрасно работает и под XP, и под W7/8.
    Но как известно, под W7/8 устройства могут иметь длинные имена и в Caps они обрезаются. По этому во всех факю предлагается использовать Core Audio APIs.
    Переделал ф-ци выше так:


    procedure GetWaveOutDevices(DeviceNames: TStrings);
    var
     DNum: integer;
     i:    integer;
     Caps: TWaveOutCaps;

     pEnumerator: IMMDeviceEnumerator;
     pCollection: IMMDeviceCollection;
     pEndPoint: IMMDevice;
     hr: HRESULT;
     mask: DWORD;
     count: Cardinal;
     friendlyName: string;
     pProps: IPropertyStore;
     varName: PROPVARIANT;
    begin
     if Win32MajorVersion < 6 then
     begin
       DNum := waveOutGetNumDevs; // Number of Devices
       for i := 0 to DNum - 1 do // Query Devicenames
       begin
         waveOutGetDevCaps(i, @Caps, SizeOf(TWaveOutCaps));
         DeviceNames.Add(Caps.szPname);
       end;
     end
     else
     begin
       HR := CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER,
         IID_IMMDeviceEnumerator, pEnumerator);

       // get the endpoint collection
       mask := DEVICE_STATE_ACTIVE;
       hr := pEnumerator.EnumAudioEndpoints(eRender, mask, pCollection);

       // get the size of the collection
       count := 0;
       hr := pCollection.GetCount(count);

       for i := 0 to  (count - 1) do
       begin
           // get the endpoint
           hr := pCollection.Item(i, pEndPoint);

           // get the human readable name
           hr := pEndPoint.OpenPropertyStore(STGM_READ, pProps);
           PropVariantInit(varName);
           hr := pProps.GetValue(PKEY_Device_FriendlyName, varName);
           friendlyName := string(varName.pwszVal);
           DeviceNames.Add(friendlyName);
           PropVariantClear(@varName);
       end;
     end;
    end;



    Теперь длинные имена отображаются. а вот последовательность их не совпадает с тем что выдает waveOutGetDevCaps. Вернее на некоторых компах совпадает, на некоторых - нет. Естественно там , где не совпадает, индекс ус-ва получается не правильный и сторонняя библиотека пытается использовать не то звуковое ус-во.
    Вопрос - как получить последовательность ус-в как у waveOutGetDevCaps но с длинными именами?
 
Конференция "Media" » Индекс звукового ус-ва под W7/8
Есть новые Нет новых   [134427   +38][b:0][p:0.001]