//WinQLMediaSession.cpp

// Copyright Querysoft Limited 2013, 2015
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
// 
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

#include "WinQL/CodeServices/WinQLPolicy.h"
#include "WinQL/Application/Threading/WinQLCriticalSection.h"
#include "WinQL/MediaFoundation/MediaSession.h"
#include "WinQAPI/MedFoundAPI.h"

//--------------------------------------------------------------------------------
namespace nsWin32
{
	//--------------------------------------------------------------------------------
	namespace nsMediaFoundation
	{		

		__QOR_IMPLEMENT_OCLASS_LUID( CMediaSession );

		//--------------------------------------------------------------------------------
		CMediaSession::CMediaSession( IMFAttributes* pConfiguration ) : m_MFLibrary( *( new nsWinQAPI::CMF ) )
		{
			_WINQ_FCONTEXT( "CMediaSession::CMediaSession" );
			m_pActivate = 0;
			m_ulStatus = MediaFoundationHelper.MFCreateMediaSession(
				reinterpret_cast< ::IMFAttributes* >( pConfiguration ),
				reinterpret_cast< ::IMFMediaSession** >( &m_p ) );
		}

		//--------------------------------------------------------------------------------
		//Creates an instance of the Media Session inside a Protected Media Path (PMP) process. 
		CMediaSession::CMediaSession( unsigned long dwCreationFlags, IMFAttributes* pConfiguration ) : m_MFLibrary( *( new nsWinQAPI::CMF ) )
		{
			_WINQ_FCONTEXT( "CMediaSession::CMediaSession" );
			m_pActivate = 0;
			m_ulStatus = m_MFLibrary.MFCreatePMPMediaSession( dwCreationFlags, 
				reinterpret_cast< ::IMFAttributes* >( pConfiguration ),
				reinterpret_cast< ::IMFMediaSession** >( &m_p ),
				reinterpret_cast< ::IMFActivate** >( &m_pActivate ) );
		}

		//--------------------------------------------------------------------------------
		CMediaSession::~CMediaSession()
		{
			_WINQ_FCONTEXT( "CMediaSession::~CMediaSession" );
			if( m_pActivate )
			{
				m_pActivate->Release();
				m_pActivate = 0;
			}

			m_ulStatus = m_p->Shutdown();
			delete &m_MFLibrary;
		}

	}//nsMediaFoundation

}//nsWin32
