/ src / Ryujinx.Horizon / Usb / UsbIpcServer.cs
UsbIpcServer.cs
 1  using Ryujinx.Horizon.Sdk.Sf.Hipc;
 2  using Ryujinx.Horizon.Sdk.Sm;
 3  using Ryujinx.Horizon.Usb.Ipc;
 4  
 5  namespace Ryujinx.Horizon.Usb
 6  {
 7      class UsbIpcServer
 8      {
 9          private const int UsbDsMaxSessionsCount = 4;
10          private const int UsbHsMaxSessionsCount = 20;
11          private const int UsbHsAMaxSessionsCount = 3;
12          private const int UsbObsvMaxSessionsCount = 2;
13          private const int UsbPdMaxSessionsCount = 6;
14          private const int UsbPdCMaxSessionsCount = 4;
15          private const int UsbPdMMaxSessionsCount = 1;
16          private const int UsbPmMaxSessionsCount = 5;
17          private const int UsbQdbMaxSessionsCount = 4;
18          private const int TotalMaxSessionsCount =
19              UsbDsMaxSessionsCount +
20              UsbHsMaxSessionsCount +
21              UsbHsAMaxSessionsCount +
22              UsbObsvMaxSessionsCount +
23              UsbPdMaxSessionsCount +
24              UsbPdCMaxSessionsCount +
25              UsbPdMMaxSessionsCount +
26              UsbPmMaxSessionsCount +
27              UsbQdbMaxSessionsCount;
28  
29          private const int PointerBufferSize = 0;
30          private const int MaxDomains = 0;
31          private const int MaxDomainObjects = 0;
32          private const int MaxPortsCount = 9;
33  
34          private static readonly ManagerOptions _options = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false);
35  
36          private SmApi _sm;
37          private ServerManager _serverManager;
38  
39          public void Initialize()
40          {
41              HeapAllocator allocator = new();
42  
43              _sm = new SmApi();
44              _sm.Initialize().AbortOnFailure();
45  
46              _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _options, TotalMaxSessionsCount);
47  
48  #pragma warning disable IDE0055 // Disable formatting
49              _serverManager.RegisterObjectForServer(new DsRootSession(),        ServiceName.Encode("usb:ds"),   UsbDsMaxSessionsCount);
50              _serverManager.RegisterObjectForServer(new ClientRootSession(),    ServiceName.Encode("usb:hs"),   UsbHsMaxSessionsCount);
51              _serverManager.RegisterObjectForServer(new ClientRootSession(),    ServiceName.Encode("usb:hs:a"), UsbHsAMaxSessionsCount);  // 7.0.0+
52              _serverManager.RegisterObjectForServer(new PmObserverService(),    ServiceName.Encode("usb:obsv"), UsbObsvMaxSessionsCount); // 8.0.0+
53              _serverManager.RegisterObjectForServer(new PdManager(),            ServiceName.Encode("usb:pd"),   UsbPdMaxSessionsCount);
54              _serverManager.RegisterObjectForServer(new PdCradleManager(),      ServiceName.Encode("usb:pd:c"), UsbPdCMaxSessionsCount);
55              _serverManager.RegisterObjectForServer(new PdManufactureManager(), ServiceName.Encode("usb:pd:m"), UsbPdMMaxSessionsCount);  // 1.0.0
56              _serverManager.RegisterObjectForServer(new PmService(),            ServiceName.Encode("usb:pm"),   UsbPmMaxSessionsCount);
57              _serverManager.RegisterObjectForServer(new QdbManager(),           ServiceName.Encode("usb:qdb"),  UsbQdbMaxSessionsCount);  // 7.0.0+
58  #pragma warning restore IDE0055
59          }
60  
61          public void ServiceRequests()
62          {
63              _serverManager.ServiceRequests();
64          }
65  
66          public void Shutdown()
67          {
68              _serverManager.Dispose();
69              _sm.Dispose();
70          }
71      }
72  }