Etapa 2: Criar o objeto CPlayer

Este tópico é a etapa 2 do tutorial Como reproduzir arquivos de mídia com o Media Foundation. O código completo é mostrado no tópico Exemplo de Reprodução de Sessão de Mídia.

Para criar uma instância da CPlayer classe , o aplicativo chama o método estático CPlayer::CreateInstance . Esse método usa os seguintes parâmetros:

  • hVideo especifica a janela para exibir o vídeo.
  • hEvent especifica uma janela para receber eventos. É válido passar o mesmo identificador para ambos os identificadores de janela.
  • ppPlayer recebe um ponteiro para uma nova CPlayer instância.

O código a seguir mostra o método 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;
}

O código a seguir mostra o CPlayer construtor:

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)
{
}

O construtor faz o seguinte:

  1. Chama MFStartup para inicializar a plataforma do Media Foundation.
  2. Cria um evento de redefinição automática. Esse evento é usado ao fechar a Sessão de Mídia; consulte Etapa 7: Desligar a sessão de mídia.

O destruidor desliga a Sessão de Mídia, conforme descrito na Etapa 7: Desligar a Sessão de Mídia.

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();
}

Observe que o construtor e o destruidor são métodos de classe protegidos. O aplicativo cria o objeto usando o método estático CreateInstance . Ele destrói o objeto chamando IUnknown::Release, em vez de usar explicitamente delete.

Próximo: Etapa 3: Abrir um arquivo de mídia

Reprodução de áudio/vídeo

Como reproduzir arquivos de mídia com o Media Foundation