예제 #1
0
        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);
            }
        }