Rdzleo aeae073e4f chore(git): 把 components/common/ 纳入 git 跟踪
components/common/ 是项目自己写的代码 (火山 RTC SDK 的 wrapper + HTTP 客户端 + JSON
工具 + 设备管理), 历史上被 .gitignore 的 components/ 规则误排除。共 15 个文件 2750
行项目代码长期未被 git 跟踪, 修改易丢失, 不利于多设备开发和回溯。

主要变动:

1. .gitignore
   - 改 components/ → /components/* (顶层 children 而非目录本身)
   - 加 !/components/common/ 例外, 让项目自己代码进入跟踪
   - 加 esp-spot/**/components/ 显式 ignore 子项目里的 components/ 保持原行为

2. components/common/ 首次入 git (~2750 行)
   - inc/volc_rtc.h, src/volc_rtc.c — 火山 RTC SDK 的封装层
   - inc/volc_http.h, src/volc_http.c — HTTP 客户端
   - inc/util/volc_json.h, src/volc_json.c — JSON 工具
   - inc/base/volc_device_manager.h, src/volc_device_manager.c — RTC 设备凭证管理
   - inc/util/volc_log.h — 日志宏
   - inc/util/volc_list.h — 链表工具
   - inc/volc_conv_ai.h — 会话 AI 接口定义
   - inc/volc_platform.h, src/volc_platform.c — 平台抽象
   - inc/base/volc_base.h — 基础类型

未跟踪的兄弟目录 (保持 ignore):
   - components/78__esp-opus-encoder/ (IDF managed component)
   - components/volc_engine_rtc_lite/ (火山 RTC SDK 二进制库)
   - components/zlib/ (第三方库)

后续 fix(rtc) NULL guard 等 components/common/ 的改动将作为独立 commit。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 13:50:52 +08:00

