50 lines
2.9 KiB
C
50 lines
2.9 KiB
C
/* Общая адаптация воспроизведения desktop/Android, без сетевых ресурсов и очередей медиа.
|
|
* Один поток либо внешняя блокировка. position_us — фактические общие часы исходного материала;
|
|
* ready_us — непрерывная готовая граница, включая данные в кольце/кодеке/устройстве.
|
|
* Минимумы короткого окна нормализованы по смещению wall-clock относительно media-clock:
|
|
* простой увеличивает все прежние запасы, догон уменьшает их без переписывания истории.
|
|
* После 200 мс без фактической недостачи избыток погашается плавным ускорением до 1.6.
|
|
* guard_us и уже поставленный устройству pending_gain_us защищают остаток при снижении темпа.
|
|
* reset нужен при новой эпохе/реальном GAP/смене позиции; временная нехватка историю сохраняет. */
|
|
#ifndef STREAM_PLAYBACK_CLOCK_H
|
|
#define STREAM_PLAYBACK_CLOCK_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define STREAM_PLAYBACK_HISTORY 4
|
|
#define STREAM_PLAYBACK_BUCKET_US 50000
|
|
#define STREAM_PLAYBACK_SETTLE_US 200000
|
|
#define STREAM_PLAYBACK_MAX_TEMPO 1600
|
|
#define STREAM_PLAYBACK_RAMP_US 500000
|
|
|
|
struct stream_playback_bucket { int64_t period, minimum_us; };
|
|
struct stream_playback_clock {
|
|
struct stream_playback_bucket history[STREAM_PLAYBACK_HISTORY];
|
|
uint64_t id, pauses;
|
|
int64_t first_us, last_us, last_position_us, correction_us, last_bad_us, pause_us, report_us;
|
|
int64_t ramp_remainder;
|
|
int tempo_milli, initialized, waiting;
|
|
};
|
|
|
|
struct stream_playback_state {
|
|
int64_t position_us, reserve_us, minimum_us, correction_us, stable_us, removable_us;
|
|
int tempo_milli, waiting, history_ready;
|
|
};
|
|
|
|
void stream_playback_clock_reset(struct stream_playback_clock *clock, uint64_t id);
|
|
/* Результат не меняется при ошибке. starved отмечает фактическую остановку подготовки/вывода.
|
|
* Временное уменьшение фактического position_us запрещено; после перемотки вызывают reset.
|
|
* Возврат 0 — успех, отрицательный — неверные аргументы/часы. */
|
|
int stream_playback_clock_update(struct stream_playback_clock *clock, int64_t now_us, int64_t position_us,
|
|
int64_t ready_us, int64_t guard_us, int64_t pending_gain_us,
|
|
int starved, struct stream_playback_state *state);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|