Exemplo n.º 1
0
        public void Play(MediaSession.QueueItem item)
        {
            var mediaHasChanged = InitPlayerStates(item.Description.MediaId);

            if (MusicPlayerState == PlaybackStateCode.Paused && !mediaHasChanged && _mediaPlayer != null)
            {
                ConfigMediaPlayerState();
            }
            else
            {
                MusicPlayerState = PlaybackStateCode.Stopped;
                CleanUp(false);
                MediaMetadata track = _musicProvider.GetMusic(
                    HierarchyHelper.ExtractMusicIDFromMediaID(item.Description.MediaId));

                string source = track.GetString(MusicProvider.PodcastSource);

                try
                {
                    _mediaPlayer.Reset();
                    MusicPlayerState = PlaybackStateCode.Buffering;
                    _mediaPlayer.SetAudioStreamType(Android.Media.Stream.Music);
                    _mediaPlayer.SetDataSource(source);
                    _mediaPlayer.PrepareAsync();
                    _wifiLock.Acquire();
                    _musicService.OnPlaybackStatusChanged(MusicPlayerState);
                }
                catch (Exception ex)
                {
                    Logger.Error(ex, "Error playing song");
                    _musicService.OnError(ex.Message);
                }
            }
        }
        void UpdateMetadata()
        {
            if (!QueueHelper.isIndexPlayable(currentIndexOnQueue, playingQueue))
            {
                LogHelper.Error(Tag, "Can't retrieve current metadata.");
                UpdatePlaybackState(Resources.GetString(Resource.String.error_no_metadata));
                return;
            }
            MediaSession.QueueItem queueItem = playingQueue [currentIndexOnQueue];
            string musicId = MediaIDHelper.ExtractMusicIDFromMediaID(
                queueItem.Description.MediaId);
            MediaMetadata track   = musicProvider.GetMusic(musicId);
            string        trackId = track.GetString(MediaMetadata.MetadataKeyMediaId);

            if (musicId != trackId)
            {
                var e = new InvalidOperationException("track ID should match musicId.");
                LogHelper.Error(Tag, "track ID should match musicId.",
                                " musicId=", musicId, " trackId=", trackId,
                                " mediaId from queueItem=", queueItem.Description.MediaId,
                                " title from queueItem=", queueItem.Description.Title,
                                " mediaId from track=", track.Description.MediaId,
                                " title from track=", track.Description.Title,
                                " source.hashcode from track=", track.GetString(
                                    MusicProvider.CustomMetadataTrackSource).GetHashCode(),
                                e);
                throw e;
            }
            LogHelper.Debug(Tag, "Updating metadata for MusicID= " + musicId);
            session.SetMetadata(track);

            // Set the proper album artwork on the media session, so it can be shown in the
            // locked screen and in other places.
            if (track.Description.IconBitmap == null &&
                track.Description.IconUri != null)
            {
                string albumUri = track.Description.IconUri.ToString();
                AlbumArtCache.Instance.Fetch(albumUri, new AlbumArtCache.FetchListener {
                    OnFetched = (artUrl, bitmap, icon) => {
                        MediaSession.QueueItem qItem = playingQueue [currentIndexOnQueue];
                        MediaMetadata trackItem      = musicProvider.GetMusic(trackId);
                        trackItem = new MediaMetadata.Builder(trackItem)
                                    .PutBitmap(MediaMetadata.MetadataKeyAlbumArt, bitmap)
                                    .PutBitmap(MediaMetadata.MetadataKeyDisplayIcon, icon)
                                    .Build();

                        musicProvider.UpdateMusic(trackId, trackItem);

                        // If we are still playing the same music
                        string currentPlayingId = MediaIDHelper.ExtractMusicIDFromMediaID(
                            qItem.Description.MediaId);
                        if (trackId == currentPlayingId)
                        {
                            session.SetMetadata(trackItem);
                        }
                    }
                });
            }
        }
