Files
utun2/src/stream/stream_playback_audio.h
T

46 lines
3.5 KiB
C

/* Stereo Opus/SoundTouch и ограниченный SPSC-запас готового PCM.
* feed/prepare/set_tempo/finish — один producer; pull/silence — один consumer.
* position/pending_gain сериализуют с consumer короткой внешней блокировкой; pending_gain вызывает producer.
* Producer не держит эту блокировку при feed/prepare/finish: callback не ждёт Opus/SoundTouch.
* feed прогревает Opus перед start_pts, затем подаёт PCM с темпом 1.0..1.1 без изменения высоты звука.
* pull записывает соответствие кадров устройства исходному PTS; silence продлевает hardware time, но не media time.
* position/pending_gain используют реально проигранный frame counter, поэтому уже поставленный PCM сохраняет свой темп.
* Последний Opus-пакет/EOF не теряется: finish выталкивает остаток SoundTouch. */
#ifndef STREAM_PLAYBACK_AUDIO_H
#define STREAM_PLAYBACK_AUDIO_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
struct stream_playback_audio;
/* buffer_ms (1..1000) — порог пополнения готового PCM, без обязательного ожидания перед стартом.
* Это запас декодера, без аппаратной задержки и сетевого джиттер-буфера. */
struct stream_playback_audio *stream_playback_audio_create(int64_t start_pts_us, unsigned buffer_ms);
void stream_playback_audio_destroy(struct stream_playback_audio *audio);
int stream_playback_audio_feed(struct stream_playback_audio *audio, int64_t pts_us, const uint8_t *packet, size_t length);
/* Переносит готовый выход DSP в SPSC; вызывать producer после освобождения PCM, в том числе после finish. */
int stream_playback_audio_prepare(struct stream_playback_audio *audio);
/* Потокобезопасный снимок готового PCM, в stereo frames (48000 frames/s). */
unsigned stream_playback_audio_buffered(const struct stream_playback_audio *audio);
void stream_playback_audio_set_tempo(struct stream_playback_audio *audio, int tempo_milli);
int stream_playback_audio_needs_input(const struct stream_playback_audio *audio);
/* frames <=8192; limit_pts_us ограничивает продвижение исходного материала до готовой границы видео/аудио.
* Возвращает число stereo frames; оставшиеся места backend заполняет тишиной и вызывает silence. */
int stream_playback_audio_pull(struct stream_playback_audio *audio, int16_t *pcm, unsigned frames, int64_t limit_pts_us);
void stream_playback_audio_silence(struct stream_playback_audio *audio, unsigned frames);
int64_t stream_playback_audio_position(struct stream_playback_audio *audio, uint64_t played_frames);
int64_t stream_playback_audio_pending_gain(struct stream_playback_audio *audio, uint64_t played_frames);
int stream_playback_audio_starved(const struct stream_playback_audio *audio, uint64_t played_frames);
uint64_t stream_playback_audio_written(const struct stream_playback_audio *audio);
void stream_playback_audio_finish(struct stream_playback_audio *audio);
int stream_playback_audio_empty(const struct stream_playback_audio *audio);
#ifdef __cplusplus
}
#endif
#endif