/* Feed the meter. Scan a single frame of audio. */ int meter_feed(struct dr_meter *self, void *buf, size_t buf_size) { size_t samples = buf_size / (self->sample_size * self->channels); int err; while (samples) { if (!self->fragment_started) { err = meter_fragment_start(self); if (err) return err; } size_t fragment_left = self->fragment_size - self->fragment_read; size_t to_scan = min(fragment_left, samples); #define CASE(fmt) case fmt: meter_scan_internal(self, buf, to_scan, fmt); break switch (self->sample_fmt) { CASE(AV_SAMPLE_FMT_U8); CASE(AV_SAMPLE_FMT_S16); CASE(AV_SAMPLE_FMT_S32); CASE(AV_SAMPLE_FMT_FLT); CASE(AV_SAMPLE_FMT_DBL); default: meter_scan_internal(self, buf, to_scan, self->sample_fmt); } #undef CASE buf = (char *)buf + self->sample_size * self->channels * to_scan; self->fragment_read += to_scan; if (self->fragment_size <= self->fragment_read) { meter_fragment_finish(self); } samples -= to_scan; } return 0; }
/* Feed the meter. Scan a single frame of audio. */ int meter_feed(struct dr_meter *self, void **buf, size_t samples) { size_t start = 0, end = samples; int err; if (debug && 0) { fprintf(stdout, "%zd\n", samples); } while (start < samples) { if (!self->fragment_started) { err = meter_fragment_start(self); if (err) return err; } size_t fragment_left = self->fragment_size - self->fragment_read; end = min(fragment_left, samples); #define CASE(fmt) case fmt: meter_scan_internal(self, buf, start, end, samples, fmt); break switch (self->sample_fmt) { CASE(AV_SAMPLE_FMT_U8); CASE(AV_SAMPLE_FMT_U8P); CASE(AV_SAMPLE_FMT_S16); CASE(AV_SAMPLE_FMT_S16P); CASE(AV_SAMPLE_FMT_S32); CASE(AV_SAMPLE_FMT_S32P); CASE(AV_SAMPLE_FMT_FLT); CASE(AV_SAMPLE_FMT_FLTP); CASE(AV_SAMPLE_FMT_DBL); CASE(AV_SAMPLE_FMT_DBLP); default: meter_scan_internal(self, buf, start, end, samples, self->sample_fmt); } #undef CASE self->fragment_read += end - start; start = end; if (self->fragment_size <= self->fragment_read) { meter_fragment_finish(self); } } //printf("%lld += %zu\n", self->total_samples, samples); self->total_samples += samples; return 0; }