Improved polling and Session handling
This commit is contained in:
parent
e3997059d2
commit
6bbf2d115e
|
@ -76,8 +76,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
_transportState = value;
|
_transportState = value;
|
||||||
|
|
||||||
if (value == "PLAYING" || value == "STOPPED")
|
if (value == TRANSPORTSTATE.PLAYING || value == TRANSPORTSTATE.STOPPED)
|
||||||
NotifyPlaybackChanged(value == "STOPPED");
|
NotifyPlaybackChanged(value == TRANSPORTSTATE.STOPPED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return TransportState == "PLAYING";
|
return TransportState == TRANSPORTSTATE.PLAYING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return (TransportState == "TRANSITIONING");
|
return (TransportState == TRANSPORTSTATE.TRANSITIONING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return TransportState == "PAUSED" || TransportState == "PAUSED_PLAYBACK";
|
return TransportState == TRANSPORTSTATE.PAUSED || TransportState == TRANSPORTSTATE.PAUSED_PLAYBACK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return (TransportState == "STOPPED");
|
return TransportState == TRANSPORTSTATE.STOPPED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,23 +127,39 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int GetTimerIntervalMs()
|
private int GetPlaybackTimerIntervalMs()
|
||||||
{
|
{
|
||||||
return 10000;
|
return 2000;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetInactiveTimerIntervalMs()
|
||||||
|
{
|
||||||
|
return 20000;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Start()
|
public void Start()
|
||||||
{
|
{
|
||||||
UpdateTime = DateTime.UtcNow;
|
UpdateTime = DateTime.UtcNow;
|
||||||
|
|
||||||
var interval = GetTimerIntervalMs();
|
var interval = GetPlaybackTimerIntervalMs();
|
||||||
|
|
||||||
_timer = new Timer(TimerCallback, null, interval, interval);
|
_timer = new Timer(TimerCallback, null, interval, interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RestartTimer()
|
private void RestartTimer()
|
||||||
{
|
{
|
||||||
var interval = GetTimerIntervalMs();
|
var interval = GetPlaybackTimerIntervalMs();
|
||||||
|
|
||||||
|
_timer.Change(interval, interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Restarts the timer in inactive mode.
|
||||||
|
/// </summary>
|
||||||
|
private void RestartTimerInactive()
|
||||||
|
{
|
||||||
|
var interval = GetInactiveTimerIntervalMs();
|
||||||
|
|
||||||
_timer.Change(interval, interval);
|
_timer.Change(interval, interval);
|
||||||
}
|
}
|
||||||
|
@ -230,11 +246,9 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
StopTimer();
|
StopTimer();
|
||||||
|
|
||||||
TransportState = "STOPPED";
|
await SetStop().ConfigureAwait(false);
|
||||||
CurrentId = "0";
|
CurrentId = "0";
|
||||||
|
|
||||||
await Task.Delay(50).ConfigureAwait(false);
|
|
||||||
|
|
||||||
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetAVTransportURI");
|
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetAVTransportURI");
|
||||||
if (command == null)
|
if (command == null)
|
||||||
return false;
|
return false;
|
||||||
|
@ -261,7 +275,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
await SetPlay().ConfigureAwait(false);
|
await SetPlay().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_count = 5;
|
_lapsCount = SetLapsCountToFull();
|
||||||
RestartTimer();
|
RestartTimer();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -322,7 +336,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
var result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType, 1))
|
var result = await new SsdpHttpClient(_httpClient).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType, 1))
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
_count = 5;
|
_lapsCount = SetLapsCountToFull();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +352,6 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
await Task.Delay(50).ConfigureAwait(false);
|
await Task.Delay(50).ConfigureAwait(false);
|
||||||
_count = 4;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,8 +375,13 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
#region Get data
|
#region Get data
|
||||||
|
|
||||||
// TODO: What is going on here
|
private int GetLapsCount()
|
||||||
int _count = 5;
|
{
|
||||||
|
// No need to get all data every lap, just every X time.
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _lapsCount = 0;
|
||||||
|
|
||||||
private async void TimerCallback(object sender)
|
private async void TimerCallback(object sender)
|
||||||
{
|
{
|
||||||
|
@ -374,18 +392,24 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var hasTrack = await GetPositionInfo().ConfigureAwait(false);
|
await GetTransportInfo().ConfigureAwait(false);
|
||||||
|
|
||||||
// TODO: Why make these requests if hasTrack==false?
|
//If we're not playing anything no need to get additional data
|
||||||
if (_count > 5)
|
if (TransportState != TRANSPORTSTATE.STOPPED)
|
||||||
{
|
{
|
||||||
await GetTransportInfo().ConfigureAwait(false);
|
var hasTrack = await GetPositionInfo().ConfigureAwait(false);
|
||||||
if (!hasTrack)
|
|
||||||
|
// TODO: Why make these requests if hasTrack==false?
|
||||||
|
// TODO ANSWER Some vendors don't include track in GetPositionInfo, use GetMediaInfo instead.
|
||||||
|
if (_lapsCount > GetLapsCount())
|
||||||
{
|
{
|
||||||
await GetMediaInfo().ConfigureAwait(false);
|
if (!hasTrack)
|
||||||
|
{
|
||||||
|
await GetMediaInfo().ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
await GetVolume().ConfigureAwait(false);
|
||||||
|
_lapsCount = 0;
|
||||||
}
|
}
|
||||||
await GetVolume().ConfigureAwait(false);
|
|
||||||
_count = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -393,11 +417,16 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
_logger.ErrorException("Error updating device info", ex);
|
_logger.ErrorException("Error updating device info", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
_count++;
|
_lapsCount++;
|
||||||
|
|
||||||
if (_disposed)
|
if (_disposed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
RestartTimer();
|
//If we're not playing anything make sure we don't get data more often than neccessry to keep the Session alive
|
||||||
|
if (TransportState != TRANSPORTSTATE.STOPPED)
|
||||||
|
RestartTimer();
|
||||||
|
else
|
||||||
|
RestartTimerInactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task GetVolume()
|
private async Task GetVolume()
|
||||||
|
@ -747,5 +776,15 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
return String.Format("{0} - {1}", Properties.Name, Properties.BaseUrl);
|
return String.Format("{0} - {1}", Properties.Name, Properties.BaseUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class TRANSPORTSTATE
|
||||||
|
{
|
||||||
|
public const string STOPPED = "STOPPED";
|
||||||
|
public const string PLAYING = "PLAYING";
|
||||||
|
public const string TRANSITIONING = "TRANSITIONING";
|
||||||
|
public const string PAUSED_PLAYBACK = "PAUSED_PLAYBACK";
|
||||||
|
public const string PAUSED = "PAUSED";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,6 +131,14 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
((Timer)sender).Stop();
|
((Timer)sender).Stop();
|
||||||
|
|
||||||
|
|
||||||
|
if(!IsSessionActive)
|
||||||
|
{
|
||||||
|
//Session is inactive, mark it for Disposal and don't start the elapsed timer.
|
||||||
|
await _sessionManager.ReportSessionEnded(this._session.Id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
await ReportProgress().ConfigureAwait(false);
|
await ReportProgress().ConfigureAwait(false);
|
||||||
|
|
||||||
if (!_disposed && IsSessionActive)
|
if (!_disposed && IsSessionActive)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 2012
|
# Visual Studio 2013
|
||||||
|
VisualStudioVersion = 12.0.21005.1
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Api", "MediaBrowser.Api\MediaBrowser.Api.csproj", "{4FD51AC5-2C16-4308-A993-C3A84F3B4582}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Api", "MediaBrowser.Api\MediaBrowser.Api.csproj", "{4FD51AC5-2C16-4308-A993-C3A84F3B4582}"
|
||||||
|
@ -251,7 +253,4 @@ Global
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(Performance) = preSolution
|
|
||||||
HasPerformanceSessions = true
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
Loading…
Reference in New Issue
Block a user