diff --git a/DS4Windows/DS4Library/Crc32.cs b/DS4Windows/DS4Library/Crc32.cs index 4e9bc1a..89d5b8a 100644 --- a/DS4Windows/DS4Library/Crc32.cs +++ b/DS4Windows/DS4Library/Crc32.cs @@ -276,7 +276,7 @@ namespace DS4Windows return crc; } - public static uint CalculateFasterBTHash(ref uint seed, ref byte[] buffer, ref int start, ref int size) + public static unsafe uint CalculateFasterBTHash(ref uint seed, ref byte[] buffer, ref int start, ref int size) { /*uint crc = seed; for (int i = start; i < size + start; i++) @@ -288,85 +288,88 @@ namespace DS4Windows int i = start; int bufsize = size; //while (bufsize >= 16) - for (int j = 0; j < 4; j++) + fixed (byte* byteP = buffer) { - uint one = (buffer[i++] | - (uint)(buffer[i++] << 8) | - (uint)(buffer[i++] << 16) | - (uint)(buffer[i++] << 24)) ^ crc; - uint two = buffer[i++] | - (uint)(buffer[i++] << 8) | - (uint)(buffer[i++] << 16) | - (uint)(buffer[i++] << 24); - uint three = (buffer[i++] | - (uint)(buffer[i++] << 8) | - (uint)(buffer[i++] << 16) | - (uint)(buffer[i++] << 24)); - uint four = buffer[i++] | - (uint)(buffer[i++] << 8) | - (uint)(buffer[i++] << 16) | - (uint)(buffer[i++] << 24); + for (int j = 0; j < 4; j++) + { + uint one = (byteP[i++] | + (uint)(byteP[i++] << 8) | + (uint)(byteP[i++] << 16) | + (uint)(byteP[i++] << 24)) ^ crc; + uint two = byteP[i++] | + (uint)(byteP[i++] << 8) | + (uint)(byteP[i++] << 16) | + (uint)(byteP[i++] << 24); + uint three = (byteP[i++] | + (uint)(byteP[i++] << 8) | + (uint)(byteP[i++] << 16) | + (uint)(byteP[i++] << 24)); + uint four = byteP[i++] | + (uint)(byteP[i++] << 8) | + (uint)(byteP[i++] << 16) | + (uint)(byteP[i++] << 24); - crc = secondLook[15, one & 0xFF] ^ - secondLook[14, (one >> 8) & 0xFF] ^ - secondLook[13, (one >> 16) & 0xFF] ^ - secondLook[12, (one >> 24) & 0xFF] ^ - secondLook[11, two & 0xFF] ^ - secondLook[10, (two >> 8) & 0xFF] ^ - secondLook[9, (two >> 16) & 0xFF] ^ - secondLook[8, (two >> 24) & 0xFF] ^ - secondLook[7, three & 0xFF] ^ - secondLook[6, (three >> 8) & 0xFF] ^ - secondLook[5, (three >> 16) & 0xFF] ^ - secondLook[4, (three >> 24) & 0xFF] ^ - secondLook[3, four & 0xFF] ^ - secondLook[2, (four >> 8) & 0xFF] ^ - secondLook[1, (four >> 16) & 0xFF] ^ - defaultTable[(four >> 24) & 0xFF]; + crc = secondLook[15, one & 0xFF] ^ + secondLook[14, (one >> 8) & 0xFF] ^ + secondLook[13, (one >> 16) & 0xFF] ^ + secondLook[12, (one >> 24) & 0xFF] ^ + secondLook[11, two & 0xFF] ^ + secondLook[10, (two >> 8) & 0xFF] ^ + secondLook[9, (two >> 16) & 0xFF] ^ + secondLook[8, (two >> 24) & 0xFF] ^ + secondLook[7, three & 0xFF] ^ + secondLook[6, (three >> 8) & 0xFF] ^ + secondLook[5, (three >> 16) & 0xFF] ^ + secondLook[4, (three >> 24) & 0xFF] ^ + secondLook[3, four & 0xFF] ^ + secondLook[2, (four >> 8) & 0xFF] ^ + secondLook[1, (four >> 16) & 0xFF] ^ + defaultTable[(four >> 24) & 0xFF]; - bufsize -= 16; + bufsize -= 16; + } + + //while (bufsize >= 8) + //if (bufsize >= 8) + + uint one8 = (byteP[i++] | + (uint)(byteP[i++] << 8) | + (uint)(byteP[i++] << 16) | + (uint)(byteP[i++] << 24)) ^ crc; + uint two8 = byteP[i++] | + (uint)(byteP[i++] << 8) | + (uint)(byteP[i++] << 16) | + (uint)(byteP[i++] << 24); + crc = secondLook[7, one8 & 0xFF] ^ + secondLook[6, (one8 >> 8) & 0xFF] ^ + secondLook[5, (one8 >> 16) & 0xFF] ^ + secondLook[4, one8 >> 24] ^ + secondLook[3, two8 & 0xFF] ^ + secondLook[2, (two8 >> 8) & 0xFF] ^ + secondLook[1, (two8 >> 16) & 0xFF] ^ + defaultTable[two8 >> 24]; + + bufsize -= 8; + /*crc ^= buffer[i++] | + (uint)(buffer[i++] << 8) | + (uint)(buffer[i++] << 16) | + (uint)(buffer[i++] << 24);// i = i + 4; + //crc ^= buffer[i]; + crc = secondLook[3, (crc & 0xFF)] ^ + secondLook[2, ((crc >> 8) & 0xFF)] ^ + secondLook[1, ((crc >> 16) & 0xFF)] ^ + defaultTable[crc >> 24]; + bufsize -= 4; + */ + + + //while (--bufsize >= 0) + //{ + crc = (crc >> 8) ^ defaultTable[(crc & 0xFF) ^ byteP[i++]];// i++; + crc = (crc >> 8) ^ defaultTable[(crc & 0xFF) ^ byteP[i++]];// i++; + //} } - //while (bufsize >= 8) - //if (bufsize >= 8) - - uint one8 = (buffer[i++] | - (uint)(buffer[i++] << 8) | - (uint)(buffer[i++] << 16) | - (uint)(buffer[i++] << 24)) ^ crc; - uint two8 = buffer[i++] | - (uint)(buffer[i++] << 8) | - (uint)(buffer[i++] << 16) | - (uint)(buffer[i++] << 24); - crc = secondLook[7, one8 & 0xFF] ^ - secondLook[6, (one8 >> 8) & 0xFF] ^ - secondLook[5, (one8 >> 16) & 0xFF] ^ - secondLook[4, one8 >> 24] ^ - secondLook[3, two8 & 0xFF] ^ - secondLook[2, (two8 >> 8) & 0xFF] ^ - secondLook[1, (two8 >> 16) & 0xFF] ^ - defaultTable[two8 >> 24]; - - bufsize -= 8; - /*crc ^= buffer[i++] | - (uint)(buffer[i++] << 8) | - (uint)(buffer[i++] << 16) | - (uint)(buffer[i++] << 24);// i = i + 4; - //crc ^= buffer[i]; - crc = secondLook[3, (crc & 0xFF)] ^ - secondLook[2, ((crc >> 8) & 0xFF)] ^ - secondLook[1, ((crc >> 16) & 0xFF)] ^ - defaultTable[crc >> 24]; - bufsize -= 4; - */ - - - //while (--bufsize >= 0) - //{ - crc = (crc >> 8) ^ defaultTable[(crc & 0xFF) ^ buffer[i++]];// i++; - crc = (crc >> 8) ^ defaultTable[(crc & 0xFF) ^ buffer[i++]];// i++; - //} - return crc; } diff --git a/DS4Windows/DS4Library/DS4Device.cs b/DS4Windows/DS4Library/DS4Device.cs index 423c350..f2b8405 100644 --- a/DS4Windows/DS4Library/DS4Device.cs +++ b/DS4Windows/DS4Library/DS4Device.cs @@ -697,7 +697,7 @@ namespace DS4Windows const uint DefaultPolynomial = 0xedb88320u; uint HamSeed = 2351727372; - private void performDs4Input() + private unsafe void performDs4Input() { firstActive = DateTime.UtcNow; NativeMethods.HidD_SetNumInputBuffers(hDevice.safeReadHandle.DangerousGetHandle(), 2); @@ -749,7 +749,18 @@ namespace DS4Windows timeoutEvent = false; if (res == HidDevice.ReadStatus.Success) { - Array.Copy(btInputReport, 2, inputReport, 0, inputReport.Length); + //Array.Copy(btInputReport, 2, inputReport, 0, inputReport.Length); + fixed (byte* byteP = &btInputReport[2], imp = inputReport) + { + byte* btImp = byteP; + byte* finImp = imp; + for (int j = 0; j < BT_INPUT_REPORT_LENGTH-2;j++) + { + finImp[j] = btImp[j]; + //*finImp = *btImp; + //btImp++; finImp++; + } + } //uint recvCrc32 = BitConverter.ToUInt32(btInputReport, BT_INPUT_REPORT_CRC32_POS); uint recvCrc32 = btInputReport[BT_INPUT_REPORT_CRC32_POS] | diff --git a/DS4Windows/DS4Windows.csproj b/DS4Windows/DS4Windows.csproj index 0e90b72..37ee192 100644 --- a/DS4Windows/DS4Windows.csproj +++ b/DS4Windows/DS4Windows.csproj @@ -92,6 +92,7 @@ On 6 false + true true