Inscription d’un DMO

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Pour que les clients utilisent votre DMO, le CLSID doit être inscrit sur le système de l’utilisateur. Cela s’effectue via la fonction DllRegisterServer de la DLL. Si vous utilisez la bibliothèque active de modèles (ATL), l’Assistant ATL génère automatiquement cette fonction.

Vous pouvez également inscrire votre DMO sous une ou plusieurs catégories DMO standard. Cela permet aux clients de découvrir votre DMO à l’aide de la fonction DMOEnum . Les catégories sont définies par GUID et sont répertoriées dans la section GUID DMO.

L’inscription d’un DMO sous une catégorie est facultative. Pour ce faire, appelez la fonction DMORegister et spécifiez le nom convivial du DMO, le CLSID et la catégorie. Si vous le souhaitez, vous pouvez également inscrire un ensemble de types de supports pris en charge par vos DMO. Pour plus d’informations, consultez Types de médias DMO.

L’exemple suivant montre comment inscrire un DMO d’effet audio qui prend en charge l’entrée et la sortie audio PCM. Dans ce cas, les types d’entrée et de sortie sont identiques.

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);
}

Cet exemple suppose qu’ATL a été utilisé pour créer le projet ; la dernière ligne de la fonction appelle la méthode ATL standard pour inscrire le serveur COM. Si vous n’utilisez pas ATL, votre fonction sera différente.

Annulation de l’inscription d’un DMO

Votre fonction DllUnregisterServer doit supprimer toutes les entrées de Registre créées par la fonction DllRegisterServer . Si vous appelez DMORegister lorsque vous inscrivez le DMO, vous devez DMOUnregister avec la même catégorie lorsque vous désinscrivez le DMO.

L’exemple suivant supprime les entrées de Registre créées dans l’exemple précédent :

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

DirectShow Merit Values

Pour créer des graphiques de filtre, DirectShow affecte une valeur de mérite par défaut aux DMO. Vous pouvez remplacer cette valeur en ajoutant une entrée de Registre à la clé de Registre de DMO dans HKEY_CLASSES_ROOT\CLSID. Incluez une valeur DWORD nommée Merit dont la valeur spécifie le mérite.

Écriture d’un DMO