Schritt 7: Herunterfahren der Mediensitzung

Dieses Thema ist Schritt 7 des Tutorials Wiedergeben von Mediendateien mit Media Foundation. Der vollständige Code wird im Thema Media Session Playback Example (Beispiel für die Mediensitzungswiedergabe) angezeigt.

Führen Sie zum Herunterfahren der Mediensitzung die folgenden Schritte aus:

  1. Rufen Sie IMFMediaSession::Close auf, um die aktuelle Präsentation zu schließen.
  2. Warten Sie auf das MESessionClosed-Ereignis . Dieses Ereignis ist garantiert das letzte Ereignis aus der Mediensitzung.
  3. Rufen Sie IMFMediaSession::Shutdown auf. Diese Methode bewirkt, dass die Mediensitzungen Ressourcen freigeben.
  4. Rufen Sie IMFMediaSource::Shutdown für die aktuelle Medienquelle auf.

Die folgende Methode beendet die Mediensitzung. Es verwendet ein Ereignishandle (m_hCloseEvent), um auf das MESessionClosed-Ereignis zu warten. Weitere Informationen finden Sie unter Schritt 5: Behandeln von Mediensitzungsereignissen.

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

Bevor die Anwendung beendet wird, schließen Sie die Mediensitzung, und rufen Sie dann MFShutdown auf, um die Microsoft Media Foundation-Plattform herunterzufahren.

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

Audio-/Videowiedergabe

Wiedergeben von Mediendateien mit Media Foundation