Столкнулся со следующей проблемой:
есть стотонная библиотека для работы со звуковыми ус-ми. В качестве параметра туда нужно передавать индекс звукового ус-ва в системе. Индекс по имени звукового ус-ва получаю так:
procedure GetWaveInDevices(DeviceNames: TStrings);
var
DNum: integer;
i: integer;
Caps: TWaveInCaps;
begin
DNum := waveInGetNumDevs;
for i := 0 to DNum - 1 do
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;
for i := 0 to DNum - 1 do
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);
mask := DEVICE_STATE_ACTIVE;
hr := pEnumerator.EnumAudioEndpoints(eRender, mask, pCollection);
count := 0;
hr := pCollection.GetCount(count);
for i := 0 to (count - 1) do
begin
hr := pCollection.Item(i, pEndPoint);
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 но с длинными именами?