IOHIDDeviceSetReport() приватный Метод

private IOHIDDeviceSetReport ( IntPtr device, IOHIDReportType type, IntPtr reportID, IntPtr report, IntPtr reportLength ) : IOReturn
device System.IntPtr
type IOHIDReportType
reportID System.IntPtr
report System.IntPtr
reportLength System.IntPtr
Результат IOReturn
Пример #1
0
        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();
            }
        }
Пример #2
0
        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();
            }
        }