hantek-6xxx: FIFO sampling
It doesn't buffer all the samples before sending them out anymore. This fixes bug #1214.
This commit is contained in:
parent
d828b05e65
commit
4299fcc0b8
|
@ -566,27 +566,6 @@ static void send_chunk(struct sr_dev_inst *sdi, unsigned char *buf,
|
|||
g_free(analog.data);
|
||||
}
|
||||
|
||||
static void send_data(struct sr_dev_inst *sdi, struct libusb_transfer *buf[], uint64_t samples)
|
||||
{
|
||||
int i = 0;
|
||||
uint64_t send = 0;
|
||||
uint32_t chunk;
|
||||
|
||||
while (send < samples) {
|
||||
chunk = MIN(samples - send, (uint64_t)(buf[i]->actual_length / NUM_CHANNELS));
|
||||
send += chunk;
|
||||
send_chunk(sdi, buf[i]->buffer, chunk);
|
||||
|
||||
/*
|
||||
* Everything in this transfer was either copied to the buffer
|
||||
* or sent to the session bus.
|
||||
*/
|
||||
g_free(buf[i]->buffer);
|
||||
libusb_free_transfer(buf[i]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by libusb (as triggered by handle_event()) when a transfer comes in.
|
||||
* Only channel data comes in asynchronously, and all transfers for this are
|
||||
|
@ -613,26 +592,6 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
|
|||
if (devc->dev_state != CAPTURE)
|
||||
return;
|
||||
|
||||
if (!devc->sample_buf) {
|
||||
devc->sample_buf_size = 10;
|
||||
devc->sample_buf = g_try_malloc(devc->sample_buf_size * sizeof(transfer));
|
||||
devc->sample_buf_write = 0;
|
||||
}
|
||||
|
||||
if (devc->sample_buf_write >= devc->sample_buf_size) {
|
||||
devc->sample_buf_size += 10;
|
||||
devc->sample_buf = g_try_realloc(devc->sample_buf,
|
||||
devc->sample_buf_size * sizeof(transfer));
|
||||
if (!devc->sample_buf) {
|
||||
sr_err("Sample buffer malloc failed.");
|
||||
devc->dev_state = STOPPING;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
devc->sample_buf[devc->sample_buf_write++] = transfer;
|
||||
devc->samp_received += transfer->actual_length / NUM_CHANNELS;
|
||||
|
||||
sr_spew("receive_transfer(): calculated samplerate == %" PRIu64 "ks/s",
|
||||
(uint64_t)(transfer->actual_length * 1000 /
|
||||
(g_get_monotonic_time() - devc->read_start_ts + 1) /
|
||||
|
@ -645,20 +604,23 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
|
|||
/* Nothing to send to the bus. */
|
||||
return;
|
||||
|
||||
unsigned samples_received = transfer->actual_length / NUM_CHANNELS;
|
||||
send_chunk(sdi, transfer->buffer, samples_received);
|
||||
devc->samp_received += samples_received;
|
||||
|
||||
g_free(transfer->buffer);
|
||||
libusb_free_transfer(transfer);
|
||||
|
||||
if (devc->limit_samples && devc->samp_received >= devc->limit_samples) {
|
||||
sr_info("Requested number of samples reached, stopping. %"
|
||||
PRIu64 " <= %" PRIu64, devc->limit_samples,
|
||||
devc->samp_received);
|
||||
send_data(sdi, devc->sample_buf, devc->limit_samples);
|
||||
sr_dev_acquisition_stop(sdi);
|
||||
} else if (devc->limit_msec && (g_get_monotonic_time() -
|
||||
devc->aq_started) / 1000 >= devc->limit_msec) {
|
||||
sr_info("Requested time limit reached, stopping. %d <= %d",
|
||||
(uint32_t)devc->limit_msec,
|
||||
(uint32_t)(g_get_monotonic_time() - devc->aq_started) / 1000);
|
||||
send_data(sdi, devc->sample_buf, devc->samp_received);
|
||||
g_free(devc->sample_buf);
|
||||
devc->sample_buf = NULL;
|
||||
sr_dev_acquisition_stop(sdi);
|
||||
} else {
|
||||
read_channel(sdi, data_amount(sdi));
|
||||
|
|
Loading…
Reference in New Issue