+2009-01-19 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/spectrum/gstspectrum.c: (gst_spectrum_reset_state),
+ (gst_spectrum_transform_ip):
+ * gst/spectrum/gstspectrum.h:
+ Implement a simple compensation algorithm for rounding errors.
+ This makes sure that a spectrum message is posted on the bus
+ every interval nanoseconds. Fixes bug #567955.
+
2009-01-15 Michael Smith <msmith@songbirdnest.com>
* sys/osxaudio/Makefile.am:
spectrum->num_frames = 0;
spectrum->num_fft = 0;
+
+ spectrum->accumulated_error = 0;
}
static void
spectrum->fft_ctx = gst_fft_f32_new (nfft, FALSE);
spectrum->frames_per_interval =
gst_util_uint64_scale (spectrum->interval, rate, GST_SECOND);
+ spectrum->error_per_interval = (spectrum->interval * rate) % GST_SECOND;
if (spectrum->frames_per_interval == 0)
spectrum->frames_per_interval = 1;
spectrum->num_frames = 0;
spectrum->num_fft = 0;
+ spectrum->accumulated_error = 0;
}
if (spectrum->num_frames == 0)
* FFT of frames that we already handled.
*/
if (spectrum->num_frames % nfft == 0 ||
- spectrum->num_frames == spectrum->frames_per_interval) {
+ ((spectrum->accumulated_error < GST_SECOND
+ && spectrum->num_frames == spectrum->frames_per_interval)
+ || (spectrum->accumulated_error >= GST_SECOND
+ && spectrum->num_frames - 1 ==
+ spectrum->frames_per_interval))) {
+
for (i = 0; i < nfft; i++)
input_tmp[i] = input[(spectrum->input_pos + i) % nfft];
}
/* Do we have the FFTs for one interval? */
- if (spectrum->num_frames == spectrum->frames_per_interval) {
+ if ((spectrum->accumulated_error < GST_SECOND
+ && spectrum->num_frames == spectrum->frames_per_interval)
+ || (spectrum->accumulated_error >= GST_SECOND
+ && spectrum->num_frames - 1 == spectrum->frames_per_interval)) {
+
+ if (spectrum->accumulated_error >= GST_SECOND)
+ spectrum->accumulated_error -= GST_SECOND;
+ else
+ spectrum->accumulated_error += spectrum->error_per_interval;
+
if (spectrum->message) {
GstMessage *m;