Как однозначно определить фильтры визуализации DirectShow? - PullRequest
3 голосов
/ 01 июля 2011

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

1 Ответ

4 голосов
/ 04 июля 2011

Фильтры рендеринга, обертывающие устройства WaveOut, могут быть идентифицированы WaveOutId. Обертывающие устройства DirectSound могут быть идентифицированы с помощью DSGuid.

ICreateDevEnum* devices;
if (CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (LPVOID*)&devices) == S_OK)
{
    IEnumMoniker* enumerator;
    if (devices->CreateClassEnumerator(CLSID_AudioRendererCategory, &enumerator, 0) == S_OK)
    {
        IMoniker* moniker;
        while (enumerator->Next(1, &moniker, NULL) == S_OK)
        {
            IPropertyBag* properties;
            if (moniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void**)&properties) == S_OK)
            {
                VARIANT variant;
                VariantInit(&variant);
                if (properties->Read(L"WaveOutId", &variant, NULL) == S_OK)
                {
                    // variant.lVal now contains the id of the wrapped WaveOut device.
                }
                else if (properties->Read(L"DSGuid", &variant, NULL) == S_OK)
                {
                    // variant.bstrVal now contains an uppercase GUID.
                    // It's the same GUID you would get from DirectSoundEnumerate.
                }
                VariantClear(&variant);
                properties->Release();
            }
            moniker->Release();
        }
        enumerator->Release();
    }
    devices->Release();
}
...