public ReactiveMediaManager()
        {
            var bufferObservable = Observable.FromEventPattern <BufferingChangedEventHandler, BufferingChangedEventArgs>(
                h => CrossMediaManager.Current.BufferingChanged += h,
                h => CrossMediaManager.Current.BufferingChanged -= h)
                                   .Select(pattern => pattern.EventArgs);

            BufferedTime     = bufferObservable.Select(e => e.BufferedTime);
            BufferedProgress = bufferObservable.Select(e => e.BufferProgress);

            PlaybackState = Observable.FromEventPattern <StatusChangedEventHandler, StatusChangedEventArgs>(
                h => CrossMediaManager.Current.StatusChanged += h,
                h => CrossMediaManager.Current.StatusChanged -= h)
                            .Select(pattern => pattern.EventArgs.Status);

            var playingObservable = Observable.FromEventPattern <PlayingChangedEventHandler, PlayingChangedEventArgs>(
                h => CrossMediaManager.Current.PlayingChanged += h,
                h => CrossMediaManager.Current.PlayingChanged -= h)
                                    .Select(pattern => pattern.EventArgs);

            PlaybackDuration = playingObservable.Select(e => e.Duration);
            PlaybackPosition = playingObservable.Select(e => e.Position);
            PlaybackProgress = playingObservable.Select(e => e.Progress);

            IsPlaying = PlaybackState.Select(status => status == MediaPlayerStatus.Playing);

            MediaFinished = Observable.FromEventPattern <MediaFinishedEventHandler, MediaFinishedEventArgs>(
                h => CrossMediaManager.Current.MediaFinished += h, h => CrossMediaManager.Current.MediaFinished -= h)
                            .Select(e => e.EventArgs.File);

            MediaFailed = Observable.FromEventPattern <MediaFileFailedEventHandler, MediaFailedEventArgs>(
                h => CrossMediaManager.Current.MediaFileFailed += h,
                h => CrossMediaManager.Current.MediaFileFailed -= h)
                          .Select(e => e.EventArgs);

            MediaFileChanged = Observable.FromEventPattern <MediaFileChangedEventHandler, MediaFileChangedEventArgs>(
                h => CrossMediaManager.Current.MediaFileChanged += h,
                h => CrossMediaManager.Current.MediaFileChanged -= h)
                               .Select(e => e.EventArgs.File);

            QueueEnded = Observable.FromEventPattern <QueueEndedEventHandler, QueueEndedEventArgs>(
                h => CrossMediaManager.Current.MediaQueue.QueueEnded += h,
                h => CrossMediaManager.Current.MediaQueue.QueueEnded -= h)
                         .Select(e => true);

            ActiveItemInQueue = Observable.FromEventPattern <QueueMediaChangedEventHandler, QueueMediaChangedEventArgs>(
                h => CrossMediaManager.Current.MediaQueue.QueueMediaChanged += h,
                h => CrossMediaManager.Current.MediaQueue.QueueMediaChanged -= h)
                                .Select(e => e.EventArgs.File);

            QueueChanged = Observable
                           .FromEventPattern <NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
                h => CrossMediaManager.Current.MediaQueue.CollectionChanged += h,
                h => CrossMediaManager.Current.MediaQueue.CollectionChanged -= h)
                           .Select(e => e.EventArgs);
        }