Exemplo n.º 3
0
        public void Play(MediaSession.QueueItem item)
        {
            playOnFocusGain = true;
            TryToGetAudioFocus();
            RegisterAudioNoisyReceiver();
            string mediaId         = item.Description.MediaId;
            bool   mediaHasChanged = mediaId != currentMediaId;

            if (mediaHasChanged)
            {
                currentPosition = 0;
                currentMediaId  = mediaId;
            }

            if (State == PlaybackStateCode.Paused && !mediaHasChanged && mediaPlayer != null)
            {
                ConfigMediaPlayerState();
            }
            else
            {
                State = PlaybackStateCode.Stopped;
                RelaxResources(false);
                MediaMetadata track = musicProvider.GetMusic(
                    MediaIDHelper.ExtractMusicIDFromMediaID(item.Description.MediaId));

                string source = track.GetString(MusicProvider.CustomMetadataTrackSource);

                try {
                    CreateMediaPlayerIfNeeded();

                    State = PlaybackStateCode.Buffering;

                    mediaPlayer.SetAudioStreamType(Android.Media.Stream.Music);
                    mediaPlayer.SetDataSource(source);

                    mediaPlayer.PrepareAsync();

                    wifiLock.Acquire();

                    if (Callback != null)
                    {
                        Callback.OnPlaybackStatusChanged(State);
                    }
                } catch (IOException ex) {
                    LogHelper.Error(Tag, ex, "Exception playing song");
                    if (Callback != null)
                    {
                        Callback.OnError(ex.Message);
                    }
                }
            }
        }
        static List <MediaSession.QueueItem> ConvertToQueue(IEnumerable <MediaMetadata> tracks, params string[] categories)
        {
            var queue = new List <MediaSession.QueueItem>();
            int count = 0;

            foreach (var track in tracks)
            {
                string        hierarchyAwareMediaID = MediaIDHelper.CreateMediaID(track.Description.MediaId, categories);
                MediaMetadata trackCopy             = new MediaMetadata.Builder(track)
                                                      .PutString(MediaMetadata.MetadataKeyMediaId, hierarchyAwareMediaID)
                                                      .Build();

                var item = new MediaSession.QueueItem(trackCopy.Description, count++);
                queue.Add(item);
            }
            return(queue);
        }
Exemplo n.º 5
0
        private void UpdateMetadata()
        {
            if (!this.isIndexPlayable(_currentIndexQueue, _playingQueue))
            {
                Logger.Error("Can't retrieve current metadata.");
                UpdatePlaybackState("Error no data.");
                return;
            }
            MediaSession.QueueItem queueItem = _playingQueue[_currentIndexQueue];
            string        musicId            = HierarchyHelper.ExtractMusicIDFromMediaID(queueItem.Description.MediaId);
            MediaMetadata track   = _musicProvider.GetMusic(musicId);
            string        trackId = track.GetString(MediaMetadata.MetadataKeyMediaId);

            if (musicId != trackId)
            {
                var e = new InvalidOperationException("track ID should match musicId.");
                throw e;
            }
            Logger.Debug($"Updating metadata for MusicID= {musicId}");
            _session.SetMetadata(track);
        }
Exemplo n.º 6
0
		static List<MediaSession.QueueItem> ConvertToQueue(
			IEnumerable<MediaMetadata> tracks, params string[] categories) {
			var queue = new List<MediaSession.QueueItem>();
			var count = 0;
			foreach (var track in tracks) {
				var hierarchyAwareMediaID = MediaIDHelper.CreateMediaID(
					track.Description.MediaId, categories);

				var trackCopy = new MediaMetadata.Builder(track)
					.PutString(MediaMetadata.MetadataKeyMediaId, hierarchyAwareMediaID)
					.Build();

				var item = new MediaSession.QueueItem(trackCopy.Description, count++);
				queue.Add(item);
			}
			return queue;

		}