Pergunta

Estou usando o Direct Show para reproduzir arquivos de mídia no meu programa e pude reproduzir um arquivo de mídia uma única vez usando o código a seguir.

void main()
{
    IGraphBuilder *pGraph = NULL;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;
    HRESULT hr = CoInitialize(NULL);

    if (FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
    }

    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);

    if (FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
    }

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
    hr = pGraph->RenderFile(L"C:\\Example.mp3", NULL);

    if (SUCCEEDED(hr))
    {
        hr = pControl->Run();

        if (SUCCEEDED(hr))
        {
            long evCode;
            pEvent->WaitForCompletion(INFINITE, &evCode);
        }
    }

    pControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize();
    return;
}

Minha pergunta se torna como eu faria o arquivo continuar a jogar e repetir um determinado número de vezes, ou infinitamente se eu desejasse. O imediacontrol não tem nenhum membro chamado Loop.

Foi útil?

Solução

Não há como fazer isso para fazer isso. Uma vez que a maneira de implementar isso é que, em vez de sair, você funciona quando você obtém o evento de conclusão, busca o início do arquivo e a reprodução de início novamente. O link a seguir sobre o manuseio de eventos pode ajudar: Aprendendo quando um evento ocorre. EC_COMPLETE Evento/notificação é emitido quando o streaming estiver concluído.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top