ssize_t iio_buffer_refill(struct iio_buffer *buffer) { ssize_t read; const struct iio_device *dev = buffer->dev; if (buffer->dev_is_high_speed) { read = dev->ctx->ops->get_buffer(dev, &buffer->buffer, buffer->length, buffer->mask, dev->words); } else { read = iio_device_read_raw(dev, buffer->buffer, buffer->length, buffer->mask, dev->words); } if (read >= 0) { buffer->data_length = read; buffer->sample_size = iio_device_get_sample_size_mask(dev, buffer->mask, dev->words); } return read; }
struct iio_buffer * iio_device_create_buffer(const struct iio_device *dev, size_t samples_count, bool cyclic) { int ret = -EINVAL; struct iio_buffer *buf; unsigned int sample_size = iio_device_get_sample_size(dev); if (!sample_size) goto err_set_errno; buf = malloc(sizeof(*buf)); if (!buf) { ret = -ENOMEM; goto err_set_errno; } buf->dev_sample_size = sample_size; buf->length = sample_size * samples_count; buf->dev = dev; buf->mask = calloc(dev->words, sizeof(*buf->mask)); if (!buf->mask) { ret = -ENOMEM; goto err_free_buf; } /* Set the default channel mask to the one used by the device. * While input buffers will erase this as soon as the refill function * is used, it is useful for output buffers, as it permits * iio_buffer_foreach_sample to be used. */ memcpy(buf->mask, dev->mask, dev->words * sizeof(*buf->mask)); ret = iio_device_open(dev, samples_count, cyclic); if (ret < 0) goto err_free_mask; buf->dev_is_high_speed = device_is_high_speed(dev); if (buf->dev_is_high_speed) { /* Dequeue the first buffer, so that buf->buffer is correctly * initialized */ buf->buffer = NULL; if (iio_device_is_tx(dev)) { ret = dev->ctx->ops->get_buffer(dev, &buf->buffer, buf->length, buf->mask, dev->words); if (ret < 0) goto err_close_device; } } else { buf->buffer = malloc(buf->length); if (!buf->buffer) { ret = -ENOMEM; goto err_close_device; } } buf->sample_size = iio_device_get_sample_size_mask(dev, buf->mask, dev->words); buf->data_length = buf->length; return buf; err_close_device: iio_device_close(dev); err_free_mask: free(buf->mask); err_free_buf: free(buf); err_set_errno: errno = -ret; return NULL; }
ssize_t iio_device_get_sample_size(const struct iio_device *dev) { return iio_device_get_sample_size_mask(dev, dev->mask, dev->words); }