X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Ffeed_queue.c;fp=src%2Finput%2Ffeed_queue.c;h=d62f3f6b71fb000e4018135441920bc502891e33;hb=f70db77ae6d27eea6cd9675c4eea5abf17c20765;hp=4e01313dec0a33e26ddcf1b829656af56ce7e84f;hpb=f40d8479b0cccf031feb0fc52b19333e85a9c4b3;p=libsigrok.git diff --git a/src/input/feed_queue.c b/src/input/feed_queue.c index 4e01313d..d62f3f6b 100644 --- a/src/input/feed_queue.c +++ b/src/input/feed_queue.c @@ -79,6 +79,35 @@ SR_API int feed_queue_logic_submit_one(struct feed_queue_logic *q, return SR_OK; } +SR_API int feed_queue_logic_submit_many(struct feed_queue_logic *q, + const uint8_t *data, size_t samples_count) +{ + uint8_t *wrptr; + size_t space, copy_count; + int ret; + + wrptr = &q->data_bytes[q->fill_count * q->unit_size]; + while (samples_count) { + space = q->alloc_count - q->fill_count; + copy_count = samples_count; + if (copy_count > space) + copy_count = space; + memcpy(wrptr, data, copy_count * q->unit_size); + data += copy_count * q->unit_size; + samples_count -= copy_count; + wrptr += copy_count * q->unit_size; + q->fill_count += copy_count; + if (q->fill_count == q->alloc_count) { + ret = feed_queue_logic_flush(q); + if (ret != SR_OK) + return ret; + wrptr = &q->data_bytes[0]; + } + } + + return SR_OK; +} + SR_API int feed_queue_logic_flush(struct feed_queue_logic *q) { int ret;