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