예제 #1
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());
        }