| /* 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_ */ |