public override DsPadId Notify(ScpDevice.Notified notification, string Class, string Path) { Log.InfoFormat("++ Notify [{0}] [{1}] [{2}]", notification, Class, Path); switch (notification) { case ScpDevice.Notified.Arrival: { var arrived = new UsbDevice(); if (string.Equals(Class, UsbDs3.USB_CLASS_GUID, StringComparison.CurrentCultureIgnoreCase)) { arrived = new UsbDs3(); Log.Debug("-- DS3 Arrival Event"); } if (string.Equals(Class, UsbDs4.USB_CLASS_GUID, StringComparison.CurrentCultureIgnoreCase)) { arrived = new UsbDs4(); Log.Debug("-- DS4 Arrival Event"); } Log.InfoFormat("Arrival event for GUID {0} received", Class); if (arrived.Open(Path)) { Log.InfoFormat("-- Device Arrival [{0}]", arrived.Local); if (!Apply3RdPartyWorkaroundsForDs3(ref arrived, path: Path)) break; if (LogArrival(arrived)) { if (_devices[(byte)arrived.PadId].IsShutdown) { _devices[(byte)arrived.PadId].IsShutdown = false; _devices[(byte)arrived.PadId].Close(); _devices[(byte)arrived.PadId] = arrived; return arrived.PadId; } arrived.HidReportReceived += OnHidReportReceived; _devices[(byte)arrived.PadId].Close(); _devices[(byte)arrived.PadId] = arrived; if (m_Started) arrived.Start(); return arrived.PadId; } } arrived.Close(); } break; case ScpDevice.Notified.Removal: { foreach (var t in _devices.Where(t => t.State == DsState.Connected && Path == t.Path)) { Log.InfoFormat("-- Device Removal [{0}]", t.Local); AudioPlayer.Instance.PlayCustomFile(GlobalConfiguration.Instance.UsbDisconnectSoundFile); t.Stop(); } } break; } return DsPadId.None; }
public override bool Start() { m_Started = true; byte index = 0; // enumerate DS4 devices for (byte instance = 0; instance < _devices.Length && index < _devices.Length; instance++) { try { UsbDevice current = new UsbDs4(); current.PadId = (DsPadId)index; if (current.Open(instance)) { if (LogArrival(current)) { current.HidReportReceived += OnHidReportReceived; _devices[index++] = current; } else current.Close(); } else current.Close(); } catch (Exception ex) { Log.ErrorFormat("Unexpected error: {0}", ex); break; } } // enumerate DS3 devices for (byte instance = 0; instance < _devices.Length && index < _devices.Length; instance++) { try { UsbDevice current = new UsbDs3(); current.PadId = (DsPadId)index; if (current.Open(instance)) { if (!Apply3RdPartyWorkaroundsForDs3(ref current, instance)) continue; // notify bus of new device if (LogArrival(current)) { // listen for HID reports current.HidReportReceived += OnHidReportReceived; _devices[index++] = current; } else current.Close(); } else current.Close(); } catch (Exception ex) { Log.ErrorFormat("Unexpected error: {0}", ex); break; } } try { for (index = 0; index < _devices.Length; index++) { if (_devices[index].State == DsState.Reserved) { _devices[index].Start(); } } } catch (Exception ex) { Log.ErrorFormat("Unexpected error: {0}", ex); } return base.Start(); }