private unsafe static void SdrIqSamplesAvailable(short *buf, uint len, IntPtr ctx) { GCHandle gCHandle = GCHandle.FromIntPtr(ctx); if (gCHandle.IsAllocated) { SdrIqDevice sdrIqDevice = (SdrIqDevice)gCHandle.Target; int num = (int)len / 2; if (sdrIqDevice._iqBuffer == null || sdrIqDevice._iqBuffer.Length != num) { sdrIqDevice._iqBuffer = UnsafeBuffer.Create(num, sizeof(Complex)); sdrIqDevice._iqPtr = (Complex *)(void *)sdrIqDevice._iqBuffer; } Complex *ptr = sdrIqDevice._iqPtr; for (int i = 0; i < num; i++) { Complex *intPtr = ptr; float * lut = SdrIqDevice._lut16; short * intPtr2 = buf; buf = intPtr2 + 1; intPtr->Imag = lut[*intPtr2 + 32768]; Complex *intPtr3 = ptr; float * lut2 = SdrIqDevice._lut16; short * intPtr4 = buf; buf = intPtr4 + 1; intPtr3->Real = lut2[*intPtr4 + 32768]; ptr++; } sdrIqDevice.ComplexSamplesAvailable(sdrIqDevice._iqPtr, sdrIqDevice._iqBuffer.Length); } }