X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fsession.c;h=a3f6a86d3ef8226659f67f5fc222ed44726bf14c;hb=7a0b98b544ca00f351295f21f895442680b1c014;hp=276c5d17a997dc8cc93b2321b71c4259373043ab;hpb=4ed5d21d048c8feed085530b7fda6ed265a5913f;p=libsigrok.git diff --git a/src/session.c b/src/session.c index 276c5d17..a3f6a86d 100644 --- a/src/session.c +++ b/src/session.c @@ -379,10 +379,30 @@ SR_API int sr_session_trigger_set(struct sr_session *session, struct sr_trigger static int sr_session_iteration(struct sr_session *session, gboolean block) { unsigned int i; - int ret; + int ret, timeout; +#ifdef HAVE_LIBUSB_1_0 + int usb_timeout; + struct timeval tv; +#endif + + timeout = block ? session->source_timeout : 0; + +#ifdef HAVE_LIBUSB_1_0 + if (session->ctx->usb_source_present) { + timeout = block ? 0 : session->source_timeout; + ret = libusb_get_next_timeout(session->ctx->libusb_ctx, &tv); + if (ret < 0) { + sr_err("Error getting libusb timeout: %s", + libusb_error_name(ret)); + return SR_ERR; + } else if (ret == 1) { + usb_timeout = tv.tv_sec * 1000 + tv.tv_usec / 1000; + timeout = MIN(timeout, usb_timeout); + } + } +#endif - ret = g_poll(session->pollfds, session->num_sources, - block ? session->source_timeout : 0); + ret = g_poll(session->pollfds, session->num_sources, timeout); for (i = 0; i < session->num_sources; i++) { if (session->pollfds[i].revents > 0 || (ret == 0 && session->source_timeout == session->sources[i].timeout)) {