コード例 #1
0
XnStatus XnBufferPool::GetBuffer(XnBuffer** ppBuffer)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	xnOSEnterCriticalSection(&m_hLock);

	XnBuffersList::Iterator it = m_FreeBuffers.begin();
	if (it == m_FreeBuffers.end())
	{
		xnOSLeaveCriticalSection(&m_hLock);
		return XN_STATUS_ALLOC_FAILED;
	}

	XnBufferInPool* pBuffer = *it;

	// remove from list
	nRetVal = m_FreeBuffers.Remove(it);
	if (nRetVal != XN_STATUS_OK)
	{
		xnOSLeaveCriticalSection(&m_hLock);
		return XN_STATUS_ALLOC_FAILED;
	}

	pBuffer->m_nRefCount = 1;
	xnDumpWriteString(m_dump, "%u taken from pool\n", pBuffer->m_nID);

	xnOSLeaveCriticalSection(&m_hLock);

	*ppBuffer = pBuffer;
	
	return (XN_STATUS_OK);
}
コード例 #2
0
XnStatus XnSensorDepthStream::SetMirror(XnBool bIsMirrored)
{
	XnStatus nRetVal = XN_STATUS_OK;

	xnOSEnterCriticalSection(GetLock());

	// set firmware mirror
	XnBool bFirmwareMirror = (bIsMirrored == TRUE && m_Helper.GetFirmwareVersion() >= XN_SENSOR_FW_VER_5_0);

	nRetVal = m_Helper.SimpleSetFirmwareParam(m_FirmwareMirror, (XnUInt16)bFirmwareMirror);
	if (nRetVal != XN_STATUS_OK)
	{
		xnOSLeaveCriticalSection(GetLock());
		return (nRetVal);
	}

	// update prop
	nRetVal = XnDepthStream::SetMirror(bIsMirrored);

	xnOSLeaveCriticalSection(GetLock());
	XN_IS_STATUS_OK(nRetVal);

	if (m_depthUtilsHandle != NULL)
	{
		nRetVal = DepthUtilsSetDepthConfiguration(m_depthUtilsHandle, GetXRes(), GetYRes(), GetOutputFormat(), IsMirrored());
		XN_IS_STATUS_OK(nRetVal);
	}

	return (XN_STATUS_OK);
}
コード例 #3
0
XnStatus XnSensorAudioStream::ReadImpl(XnStreamData *pStreamOutput)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	XnDevicePrivateData* pDevicePrivateData = m_Helper.GetPrivateData();

	pStreamOutput->nDataSize = 0;

	XN_AUDIO_TYPE* pAudioBuf = (XN_AUDIO_TYPE*)pStreamOutput->pData;

	xnOSEnterCriticalSection(&pDevicePrivateData->hAudioBufferCriticalSection);

	// check how many buffers we have
	XnInt32 nAvailbalePackets = pDevicePrivateData->nAudioWriteIndex - pDevicePrivateData->nAudioReadIndex;
	if (nAvailbalePackets < 0)
		nAvailbalePackets += pDevicePrivateData->nAudioBufferNumOfPackets;

	// now check if stream frame buffer has enough space
	if (GetRequiredDataSize() < (XnUInt32)nAvailbalePackets * pDevicePrivateData->nAudioPacketSize)
	{
		xnOSLeaveCriticalSection(&pDevicePrivateData->hAudioBufferCriticalSection);
		return (XN_STATUS_IO_INVALID_STREAM_AUDIO_BUFFER_SIZE);
	}

	// take first packet timestamp
	pStreamOutput->nTimestamp = pDevicePrivateData->pAudioPacketsTimestamps[pDevicePrivateData->nAudioReadIndex];
	XnUChar* pPacketData = pDevicePrivateData->pAudioBuffer + (pDevicePrivateData->nAudioReadIndex * pDevicePrivateData->nAudioPacketSize);

	// copy
	while (pDevicePrivateData->nAudioReadIndex != pDevicePrivateData->nAudioWriteIndex)
	{
		xnOSMemCopy(pAudioBuf, pPacketData, pDevicePrivateData->nAudioPacketSize);
		pAudioBuf += pDevicePrivateData->nAudioPacketSize;
		pStreamOutput->nDataSize += pDevicePrivateData->nAudioPacketSize;

		pDevicePrivateData->nAudioReadIndex++;
		pPacketData += pDevicePrivateData->nAudioPacketSize;
		if (pDevicePrivateData->nAudioReadIndex == pDevicePrivateData->nAudioBufferNumOfPackets)
		{
			pDevicePrivateData->nAudioReadIndex = 0;
			pPacketData = pDevicePrivateData->pAudioBuffer;
		}
	}

	xnOSLeaveCriticalSection(&pDevicePrivateData->hAudioBufferCriticalSection);

	++m_nFrameID;
	pStreamOutput->nFrameID = m_nFrameID;
	
	return (XN_STATUS_OK);
}
コード例 #4
0
ファイル: XnNodeManager.cpp プロジェクト: nixz/OpenNI
XnNode* XnNodeManager::Allocate()
{
    XnNode* pResult = NULL;

    xnOSEnterCriticalSection(&m_hCriticalSection);

    if (m_eInitializationState == XN_NM_INIT_STATE_CREATE_INTERNAL_LIST)
    {
        pResult = &(m_InitialNodes[0]);
    }
    else if (m_eInitializationState == XN_NM_INIT_STATE_CREATE_FIRST_LINK)
    {
        pResult = &(m_InitialNodes[1]);
    }

    if (pResult != NULL)
    {
        xnOSLeaveCriticalSection(&m_hCriticalSection);
        return pResult;
    }

    // Check if resize is in order
    if (m_nCurrentAvailability == 1 ||
            XnFloat(m_nCurrentOccupancy)/m_nCurrentCapacity > 0.75)
    {
        XnStatus rc = Resize((XnUInt32)(m_nCurrentCapacity*0.5));
        if (rc != XN_STATUS_OK && m_nCurrentAvailability == 1)
        {
            // Couldn't resize, and there is only one node available
            // We'll need that one node to add to the list, to contain all new nodes
            // So there are actually no available nodes....
            xnOSLeaveCriticalSection(&m_hCriticalSection);
            return NULL;
        }
    }

    m_nCurrentOccupancy++;
    m_nCurrentAvailability--;

    // Return the first available
    XnNode* pOut = m_pFirstAvailable;
    m_pFirstAvailable = m_pFirstAvailable->Next();
    pOut->Next() = NULL;

    xnOSLeaveCriticalSection(&m_hCriticalSection);

    return pOut;
}
コード例 #5
0
void XnAudioProcessor::ProcessWholePacket(const XnSensorProtocolResponseHeader* pHeader, const XnUChar* pData)
{
	xnOSEnterCriticalSection(&m_pDevicePrivateData->hAudioBufferCriticalSection);

	// take write packet
	XnUChar* pWritePacket = m_pDevicePrivateData->pAudioBuffer + (m_pDevicePrivateData->nAudioWriteIndex * m_pDevicePrivateData->nAudioPacketSize);

	if (m_bDeleteChannel)
	{
		XnUInt16* pSamples = (XnUInt16*)pData;
		XnUInt16* pSamplesEnd = (XnUInt16*)(pData + pHeader->nBufSize);
		XnUInt16* pOutput = (XnUInt16*)pWritePacket;

		while (pSamples < pSamplesEnd)
		{
			*pOutput = *pSamples;

			pOutput++;
			// skip a sample
			pSamples += 2;
		}
	}
	else
	{
		// copy data
		xnOSMemCopy(pWritePacket, pData, pHeader->nBufSize);
	}

	// mark timestamp
	m_pDevicePrivateData->pAudioPacketsTimestamps[m_pDevicePrivateData->nAudioWriteIndex] = GetTimeStamp(pHeader->nTimeStamp);

	if (m_nLastPacketID % 10 == 0)
	{
		XnUInt64 nSysTime;
		xnOSGetTimeStamp(&nSysTime);

		xnDumpFileWriteString(m_pDevicePrivateData->BandwidthDump, "%llu,%s,%d,%d\n",
			nSysTime, "Audio", -1, m_nBytesReceived);

		m_nBytesReceived = 0;
	}

	// move write index forward
	m_pDevicePrivateData->nAudioWriteIndex = (m_pDevicePrivateData->nAudioWriteIndex + 1) % m_pDevicePrivateData->nAudioBufferNumOfPackets;

	// if write index got to read index (end of buffer), move read index forward (and loose a packet)
	if (m_pDevicePrivateData->nAudioWriteIndex == m_pDevicePrivateData->nAudioReadIndex)
	{
		m_pDevicePrivateData->nAudioReadIndex = (m_pDevicePrivateData->nAudioReadIndex + 1) % m_pDevicePrivateData->nAudioBufferNumOfPackets;
	}

	xnOSLeaveCriticalSection(&m_pDevicePrivateData->hAudioBufferCriticalSection);

	xnDumpFileWriteBuffer(m_AudioInDump, pData, pHeader->nBufSize);

	if (m_pDevicePrivateData->pAudioCallback != NULL)
	{
		m_pDevicePrivateData->pAudioCallback(m_pDevicePrivateData->pAudioCallbackCookie);
	}
}
コード例 #6
0
ファイル: XnScheduler.cpp プロジェクト: 1170390/OpenNI2
XN_C_API XnStatus xnSchedulerRemoveTask(XnScheduler* pScheduler, XnScheduledTask** ppTask)
{
	XnStatus nRetVal = XN_STATUS_OK;

	XN_VALIDATE_INPUT_PTR(pScheduler);
	XN_VALIDATE_INPUT_PTR(ppTask);
	XN_VALIDATE_INPUT_PTR(*ppTask);

	XnScheduledTask* pTask = *ppTask;

	// enter critical section
	nRetVal = xnOSEnterCriticalSection(&pScheduler->hCriticalSection);
	XN_IS_STATUS_OK(nRetVal);

	XnSchedulerRemoveTaskInternal(pScheduler, pTask);

	// leave critical section
	nRetVal = xnOSLeaveCriticalSection(&pScheduler->hCriticalSection);
	XN_IS_STATUS_OK(nRetVal);

	// notify that the list has changed
	nRetVal = xnOSSetEvent(pScheduler->hWakeThreadEvent);
	if (nRetVal != XN_STATUS_OK)
	{
		xnLogWarning(XN_MASK_SCHEDULER, "Failed setting event when removing task: %s", xnGetStatusString(nRetVal));
	}

	xnOSFree(pTask);

	*ppTask = NULL;

	return (XN_STATUS_OK);
}
コード例 #7
0
XnStatus XnFrameBufferManager::CopyLastStableBuffer(void* pDest, XnUInt32 nDestSize, XnUInt32* pnWritten)
{
	// do this inside a lock (so we won't erase memory during copy)
	xnOSEnterCriticalSection(&m_hLock);

	// check size
	if (nDestSize < m_pStableBuffer->GetSize())
	{
		xnOSLeaveCriticalSection(&m_hLock);
		return (XN_STATUS_OUTPUT_BUFFER_OVERFLOW);
	}

	// copy
	m_pStableBuffer->UnsafeCopy(pDest);
	*pnWritten = m_pStableBuffer->GetSize();

	xnOSLeaveCriticalSection(&m_hLock);

	return XN_STATUS_OK;
}
コード例 #8
0
XnStatus XnFrameBufferManager::Reallocate(XnUInt32 nBufferSize)
{
	XnStatus nRetVal = XN_STATUS_OK;

	xnOSEnterCriticalSection(&m_hLock);

	nRetVal = m_pBufferPool->ChangeBufferSize(nBufferSize);
	if (nRetVal != XN_STATUS_OK)
	{
		xnOSLeaveCriticalSection(&m_hLock);
		return (nRetVal);
	}

	// release current ones
	if (m_pWorkingBuffer != NULL)
	{
		m_pBufferPool->DecRef(m_pWorkingBuffer);
	}

	if (m_pStableBuffer != NULL)
	{
		m_pBufferPool->DecRef(m_pStableBuffer);
	}

	// and take one
	if (nBufferSize == 0)
	{
		m_pWorkingBuffer = NULL;
		m_pStableBuffer = NULL;
	}
	else
	{
		// take working buffer
		nRetVal = m_pBufferPool->GetBuffer(&m_pWorkingBuffer);
		XN_IS_STATUS_OK(nRetVal);
	}

	xnOSLeaveCriticalSection(&m_hLock);

	return (XN_STATUS_OK);
}
コード例 #9
0
XnBool LinkContInputStream::IsNewDataAvailable() const
{
	xnOSEnterCriticalSection(&m_hCriticalSection);
	if (!m_bInitialized)
	{
		return FALSE;
	}
	XnBool bNewDataAvailable = m_bNewDataAvailable;
	xnOSLeaveCriticalSection(&m_hCriticalSection);

	return bNewDataAvailable;
}
コード例 #10
0
XnStatus XnBufferPool::ChangeBufferSize(XnUInt32 nBufferSize)
{
	XnStatus nRetVal = XN_STATUS_OK;

	xnDumpWriteString(m_dump, "changing buffer size to %d\n", nBufferSize);

	xnOSEnterCriticalSection(&m_hLock);

	m_nBufferSize = nBufferSize;

	nRetVal = AllocateBuffers();
	if (nRetVal != XN_STATUS_OK)
	{
		xnOSLeaveCriticalSection(&m_hLock);
		return (nRetVal);
	}

	xnOSLeaveCriticalSection(&m_hLock);
	
	return (XN_STATUS_OK);
}
コード例 #11
0
ファイル: XnScheduler.cpp プロジェクト: 1170390/OpenNI2
XN_C_API XnStatus xnSchedulerAddTask(XnScheduler* pScheduler, XnUInt64 nInterval, XnTaskCallbackFuncPtr pCallback, void* pCallbackArg, XnScheduledTask** ppTask)
{
	XnStatus nRetVal = XN_STATUS_OK;

	XN_VALIDATE_INPUT_PTR(pScheduler);
	XN_VALIDATE_INPUT_PTR(pCallback);
	XN_VALIDATE_OUTPUT_PTR(ppTask);

	// create node
	XnScheduledTask* pTask;
	XN_VALIDATE_ALLOC(pTask, XnScheduledTask);

	pTask->nInterval = nInterval;
	pTask->pCallback = pCallback;
	pTask->pCallbackArg = pCallbackArg;

	// calculate next execution
	XnUInt64 nNow;
	xnOSGetTimeStamp(&nNow);
	pTask->nNextTime = nNow + nInterval;
	pTask->pNextTask = NULL;

	// enter critical section
	nRetVal = xnOSEnterCriticalSection(&pScheduler->hCriticalSection);
	if (nRetVal != XN_STATUS_OK)
	{
		xnOSFree(pTask);
		return (nRetVal);
	}

	xnSchedulerAddTaskInternal(pScheduler, pTask);

	// leave critical section
	nRetVal = xnOSLeaveCriticalSection(&pScheduler->hCriticalSection);
	if (nRetVal != XN_STATUS_OK)
	{
		xnOSFree(pTask);
		return (nRetVal);
	}

	// notify that the list has changed
	nRetVal = xnOSSetEvent(pScheduler->hWakeThreadEvent);
	if (nRetVal != XN_STATUS_OK)
	{
		xnLogWarning(XN_MASK_SCHEDULER, "Failed setting event when adding task: %s", xnGetStatusString(nRetVal));
	}

	*ppTask = pTask;

	return (XN_STATUS_OK);
}
コード例 #12
0
ファイル: XnNodeManager.cpp プロジェクト: nixz/OpenNI
void XnNodeManager::Deallocate(XnNode *pNode)
{
    xnOSEnterCriticalSection(&m_hCriticalSection);

    m_nCurrentOccupancy--;
    m_nCurrentAvailability++;

    // Add the returned node as the first available
    pNode->Next() = m_pFirstAvailable;
    pNode->Previous() = NULL;
    m_pFirstAvailable = pNode;

    xnOSLeaveCriticalSection(&m_hCriticalSection);
}
XnStatus XnDeviceModule::SetLockState(XnBool bLocked)
{
	XnStatus nRetVal = XN_STATUS_OK;

	if (bLocked && m_Lock.GetValue() == TRUE)
	{
		return XN_STATUS_NODE_IS_LOCKED;
	}

	xnOSEnterCriticalSection(&m_hLockCS);

	// check again
	if (bLocked && m_Lock.GetValue() == TRUE)
	{
		xnOSLeaveCriticalSection(&m_hLockCS);
		return XN_STATUS_NODE_IS_LOCKED;
	}

	nRetVal = m_Lock.UnsafeUpdateValue(bLocked);
	xnOSLeaveCriticalSection(&m_hLockCS);

	return (nRetVal);
}
コード例 #14
0
ファイル: XnSensorDepthStream.cpp プロジェクト: bouffa/Sensor
XnStatus XnSensorDepthStream::SetMirror(XnBool bIsMirrored)
{
	XnStatus nRetVal = XN_STATUS_OK;

	xnOSEnterCriticalSection(GetLock());

	// set firmware mirror
	XnBool bFirmwareMirror = (bIsMirrored == TRUE && m_Helper.GetFirmwareVersion() >= XN_SENSOR_FW_VER_5_0);

	nRetVal = m_Helper.SimpleSetFirmwareParam(m_FirmwareMirror, (XnUInt16)bFirmwareMirror);
	if (nRetVal != XN_STATUS_OK)
	{
		xnOSLeaveCriticalSection(GetLock());
		return (nRetVal);
	}

	// update prop
	nRetVal = XnDepthStream::SetMirror(bIsMirrored);
	xnOSLeaveCriticalSection(GetLock());
	XN_IS_STATUS_OK(nRetVal);

	return (XN_STATUS_OK);
}
コード例 #15
0
void XnBufferPool::AddRef(XnBuffer* pBuffer)
{
	if (pBuffer == NULL)
	{
		return;
	}

	xnOSEnterCriticalSection(&m_hLock);
	XnBufferInPool* pBufferInPool = (XnBufferInPool*)pBuffer;
	++pBufferInPool->m_nRefCount;

	xnDumpWriteString(m_dump, "%u add ref (%d)\n", pBufferInPool->m_nID, pBufferInPool->m_nRefCount);

	xnOSLeaveCriticalSection(&m_hLock);
}
コード例 #16
0
void LinkContInputStream::Shutdown()
{
	if (!m_bInitialized)
		return;

	xnOSEnterCriticalSection(&m_hCriticalSection);

	XN_ALIGNED_FREE_AND_NULL(m_pUserBuffer);
	XN_ALIGNED_FREE_AND_NULL(m_pWorkingBuffer);

	m_bInitialized = FALSE;
	m_bNewDataAvailable = FALSE;
    LinkInputStream::Shutdown();

	xnOSLeaveCriticalSection(&m_hCriticalSection);
}
コード例 #17
0
void XnFrameBufferManager::MarkWriteBufferAsStable(XnUInt64 nTimestamp, XnUInt32* pnFrameID)
{
	xnOSEnterCriticalSection(&m_hLock);

	// lock buffer pool (for rollback option)
	m_pBufferPool->Lock();

	XnBuffer* pPrevStable = m_pStableBuffer;

	// release previous stable
	if (m_pStableBuffer != NULL)
	{
		m_pBufferPool->DecRef(m_pStableBuffer);
	}

	// mark working as stable
	m_nStableFrameID++;
	m_nStableTimestamp = nTimestamp;
	*pnFrameID = m_nStableFrameID;

	m_pStableBuffer = m_pWorkingBuffer; // no need to add ref, working buffer will be replaced in a moment

	// take a new working buffer
	XnStatus nRetVal = m_pBufferPool->GetBuffer(&m_pWorkingBuffer);
	if (nRetVal != XN_STATUS_OK)
	{
		xnLogError(XN_MASK_DDK, "Failed to get new working buffer!");
		// we'll return back to our old working one
		m_pWorkingBuffer->Reset();

		m_pStableBuffer = pPrevStable;
		m_pBufferPool->AddRef(m_pStableBuffer);
		m_pBufferPool->Unlock();
		return;
	}

	m_pBufferPool->Unlock();
	xnOSLeaveCriticalSection(&m_hLock);

	// reset new working
	m_pWorkingBuffer->Reset();

	// notify stream that new data is available
	m_NewFrameEvent.Raise(this, m_nStableTimestamp);
}
コード例 #18
0
void XnFrameBufferManager::ReadLastStableBuffer(XnBuffer** ppBuffer, XnUInt64* pnTimestamp, XnUInt32* pnFrameID)
{
	xnOSEnterCriticalSection(&m_hLock);

	// take a pointer to stable one
	*ppBuffer = m_pStableBuffer;
	// and add ref to it (so it wouldn't be deleted)
	if (m_pStableBuffer != NULL)
	{
		m_pBufferPool->AddRef(m_pStableBuffer);
	}

	// take props
	*pnTimestamp = m_nStableTimestamp;
	*pnFrameID = m_nStableFrameID;

	xnOSLeaveCriticalSection(&m_hLock);
}
コード例 #19
0
void XnFrameBufferManager::MarkWriteBufferAsStable(XnUInt32* pnFrameID)
{
    xnOSEnterCriticalSection(&m_hLock);

    OniFrame* pStableBuffer = m_pWorkingBuffer;
    pStableBuffer->dataSize = m_writeBuffer.GetSize();

    // lock buffer pool (for rollback option)
    m_pBufferPool->Lock();

    // mark working as stable
    m_nStableFrameID++;
    *pnFrameID = m_nStableFrameID;
    pStableBuffer->frameIndex = m_nStableFrameID;

    // take a new working buffer
    m_pWorkingBuffer = m_pBufferPool->Acquire();
    if (m_pWorkingBuffer == NULL)
    {
        xnLogError(XN_MASK_DDK, "Failed to get new working buffer!");

        // we'll return back to our old working one
        m_pWorkingBuffer = pStableBuffer;
        m_pWorkingBuffer->dataSize = 0;

        m_pBufferPool->Unlock();

        XN_ASSERT(FALSE);
        return;
    }

    m_writeBuffer.SetExternalBuffer((XnUChar*)m_pWorkingBuffer->data, m_pBufferPool->GetFrameSize());

    m_pBufferPool->Unlock();
    xnOSLeaveCriticalSection(&m_hLock);

    // reset new working
    m_pWorkingBuffer->dataSize = 0;

    // notify stream that new data is available
    NewFrameEventArgs args;
    args.pFrame = pStableBuffer;
    m_NewFrameEvent.Raise(args);
}
コード例 #20
0
ファイル: XnPixelStream.cpp プロジェクト: eruffaldi/OpenNI2
void XnPixelStream::NewDataAvailable(OniFrame* pFrame)
{
	// crop
	xnOSEnterCriticalSection(GetLock());
	OniCropping cropping = *GetCropping();
	xnOSLeaveCriticalSection(GetLock());

	if (cropping.enabled)
	{
		XnStatus nRetVal = CropImpl(pFrame, &cropping);
		if (nRetVal != XN_STATUS_OK)
		{
			xnLogWarning(XN_MASK_DDK, "Failed to crop! Frame will be dropped");
			return;
		}
	}

	XnFrameStream::NewDataAvailable(pFrame);
}
コード例 #21
0
XnStatus XnFrameBufferManager::Reallocate(XnUInt32 nBufferSize)
{
    xnOSEnterCriticalSection(&m_hLock);

    // release current ones
    if (m_pWorkingBuffer != NULL)
    {
        m_pBufferPool->DecRef(m_pWorkingBuffer);
        m_pWorkingBuffer = NULL;
    }

    // Change the buffer size.
    m_pBufferPool->SetFrameSize(nBufferSize);

    // TODO: validate all is OK
    /*if (nRetVal != XN_STATUS_OK)
    {
    	xnOSLeaveCriticalSection(&m_hLock);
    	return (nRetVal);
    }*/

    // and take one
    if (nBufferSize == 0)
    {
        m_pWorkingBuffer = NULL;
    }
    else
    {
        // take working buffer
        m_pWorkingBuffer = m_pBufferPool->Acquire();
        if (m_pWorkingBuffer == NULL)
        {
            XN_ASSERT(FALSE);
            return XN_STATUS_ERROR;
        }
        m_writeBuffer.SetExternalBuffer((XnUChar*)m_pWorkingBuffer->data, nBufferSize);
    }

    xnOSLeaveCriticalSection(&m_hLock);

    return (XN_STATUS_OK);
}
コード例 #22
0
ファイル: XnProfiling.cpp プロジェクト: ABMNYZ/OpenNI
XN_C_API XnStatus xnProfilingSectionStart(const char* csSectionName, XnBool bMT, XnProfilingHandle* pHandle)
{
	if (!g_ProfilingData.bInitialized)
		return XN_STATUS_OK;

	if (*pHandle == INVALID_PROFILING_HANDLE)
	{
		xnOSEnterCriticalSection(&g_ProfilingData.hCriticalSection);
		if (*pHandle == INVALID_PROFILING_HANDLE)
		{
			XnUInt32 nIndex = g_ProfilingData.nSectionCount;
			g_ProfilingData.nSectionCount++;
			XnProfiledSection* pSection = &g_ProfilingData.aSections[nIndex];
			pSection->nIndentation = gt_nStackDepth;

			XnUInt32 nChar = 0;
			for (nChar = 0; nChar < gt_nStackDepth*2; ++nChar)
				pSection->csName[nChar] = ' ';

			strncpy(pSection->csName + nChar, csSectionName, MAX_SECTION_NAME);

			if (strlen(pSection->csName) > g_ProfilingData.nMaxSectionName)
				g_ProfilingData.nMaxSectionName = strlen(pSection->csName);

			if (bMT)
			{
				pSection->bMultiThreaded = TRUE;
				xnOSCreateCriticalSection(&pSection->hLock);
			}

			*pHandle = nIndex;
		}
		xnOSLeaveCriticalSection(&g_ProfilingData.hCriticalSection);
	}

	gt_nStackDepth++;

	XnProfiledSection* pSection = &g_ProfilingData.aSections[*pHandle];
	xnOSGetHighResTimeStamp(&pSection->nCurrStartTime);

	return XN_STATUS_OK;
}
コード例 #23
0
XnStatus XnPixelStream::ReadImpl(XnStreamData* pStreamOutput)
{
    XnStatus nRetVal = XN_STATUS_OK;

    // first read
    nRetVal = XnFrameStream::ReadImpl(pStreamOutput);
    XN_IS_STATUS_OK(nRetVal);

    // now crop
    xnOSEnterCriticalSection(GetLock());
    XnCropping cropping = *GetCropping();
    xnOSLeaveCriticalSection(GetLock());

    if (cropping.bEnabled)
    {
        nRetVal = CropImpl(pStreamOutput, &cropping);
        XN_IS_STATUS_OK(nRetVal);
    }

    return (XN_STATUS_OK);
}
コード例 #24
0
void XnBufferPool::DecRef(XnBuffer* pBuffer)
{
	if (pBuffer == NULL)
	{
		return;
	}

	XnBufferInPool* pBufInPool = (XnBufferInPool*)pBuffer;

	xnOSEnterCriticalSection(&m_hLock);

	xnDumpWriteString(m_dump, "%u dec ref (%d)", pBufInPool->m_nID, pBufInPool->m_nRefCount-1);

	if (--pBufInPool->m_nRefCount == 0)
	{
		if (pBufInPool->m_bDestroy)
		{
			// remove it from all buffers pool
			XnBuffersList::ConstIterator it = m_AllBuffers.Find(pBufInPool);
			XN_ASSERT(it != m_AllBuffers.end());
			m_AllBuffers.Remove(it);
			// and free it
			DestroyBuffer(pBufInPool);
			xnDumpWriteString(m_dump, "destroy!\n");
		}
		else
		{
			// return it to free buffers list
			m_FreeBuffers.AddLast(pBufInPool);
			xnDumpWriteString(m_dump, "return to pool!\n");
		}
	}
	else
	{
		xnDumpWriteString(m_dump, "\n");
	}

	xnOSLeaveCriticalSection(&m_hLock);
}
コード例 #25
0
XnStatus XnDeviceStream::Read(XnStreamData* pStreamOutput)
{
	XnStatus nRetVal = XN_STATUS_OK;

	// check the size of the stream output object
	nRetVal = XnStreamDataCheckSize(pStreamOutput, GetRequiredDataSize());
	XN_IS_STATUS_OK(nRetVal);

	// first mark old data as old
	pStreamOutput->bIsNew = FALSE;

	// now check if we have some new data
	if (m_bNewDataAvailable)
	{
		// copy data
		nRetVal = ReadImpl(pStreamOutput);
		XN_IS_STATUS_OK(nRetVal);

		xnOSEnterCriticalSection(&m_hCriticalSection);
		XnBool bMirror = IsMirrored();
		xnOSLeaveCriticalSection(&m_hCriticalSection);

		// mirror it if needed
		if (bMirror)
		{
			nRetVal = Mirror(pStreamOutput);
			XN_IS_STATUS_OK(nRetVal);
		}

		// mark that data is new
		pStreamOutput->bIsNew = TRUE;

		// and that we don't have new info
		m_bNewDataAvailable = FALSE;
	}

	return (XN_STATUS_OK);
}
コード例 #26
0
void XnVMessageListener::BaseUpdate(XnVMessage* pMessage)
{
	if (!m_bThreadProtectionQueueMode || IsInActivityThread())
	{
		xnLogVerbose(XNV_NITE_MASK_FLOW, "Listener %s [0x%08x]: Update (%s)",
			GetListenerName(), this, pMessage->GetType());

		HandleCCMessages(pMessage);

		xnOSEnterCriticalSection(&m_hListenerCS);
		Update(pMessage);
		xnOSLeaveCriticalSection(&m_hListenerCS);
		m_pUpdateCBs->Raise(pMessage);
	}
	else
	{
		xnLogVerbose(XNV_NITE_MASK_MT_QUEUE, "Listener %s [%08x]: Adding to queue (%s)",
			GetListenerName(), this, pMessage->GetType());

		XnVMessage* pNewMessage = pMessage->Clone();
		m_pMessageQueue->Push(pNewMessage);
	}
} // XnVMessageListener::BaseUpdate
コード例 #27
0
ファイル: XnScheduler.cpp プロジェクト: 1170390/OpenNI2
XN_C_API XnStatus xnSchedulerRescheduleTask(XnScheduler* pScheduler, XnScheduledTask* pTask, XnUInt64 nInterval)
{
	XnStatus nRetVal = XN_STATUS_OK;

	XN_VALIDATE_INPUT_PTR(pScheduler);
	XN_VALIDATE_INPUT_PTR(pTask);

	// enter critical section
	nRetVal = xnOSEnterCriticalSection(&pScheduler->hCriticalSection);
	XN_IS_STATUS_OK(nRetVal);

	// remove it from list
	XnSchedulerRemoveTaskInternal(pScheduler, pTask);

	pTask->nInterval = nInterval;

	// update its next execution
	XnUInt64 nNow;
	xnOSGetTimeStamp(&nNow);
	pTask->nNextTime = nNow + nInterval;

	// and add it back to the queue
	xnSchedulerAddTaskInternal(pScheduler, pTask);

	// leave critical section
	nRetVal = xnOSLeaveCriticalSection(&pScheduler->hCriticalSection);
	XN_IS_STATUS_OK(nRetVal);

	// notify that the list has changed
	nRetVal = xnOSSetEvent(pScheduler->hWakeThreadEvent);
	if (nRetVal != XN_STATUS_OK)
	{
		xnLogWarning(XN_MASK_SCHEDULER, "Failed setting event when rescheduling task: %s", xnGetStatusString(nRetVal));
	}

	return (XN_STATUS_OK);
}
コード例 #28
0
ファイル: XnProfiling.cpp プロジェクト: ABMNYZ/OpenNI
XN_C_API XnStatus xnProfilingSectionEnd(XnProfilingHandle* pHandle)
{
	if (!g_ProfilingData.bInitialized)
		return XN_STATUS_OK;

	XnUInt64 nNow;
	xnOSGetHighResTimeStamp(&nNow);

	XnProfiledSection* pSection = &g_ProfilingData.aSections[*pHandle];
	if (pSection->bMultiThreaded)
	{
		xnOSEnterCriticalSection(&pSection->hLock);
	}
	pSection->nTimesExecuted++;
	pSection->nTotalTime += nNow - pSection->nCurrStartTime;
	if (pSection->bMultiThreaded)
	{
		xnOSLeaveCriticalSection(&pSection->hLock);
	}

	gt_nStackDepth--;

	return XN_STATUS_OK;
}
コード例 #29
0
ファイル: XnSensorDepthStream.cpp プロジェクト: bouffa/Sensor
XnStatus XnSensorDepthStream::SetCropping(const XnCropping* pCropping)
{
	XnStatus nRetVal = XN_STATUS_OK;

	nRetVal = ValidateCropping(pCropping);
	XN_IS_STATUS_OK(nRetVal);

	xnOSEnterCriticalSection(GetLock());

	if (m_Helper.GetFirmwareVersion() > XN_SENSOR_FW_VER_3_0)
	{
		nRetVal = m_Helper.StartFirmwareTransaction();
		if (nRetVal != XN_STATUS_OK)
		{
			xnOSLeaveCriticalSection(GetLock());
			return (nRetVal);
		}

		if (pCropping->bEnabled)
		{
			nRetVal = m_Helper.SimpleSetFirmwareParam(m_FirmwareCropSizeX, pCropping->nXSize);

			if (nRetVal == XN_STATUS_OK)
				nRetVal = m_Helper.SimpleSetFirmwareParam(m_FirmwareCropSizeY, pCropping->nYSize);

			if (nRetVal == XN_STATUS_OK)
				nRetVal = m_Helper.SimpleSetFirmwareParam(m_FirmwareCropOffsetX, pCropping->nXOffset);

			if (nRetVal == XN_STATUS_OK)
				nRetVal = m_Helper.SimpleSetFirmwareParam(m_FirmwareCropOffsetY, pCropping->nYOffset);
		}

		if (nRetVal == XN_STATUS_OK)
		{
			nRetVal = m_Helper.SimpleSetFirmwareParam(m_FirmwareCropEnabled, (XnUInt16)pCropping->bEnabled);
		}

		if (nRetVal != XN_STATUS_OK)
		{
			m_Helper.RollbackFirmwareTransaction();
			m_Helper.UpdateFromFirmware(m_FirmwareCropEnabled);
			m_Helper.UpdateFromFirmware(m_FirmwareCropOffsetX);
			m_Helper.UpdateFromFirmware(m_FirmwareCropOffsetY);
			m_Helper.UpdateFromFirmware(m_FirmwareCropSizeX);
			m_Helper.UpdateFromFirmware(m_FirmwareCropSizeY);
			xnOSLeaveCriticalSection(GetLock());
			return (nRetVal);
		}

		nRetVal = m_Helper.CommitFirmwareTransactionAsBatch();
		if (nRetVal != XN_STATUS_OK)
		{
			m_Helper.UpdateFromFirmware(m_FirmwareCropEnabled);
			m_Helper.UpdateFromFirmware(m_FirmwareCropOffsetX);
			m_Helper.UpdateFromFirmware(m_FirmwareCropOffsetY);
			m_Helper.UpdateFromFirmware(m_FirmwareCropSizeX);
			m_Helper.UpdateFromFirmware(m_FirmwareCropSizeY);
			xnOSLeaveCriticalSection(GetLock());
			return (nRetVal);
		}
	}

	nRetVal = XnDepthStream::SetCropping(pCropping);
	xnOSLeaveCriticalSection(GetLock());
	XN_IS_STATUS_OK(nRetVal);

	return (XN_STATUS_OK);
}
コード例 #30
0
ファイル: XnScheduler.cpp プロジェクト: 1170390/OpenNI2
/* This is the actual scheduler function. It is being run in its own thread. */
XN_THREAD_PROC xnSchedulerThreadFunc(XN_THREAD_PARAM pThreadParam)
{
	XnScheduler* pScheduler = (XnScheduler*)pThreadParam;

	XnUInt64 nNow;
	while (!pScheduler->bStopThread)
	{
		// check when next task should be executed
		XnUInt64 nWait = XN_WAIT_INFINITE;

		XnScheduledTask* pTask = NULL;
		XnTaskCallbackFuncPtr pCallback = NULL;
		void* pCallbackArg = NULL;

		// check if something is in the list
		if (pScheduler->pFirst != NULL)
		{
			// enter critical section
			xnOSEnterCriticalSection(&pScheduler->hCriticalSection);

			pTask = pScheduler->pFirst;
			if (pTask != NULL)
			{
				xnOSGetTimeStamp(&nNow);
				if (pTask->nNextTime < nNow)
				{
					// task should be executed
					pCallback = pTask->pCallback;
					pCallbackArg = pTask->pCallbackArg;

					// remove it from the list
					pScheduler->pFirst = pTask->pNextTask;

					// calculate next time
					pTask->nNextTime += pTask->nInterval;

					// add it to the list again
					xnSchedulerAddTaskInternal(pScheduler, pTask);
				}
				else
				{
					nWait = pTask->nNextTime - nNow;
				}
			}

			// leave critical section
			xnOSLeaveCriticalSection(&pScheduler->hCriticalSection);

			if (pCallback != NULL)
			{
				// execute task (outside critical section)
				pCallback(pCallbackArg);
				// no need to wait (we don't know how much time did callback take)
				nWait = 0;
			}
		}

		// wait for a change of the list, or the time of the next task
		xnOSWaitEvent(pScheduler->hWakeThreadEvent, (XnUInt32)nWait);
	}

	XN_THREAD_PROC_RETURN(XN_STATUS_OK);
}