Compartir a través de


Paso 7: Apagar la sesión multimedia

Este tema es el paso 7 del tutorial Cómo reproducir archivos multimedia con Media Foundation. El código completo se muestra en el tema Ejemplo de reproducción de sesión multimedia.

Para apagar la sesión multimedia, realice los pasos siguientes:

  1. Llame a IMFMediaSession::Close para cerrar la presentación actual.
  2. Espere al evento MESessionClosed . Este evento se garantiza que es el último evento de la sesión multimedia.
  3. Llame a IMFMediaSession::Shutdown. Este método hace que las sesiones multimedia liberen recursos.
  4. Llame a IMFMediaSource::Shutdown en el origen multimedia actual.

El método siguiente cierra la sesión multimedia. Usa un identificador de eventos (m_hCloseEvent) para esperar al evento MESessionClosed . Consulte Paso 5: Controlar eventos de sesión multimedia.

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

Antes de que se cierre la aplicación, apague la sesión multimedia y, a continuación, llame a MFShutdown para apagar la plataforma de 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;
}

Reproducción de audio y vídeo

Cómo reproducir archivos multimedia con Media Foundation