+/**
+ * read a chunk of data from the current audio file
+ *
+ * \param current_chunk the chunk number to read
+ *
+ * \return The length of the chunk on success, zero on end of file, negative on
+ * errors. Note: If the current chunk is of length zero, but the end of the
+ * file is not yet reached, this function returns -E_EMPTY_CHUNK.
+ * */
+ssize_t vss_read_chunk(void)
+{
+ ssize_t len;
+ size_t pos;
+ int ret;
+ long unsigned cc = mmd->current_chunk;
+
+ if (cc >= mmd->afi.chunks_total) /* eof */
+ return 0;
+ len = mmd->afi.chunk_table[cc + 1] - mmd->afi.chunk_table[cc];
+ if (!len) /* nothing to send for this run */
+ return -E_EMPTY_CHUNK;
+ pos = mmd->afi.chunk_table[cc];
+ if (inbuf_size < len) {
+ PARA_INFO_LOG("increasing inbuf for chunk #%lu/%lu to %zu bytes\n",
+ cc, mmd->afi.chunks_total, len);
+ inbuf = para_realloc(inbuf, len);
+ inbuf_size = len;
+ }
+ ret = para_fseek(audio_file, pos, SEEK_SET);
+ if (ret < 0)
+ return ret;
+ return para_fread(inbuf, len, 1, audio_file);
+}
+