手順 2: CPlayer オブジェクトを作成する
このトピックは、 Media Foundation を使用してメディア ファイルを再生する方法に関するチュートリアルの手順 2 です。 完全なコードは、「 メディア セッション再生の例」のトピックに示されています。
クラスの CPlayer
インスタンスを作成するために、アプリケーションは静的 CPlayer::CreateInstance
メソッドを呼び出します。 このメソッドは、次のパラメーターを受け取ります。
- hVideo は 、ビデオを表示するウィンドウを指定します。
- hEvent は 、イベントを受信するウィンドウを指定します。 両方のウィンドウ ハンドルに同じハンドルを渡すことが有効です。
-
ppPlayer は 、新しい
CPlayer
インスタンスへのポインターを受け取ります。
CreateInstance
メソッドのコードを次に示します。
// Static class method to create the CPlayer object.
HRESULT CPlayer::CreateInstance(
HWND hVideo, // Video window.
HWND hEvent, // Window to receive notifications.
CPlayer **ppPlayer) // Receives a pointer to the CPlayer object.
{
if (ppPlayer == NULL)
{
return E_POINTER;
}
CPlayer *pPlayer = new (std::nothrow) CPlayer(hVideo, hEvent);
if (pPlayer == NULL)
{
return E_OUTOFMEMORY;
}
HRESULT hr = pPlayer->Initialize();
if (SUCCEEDED(hr))
{
*ppPlayer = pPlayer;
}
else
{
pPlayer->Release();
}
return hr;
}
HRESULT CPlayer::Initialize()
{
// Start up Media Foundation platform.
HRESULT hr = MFStartup(MF_VERSION);
if (SUCCEEDED(hr))
{
m_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (m_hCloseEvent == NULL)
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
}
return hr;
}
次のコードは、コンストラクターを CPlayer
示しています。
CPlayer::CPlayer(HWND hVideo, HWND hEvent) :
m_pSession(NULL),
m_pSource(NULL),
m_pVideoDisplay(NULL),
m_hwndVideo(hVideo),
m_hwndEvent(hEvent),
m_state(Closed),
m_hCloseEvent(NULL),
m_nRefCount(1)
{
}
コンストラクターは次の処理を行います。
- MFStartup を呼び出して Media Foundation プラットフォームを初期化します。
- 自動リセット イベントを作成します。 このイベントは、メディア セッションを閉じるときに使用されます。 「手順 7: メディア セッションをシャットダウンする」を参照してください。
「手順 7: メディア セッションをシャットダウンする」の説明に従って、デストラクター によってメディア セッションがシャットダウンされます。
CPlayer::~CPlayer()
{
assert(m_pSession == NULL);
// If FALSE, the app did not call Shutdown().
// When CPlayer calls IMediaEventGenerator::BeginGetEvent on the
// media session, it causes the media session to hold a reference
// count on the CPlayer.
// This creates a circular reference count between CPlayer and the
// media session. Calling Shutdown breaks the circular reference
// count.
// If CreateInstance fails, the application will not call
// Shutdown. To handle that case, call Shutdown in the destructor.
Shutdown();
}
コンストラクターとデストラクターはどちらも保護されたクラス メソッドであることに注意してください。 アプリケーションは、静的 CreateInstance
メソッドを使用して オブジェクトを作成します。
明示的に delete を使用するのではなく、IUnknown::Release を呼び出してオブジェクトを破棄します。
関連トピック