<metro>PlayToReceiver

       PlayToReceiver例子演示了如何创建一个软件发挥接收机。

                                                 图1

      如图2所示,单击“start Receiver”键后,这程序就开始接收广告形式数据流。

    

                                                 图2

      如图3单击“stop Receiver”键后,这程序就停止接收。通过这样一个软件接收程序,可以以流媒体的形式,从不同电脑将资源转移到自己的电脑。就如同互联网上随时冒出的广告。这个程序只会接收不同计算机的音频/视频和图片。

     

    

                                                图3

      它的工作原理是,当点击“start receiver”键时,就将startPlayToReceiver方法运行,随着开始初始化InitialisePlayToReceiver,接着把各种事件,通过多线程异步的手段来激活。最后是否执行某事件,由Dispatcher调度员以权能高低决定。在刚刚激活的事件中有接收器播放请求/暂停/停止/时间更新等各样请求异步事件。异步事件程序虽被激活,但要等待条件,即调度员依权值决定是否运行。

receiver_PlayRequested
receiver_PauseRequested
receiver_StopRequested
receiver_TimeUpdateRequested
receiver_CurrentTimeChangeRequested
receiver_SourceChangeRequested
receiver_MuteChangeRequested
receiver_PlaybackRateChangeRequested
receiver_VolumeChangeRequested

      与此同时,它数字媒体接收器的各种音频视频各样方法会自行启动,等待接收。 一点击开始就立即运行的是数字媒体接收器的各种功能方法,例如音量变化/比率变化/媒体打开等。也可以由stopPlayToReceiver方法关闭。

dmrVideo_VolumeChanged
dmrVideo_RateChanged
dmrVideo_MediaOpened
dmrVideo_CurrentStateChanged
dmrVideo_MediaEnded
dmrVideo_MediaFailed
dmrVideo_SeekCompleted
dmrVideo_DownloadProgressChanged_1
dmrImage_ImageFailed_1

      简单举例说明一下:激活startPlayToReceiver()方法后,它会唤醒里面的InitialisePlayToReceiver()方法,紧随会启动PlayRequested播放请求方法。

InitialisePlayToReceiver();    =>
receiver.PlayRequested += new TypedEventHandler<PlayToReceiver, object>
(receiver_PlayRequested);   =>
 private async void receiver_PlayRequested(PlayToReceiver recv, Object args)
        {
            await Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
            {
                if (dmrVideo != null && currentType == MediaType.AudioVideo)
                {
                    IsPlayReceivedPreMediaLoaded = true;
                    dmrVideo.Play();
                }
                else if (currentType == MediaType.Image)
                {
                    dmrImage.Source = imagerevd;
                    receiver.NotifyPlaying();
                }
            });
        }

      同理,startPlayToReceiver()方法会给IsReceiverStarted的值赋为true。就唤醒数媒接收器的声音变化方法。

IsReceiverStarted = true;       =>
private void dmrVideo_VolumeChanged(object sender,RoutedEventArgs e)
 {
        if (IsReceiverStarted)
        {
             receiver.NotifyVolumeChange(dmrVideo.Volume,dmrVideo.IsMuted);
         }
  }
原文地址:https://www.cnblogs.com/virgil/p/2665529.html