166 lines
5.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (2025) Beijing Volcano Engine Technology Ltd.
// SPDX-License-Identifier: Apache-2.0
#ifndef __VOLC_CONV_AI_H__
#define __VOLC_CONV_AI_H__
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
#define __volc_rt_api__ __attribute__((visibility("default")))
#define VOLC_VERSION_MAJOR 1
#define VOLC_VERSION_MINOR 0
#define VOLC_VERSION_PATCH 0
#define VOLC_VERSION_CHECK(major, minor, patch) ((major * 10000U) + (minor * 100U) + patch)
#define VOLC_VERSION VOLC_VERSION_CHECK(VOLC_VERSION_MAJOR, VOLC_VERSION_MINOR, VOLC_VERSION_PATCH)
typedef enum {
VOLC_ERR_NO_ERROR = 0,
VOLC_ERR_FAILED = -1,
VOLC_ERR_LICENSE_EXHAUSTED = -10,
VOLC_ERR_LICENSE_EXPIRED = -11,
} volc_error_code_e;
typedef enum {
VOLC_AUDIO_DATA_TYPE_UNKNOWN = 0,
VOLC_AUDIO_DATA_TYPE_OPUS = 1,
VOLC_AUDIO_DATA_TYPE_G722 = 2,
VOLC_AUDIO_DATA_TYPE_AACLC = 3,
VOLC_AUDIO_DATA_TYPE_G711A = 4,
VOLC_AUDIO_DATA_TYPE_PCM = 5,
VOLC_AUDIO_DATA_TYPE_G711U = 6,
} volc_audio_data_type_e;
typedef enum {
VOLC_AUDIO_CODEC_TYPE_UNKNOWN = 0,
VOLC_AUDIO_CODEC_TYPE_OPUS = 1,
VOLC_AUDIO_CODEC_TYPE_G722 = 2,
VOLC_AUDIO_CODEC_TYPE_AACLC = 3,
VOLC_AUDIO_CODEC_TYPE_G711A = 4,
VOLC_AUDIO_CODEC_TYPE_G711U = 5,
} volc_audio_codec_type_e;
typedef struct {
volc_audio_data_type_e data_type;
// uint16_t sent_ts;
bool commit;
} volc_audio_frame_info_t;
typedef enum {
VOLC_VIDEO_CODEC_TYPE_UNKNOWN = 0,
VOLC_VIDEO_CODEC_TYPE_H264 = 1,
VOLC_VIDEO_CODEC_TYPE_BYTEVC1 = 2,
} volc_video_codec_type_e;
typedef enum {
VOLC_VIDEO_DATA_TYPE_UNKNOWN = 0,
VOLC_VIDEO_DATA_TYPE_H264 = 1,
VOLC_VIDEO_DATA_TYPE_BYTEVC1 = 2,
VOLC_VIDEO_DATA_TYPE_I420 = 3,
} volc_video_data_type_e;
typedef enum {
VOLC_VIDEO_FRAME_TYPE_AUTO = 0,
VOLC_VIDEO_FRAME_TYPE_KEY = 1,
VOLC_VIDEO_FRAME_TYPE_DELTA = 2,
} volc_video_frame_type_e;
typedef struct {
volc_video_data_type_e data_type;
} volc_video_frame_info_t;
typedef enum {
VOLC_CONV_STATUS_LISTENING = 1,
VOLC_CONV_STATUS_THINKING,
VOLC_CONV_STATUS_ANSWERING,
VOLC_CONV_STATUS_INTERRUPTED,
VOLC_CONV_STATUS_ANSWER_FINISH,
} volc_conv_status_e;
typedef struct {
// place holder
bool is_binary;
} volc_message_info_t;
typedef enum {
VOLC_DATA_TYPE_AUDIO = 0,
VOLC_DATA_TYPE_VIDEO,
VOLC_DATA_TYPE_MESSAGE,
VOLC_DATA_TYPE_CNT,
} volc_data_type_e;
typedef struct {
volc_data_type_e type;
union {
volc_audio_frame_info_t audio;
volc_video_frame_info_t video;
volc_message_info_t message;
} info;
} volc_data_info_t;
typedef enum {
VOLC_EV_UNKNOWN = 0, // 未知事件
VOLC_EV_CONNECTED, // 成功连接
VOLC_EV_DISCONNECTED, // 断开连接
} volc_event_code_e;
typedef struct {
volc_event_code_e code; // 包含错误码、告警码、关键事件码等
union {
int placeholder;
} data; // 事件数据具体内容根据event_code而定
} volc_event_t;
typedef enum {
VOLC_MODE_RTC = 0,
VOLC_MODE_WS = 1,
VOLC_MODE_UNKNOWN,
} volc_mode_e;
typedef struct {
volc_mode_e mode;
char* bot_id;
bool wait_for_session_update;
} volc_opt_t;
typedef void* volc_engine_t;
typedef struct {
void (*on_volc_event)(volc_engine_t handle, volc_event_t* event, void* user_data);
void (*on_volc_conversation_status)(volc_engine_t handle, volc_conv_status_e status, void* user_data);
void (*on_volc_audio_data)(volc_engine_t handle, const void* data_ptr, size_t data_len, volc_audio_frame_info_t* info_ptr, void* user_data);
void (*on_volc_video_data)(volc_engine_t handle, const void* data_ptr, size_t data_len, volc_video_frame_info_t* info_ptr, void* user_data);
void (*on_volc_message_data)(volc_engine_t handle, const void* data_ptr, size_t data_len, volc_message_info_t* info_ptr, void* user_data);
} volc_event_handler_t;
__volc_rt_api__ const char* volc_get_version(void);
__volc_rt_api__ const char* volc_err_2_str(int err_code);
__volc_rt_api__ int volc_create(volc_engine_t* handle, const char* config_json, volc_event_handler_t* event_handler, void* user_data);
__volc_rt_api__ void volc_destroy(volc_engine_t handle);
__volc_rt_api__ int volc_start(volc_engine_t handle, volc_opt_t* opt);
__volc_rt_api__ int volc_stop(volc_engine_t handle);
__volc_rt_api__ int volc_update(volc_engine_t handle, const void* data_ptr, size_t data_len);
__volc_rt_api__ int volc_send_audio_data(volc_engine_t handle, const void* data_ptr, size_t data_len, volc_audio_frame_info_t* info_ptr);
__volc_rt_api__ int volc_send_video_data(volc_engine_t handle, const void* data_ptr, size_t data_len, volc_video_frame_info_t* info_ptr);
__volc_rt_api__ int volc_send_message(volc_engine_t handle, const void* data_ptr, size_t data_len, volc_message_info_t* info_ptr);
__volc_rt_api__ int volc_interrupt(volc_engine_t handle);
#ifdef __cplusplus
}
#endif
#endif /* __VOLC_CONV_AI_H__ */