X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fsession.c;h=605ab2cc0d8cf1f5f8d677624afe0b53b4ff0779;hb=55c9f09dbc7edd24b0da8dda8837aff6a932e3c5;hp=276c5d17a997dc8cc93b2321b71c4259373043ab;hpb=4ed5d21d048c8feed085530b7fda6ed265a5913f;p=libsigrok.git diff --git a/src/session.c b/src/session.c index 276c5d17..605ab2cc 100644 --- a/src/session.c +++ b/src/session.c @@ -22,7 +22,7 @@ #include #include #include -#include "libsigrok.h" +#include #include "libsigrok-internal.h" /** @cond PRIVATE */ @@ -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 - ret = g_poll(session->pollfds, session->num_sources, - block ? session->source_timeout : 0); + 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, timeout); for (i = 0; i < session->num_sources; i++) { if (session->pollfds[i].revents > 0 || (ret == 0 && session->source_timeout == session->sources[i].timeout)) { @@ -647,12 +667,15 @@ static void datafeed_dump(const struct sr_datafeed_packet *packet) case SR_DF_HEADER: sr_dbg("bus: Received SR_DF_HEADER packet."); break; - case SR_DF_TRIGGER: - sr_dbg("bus: Received SR_DF_TRIGGER packet."); + case SR_DF_END: + sr_dbg("bus: Received SR_DF_END packet."); break; case SR_DF_META: sr_dbg("bus: Received SR_DF_META packet."); break; + case SR_DF_TRIGGER: + sr_dbg("bus: Received SR_DF_TRIGGER packet."); + break; case SR_DF_LOGIC: logic = packet->payload; sr_dbg("bus: Received SR_DF_LOGIC packet (%" PRIu64 " bytes, " @@ -663,20 +686,17 @@ static void datafeed_dump(const struct sr_datafeed_packet *packet) sr_dbg("bus: Received SR_DF_ANALOG packet (%d samples).", analog->num_samples); break; - case SR_DF_ANALOG2: - analog2 = packet->payload; - sr_dbg("bus: Received SR_DF_ANALOG2 packet (%d samples).", - analog2->num_samples); - break; - case SR_DF_END: - sr_dbg("bus: Received SR_DF_END packet."); - break; case SR_DF_FRAME_BEGIN: sr_dbg("bus: Received SR_DF_FRAME_BEGIN packet."); break; case SR_DF_FRAME_END: sr_dbg("bus: Received SR_DF_FRAME_END packet."); break; + case SR_DF_ANALOG2: + analog2 = packet->payload; + sr_dbg("bus: Received SR_DF_ANALOG2 packet (%d samples).", + analog2->num_samples); + break; default: sr_dbg("bus: Received unknown packet type: %d.", packet->type); break;