You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
2.8 KiB
52 lines
2.8 KiB
#ifndef CALL_AUDIO_H |
|
#define CALL_AUDIO_H |
|
|
|
/* call_audio.h — аудио-движок P2P-звонка для Android (аналог десктопного CallAudioEngine) |
|
* |
|
* Держит один активный звонок: Opus encoder (PCM→Opus, отправка пиру) и |
|
* decoder (Opus→PCM, приём от пира). Аудио I/O живёт в Kotlin (AudioRecord/ |
|
* AudioTrack), кодеки — здесь (Opus есть только в C). |
|
* |
|
* Потоки: |
|
* - feed_pcm: из AudioRecord-потока Kotlin (кодирование + uasync_post) |
|
* - media_recv: из uasync-потока (call.c) — декодирование + коллбэк PCM |
|
* - start/stop: из GUI-потока Kotlin (по ACCEPTED/ENDED) |
|
* Все общие поля защищены мьютексом; encoder/decoder используются строго |
|
* одним потоком каждый, но освобождаются в stop под тем же мьютексом. */ |
|
#include <stdint.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/* Параметры аудио: Opus 48kHz mono, кадр 20мс = 960 сэмплов. */ |
|
#define CALL_AUDIO_SAMPLE_RATE 48000 |
|
#define CALL_AUDIO_FRAME_MS 20 |
|
#define CALL_AUDIO_FRAME_SAMPLES (CALL_AUDIO_SAMPLE_RATE * CALL_AUDIO_FRAME_MS / 1000) |
|
|
|
/* Запустить полнодуплексное аудио для активного звонка (после ACCEPTED). |
|
* Создаёт encoder+decoder, регистрирует приём медиа в call.c. |
|
* Повторный start с тем же call_id — no-op; с другим — сперва stop. |
|
* Возвращает 0 при успехе, <0 при ошибке. */ |
|
int call_audio_start(uint64_t call_id); |
|
|
|
/* Отправить один кадр PCM (ровно CALL_AUDIO_FRAME_SAMPLES) пиру. |
|
* Кодируется в Opus и уходит через call_send_media (uasync-пост). |
|
* Можно звать из любого потока. 0 — успех, <0 — звонок не активен/ошибка. */ |
|
int call_audio_feed_pcm(uint64_t call_id, const int16_t* pcm, int count); |
|
|
|
/* Остановить аудио: снять recv-cb, освободить encoder/decoder. */ |
|
void call_audio_stop(void); |
|
|
|
/* Активен ли звонок с данным call_id (для логов/диагностики). */ |
|
int call_audio_is_active(uint64_t call_id); |
|
|
|
/* Коллбэк приёма декодированного PCM пира (960 сэмплов/кадр). |
|
* Вызывается в uasync-потоке на каждый принятый Opus-кадр. */ |
|
typedef void (*call_audio_pcm_recv_fn)(uint64_t call_id, const int16_t* pcm, int count, void* arg); |
|
void call_audio_set_pcm_recv_cb(call_audio_pcm_recv_fn fn, void* arg); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
#endif /* CALL_AUDIO_H */
|
|
|