OniStatus Context::waitForStreams(OniStreamHandle* pStreams, int streamCount, int* pStreamIndex, int timeout) { static const int MAX_WAITED_STREAMS = 50; Device* deviceList[MAX_WAITED_STREAMS]; VideoStream* streamsList[MAX_WAITED_STREAMS]; unsigned long long oldestTimestamp = XN_MAX_UINT64; int oldestIndex = -1; if (streamCount > MAX_WAITED_STREAMS) { m_errorLogger.Append("Cannot wait on more than %d streams", MAX_WAITED_STREAMS); return ONI_STATUS_NOT_SUPPORTED; } int numDevices = 0; for (int i = 0; i < streamCount; ++i) { if (pStreams[i] == NULL) { continue; } streamsList[i] = ((_OniStream*)pStreams[i])->pStream; Device* pDevice = &streamsList[i]->getDevice(); // Check if device already exists. bool found = false; for (int j = 0; j < numDevices; ++j) { if (deviceList[j] == pDevice) { found = true; break; } } // Add new device to list. if (!found) { deviceList[numDevices] = pDevice; ++numDevices; } } XN_EVENT_HANDLE hEvent = getThreadEvent(); XnUInt64 passedTime; XnOSTimer workTimer; XnUInt32 timeToWait = timeout; xnOSStartTimer(&workTimer); do { for (int i = 0; i < streamCount; ++i) { if (pStreams[i] == NULL) continue; VideoStream* pStream = ((_OniStream*)pStreams[i])->pStream; pStream->lockFrame(); OniFrame* pFrame = pStream->peekFrame(); if (pFrame != NULL && pFrame->timestamp < oldestTimestamp) { oldestTimestamp = pFrame->timestamp; oldestIndex = i; } pStream->unlockFrame(); } if (oldestIndex != -1) { *pStreamIndex = oldestIndex; break; } // 'Poke' the driver to attempt to receive more frames. for (int j = 0; j < numDevices; ++j) { deviceList[j]->tryManualTrigger(); } if(timeout != ONI_TIMEOUT_FOREVER) { xnOSQueryTimer(workTimer, &passedTime); if((int)passedTime < timeout) timeToWait = timeout - (int)passedTime; else timeToWait = 0; } } while (XN_STATUS_OK == xnOSWaitEvent(hEvent, timeToWait)); xnOSStopTimer(&workTimer); if (oldestIndex != -1) { return ONI_STATUS_OK; } m_errorLogger.Append("waitForStreams: timeout reached"); return ONI_STATUS_TIME_OUT; }
OniStatus Context::waitForStreams(OniStreamHandle* pStreams, int streamCount, int* pStreamIndex, int timeout) { static const int MAX_WAITED_DEVICES = 20; Device* deviceList[MAX_WAITED_DEVICES]; unsigned long long oldestTimestamp = XN_MAX_UINT64; int oldestIndex = -1; int numDevices = 0; for (int i = 0; i < streamCount; ++i) { if (pStreams[i] != NULL) { VideoStream* pStream = ((_OniStream*)pStreams[i])->pStream; Device* pDevice = &pStream->getDevice(); // Check if device already exists. bool found = false; for (int j = 0; j < numDevices; ++j) { if (deviceList[j] == pDevice) { found = true; break; } } // Add new device to list. if (!found) { if (numDevices < MAX_WAITED_DEVICES) { deviceList[numDevices] = pDevice; ++numDevices; } else { // Cannot wait on streams from more than MAX_WAITED_DEVICES devices. return ONI_STATUS_NOT_SUPPORTED; } } } } do { for (int i = 0; i < streamCount; ++i) { if (pStreams[i] == NULL) continue; VideoStream* pStream = ((_OniStream*)pStreams[i])->pStream; pStream->lockFrame(); OniFrame* pFrame = pStream->peekFrame(); if (pFrame != NULL && pFrame->timestamp < oldestTimestamp) { oldestTimestamp = pFrame->timestamp; oldestIndex = i; } pStream->unlockFrame(); } if (oldestIndex != -1) { *pStreamIndex = oldestIndex; return ONI_STATUS_OK; } // 'Poke' the driver to attempt to receive more frames. for (int j = 0; j < numDevices; ++j) { deviceList[j]->tryManualTrigger(); } } while (m_newFrameAvailableEvent.Wait(timeout) == XN_STATUS_OK); m_errorLogger.Append("waitForStreams: timeout reached"); return ONI_STATUS_TIME_OUT; }