Registrando um DMO

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Para que os clientes usem seu DMO, o CLSID deve ser registrado no sistema do usuário. Isso é feito por meio da função DllRegisterServer da DLL . Se você estiver usando a ATL (Biblioteca de Modelos Ativos), o assistente da ATL gerará automaticamente essa função.

Você também pode registrar seu DMO em uma ou mais categorias de DMO padrão. Isso permite que os clientes descubram seu DMO usando a função DMOEnum . As categorias são definidas pelo GUID e são listadas na seção GUIDs de DMO.

Registrar um DMO em uma categoria é opcional. Para fazer isso, chame a função DMORegister e especifique o nome amigável do DMO, do CLSID e da categoria. Opcionalmente, você também pode registrar um conjunto de tipos de mídia aos quais seus DMOs dão suporte. Para obter mais informações, consulte Tipos de mídia DMO.

O exemplo a seguir mostra como registrar um efeito de áudio DMO que dá suporte à entrada e saída de áudio PCM. Nesse caso, os tipos de entrada e os tipos de saída são os mesmos.

STDAPI DllRegisterServer(void)
{
    // Register the DMO as a PCM audio effect DMO
    DMO_PARTIAL_MEDIATYPE mt;
    mt.type    = MEDIATYPE_Audio;
    mt.subtype = MEDIASUBTYPE_PCM;
    HRESULT hr = DMORegister(
        L"MyDMO",                  // Friendly name
        CLSID_MyDMO,               // CLSID
        DMOCATEGORY_AUDIO_EFFECT,  // Category
        0,                         // Flags 
        1,                         // Number of input types
        &mt,                       // Array of input types
        1,                         // Number of output types
        &mt);                      // Array of output types

    if (FAILED(hr)) return hr;

    // Registers the object, with no typelib.
    return _Module.RegisterServer(FALSE);
}

Este exemplo pressupõe que a ATL foi usada para criar o projeto; a última linha da função chama o método ATL padrão para registrar o servidor COM. Se você não estiver usando a ATL, sua função terá uma aparência diferente.

Cancelar o registro de um DMO

Sua função DllUnregisterServer deve remover todas as entradas do Registro criadas pela função DllRegisterServer . Se você chamar DMORegister ao registrar o DMO, deverá DMOUnregister com a mesma categoria ao cancelar o registro do DMO.

O exemplo a seguir remove as entradas do Registro criadas no exemplo anterior:

STDAPI DllUnregisterServer(void)
{
    DMOUnregister(CLSID_MyDMO, DMOCATEGORY_AUDIO_EFFECT);
    return _Module.UnregisterServer(TRUE);
}

Valores de mérito do DirectShow

Para fins de criação de grafos de filtro, o DirectShow atribui um valor de mérito padrão aos DMOs. Você pode substituir esse valor adicionando uma entrada do Registro à chave do Registro do DMO em HKEY_CLASSES_ROOT\CLSID. Inclua um valor DWORD chamado Merit cujo valor especifica o mérito.

Escrevendo um DMO