Étape 2 : Créer l’objet CPlayer

Cette rubrique est l’étape 2 du didacticiel Guide pratique pour lire des fichiers multimédias avec Media Foundation. Le code complet est présenté dans la rubrique Media Session Playback Example( Exemple de lecture de session multimédia).

Pour créer un instance de la CPlayer classe, l’application appelle la méthode statiqueCPlayer::CreateInstance. Cette méthode prend les paramètres suivants :

  • hVideo spécifie la fenêtre pour afficher la vidéo.
  • hEvent spécifie une fenêtre pour recevoir des événements. Il est valide de passer le même handle pour les deux poignées de fenêtre.
  • ppPlayer reçoit un pointeur vers un nouveau CPlayer instance.

Le code suivant montre la méthode CreateInstance :

//  Static class method to create the CPlayer object.

HRESULT CPlayer::CreateInstance(
    HWND hVideo,                  // Video window.
    HWND hEvent,                  // Window to receive notifications.
    CPlayer **ppPlayer)           // Receives a pointer to the CPlayer object.
{
    if (ppPlayer == NULL)
    {
        return E_POINTER;
    }

    CPlayer *pPlayer = new (std::nothrow) CPlayer(hVideo, hEvent);
    if (pPlayer == NULL)
    {
        return E_OUTOFMEMORY;
    }

    HRESULT hr = pPlayer->Initialize();
    if (SUCCEEDED(hr))
    {
        *ppPlayer = pPlayer;
    }
    else
    {
        pPlayer->Release();
    }
    return hr;
}

HRESULT CPlayer::Initialize()
{
    // Start up Media Foundation platform.
    HRESULT hr = MFStartup(MF_VERSION);
    if (SUCCEEDED(hr))
    {
        m_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (m_hCloseEvent == NULL)
        {
            hr = HRESULT_FROM_WIN32(GetLastError());
        }
    }
    return hr;
}

Le code suivant montre le CPlayer constructeur :

CPlayer::CPlayer(HWND hVideo, HWND hEvent) : 
    m_pSession(NULL),
    m_pSource(NULL),
    m_pVideoDisplay(NULL),
    m_hwndVideo(hVideo),
    m_hwndEvent(hEvent),
    m_state(Closed),
    m_hCloseEvent(NULL),
    m_nRefCount(1)
{
}

Le constructeur effectue les opérations suivantes :

  1. Appelle MFStartup pour initialiser la plateforme Media Foundation.
  2. Crée un événement de réinitialisation automatique. Cet événement est utilisé lors de la fermeture de la session multimédia ; consultez Étape 7 : Arrêter la session multimédia.

Le destructeur arrête la session multimédia, comme décrit dans Étape 7 : Arrêter la session multimédia.

CPlayer::~CPlayer()
{
    assert(m_pSession == NULL);  
    // If FALSE, the app did not call Shutdown().

    // When CPlayer calls IMediaEventGenerator::BeginGetEvent on the
    // media session, it causes the media session to hold a reference 
    // count on the CPlayer. 
    
    // This creates a circular reference count between CPlayer and the 
    // media session. Calling Shutdown breaks the circular reference 
    // count.

    // If CreateInstance fails, the application will not call 
    // Shutdown. To handle that case, call Shutdown in the destructor. 

    Shutdown();
}

Notez que le constructeur et le destructeur sont tous deux des méthodes de classe protégées. L’application crée l’objet à l’aide de la méthode statique CreateInstance . Il détruit l’objet en appelant IUnknown::Release, plutôt que d’utiliser explicitement delete.

Suivant : Étape 3 : Ouvrir un fichier multimédia

Lecture audio/vidéo

Guide pratique pour lire des fichiers multimédias avec Media Foundation