Working through issue where Song does not start playing until a certain point. This is an issue because when retrieving the repeat mode status from the player it defaults to off even though it is initialized from the database.

This commit is contained in:
amazing-username
2019-06-07 17:37:20 -07:00
parent 09c3cffde0
commit fc03d6e15b
7 changed files with 179 additions and 23 deletions
+1
View File
@@ -25,6 +25,7 @@ namespace Mear.Droid
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
CrossMediaManager.Current.Init();
CrossMediaManager.Current.Init(this);
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
+3 -1
View File
@@ -5,6 +5,8 @@ using System.Text;
using SQLite;
using Mear.Models.PlayerControls;
namespace Mear.Models
{
[DataContract]
@@ -14,6 +16,6 @@ namespace Mear.Models
[PrimaryKey, Column("Id"), AutoIncrement]
public int Id { get; set; }
public bool ShuffleOn { get; set; } = false;
public bool RepeatOn { get; set; } = false;
public int RepeatOn { get; set; } = (int)PlayerControls.Repeat.OFF;
}
}
+13
View File
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Mear.Models.PlayerControls
{
public enum Repeat
{
OFF = 0,
ONE,
ALL
}
}
+57 -6
View File
@@ -12,7 +12,9 @@ using Mear.Constants;
using Mear.Constants.API;
using Mear.Models;
using Mear.Models.Authentication;
using Mear.Models.PlayerControls;
using Mear.Repositories.Database;
using Mear.Utilities;
namespace Mear.Playback
{
@@ -85,11 +87,13 @@ namespace Mear.Playback
}
public static async Task<Song> ControlMusic(Song song, PlayControls control)
{
switch (control)
{
case PlayControls.PLAYOFFLINE:
var songPath = song.SongPath;
await CrossMediaManager.Current.Play(songPath);
InitializeRepeatMode();
break;
case PlayControls.PAUSE:
await CrossMediaManager.Current.Pause();
@@ -98,12 +102,11 @@ namespace Mear.Playback
await CrossMediaManager.Current.Play();
break;
case PlayControls.STREAM:
return StreamSong(song);
break;
song = StreamSong(song);
InitializeRepeatMode();
return song;
case PlayControls.REPEAT:
// TODO: Not fully implemented
CrossMediaManager.Current.ToggleRepeat();
var i = CrossMediaManager.Current.RepeatMode;
ToggleRepeat();
break;
case PlayControls.SHUFFLE:
// TODO: Implement shuffling
@@ -119,6 +122,23 @@ namespace Mear.Playback
return null;
}
public static string RetrieveRepeatString()
{
var ctrlRepeatMode = CrossMediaManager.Current.RepeatMode;
switch (ctrlRepeatMode)
{
case MediaManager.Playback.RepeatMode.Off:
return "RepOff";
case MediaManager.Playback.RepeatMode.One:
return "RepOn";
case MediaManager.Playback.RepeatMode.All:
return "RepAll";
}
return string.Empty;
}
private static Song StreamSong(Song song)
{
string tmpFile = Path.GetTempPath() + "track.mp3";
@@ -145,7 +165,8 @@ namespace Mear.Playback
var response = client.DownloadData(request);
CrossMediaManager.Current.Play(tmpFile);
PlaySong(tmpFile);
song.SongPath = tmpFile;
}
@@ -158,6 +179,36 @@ namespace Mear.Playback
return null;
}
private static void InitializeModes()
{
InitializeRepeatMode();
}
private static void InitializeRepeatMode()
{
var ctrlRepo = new DBMusicControlsRepository();
var repeatMode = ctrlRepo.IsRepeatOn();
var mode = RepeatUtility.RetrieveRepeatMode(repeatMode);
CrossMediaManager.Current.RepeatMode = mode;
}
private static async Task PlaySong(string songPath)
{
await CrossMediaManager.Current.Play(songPath);
}
private static void ToggleRepeat()
{
var musicCtrl = new DBMusicControlsRepository();
musicCtrl.UpdateRepeat();
var repeatMode = (Repeat)musicCtrl.IsRepeatOn();
for (var rpt = RepeatUtility.RetrieveRepeatMode(repeatMode);
CrossMediaManager.Current.RepeatMode != rpt;)
{
CrossMediaManager.Current.RepeatMode = RepeatUtility.RetrieveRepeatMode(repeatMode);
}
}
#endregion
}
}
@@ -3,6 +3,8 @@ using System.Collections.Generic;
using System.Text;
using Mear.Models;
using Mear.Models.PlayerControls;
using Mear.Utilities;
namespace Mear.Repositories.Database
{
@@ -48,18 +50,15 @@ namespace Mear.Repositories.Database
return false;
}
public bool IsRepeatOn()
public Repeat IsRepeatOn()
{
try
{
if (DoesTableExist("MusicControls"))
{
bool? repeat = _Db.Table<MusicControls>().First().RepeatOn;
var repeat = _Db.Table<MusicControls>().First().RepeatOn;
if (repeat != null)
{
return repeat.Value;
}
return (Repeat)repeat;
}
}
catch (Exception ex)
@@ -67,7 +66,7 @@ namespace Mear.Repositories.Database
var msg = ex.Message;
}
return false;
return Repeat.OFF;
}
public void UpdateRepeat()
@@ -77,7 +76,9 @@ namespace Mear.Repositories.Database
if (DoesTableExist("MusicControls"))
{
var control = RetrieveMusicControls();
control.RepeatOn = !control.RepeatOn;
var repeatMode = (Repeat)control.RepeatOn;
control.RepeatOn = RepeatUtility.ToggleRepeatMode(repeatMode);
_Db.Update(control);
}
}
+86
View File
@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Text;
using MediaManager;
using Mear.Models.PlayerControls;
namespace Mear.Utilities
{
public class RepeatUtility
{
#region Fields
#endregion
#region Properties
#endregion
#region Constructors
#endregion
#region Methods
public static MediaManager.Playback.RepeatMode RetrieveRepeatMode(Repeat repeatMode)
{
switch (repeatMode)
{
case Repeat.OFF:
return MediaManager.Playback.RepeatMode.Off;
case Repeat.ONE:
return MediaManager.Playback.RepeatMode.One;
case Repeat.ALL:
return MediaManager.Playback.RepeatMode.All;
}
return MediaManager.Playback.RepeatMode.Off;
}
public static string RepeatString(Repeat repeatMode)
{
switch (repeatMode)
{
case Repeat.OFF:
return "RepOff";
case Repeat.ONE:
return "RepOne";
case Repeat.ALL:
return "RepAll";
}
return string.Empty;
}
public static string ToggleRepeatString(Repeat repeatMode)
{
switch (repeatMode)
{
case Repeat.OFF:
return "RepOn";
case Repeat.ONE:
return "RepAll";
case Repeat.ALL:
return "RepOff";
}
return string.Empty;
}
public static int ToggleRepeatMode(Repeat repeatMode)
{
switch (repeatMode)
{
case Repeat.OFF:
return (int)Repeat.ONE;
case Repeat.ONE:
return (int)Repeat.ALL;
case Repeat.ALL:
return (int)Repeat.OFF;
}
return 0;
}
#endregion
}
}
+10 -8
View File
@@ -12,12 +12,15 @@ using Xamarin.Forms.Xaml;
using Mear.Constants;
using Mear.Models;
using Mear.Models.PlayerControls;
using Mear.Playback;
using Mear.Repositories.Database;
using Mear.Repositories.Remote;
using Mear.Utilities;
using Mear.ViewModels;
using RepeatMode = Mear.Models.PlayerControls.Repeat;
namespace Mear.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
@@ -98,10 +101,10 @@ namespace Mear.Views
var controlRepo = new DBMusicControlsRepository();
var shuffleOn = controlRepo.IsShuffleOn();
var repeatOn = controlRepo.IsRepeatOn();
var repeatMode = (RepeatMode)controlRepo.IsRepeatOn();
Shuffle.Text = (shuffleOn) ? "ShfOn" : "ShfOff";
Repeat.Text = (repeatOn) ? "RepOn" : "RepOff";
Repeat.Text = MearPlayer.RetrieveRepeatString();
EndTime.Text = endTime;
}
@@ -185,13 +188,12 @@ namespace Mear.Views
}
private void Repeat_Clicked(object sender, EventArgs e)
{
var musicCtrl = new DBMusicControlsRepository();
var control = musicCtrl.IsRepeatOn();
Repeat.Text = (!control) ? "RepOn" : "RepOff";
Task.Run(async () =>
{
await MearPlayer.ControlMusic(_song, PlayControls.REPEAT);
}).Wait();
musicCtrl.UpdateRepeat();
MearPlayer.ControlMusic(_song, PlayControls.REPEAT);
Repeat.Text = MearPlayer.RetrieveRepeatString();
}
private void Shuffle_Clicked(object sender, EventArgs e)
{