XnStatus xnUSBPlatformSpecificInit() { xnLogVerbose(XN_MASK_USB, "Initializing USB..."); // initialize the library int rc = libusb_init(&g_InitData.pContext); if (rc != 0) { return (XN_STATUS_USB_INIT_FAILED); } XnStatus nRetVal = xnOSCreateCriticalSection(&g_InitData.hLock); XN_IS_STATUS_OK(nRetVal); #ifdef XN_USE_UDEV // initialize the UDEV Events thread g_bShouldRunUDEVThread = true; nRetVal = xnOSCreateThread(xnUSBUDEVEventsThread, NULL, &g_hUDEVThread); if (nRetVal != XN_STATUS_OK) { g_hUDEVThread = NULL; g_bShouldRunUDEVThread = false; // clean-up xnUSBPlatformSpecificShutdown(); return nRetVal; } #endif //libusb_set_debug(g_InitData.pContext, 3); xnLogInfo(XN_MASK_USB, "USB is initialized."); return (XN_STATUS_OK); }
XnStatus xnUSBAsynchThreadAddRef() { XnStatus nRetVal = XN_STATUS_OK; xnl::AutoCSLocker locker(g_InitData.hLock); ++g_InitData.nOpenDevices; if (g_InitData.hThread == NULL) { xnLogVerbose(XN_MASK_USB, "Starting libusb asynch thread..."); // mark thread should run g_InitData.bShouldThreadRun = TRUE; // and start thread nRetVal = xnOSCreateThread(xnUSBHandleEventsThread, NULL, &g_InitData.hThread); if (nRetVal != XN_STATUS_OK) { // clean-up xnUSBPlatformSpecificShutdown(); return nRetVal; } // set thread priority to critical nRetVal = xnOSSetThreadPriority(g_InitData.hThread, XN_PRIORITY_CRITICAL); if (nRetVal != 0) { xnLogWarning(XN_MASK_USB, "USB events thread: Failed to set thread priority to critical. This might cause loss of data..."); printf("Warning: USB events thread - failed to set priority. This might cause loss of data...\n"); } } return (XN_STATUS_OK); }
XN_C_API XnStatus xnUSBShutdown() { XnStatus nRetVal = XN_STATUS_OK; if (g_bUSBWasInit == TRUE) { nRetVal = xnUSBPlatformSpecificShutdown(); XN_IS_STATUS_OK(nRetVal); g_bUSBWasInit = FALSE; } else { return (XN_STATUS_USB_NOT_INIT); } return (XN_STATUS_OK); }