Étape 7 : Arrêter la session multimédia

Cette rubrique est l’étape 7 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 arrêter la session multimédia, procédez comme suit :

  1. Appelez IMFMediaSession::Close pour fermer la présentation actuelle.
  2. Attendez l’événement MESessionClosed . Il est garanti que cet événement sera le dernier événement de la session multimédia.
  3. Appelez IMFMediaSession::Shutdown. Cette méthode entraîne la libération des ressources par les sessions multimédias.
  4. Appelez IMFMediaSource::Shutdown sur la source multimédia actuelle.

La méthode suivante arrête la session multimédia. Il utilise un handle d’événement (m_hCloseEvent) pour attendre l’événement MESessionClosed . Consultez Étape 5 : Gérer les événements de session multimédia.

//  Close the media session. 
HRESULT CPlayer::CloseSession()
{
    //  The IMFMediaSession::Close method is asynchronous, but the 
    //  CPlayer::CloseSession method waits on the MESessionClosed event.
    //  
    //  MESessionClosed is guaranteed to be the last event that the 
    //  media session fires.

    HRESULT hr = S_OK;

    SafeRelease(&m_pVideoDisplay);

    // First close the media session.
    if (m_pSession)
    {
        DWORD dwWaitResult = 0;

        m_state = Closing;
           
        hr = m_pSession->Close();
        // Wait for the close operation to complete
        if (SUCCEEDED(hr))
        {
            dwWaitResult = WaitForSingleObject(m_hCloseEvent, 5000);
            if (dwWaitResult == WAIT_TIMEOUT)
            {
                assert(FALSE);
            }
            // Now there will be no more events from this session.
        }
    }

    // Complete shutdown operations.
    if (SUCCEEDED(hr))
    {
        // Shut down the media source. (Synchronous operation, no events.)
        if (m_pSource)
        {
            (void)m_pSource->Shutdown();
        }
        // Shut down the media session. (Synchronous operation, no events.)
        if (m_pSession)
        {
            (void)m_pSession->Shutdown();
        }
    }

    SafeRelease(&m_pSource);
    SafeRelease(&m_pSession);
    m_state = Closed;
    return hr;
}

Avant la fermeture de l’application, arrêtez la session multimédia, puis appelez MFShutdown pour arrêter la plateforme Microsoft Media Foundation.

//  Release all resources held by this object.
HRESULT CPlayer::Shutdown()
{
    // Close the session
    HRESULT hr = CloseSession();

    // Shutdown the Media Foundation platform
    MFShutdown();

    if (m_hCloseEvent)
    {
        CloseHandle(m_hCloseEvent);
        m_hCloseEvent = NULL;
    }

    return hr;
}

Lecture audio/vidéo

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