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

Cette rubrique est l’étape 7 du didacticiel Comment lire des fichiers multimédias avec Media Foundation. Le code complet est présenté dans la rubrique 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 . Cet événement est garanti comme étant le dernier événement de la session multimédia.
  3. Appelez IMFMediaSession :: Shutdown. Cette méthode amène les sessions multimédia à libérer des ressources.
  4. Appelez IMFMediaSource :: Shutdown sur la source du média en cours.

La méthode suivante arrête la session multimédia. Elle utilise un descripteur 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 de quitter 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

Comment lire des fichiers multimédias avec Media Foundation