/**
 * @file audio_codec.h
 * @brief 音频编解码接口（上行编码 / 下行解码）
 *
 * 一个实例同时持有上行和下行的编解码状态。
 * raw16k/raw/pcm 为直通，g722 为 G.722 编解码。
 */

#ifndef AIAGENT_AUDIO_CODEC_H
#define AIAGENT_AUDIO_CODEC_H

#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct audio_codec audio_codec_t;

/**
 * @brief 创建编解码器
 * @param name 编码名称："g722" 使用 G.722，其它（raw16k/raw/pcm）为直通
 * @return 句柄，失败返回 NULL
 */
audio_codec_t *audio_codec_create(const char *name);

/**
 * @brief 上行编码：PCM(16bit) -> 编码字节
 * @param pcm_bytes 输入 PCM 字节数
 * @param out_cap   输出缓冲区容量（字节）
 * @return 输出字节数，负值失败
 */
int audio_codec_encode(audio_codec_t *codec, const void *pcm, int pcm_bytes,
                       void *out, int out_cap);

/**
 * @brief 下行解码：编码字节 -> PCM(16bit)
 * @param in_bytes 输入编码字节数
 * @param out_cap  输出缓冲区容量（字节）
 * @return 输出字节数，负值失败
 */
int audio_codec_decode(audio_codec_t *codec, const void *in, int in_bytes,
                       void *pcm_out, int out_cap);

/** @brief 是否为直通（raw16k/pcm，不做编解码转换） */
bool audio_codec_is_passthrough(const audio_codec_t *codec);

/** @brief 复位编解码状态（重连/新一轮会话时调用） */
void audio_codec_reset(audio_codec_t *codec);

/** @brief 销毁编解码器 */
void audio_codec_destroy(audio_codec_t *codec);

#ifdef __cplusplus
}
#endif

#endif /* AIAGENT_AUDIO_CODEC_H */
