Exemplo n.º 1
0
/* 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;
}
Exemplo n.º 2
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;
}