예제 #1
0
        private void HandleEvent(EventType eventType, KStudioEvent eventObj, EventTypePluginData data)
        {
            Debug.Assert(data != null);

            if (eventObj != null)
            {
                if ((eventObj.EventStreamDataTypeId == KStudioEventStreamDataTypeIds.Body) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.BodyMonitor))
                {
                    lock (this.lockObj)
                    {
                        data.sharedBodyFrame = eventObj.GetRetainableEventDataBuffer();

                        uint   bufferSize;
                        IntPtr bufferPtr;

                        eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out bufferPtr);

                        if (Marshal.SizeOf(typeof(nui.BODY_FRAME)) == bufferSize)
                        {
                            data.body.UpdateData(bufferPtr);

                            data.bodiesValid = true;
                        }
                    }
                }
            }
        }
예제 #2
0
        public void HandleEvent(EventType eventType, KStudioEvent eventObj)
        {
            if ((eventType == EventType.Monitor) && (eventObj != null))
            {
                if ((eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.SystemAudio) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.SystemAudioMonitor) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.TitleAudio) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.TitleAudioMonitor))
                {
                    lock (this.lockObj)
                    {
                        this.sharedAudioFrame = null;
                        this.beamConfidence   = 0.0f;
                        this.beamAngle        = 0.0f;
                        this.frameTime        = TimeSpan.Zero;

                        uint   bufferSize;
                        IntPtr bufferPtr;
                        eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out bufferPtr);

                        if (bufferSize >= cAudioFrameSizeMinimum)
                        {
                            this.sharedAudioFrame = eventObj.GetRetainableEventDataBuffer();
                            this.frameTime        = eventObj.RelativeTime;

                            unsafe
                            {
                                nui.AUDIO_FRAME *            pFrame      = (nui.AUDIO_FRAME *)bufferPtr.ToPointer();
                                nui.AUDIO_SUBFRAME *         pSubFrame   = &(pFrame->FirstSubFrame);
                                nui.AUDIO_BEAM_FRAME_HEADER *pBeamHeader = &(pSubFrame->BeamFrameHeader);

                                this.beamConfidence = pBeamHeader->BeamAngleConfidence;
                                this.beamAngle      = pBeamHeader->BeamAngle;

                                for (int i = 0; i < pFrame->SubFrameCount; ++i)
                                {
                                    UpdateChartSubFrame(pSubFrame + i);
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #3
0
        // instance for accessory should be locked
        private static void HandleEvent(KStudioEvent eventObj, viz.Accessory accessory)
        {
            if (eventObj != null)
            {
                if ((eventObj.EventStreamDataTypeId == KStudioEventStreamDataTypeIds.Body) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.BodyMonitor))
                {
                    if (accessory != null)
                    {
                        uint   bufferSize;
                        IntPtr bufferPtr;

                        eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out bufferPtr);

                        if (bufferSize >= AccessoryPlugin.cMinimumBodyFrameSize)
                        {
                            viz.Vector floorPlane;
                            viz.Vector upVector;

                            unsafe
                            {
                                float *pFloats = (float *)((bufferPtr + AccessoryPlugin.cFloorClipPlaneOffset).ToPointer());

                                if (pFloats[3] == 0.0f)
                                {
                                    // if W is 0, assume no real floor plane
                                    floorPlane = new viz.Vector(0.0f, 0.0f, 0.0f, 0.0f);
                                }
                                else
                                {
                                    floorPlane = new viz.Vector(pFloats[0], pFloats[1], pFloats[2], pFloats[3]);
                                }

                                pFloats  = (float *)((bufferPtr + AccessoryPlugin.cUpVectorOffset).ToPointer());
                                upVector = new viz.Vector(0.0f, 0.0f, 0.0f, 0.0f);  // never use up vector for visualizing the floor

                                accessory.UpdateFloorPlaneAndUpVector(floorPlane, upVector);
                            }
                        }
                    }
                }
            }
        }
예제 #4
0
        public void HandleEvent(EventType eventType, KStudioEvent eventObj)
        {
            DebugHelper.AssertUIThread();

            EventTypePluginData data = null;

            switch (eventType)
            {
            case EventType.Monitor:
                data = this.monitorData;
                break;

            case EventType.Inspection:
                data = this.inspectionData;
                break;
            }

            if ((eventObj != null) && (data != null))
            {
                if ((eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.Calibration) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.CalibrationMonitor))
                {
                    if (data.registration != null)
                    {
                        data.registration.Dispose();
                        data.registration = null;
                    }

                    uint   bufferSize;
                    IntPtr buffer;

                    eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out buffer);
                    data.registration = new nui.Registration(buffer, bufferSize);
                }
                else if (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.SystemInfo)
                {
                    if (data.registration != null)
                    {
                        data.registration.Dispose();
                        data.registration = null;
                    }

                    uint   bufferSize;
                    IntPtr buffer;

                    eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out buffer);
                    if (this.depthIrEngine != null)
                    {
                        data.registration = this.depthIrEngine.GetCalibrationFromSysInfo(buffer, bufferSize);
                    }
                }

                if (this.plugins != null)
                {
                    foreach (IEventHandlerPlugin eventHandlerPlugin in this.plugins.OfType <IEventHandlerPlugin>())
                    {
                        eventHandlerPlugin.HandleEvent(eventType, eventObj);
                    }
                }
            }
        }
