2026-02-24 15:57:32 +08:00

166 lines
5.0 KiB
C
Raw Permalink 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__ */