/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef RATE_ESTIMATOR_H_
#define RATE_ESTIMATOR_H_
#include <time.h>
/* Hold information to calculate linear least square from
* several (x, y) samples.
*/
struct least_square {
double sum_x;
double sum_y;
double sum_xy;
double sum_x2;
int num_samples;
};
/* An estimator holding the required information to determine the actual frame
* rate of an audio device.
* Members:
* last_level - Buffer level of the audio device at last check time.
* level_diff - Number of frames written to or read from audio device since
* the last check time. Rate estimator will use this change plus the
* difference of buffer level to derive the number of frames audio
* device has actually processed.
* window_start_ts - The start time of the current window.
* window_size - The size of the window.
* window_frames - The number of frames accumulated in current window.
* lsq - The helper used to estimate sample rate.
*/
struct rate_estimator {
int last_level;
int level_diff;
struct timespec window_start_ts;
struct timespec window_size;
int window_frames;
struct least_square lsq;
double smooth_factor;
double estimated_rate;
};
/* Creates a rate estimator.
* Args:
* rate - The initial value to estimate rate from.
* window_size - The window size of the rate estimator.
* smooth_factor - The coefficient used to calculate moving average
* from old estimated rate values.
*/
struct rate_estimator *rate_estimator_create(unsigned int rate,
const struct timespec *window_size,
double smooth_factor);
/* Destroy a rate estimator. */
void rate_estimator_destroy(struct rate_estimator *re);
/* Adds additional frames transmitted to/from audio device.
* Args:
* re - The rate estimator.
* fr - The number of frames written to the device. For input, this should
* be negative to indicate how many samples were read.
*/
void rate_estimator_add_frames(struct rate_estimator *re, int fr);
/* Checks the timestamp and buffer level difference since last check time,
* and use them as a new sample to update the estimated rate.
* Args:
* re - The rate estimator.
* level - The current buffer level of audio device.
* now - The time at which this function is called.
* Returns:
* True if the estimated rate is updated and window is reset,
* otherwise false.
*/
int rate_estimator_check(struct rate_estimator *re, int level,
struct timespec *now);
/* Gets the estimated rate. */
double rate_estimator_get_rate(struct rate_estimator *re);
/* Resets the estimated rate. */
void rate_estimator_reset_rate(struct rate_estimator *re, unsigned int rate);
#endif /* RATE_ESTIMATOR_H_ */