//Source Resolver Callback private CarenResult CallbackCreateMediaSource_OnInvoke(ICarenMFAsyncResult Param_AsyncResult) { //Variavel que vai ser retornada. CarenResult Resultado = ResultCode.SS_OK; //Variaveis utilizadas. CA_MF_OBJECT_TYPE OutTypeObject = CA_MF_OBJECT_TYPE.MF_OBJECT_INVALID; //Conclui a operação assincrona. Resultado = myMediaSession.ResolvedorMidia.EndCreateObjectFromURL(Param_AsyncResult, out OutTypeObject, myMediaSession.SourceMidia = new CarenMFMediaSource()); //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 concluir a operação assincrona de criação da mídia!", true); //Sai do método. goto Done; } //Cria o Presentation Source. Resultado = myMediaSession.SourceMidia.CreatePresentationDescriptor(out myMediaSession.DescritorMidia); //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 criar o descritor de apresetação para a mídia carregada!", true); //Sai do método. goto Done; } //Obtém a quantidade de stream no media source. Resultado = myMediaSession.DescritorMidia.GetStreamDescriptorCount(out myMediaSession.TotalStreamMediaSource); //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 obter a quantidade de fluxos na mídia carregada!", true); //Sai do método. goto Done; } //Chama o método para criar e configurar a topologia ConfigurarTopologia(); //Define a topologia na Sessao da mídia. Resultado = myMediaSession.MediaSession.SetTopology(CA_MFSESSION_SETTOPOLOGY_FLAGS.Zero, myMediaSession.Topologia); //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 definir a topologia na sessao de mídia!", true); //Sai do método. goto Done; } //Obtém o tempo total da mídia. myMediaSession.TotalTimeMidiaNs = ObterTempoTotalMidia(); myMediaSession.TotalTimeMidiaSegundos = myMediaSession.TotalTimeMidiaNs / REFTIME_1_SEGUNDO; Done :; //Retorna o resultado. return(Resultado); }
//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); }