+ struct dev_context *devc;
+ struct sr_datafeed_logic logic;
+ struct sr_datafeed_packet sr_packet;
+ unsigned int max_samples, n_samples, total_samples, free_n_samples;
+ size_t num_pkts;
+ gboolean do_signal_trigger;
+ uint8_t *wp;
+ const uint8_t *rp;
+ uint16_t sample_value;
+ size_t repetitions;
+ uint8_t sample_buff[sizeof(sample_value)];
+
+ devc = sdi->priv;
+
+ logic.unitsize = sizeof(sample_buff);
+ logic.data = devc->convbuffer;
+
+ sr_packet.type = SR_DF_LOGIC;
+ sr_packet.payload = &logic;
+
+ max_samples = devc->convbuffer_size / sizeof(sample_buff);
+ n_samples = 0;
+ wp = devc->convbuffer;
+ total_samples = 0;
+ do_signal_trigger = FALSE;
+
+ if (devc->trigger_involved && !devc->trigger_marked && devc->info.n_rep_packets_before_trigger == 0) {
+ std_session_send_df_trigger(sdi);
+ devc->trigger_marked = TRUE;
+ }
+
+ rp = packets;
+ while (num_xfers--) {
+ num_pkts = NUM_PACKETS_IN_CHUNK;
+ while (num_pkts--) {
+ /*
+ * Flush the conversion buffer when a trigger
+ * location needs to get communicated, or when
+ * an to-get-expected sample repetition count
+ * would no longer fit into the buffer.
+ */
+ free_n_samples = max_samples - n_samples;
+ if (free_n_samples < 256 || do_signal_trigger) {
+ logic.length = n_samples * sizeof(sample_buff);;
+ sr_session_send(sdi, &sr_packet);
+ n_samples = 0;
+ wp = devc->convbuffer;
+ if (do_signal_trigger) {
+ std_session_send_df_trigger(sdi);
+ do_signal_trigger = FALSE;
+ }
+ }
+
+ sample_value = read_u16le_inc(&rp);
+ repetitions = read_u8_inc(&rp);
+
+ n_samples += repetitions;
+ total_samples += repetitions;
+ devc->total_samples += repetitions;
+
+ write_u16le(sample_buff, sample_value);
+ while (repetitions--) {
+ memcpy(wp, sample_buff, logic.unitsize);
+ wp += logic.unitsize;
+ }
+
+ if (devc->trigger_involved && !devc->trigger_marked) {
+ if (!--devc->n_reps_until_trigger) {
+ devc->trigger_marked = TRUE;
+ do_signal_trigger = TRUE;
+ sr_dbg("Trigger position after %" PRIu64 " samples, %.6fms.",
+ devc->total_samples,
+ (double)devc->total_samples / devc->cur_samplerate * 1e3);
+ }
+ }
+ }
+ (void)read_u8_inc(&rp); /* Skip sequence number. */
+ }
+ if (n_samples) {
+ logic.length = n_samples * logic.unitsize;
+ sr_session_send(sdi, &sr_packet);
+ if (do_signal_trigger) {
+ std_session_send_df_trigger(sdi);
+ }
+ }
+ sr_dbg("Send_chunk done after %u samples.", total_samples);
+}
+
+static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
+{
+ struct sr_dev_inst *sdi;
+ struct dev_context *devc;
+ struct sr_usb_dev_inst *usb;