示例#1
0
文件: SharedMem.cs 项目: g3gg0/rx-fft
        public SharedMem(int srcChan, int dstChan, string name, long bufferSize)
        {
            if (name == null || name == "")
            {
                name = "Unnamed Channel";
            }

            this.name       = name;
            this.srcChan    = srcChan;
            this.dstChan    = dstChan;
            this.bufferSize = bufferSize;

            byte[]        dBytes = new byte[name.Length];
            ASCIIEncoding enc    = new ASCIIEncoding();

            shmemID = SharedMemNative.shmemchain_register_node_special(srcChan, dstChan, (int)bufferSize, enc.GetBytes(name));

            if (shmemID < 0)
            {
                throw new NotSupportedException("Failed to register shmem node. Error code #" + SharedMemNative.shmemchain_get_last_error() + " #" + SharedMemNative.shmemchain_get_last_errorcode());
            }

            /* try to get the real channel ids */
            foreach (NodeInfo info in GetNodeInfos())
            {
                if (info.shmemID == shmemID)
                {
                    this.srcChan = info.srcChan;
                    this.dstChan = info.dstChan;
                }
            }
        }
示例#2
0
文件: SharedMem.cs 项目: g3gg0/rx-fft
        public override int Read(byte[] buffer, int offset, int count)
        {
            int readParam = (int)readMode;

            if (SharedMemNative.shmemchain_get_last_error() != -100)
            {
                Log.AddMessage("Shmem Error: " + SharedMemNative.shmemchain_get_last_error() + " " + SharedMemNative.shmemchain_get_last_errorcode());
            }

            /* dynamic and time limited modes have the timeout in 100ms steps as parameter */
            if (readMode == eReadMode.Dynamic || readMode == eReadMode.TimeLimited || readMode == eReadMode.TimeLimitedNoPartial)
            {
                readParam |= ((readTimeout + 99) / 100);
            }

            /* directly read into buffer */
            if (offset == 0)
            {
                return((int)SharedMemNative.shmemchain_read_data(shmemID, buffer, (uint)count, readParam));
            }

            /* use a temporary buffer for writing at offset */
            byte[] tmpBuffer = new byte[count];
            int    ret       = (int)SharedMemNative.shmemchain_read_data(shmemID, tmpBuffer, (uint)count, readParam);

            Array.Copy(tmpBuffer, 0, buffer, offset, count);
            return(ret);
        }