예제 #1
0
        //Media Session Callback

        private CarenResult CallbackMediaSession_OnInvoke(ICarenMFAsyncResult Param_AsyncResult)
        {
            //Variavel que vai ser retornada.
            CarenResult Resultado = ResultCode.SS_OK;

            //Variaveis utilizadas.
            ICarenMFMediaEvent OutEvent     = null;
            CA_MediaEventType  OutEventType = CA_MediaEventType.MEUnknown;

            //Obtém o evento gerado.
            Resultado = myMediaSession.MediaSession.EndGetEvent(Param_AsyncResult, out OutEvent);

            //Verifica se não houve erro
            if (Resultado.StatusCode != ResultCode.SS_OK)
            {
                //Falhou ao realizar a operação.

                //Chama uma mensagem de erro.
                ShowMensagem("Ocorreu uma falha ao tentar obter o evento da media session!", true);

                //Sai do método.
                goto Done;
            }

            //Obtém o tipo do evento.
            Resultado = OutEvent.GetType(out OutEventType);

            //Verifica se não houve erro
            if (Resultado.StatusCode != ResultCode.SS_OK)
            {
                //Falhou ao realizar a operação.

                //Chama uma mensagem de erro.
                ShowMensagem("Ocorreu uma falha ao tentar obter o tipo do evento da media session!", true);

                //Sai do método.
                goto Done;
            }

            //Chama o método para processar o evento
            ProcessarEventoMediaSession(OutEventType, ref OutEvent);

            //Verifica se a media session não foi fechada antes de requisitar o proximo evento.
            if (StatusPlayback != StatusRendering.Closed)
            {
                //Chama o proximo evento na lista.
                Resultado = myMediaSession.MediaSession.BeginGetEvent(myMediaSession.CallbackMediaSession, null);

                //Verifica se não houve erro
                if (Resultado.StatusCode != ResultCode.SS_OK)
                {
                    //Falhou ao realizar a operação.

                    //Chama uma mensagem de erro.
                    ShowMensagem("Ocorreu uma falha ao tentar solicitar o proximo evento assincrona da Media Session!", true);

                    //Sai do método.
                    goto Done;
                }
            }

            Done :;
            //Libera o ponteiro para o evento.
            SafeReleaseInterface(OutEvent);

            //Retorna o resultado.
            return(Resultado);
        }
예제 #2
0
        private void ProcessarEventoMediaSession(CA_MediaEventType Param_EventType, ref ICarenMFMediaEvent Param_Event)
        {
            //Variaveis
            CarenResult Resultado = new CarenResult(ResultCode.ER_FAIL, false);

            //Verifica o tipo do evento.
            switch (Param_EventType)
            {
            case CA_MediaEventType.MEUnknown:
                break;

            case CA_MediaEventType.MEError:
                break;

            case CA_MediaEventType.MEExtendedType:
                break;

            case CA_MediaEventType.MENonFatalError:
                break;

            case CA_MediaEventType.MESessionUnknown:
                break;

            case CA_MediaEventType.MESessionTopologySet:
                break;

            case CA_MediaEventType.MESessionTopologiesCleared:
                break;

            case CA_MediaEventType.MESessionStarted:
                //Define que está renderizando.
                StatusPlayback = StatusRendering.Rendering;
                break;

            case CA_MediaEventType.MESessionPaused:
                //Define que está pausado.
                StatusPlayback = StatusRendering.Paused;
                break;

            case CA_MediaEventType.MESessionStopped:
                //Define que a sessão de mídia foi parada.
                StatusPlayback = StatusRendering.Stoped;

                //Chama o método para fechar a Media Session.
                Resultado = myMediaSession.MediaSession.Close();

                //Verifica se não houve erro
                if (Resultado.StatusCode != ResultCode.SS_OK)
                {
                    //Falhou ao realizar a operação.

                    //Chama uma mensagem de erro.
                    ShowMensagem("Ocorreu uma falha ao tentar fechar a Media Session.", true);
                }
                break;

            case CA_MediaEventType.MESessionClosed:
                //Define que a media session foi fechada.
                StatusPlayback = StatusRendering.Closed;

                //Chama o método para concluir a liberação de todas as interfaces.
                LiberarInterfaces();
                break;

            case CA_MediaEventType.MESessionEnded:
                break;

            case CA_MediaEventType.MESessionRateChanged:
                break;

            case CA_MediaEventType.MESessionScrubSampleComplete:
                break;

            case CA_MediaEventType.MESessionCapabilitiesChanged:
                break;

            case CA_MediaEventType.MESessionTopologyStatus:
            {
                //Variaveis utilizadas.
                CA_MF_TOPOSTATUS OutStatusTopology = CA_MF_TOPOSTATUS.MF_TOPOSTATUS_INVALID;

                //Obtém o atributo que indica o status da topologia no evento.
                Resultado = Param_Event.GetUINT32(GUIDs_MFAttributes_Events.MF_EVENT_TOPOLOGY_STATUS, out uint OutStatus);

                //Verifica se obteve sucesso na operação.
                if (Resultado.StatusCode != ResultCode.SS_OK)
                {
                    goto Done;
                }

                //Converte o status
                OutStatusTopology = (CA_MF_TOPOSTATUS)OutStatus;

                //Verifica o status da topologia.
                switch (OutStatusTopology)
                {
                case CA_MF_TOPOSTATUS.MF_TOPOSTATUS_INVALID:
                    //Topologia em estado invalido.
                    break;

                case CA_MF_TOPOSTATUS.MF_TOPOSTATUS_READY:
                    //A topologia está pronta.

                    //Chama o método para recuperar as interfaces de serviços que seram utilizadas.
                    ObterInterfacesControle();

                    //Chama o método para iniciar a reprodução.
                    Resultado = myMediaSession.MediaSession.Start(null, new CA_PROPVARIANT()
                        {
                            vt = CA_VARTYPE.VT_EMPTY
                        });

                    //Verifica se obteve sucesso.
                    if (Resultado.StatusCode != ResultCode.SS_OK)
                    {
                        //Ocorreu uma falha ao tentar iniciar a reprodução da midia.

                        //Chama uma mensagem de erro.
                        ShowMensagem("Ocorreu uma falha ao tentar iniciar a reprodução da mídia!", true);

                        //Sai do método
                        goto Done;
                    }

                    break;

                case CA_MF_TOPOSTATUS.MF_TOPOSTATUS_STARTED_SOURCE:
                    //A topologia começou a ler os dados.
                    break;

                case CA_MF_TOPOSTATUS.MF_TOPOSTATUS_DYNAMIC_CHANGED:
                    break;

                case CA_MF_TOPOSTATUS.MF_TOPOSTATUS_SINK_SWITCHED:
                    break;

                case CA_MF_TOPOSTATUS.MF_TOPOSTATUS_ENDED:
                    //A topologia chegou ao fim.
                    break;

                default:
                    break;
                }
            }
            break;

            case CA_MediaEventType.MESessionNotifyPresentationTime:
                break;

            case CA_MediaEventType.MESessionStreamSinkFormatChanged:
                break;

            case CA_MediaEventType.MENewPresentation:
                break;

            default:
                break;
            }

            Done :;

            //Informa o evento gerado.
            Debug.WriteLine("Evento gerado: " + Param_EventType.ToString());
        }