static int setup_kinect(int index, int fmt, int is_depth) { pending_runloop_tasks_inc(); pthread_mutex_lock(&runloop_lock); int thread_running_prev = thread_running; if (!thread_running) init_thread(); if (!kinects[index]) { kinects[index] = alloc_kinect(index); } if (!kinects[index]) { printf("Error: Invalid index [%d]\n", index); // If we started the thread, we need to bring it back if (!thread_running_prev) { thread_running = 0; pthread_mutex_unlock(&runloop_lock); pending_runloop_tasks_dec(); pthread_join(thread, NULL); } else { pthread_mutex_unlock(&runloop_lock); pending_runloop_tasks_dec(); } return -1; } freenect_set_user(kinects[index]->dev, kinects[index]); buffer_ring_t *buf; if (is_depth) buf = &kinects[index]->depth; else buf = &kinects[index]->video; pthread_mutex_lock(&buf->lock); if (buf->fmt != fmt) { if (is_depth) change_depth_format(kinects[index], (freenect_depth_format)fmt); else change_video_format(kinects[index], (freenect_video_format)fmt); } pthread_mutex_unlock(&buf->lock); pthread_mutex_unlock(&runloop_lock); pending_runloop_tasks_dec(); return 0; }
static void runloop_exit() { pthread_mutex_unlock(&runloop_lock); pending_runloop_tasks_dec(); }