private IOHIDDeviceSetReport ( |
||
device | ||
type | IOHIDReportType | |
reportID | ||
report | ||
reportLength | ||
Результат | IOReturn |
unsafe void WriteThread() { if (!HandleAcquire()) { return; } try { lock (_outputQueue) { while (true) { while (!_shutdown && _outputQueue.Count == 0) { Monitor.Wait(_outputQueue); } if (_shutdown) { break; } NativeMethods.IOReturn ret; CommonOutputReport outputReport = _outputQueue.Peek(); try { fixed(byte *outputReportBytes = outputReport.Bytes) { Monitor.Exit(_outputQueue); try { ret = NativeMethods.IOHIDDeviceSetReport(_handle, outputReport.Feature ? NativeMethods.IOHIDReportType.Feature : NativeMethods.IOHIDReportType.Output, (IntPtr)outputReport.Bytes[0], (IntPtr)outputReportBytes, (IntPtr)outputReport.Bytes.Length); if (ret == NativeMethods.IOReturn.Success) { outputReport.DoneOK = true; } } finally { Monitor.Enter(_outputQueue); } } } finally { _outputQueue.Dequeue(); outputReport.Done = true; Monitor.PulseAll(_outputQueue); } } } } finally { HandleRelease(); } }
unsafe void WriteThread() { if (!HandleAcquire()) { return; } try { lock (_outputQueue) { while (true) { while (!_shutdown && _outputQueue.Count == 0) { Monitor.Wait(_outputQueue); } if (_shutdown) { break; } NativeMethods.IOReturn ret; CommonOutputReport outputReport = _outputQueue.Peek(); try { fixed(byte *outputReportBytes = outputReport.Bytes) { Monitor.Exit(_outputQueue); try { int reportID = outputReport.Bytes[0]; var hasReportID = ((MacHidDevice)Device).ReportsUseID; int reportOffset = hasReportID ? 0 : 1; var reportPtr = (IntPtr)(outputReportBytes + reportOffset); int reportLength = outputReport.Bytes.Length - reportOffset; if (reportLength > 0) { ret = NativeMethods.IOHIDDeviceSetReport(_handle, outputReport.Feature ? NativeMethods.IOHIDReportType.Feature : NativeMethods.IOHIDReportType.Output, (IntPtr)reportID, reportPtr, (IntPtr)reportLength); if (ret == NativeMethods.IOReturn.Success) { outputReport.DoneOK = true; } } } finally { Monitor.Enter(_outputQueue); } } } finally { _outputQueue.Dequeue(); outputReport.Done = true; Monitor.PulseAll(_outputQueue); } } } } finally { HandleRelease(); } }