Step 7: Shut Down the Media Session
This topic is step 7 of the tutorial How to Play Media Files with Media Foundation. The complete code is shown in the topic Media Session Playback Example.
To shut down the Media Session, perform the following steps:
- Call IMFMediaSession::Close to close the current presentation.
- Wait for the MESessionClosed event. This event is guaranteed to be the last event from the Media Session.
- Call IMFMediaSession::Shutdown. This method causes the Media Sessions to release resources.
- Call IMFMediaSource::Shutdown on the current media source.
The following method shuts down the Media Session. It uses an event handle (m_hCloseEvent) to wait for the MESessionClosed event. See Step 5: Handle Media Session Events.
// 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;
}
Before the application exits, shut down the Media Session, and then call MFShutdown to shut down the Microsoft Media Foundation platform.
// 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;
}
Related topics