aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Dlna/Main/DlnaEntryPoint.cs')
-rw-r--r--MediaBrowser.Dlna/Main/DlnaEntryPoint.cs105
1 files changed, 93 insertions, 12 deletions
diff --git a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
index 37584f006..b9d9944ec 100644
--- a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
+++ b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
@@ -14,6 +14,10 @@ using MediaBrowser.Dlna.Ssdp;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Dlna.Channels;
namespace MediaBrowser.Dlna.Main
{
@@ -34,11 +38,13 @@ namespace MediaBrowser.Dlna.Main
private readonly IUserDataManager _userDataManager;
private readonly ILocalizationManager _localization;
private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly IMediaEncoder _mediaEncoder;
private readonly SsdpHandler _ssdpHandler;
private readonly IDeviceDiscovery _deviceDiscovery;
private readonly List<string> _registeredServerIds = new List<string>();
+ private bool _ssdpHandlerStarted;
private bool _dlnaServerStarted;
public DlnaEntryPoint(IServerConfigurationManager config,
@@ -54,7 +60,7 @@ namespace MediaBrowser.Dlna.Main
IUserDataManager userDataManager,
ILocalizationManager localization,
IMediaSourceManager mediaSourceManager,
- ISsdpHandler ssdpHandler, IDeviceDiscovery deviceDiscovery)
+ ISsdpHandler ssdpHandler, IDeviceDiscovery deviceDiscovery, IMediaEncoder mediaEncoder)
{
_config = config;
_appHost = appHost;
@@ -69,18 +75,29 @@ namespace MediaBrowser.Dlna.Main
_localization = localization;
_mediaSourceManager = mediaSourceManager;
_deviceDiscovery = deviceDiscovery;
+ _mediaEncoder = mediaEncoder;
_ssdpHandler = (SsdpHandler)ssdpHandler;
_logger = logManager.GetLogger("Dlna");
}
public void Run()
{
- StartSsdpHandler();
ReloadComponents();
+ _config.ConfigurationUpdated += _config_ConfigurationUpdated;
_config.NamedConfigurationUpdated += _config_NamedConfigurationUpdated;
}
+ private bool _lastEnableUpnP;
+ void _config_ConfigurationUpdated(object sender, EventArgs e)
+ {
+ if (_lastEnableUpnP != _config.Configuration.EnableUPnP)
+ {
+ ReloadComponents();
+ }
+ _lastEnableUpnP = _config.Configuration.EnableUPnP;
+ }
+
void _config_NamedConfigurationUpdated(object sender, ConfigurationUpdateEventArgs e)
{
if (string.Equals(e.Key, "dlna", StringComparison.OrdinalIgnoreCase))
@@ -89,15 +106,32 @@ namespace MediaBrowser.Dlna.Main
}
}
- private void ReloadComponents()
+ private async void ReloadComponents()
{
- var isServerStarted = _dlnaServerStarted;
-
var options = _config.GetDlnaConfiguration();
+ if (!options.EnableServer && !options.EnablePlayTo && !_config.Configuration.EnableUPnP)
+ {
+ if (_ssdpHandlerStarted)
+ {
+ // Sat/ip live tv depends on device discovery, as well as hd homerun detection
+ // In order to allow this to be disabled, we need a modular way of knowing if there are
+ // any parts of the system that are dependant on it
+ // DisposeSsdpHandler();
+ }
+ return;
+ }
+
+ if (!_ssdpHandlerStarted)
+ {
+ StartSsdpHandler();
+ }
+
+ var isServerStarted = _dlnaServerStarted;
+
if (options.EnableServer && !isServerStarted)
{
- StartDlnaServer();
+ await StartDlnaServer().ConfigureAwait(false);
}
else if (!options.EnableServer && isServerStarted)
{
@@ -121,8 +155,9 @@ namespace MediaBrowser.Dlna.Main
try
{
_ssdpHandler.Start();
+ _ssdpHandlerStarted = true;
- ((DeviceDiscovery)_deviceDiscovery).Start(_ssdpHandler);
+ StartDeviceDiscovery();
}
catch (Exception ex)
{
@@ -130,11 +165,55 @@ namespace MediaBrowser.Dlna.Main
}
}
- public void StartDlnaServer()
+ private void StartDeviceDiscovery()
+ {
+ try
+ {
+ ((DeviceDiscovery)_deviceDiscovery).Start(_ssdpHandler);
+
+ //DlnaChannel.Current.Start(() => _registeredServerIds.ToList());
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error starting device discovery", ex);
+ }
+ }
+
+ private void DisposeDeviceDiscovery()
+ {
+ try
+ {
+ ((DeviceDiscovery)_deviceDiscovery).Dispose();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error stopping device discovery", ex);
+ }
+ }
+
+ private void DisposeSsdpHandler()
+ {
+ DisposeDeviceDiscovery();
+
+ try
+ {
+ ((DeviceDiscovery)_deviceDiscovery).Dispose();
+
+ _ssdpHandler.Dispose();
+
+ _ssdpHandlerStarted = false;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error stopping ssdp handlers", ex);
+ }
+ }
+
+ public async Task StartDlnaServer()
{
try
{
- RegisterServerEndpoints();
+ await RegisterServerEndpoints().ConfigureAwait(false);
_dlnaServerStarted = true;
}
@@ -144,9 +223,9 @@ namespace MediaBrowser.Dlna.Main
}
}
- private void RegisterServerEndpoints()
+ private async Task RegisterServerEndpoints()
{
- foreach (var address in _appHost.LocalIpAddresses)
+ foreach (var address in await _appHost.GetLocalIpAddresses().ConfigureAwait(false))
{
//if (IPAddress.IsLoopback(address))
//{
@@ -196,7 +275,8 @@ namespace MediaBrowser.Dlna.Main
_config,
_userDataManager,
_localization,
- _mediaSourceManager);
+ _mediaSourceManager,
+ _mediaEncoder);
_manager.Start();
}
@@ -230,6 +310,7 @@ namespace MediaBrowser.Dlna.Main
{
DisposeDlnaServer();
DisposePlayToManager();
+ DisposeSsdpHandler();
}
public void DisposeDlnaServer()