+ if (!inc->found_data) {
+ /* Skip past size of 'fmt ' chunk. */
+ i = 20 + RL32(in->buf->str + 16);
+ offset = find_data_chunk(in->buf, i);
+ if (offset < 0) {
+ if (in->buf->len > MAX_DATA_CHUNK_OFFSET) {
+ sr_err("Couldn't find data chunk.");
+ return SR_ERR;
+ }
+ }
+ inc->found_data = TRUE;
+ } else
+ offset = 0;
+
+ /* Round off up to the last channels * unitsize boundary. */
+ chunk_samples = (in->buf->len - offset) / inc->num_channels / inc->unitsize;
+ max_chunk_samples = CHUNK_SIZE / inc->num_channels / inc->unitsize;
+ processed = 0;
+ total_samples = chunk_samples;
+ while (processed < total_samples) {
+ if (chunk_samples > max_chunk_samples)
+ num_samples = max_chunk_samples;
+ else
+ num_samples = chunk_samples;
+ send_chunk(in, offset, num_samples);
+ offset += num_samples * inc->unitsize;
+ chunk_samples -= num_samples;
+ processed += num_samples;
+ }
+
+ if ((unsigned int)offset < in->buf->len) {
+ /*
+ * The incoming buffer wasn't processed completely. Stash
+ * the leftover data for next time.
+ */
+ g_string_erase(in->buf, 0, offset);
+ } else
+ g_string_truncate(in->buf, 0);