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); } } }); } }
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); }
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); }
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; }