private void MonitorPlugins()
 {
     lock (_registeredPlugins)
     {
         if (MaxAllowedBitrate == 0)
         {
             MaxAllowedBitrate = AvailableBitrates.DefaultIfEmpty().Min();
         }
         else if (IsReadyForBitrateIncrease)
         {
             Debug.WriteLine("Ready For Bitrate Increase");
             MaxAllowedBitrate = NextBitrate;
         }
         else if (IsProblematic)
         {
             Debug.WriteLine("Problematic Plugins Found");
             var record = new ProblematicTransitionRecord
             {
                 Bitrate = MaxAllowedBitrate,
                 Time    = DateTime.Now
             };
             _problematicTransitions.Add(record);
             MaxAllowedBitrate = ActiveDownloadBitrates.DefaultIfEmpty()
                                 .Min();
         }
         else
         {
             Debug.WriteLine("Stable");
             _registeredPlugins.ForEach(i => i.BufferingTime = _stableBufferSize);
         }
     }
 }
예제 #2
0
        private void OnAvailableBitratesChanged()
        {
            var minBitrate = AvailableBitrates.Any()
                                 ? AvailableBitrates.Min()
                                 : 0;

            var maxBitrate = AvailableBitrates.Any()
                                 ? AvailableBitrates.Max()
                                 : 0;

            if (_nowDownloadingSlider != null)
            {
                _nowDownloadingSlider.Minimum = 0;
                _nowDownloadingSlider.Maximum = maxBitrate / 1000.0;
                _nowDownloadingSlider.Value   = 0;
            }

            if (_limitMaxBitrateSlider != null)
            {
                // Update the bitrate limiter slider
                _limitMaxBitrateSlider.Minimum = Math.Ceiling(minBitrate / 1000.0); // Round up otherwise we exclude bottom bitrate from eligibility
                _limitMaxBitrateSlider.Maximum = Math.Ceiling(maxBitrate / 1000.0); // Round up otherwise we exclude top bitrate from eligibility
                _limitMaxBitrateSlider.Value   = _limitMaxBitrateSlider.Maximum;
            }
        }
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            _bitrateGraphCanvas = GetTemplateChild(BitrateGraphCanvasName) as Canvas;

            isLoaded = true;

            if (AvailableBitrates.Any())
            {
                OnAvailableBitratesChanged();
            }
        }
        private async Task InitializeStreamByChannelName(string channelName)
        {
            IsBarsOpen = false;
            if (MediaSource != null)
            {
                MediaSource = null;
                OnPropertyChanged("StopMedia");
            }

            var streamResult = await _twitchRepository.FetchStreamHLS(channelName);

            if (streamResult == null)
            {
                App.Current.Exit();
                return;
            }
            if (streamResult.Status == AdaptiveMediaSourceCreationStatus.Success)
            {
                MediaSource    = streamResult.MediaSource;
                IsMediaPlaying = true;

                if (AvailableBitrates != null)
                {
                    AvailableBitrates.Clear();
                }
                else
                {
                    AvailableBitrates = new ObservableCollection <BitrateModel>();
                }

                for (int i = 0; i < MediaSource.AvailableBitrates.Count - 1; i++) // Load bitrates
                {
                    AvailableBitrates.Add(new BitrateModel()
                    {
                        OriginalBitrate = MediaSource.AvailableBitrates[i], BitrateName = BitrateNames[i]
                    });
                }

                OnPropertyChanged("MediaSource");
                OnPropertyChanged("AvailableBitrates");
            }
            else
            {
                // TODO : Log exception.
            }
        }