# BRTCClient C 共享库

本目录包含 BRTCClient 编译为 C 可调用的共享库（.so）文件及相关文件。

## 文件说明

- `libbaidurtcgo.so` - 编译生成的共享库文件，可以被 C/C++ 程序调用
- `libbaidurtcgo.h` - C 头文件，包含所有导出的函数声明和回调函数类型定义
- `baidurtc_cgo.go` - CGO 绑定文件，将 Go 的 BRTCClient 导出为 C 可调用函数
- `go.mod` - Go 模块配置文件
- `build_so.sh` - 编译脚本，用于构建共享库
- `example.c` - 示例 C 程序，演示如何使用 BRTCClient 共享库
- `Makefile` - Make 编译配置文件，用于编译示例程序
- `brtc_example` - 编译后的示例程序

## 编译共享库

如果需要重新编译共享库，运行：

```bash
./build_so.sh
```

该脚本会执行以下操作：
1. 清理旧的构建文件
2. 使用 Go 的 `-buildmode=c-shared` 模式编译共享库
3. 生成 `libbaidurtcgo.so` 和 `libbaidurtcgo.h` 文件

## 编译示例程序

使用 Makefile 编译示例程序：

```bash
make
```

或者手动编译：

```bash
gcc -Wall -O2 -o brtc_example example.c -L. -lbaidurtcgo -lpthread
```

## 运行示例程序

运行前需要设置库路径：

```bash
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./brtc_example
```

或者使用 Makefile：

```bash
make run
```

## 在 C/C++ 项目中使用

### 1. 包含头文件

```c
#include "libbaidurtcgo.h"
```

### 2. 链接库

编译时指定库路径和库名：

```bash
gcc -o your_program your_program.c -L/path/to/so/dir -lbaidurtcgo -lpthread
```

### 3. 运行时设置库路径

```bash
export LD_LIBRARY_PATH=/path/to/so/dir:$LD_LIBRARY_PATH
./your_program
```

## API 使用示例

### 创建客户端

```c
void* client = BRTCClient_New();
```

### 配置客户端

```c
BRTCClient_SetAppId(client, "your_app_id");
BRTCClient_SetRoomName(client, "test_room");
BRTCClient_SetUserId(client, 12345678);
BRTCClient_SetDisplayName(client, "Your Name");
BRTCClient_SetToken(client, "your_token");

BRTCClient_SetAudioCodec(client, "OPUS");
BRTCClient_SetVideoCodec(client, "H264");

BRTCClient_SetHasAudio(client, 1);
BRTCClient_SetHasVideo(client, 1);
BRTCClient_SetHasData(client, 1);

BRTCClient_SetAsPublisher(client, 1);
BRTCClient_SetAsListener(client, 1);
```

### 设置回调函数

```c
void onRTCLoginOK(void* userData) {
    printf("Login OK!\n");
}

BRTCClient_SetOnRTCLoginOKCallback(client, onRTCLoginOK, NULL);
```

### 连接和发送

```c
BRTCClient_Login(client);
BRTCClient_SendText(client, "Hello from C!");
BRTCClient_Logout(client);
```

### 清理资源

```c
BRTCClient_Delete(client);
```

## 注意事项

1. **类型定义**：BRTCClient 在 C 中使用 `void*` 类型表示
2. **回调函数**：所有回调函数都接收 `void* userData` 参数，可以传递自定义数据
3. **内存管理**：调用者负责调用 `BRTCClient_Delete()` 释放客户端资源
4. **线程安全**：Go 运行时会处理并发，但回调函数应该快速返回避免阻塞
5. **错误处理**：部分函数返回 int 值，-1 表示失败

## 可用的回调函数

### 事件回调
- `OnDisconnectedCallback`
- `OnListenerNACKsCallback`
- `OnNACKsCallback`
- `OnRTCLoginOKCallback`
- `OnRTCLoginTimeoutCallback`
- `OnRTCLoginErrorCallback`
- `OnRTCConnectErrorCallback`
- `OnRTCWebrtcUpCallback`
- `OnRTCMediaStreamingEventCallback`
- `OnRTCHangUpCallback`
- `OnRTCFeedComingCallback`
- `OnRTCFeedLeavingCallback`
- `OnRTCUserMessageCallback`
- `OnRTCUserAttributeCallback`
- `OnRTCUserIPCallback`
- `OnRTCUserJoinedRoomCallback`
- `OnRTCUserLeavingRoomCallback`
- `OnRTCErrorCallback`
- `OnPublisherJoinedCallback`
- `OnRemoteMediaUnpublishedCallback`
- `OnLocalMediaPublishedOKCallback`
- `OnLocalMediaUnpublishedCallback`

### 媒体回调
- `OnVideoFrameCallback`
- `OnAudioDataCallback`
- `OnAudioPCMCallback`
- `OnTextDataCallback`
- `OnLocalMediaConnectedCallback`
- `OnLocalMediaDisconnectedCallback`
- `OnRemoteMediaConnectedCallback`
- `OnRemoteMediaDisconnectedCallback`

## 完整的 API 文档

请参考 `libbaidurtcgo.h` 文件，其中包含所有导出函数的详细声明。

## 构建要求

- Go 1.20 或更高版本
- GCC 编译器（用于编译 C 程序）
- pthread 库

## 故障排除

如果遇到库加载错误：
```bash
# 查看依赖的库
ldd brtc_example

# 确保库路径正确
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
```

如果遇到 Go 编译错误：
```bash
# 确保 go.work 文件包含了 sdkdemo/so 模块
go work use ./sdkdemo/so
```