00001 /********************************************************************* 00002 * Software License Agreement (BSD License) 00003 * 00004 * Copyright (C) 2010-2012 Ken Tossell 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions 00009 * are met: 00010 * 00011 * * Redistributions of source code must retain the above copyright 00012 * notice, this list of conditions and the following disclaimer. 00013 * * Redistributions in binary form must reproduce the above 00014 * copyright notice, this list of conditions and the following 00015 * disclaimer in the documentation and/or other materials provided 00016 * with the distribution. 00017 * * Neither the name of the author nor other contributors may be 00018 * used to endorse or promote products derived from this software 00019 * without specific prior written permission. 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00022 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00023 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00024 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00025 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00026 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00027 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00028 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00029 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00031 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00032 * POSSIBILITY OF SUCH DAMAGE. 00033 *********************************************************************/ 00078 #include "libuvc.h" 00079 #include "libuvc_internal.h" 00080 00086 void *_uvc_handle_events(void *arg) { 00087 uvc_context_t *ctx = (uvc_context_t *) arg; 00088 00089 while (!ctx->kill_handler_thread) 00090 { 00091 if (ctx->usb_ctx) libusb_handle_events(ctx->usb_ctx); 00092 else break; 00093 } 00094 00095 return NULL; 00096 } 00097 00108 uvc_error_t uvc_init(uvc_context_t **pctx, struct libusb_context *usb_ctx) { 00109 uvc_error_t ret = UVC_SUCCESS; 00110 uvc_context_t *ctx = calloc(1, sizeof(*ctx)); 00111 00112 if (usb_ctx == NULL) { 00113 ret = libusb_init(&ctx->usb_ctx); 00114 ctx->own_usb_ctx = 1; 00115 if (ret != UVC_SUCCESS) { 00116 free(ctx); 00117 ctx = NULL; 00118 } 00119 } else { 00120 ctx->own_usb_ctx = 0; 00121 ctx->usb_ctx = usb_ctx; 00122 } 00123 00124 if (ctx != NULL) 00125 *pctx = ctx; 00126 00127 return ret; 00128 } 00129 00142 void uvc_exit(uvc_context_t *ctx) { 00143 uvc_device_handle_t *devh; 00144 00145 DL_FOREACH(ctx->open_devices, devh) { 00146 uvc_close(devh); 00147 } 00148 00149 if (ctx->own_usb_ctx) 00150 libusb_exit(ctx->usb_ctx); 00151 00152 free(ctx); 00153 } 00154 00163 void uvc_start_handler_thread(uvc_context_t *ctx) { 00164 if (ctx->own_usb_ctx) 00165 pthread_create(&ctx->handler_thread, NULL, _uvc_handle_events, (void*) ctx); 00166 } 00167