First pass at sync working. Need to ignore for special cases
This commit is contained in:
@ -4,7 +4,8 @@ using System.Threading;
|
||||
using Grpc.Core;
|
||||
using Aurora.Proto.Events;
|
||||
using Aurora.Proto.Party;
|
||||
using Aurora.Services.ClientService;
|
||||
using Aurora.Proto.Playback;
|
||||
using Aurora.Proto.Sync;
|
||||
|
||||
namespace Aurora.Services.ClientService
|
||||
{
|
||||
@ -12,6 +13,9 @@ namespace Aurora.Services.ClientService
|
||||
{
|
||||
private RemotePartyService.RemotePartyServiceClient _remotePartyClient;
|
||||
private RemoteEventService.RemoteEventServiceClient _remoteEventsClient;
|
||||
private RemotePlaybackService.RemotePlaybackServiceClient _remotePlaybackClient;
|
||||
private RemoteSyncService.RemoteSyncServiceClient _remoteSyncClient;
|
||||
|
||||
private Channel _channel;
|
||||
CancellationTokenSource _eventCancellationTokenSource;
|
||||
|
||||
@ -34,6 +38,16 @@ namespace Aurora.Services.ClientService
|
||||
get { return _remoteEventsClient; }
|
||||
}
|
||||
|
||||
public RemotePlaybackService.RemotePlaybackServiceClient RemotePlaybackClient
|
||||
{
|
||||
get { return _remotePlaybackClient; }
|
||||
}
|
||||
|
||||
public RemoteSyncService.RemoteSyncServiceClient RemoteSyncClient
|
||||
{
|
||||
get { return _remoteSyncClient; }
|
||||
}
|
||||
|
||||
public bool IsStarted
|
||||
{
|
||||
get
|
||||
@ -51,6 +65,8 @@ namespace Aurora.Services.ClientService
|
||||
|
||||
_remotePartyClient = new RemotePartyService.RemotePartyServiceClient(_channel);
|
||||
_remoteEventsClient = new RemoteEventService.RemoteEventServiceClient(_channel);
|
||||
_remotePlaybackClient = new RemotePlaybackService.RemotePlaybackServiceClient(_channel);
|
||||
_remoteSyncClient = new RemoteSyncService.RemoteSyncServiceClient(_channel);
|
||||
|
||||
//Assign but don't start task
|
||||
_eventCancellationTokenSource = new CancellationTokenSource();
|
||||
@ -63,6 +79,8 @@ namespace Aurora.Services.ClientService
|
||||
|
||||
_remotePartyClient = null;
|
||||
_remoteEventsClient = null;
|
||||
_remotePlaybackClient = null;
|
||||
_remoteSyncClient = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1,6 +1,9 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using Grpc.Core;
|
||||
using Aurora.Models.Media;
|
||||
using Aurora.Proto.Sync;
|
||||
using LibVLCSharp.Shared;
|
||||
|
||||
namespace Aurora.Services.PlayerService
|
||||
@ -47,6 +50,22 @@ namespace Aurora.Services.PlayerService
|
||||
return _currentMedia == media;
|
||||
}
|
||||
|
||||
public float CurrentMediaTime
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mediaPlayer.Position;
|
||||
}
|
||||
}
|
||||
|
||||
public long CurrentMediaLength
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mediaPlayer.Length;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load media into the media player.
|
||||
/// </summary>
|
||||
@ -78,7 +97,50 @@ namespace Aurora.Services.PlayerService
|
||||
{
|
||||
PlaybackState oldState = _state;
|
||||
_state = PlaybackState.Playing;
|
||||
|
||||
_mediaPlayer.Play();
|
||||
//Use sync RPC for remote audio
|
||||
if (_currentMedia is RemoteAudio)
|
||||
{
|
||||
RemoteAudio media = _currentMedia as RemoteAudio;
|
||||
RemoteSyncService.RemoteSyncServiceClient _remoteSyncClient = media.RemoteSyncClient;
|
||||
|
||||
//Sync playback in a separate task
|
||||
//Task completes when host stops syncing (when a song is complete)
|
||||
Task syncTask = new Task(async () =>
|
||||
{
|
||||
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
|
||||
using (AsyncServerStreamingCall<Sync> syncStream = _remoteSyncClient
|
||||
.GetMediaSync(new Proto.General.Empty()))
|
||||
{
|
||||
try
|
||||
{
|
||||
while (await syncStream.ResponseStream.MoveNext(cancellationTokenSource.Token))
|
||||
{
|
||||
Sync sync = new Sync(syncStream.ResponseStream.Current);
|
||||
if (sync != null)
|
||||
{
|
||||
//Adjust position based on sync
|
||||
DateTime localTime = Utils.TimeUtils.GetNetworkTime();
|
||||
//Get offset converted to milliseconds
|
||||
float offset = ((localTime.Ticks - sync.ServerTime) * 100) / (1000 * 1000);
|
||||
|
||||
float length = CurrentMediaLength;
|
||||
float position = (sync.TrackTime + offset) / length;
|
||||
|
||||
_mediaPlayer.Position = position;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Exception caught while attempting to sync: " + ex.Message);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
syncTask.Start();
|
||||
}
|
||||
|
||||
if (PlaybackStateChanged != null)
|
||||
{
|
||||
|
@ -6,6 +6,8 @@ using Grpc.Core;
|
||||
using Aurora.RemoteImpl;
|
||||
using Aurora.Proto.Events;
|
||||
using Aurora.Proto.Party;
|
||||
using Aurora.Proto.Playback;
|
||||
using Aurora.Proto.Sync;
|
||||
|
||||
|
||||
namespace Aurora.Services
|
||||
@ -17,8 +19,10 @@ namespace Aurora.Services
|
||||
private Grpc.Core.Server _server;
|
||||
|
||||
//Implementation class declarations
|
||||
RemotePartyServiceImpl _remotePartyServiceImpl;
|
||||
RemoteEventServiceImpl _remoteEventImpl;
|
||||
private RemotePartyServiceImpl _remotePartyServiceImpl;
|
||||
private RemoteEventServiceImpl _remoteEventImpl;
|
||||
private RemotePlaybackServiceImpl _remotePlaybackImpl;
|
||||
private RemoteSyncServiceImpl _remoteSyncImpl;
|
||||
|
||||
/// <summary>
|
||||
/// Constructor. Registers GRPC service implementations.
|
||||
@ -76,10 +80,14 @@ namespace Aurora.Services
|
||||
//Construct implementations
|
||||
_remotePartyServiceImpl = new RemotePartyServiceImpl();
|
||||
_remoteEventImpl = new RemoteEventServiceImpl();
|
||||
_remotePlaybackImpl = new RemotePlaybackServiceImpl();
|
||||
_remoteSyncImpl = new RemoteSyncServiceImpl();
|
||||
|
||||
// Register grpc RemoteService with singleton server service
|
||||
RegisterService(RemotePartyService.BindService(_remotePartyServiceImpl));
|
||||
RegisterService(RemoteEventService.BindService(_remoteEventImpl));
|
||||
RegisterService(RemotePlaybackService.BindService(_remotePlaybackImpl));
|
||||
RegisterService(RemoteSyncService.BindService(_remoteSyncImpl));
|
||||
}
|
||||
_server.Start();
|
||||
}
|
||||
|
Reference in New Issue
Block a user