예제 #5
0
        public static HGlobalBuffer GetRetainableEventDataBuffer(this KStudioEvent eventObj)
        {
            HGlobalBuffer value = null;

            if (eventObj != null)
            {
                lock (KStudioEventExtensions.buffers)
                {
                    // this list should be short (at max a couple dozen); if it starts to get longer than that,
                    // something is probably saving more large raw event data than it should be or the GC isn't kicking in.
                    Debug.Assert(KStudioEventExtensions.buffers.Count < 100);

                    List <int> toRemove = new List <int>();

                    for (int i = 0; i < KStudioEventExtensions.buffers.Count; ++i)
                    {
                        WeakReferenceTuple tuple = KStudioEventExtensions.buffers[i];

                        KStudioEvent eventKey;

                        if (tuple.EventReference.TryGetTarget(out eventKey))
                        {
                            HGlobalBuffer bufferValue;

                            if (tuple.BufferReference.TryGetTarget(out bufferValue))
                            {
                                if (eventKey == eventObj)
                                {
                                    value = bufferValue;
                                    break;
                                }
                            }
                            else
                            {
                                toRemove.Insert(0, i);
                            }
                        }
                        else
                        {
                            toRemove.Insert(0, i);
                        }
                    }

                    foreach (int i in toRemove)
                    {
                        KStudioEventExtensions.buffers.RemoveAt(i);
                    }

                    if (value == null)
                    {
                        uint   bufferSize;
                        IntPtr buffer;
                        eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out buffer);

                        if (bufferSize != 0)
                        {
                            value = new HGlobalBuffer(bufferSize);
                            UnsafeNativeMethods.RtlMoveMemory(value.Buffer, buffer, bufferSize);

                            WeakReferenceTuple newTuple = new WeakReferenceTuple(eventObj, value);
                            KStudioEventExtensions.buffers.Insert(0, newTuple);
                        }
                    }
                }
            }

            return(value);
        }
        public void HandleEvent(EventType eventType, KStudioEvent eventObj)
        {
            if ((eventType == EventType.Monitor) && (eventObj != null)) 
            {
                if ((eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.SystemAudio) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.SystemAudioMonitor) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.TitleAudio) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.TitleAudioMonitor))
                    {
                    lock (this.lockObj)
                    {
                        this.sharedAudioFrame = null;
                        this.beamConfidence = 0.0f;
                        this.beamAngle = 0.0f;
                        this.frameTime = TimeSpan.Zero;

                        uint bufferSize;
                        IntPtr bufferPtr;
                        eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out bufferPtr);

                        if (bufferSize >= cAudioFrameSizeMinimum)
                        {
                            this.sharedAudioFrame = eventObj.GetRetainableEventDataBuffer();
                            this.frameTime = eventObj.RelativeTime;

                            unsafe
                            {
                                nui.AUDIO_FRAME* pFrame = (nui.AUDIO_FRAME*)bufferPtr.ToPointer();
                                nui.AUDIO_SUBFRAME* pSubFrame = &(pFrame->FirstSubFrame);
                                nui.AUDIO_BEAM_FRAME_HEADER* pBeamHeader = &(pSubFrame->BeamFrameHeader);

                                this.beamConfidence = pBeamHeader->BeamAngleConfidence;
                                this.beamAngle = pBeamHeader->BeamAngle;

                                for (int i = 0; i < pFrame->SubFrameCount; ++i)
                                {
                                    UpdateChartSubFrame(pSubFrame + i);
                                }
                            }
                        }
                    }
                }
            }
        }
        private void HandleEvent(EventType eventType, KStudioEvent eventObj, EventTypePluginData data)
        {
            Debug.Assert(data != null);

            if (eventObj != null)
            {
                if ((eventObj.EventStreamDataTypeId == KStudioEventStreamDataTypeIds.Body) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.BodyMonitor))
                {
                    lock (this.lockObj)
                    {
                        data.sharedBodyFrame = eventObj.GetRetainableEventDataBuffer();

                        uint bufferSize;
                        IntPtr bufferPtr;

                        eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out bufferPtr);

                        if (Marshal.SizeOf(typeof(nui.BODY_FRAME)) == bufferSize)
                        {
                            data.body.UpdateData(bufferPtr); 
                            
                            data.bodiesValid = true;
                        }
                    }
                }
            }
        }
        // instance for accessory should be locked
        private static void HandleEvent(KStudioEvent eventObj, viz.Accessory accessory)
        {
            if (eventObj != null)
            {
                if ((eventObj.EventStreamDataTypeId == KStudioEventStreamDataTypeIds.Body) ||
                    (eventObj.EventStreamDataTypeId == HackKStudioEventStreamDataTypeIds.BodyMonitor))
                {
                    if (accessory != null)
                    {
                        uint bufferSize;
                        IntPtr bufferPtr;

                        eventObj.AccessUnderlyingEventDataBuffer(out bufferSize, out bufferPtr);

                        if (bufferSize >= AccessoryPlugin.cMinimumBodyFrameSize)
                        {
                            viz.Vector floorPlane;
                            viz.Vector upVector;

                            unsafe
                            {
                                float* pFloats = (float*)((bufferPtr + AccessoryPlugin.cFloorClipPlaneOffset).ToPointer());

                                if (pFloats[3] == 0.0f)
                                {
                                    // if W is 0, assume no real floor plane
                                    floorPlane = new viz.Vector(0.0f, 0.0f, 0.0f, 0.0f); 
                                }
                                else
                                {
                                    floorPlane = new viz.Vector(pFloats[0], pFloats[1], pFloats[2], pFloats[3]);
                                }

                                pFloats = (float*)((bufferPtr + AccessoryPlugin.cUpVectorOffset).ToPointer());
                                upVector =  new viz.Vector(0.0f, 0.0f, 0.0f, 0.0f); // never use up vector for visualizing the floor

                                accessory.UpdateFloorPlaneAndUpVector(floorPlane, upVector);
                            }
                        }
                    }
                }
            }
        }