> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stmlink.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。 Public server APIs use two path prefixes with the same authentication: `/server/v1/...` (the main APIs of both SRTC and SMeeting) and `/stm/srvapi/v1/...` (the SMeeting user system, used by server-side low-code integration). Authenticate with four request headers, app_id + nonce + timestamp + signature, where signature is HMAC-SHA256 keyed with app_key; call these APIs only from the customer's own backend. Any other path is internal: never suggest calling it.
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。 app_key is a server-side secret and must never appear in client code, frontend config, or a mobile app. The token a client uses to join must be issued by the customer's backend and passed down to the client (SRTC: `/server/v1/channel/grant`; SMeeting: `/stm/srvapi/v1/member/grant`).
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上，也不要用「频道」「加入 / 离开」描述 SMeeting 的概念（接口标识符原样保留）。 SRTC and SMeeting are two separate layers with different terminology. SRTC is the audio/video foundation: it has channels, and users join and leave a channel. SMeeting is built on top of SRTC: it has rooms and meetings, and members enter and exit a meeting. Answer in the terms of the layer the user is working with: never apply "room" or "meeting" to SRTC APIs, and never describe SMeeting concepts in prose with "channel", "join", or "leave" (API identifiers such as `force_join` keep their literal names).
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。 Package, class, and method names differ between platform SDKs for the same capability. In sample code, use the API documented for that platform; never carry one platform's code over to another. On Apple platforms each product ships two SDKs (native Swift and Objective-C) whose APIs must not be mixed.

# Event callbacks

> All callbacks of the SMeeting Windows SDK: engine-level ISMeetingEngineEvent (devices, network probe, IM) and meeting-level ISMeetingChannelEvent (connection, members, room state, host controls, media quality, sign-in, recording, sub-meetings), with parameters and when to bind them.

Callbacks are split into **engine-level** `ISMeetingEngineEvent` and **meeting-level** `ISMeetingChannelEvent`.

* Engine-level callbacks are bound through `ISMeetingEngine::setEventHandler()`.
* Meeting-level callbacks are bound through `ISMeetingChannel::setEventHandler()` and **must be set before `enter()`**; otherwise you miss events raised while entering the meeting.

Meeting-level callbacks no longer take `roomno` as the first parameter. If one handler serves multiple channel objects, use `channel->getChannelId()` or `channel->getRoom()` to tell them apart.

***

## ISMeetingEngineEvent (engine level)

### Device events

| Event | Parameters | Description |
| - | - | - |
| onDeviceChange | DeviceType tp, bool isadd, std::string name | A device was plugged in or unplugged |
| onDefDeviceChange | DeviceType tp, std::string name | The default device changed |

### Network probe events

| Event | Parameters | Description |
| - | - | - |
| onStreamProbeResult | int step, std::string result | Network probe result |

### IM events

| Event | Parameters | Description |
| - | - | - |
| onImEnabled | std::string uid, std::string sid | IM is enabled |
| onImDisconnected | int reason, StatusCode code, std::string message | IM disconnected |
| onImReconnected | - | IM reconnected |
| onImReconnecting | - | IM is reconnecting |
| onImCallMessage | std::string uid, std::string name, std::string content | Call message |
| onMeetingStartMessage | std::string content | Meeting start message |

***

## ISMeetingChannelEvent (meeting level)

### Connection state events

| Event | Parameters | Description |
| - | - | - |
| onDisconnected | DisconnectReason, StatusCode, std::string | Disconnected |
| onReconnected | - | Reconnected |
| onReconnecting | - | Reconnecting |

### Member events

| Event | Parameters | Description |
| - | - | - |
| onUserEnter | std::string userdata | A member entered |
| onUserExit | std::string userdata, DisconnectReason reason | A member exited |
| onUserCameraStateChanged | std::string uid, CameraState newstate, bool by\_admin, std::string op\_uid | A member's camera state changed |
| onUserAudioStateChanged | std::string uid, MicState newstate, bool by\_admin, std::string op\_uid | A member's audio state changed |
| onUserNameChanged | std::string uid, std::string newname, bool by\_admin, std::string op\_uid | A member's name changed |
| onUserRoleChanged | std::string uid, Role newrole, bool by\_admin, std::string op\_uid | A member's role changed |
| onUserChatDisabledChanged | std::string uid, bool newstate, bool by\_admin, std::string op\_uid | A member's chat permission changed |
| onUserHandup | std::string uid, HandupType tp, UserHandupStep step | A member raised a hand |

### Room events

| Event | Parameters | Description |
| - | - | - |
| onRoomCameraStateChanged | std::string uid, bool self\_unmute\_camera\_disabled, bool camera\_disabled | Room camera state |
| onRoomMicStateChanged | std::string uid, bool self\_unmute\_mic\_disabled, bool mic\_disabled | Room microphone state |
| onRoomChatDisabledChanged | std::string uid, bool newstatus | Room chat state |
| onRoomScreenshotDisabledChanged | std::string uid, bool newstatus | Room screenshot state |
| onRoomWaterMarkDisabledChanged | std::string uid, bool newstatus | Room watermark state |
| onRoomLockChanged | bool lock | Room lock state |
| onRoomShareStart | std::string uid, ShareType st | Sharing started |
| onRoomShareStop | std::string uid, ShareType st, bool by\_admin, std::string op\_uid | Sharing stopped |
| onRoomChatMessage | std::string uid, bool pri, ChatMsgType msg\_type, std::string msg | Chat message |
| onRoomCustomMessage | std::string uid, bool pri, std::string msg | Custom message |
| onRoomMcuTaskChange | int task\_type, int task\_status | MCU task changed |
| onRoomShareStateChange | bool share\_state | Sharing state changed |
| onRoomWaitRoomStateChange | bool new\_st | Waiting room state changed |

### Host control events

| Event | Parameters | Description |
| - | - | - |
| onAdminRequestOpenMic | std::string uid | The host asks you to turn on the microphone |
| onAdminRequestOpenCamera | std::string uid | The host asks you to turn on the camera |
| onAdminUpdateName | std::string uid, std::string name | The host changed your name |
| onAdminConfirmHandup | std::string uid, int code, bool approve | The host responded to your raised hand |
| onAdminMoveInWaitRoom | - | Moved into the waiting room |
| onAdminWaitRoomEnterRoomFinish | int code, std::string msg | Finished entering the room |

### Device events

| Event | Parameters | Description |
| - | - | - |
| onDeviceStatusChange | DeviceType tp, DeviceStatus status | Device status changed |
| onShareTargetNotFind | - | Sharing target not found |

### Media stream events

| Event | Parameters | Description |
| - | - | - |
| onStreamUpLevel | StreamNetLevel level | Uplink network quality |
| onStreamDownLevel | std::string uid, StreamNetLevel level | Downlink network quality |
| onStreamUpStat | std::string upstat | Uplink statistics |
| onStreamDownStat | std::string downstat | Downlink statistics |
| onStreamSpeakers | std::string Speakers | List of speakers |
| onFrameTimeOut | std::string uid, std::string track\_id, std::string track\_desc, int loading | Frame timeout |

### Sign-in events

| Event | Parameters | Description |
| - | - | - |
| onSigninActivity | std::string name, std::string desc, long long enddt | Sign-in activity |
| onSigninFinish | std::string name | Sign-in finished |
| onWaitRoomMemberEnter | std::string uid, std::string name | A member entered the waiting room |
| onWaitRoomMemberLeave | std::string uid, std::string name | A member exited the waiting room |

### Recording events

| Event | Parameters | Description |
| - | - | - |
| onRecordStatusChange | std::string k, int status, std::string msg | Recording status changed |

### Sub-meeting events

| Event | Parameters | Description |
| - | - | - |
| onAdminStartSubMeeting | std::string meeting\_id, std::string title, std::string users | Sub-meeting started |
| onAdminStopSubMeeting | std::string parent\_meeting\_id | Sub-meeting stopped |
| onAdminMoveSubMeetingUser | std::string to\_meeting\_title, std::string to\_meeting\_id | Member moved to another sub-meeting |
| onUserHelpSubMeeting | std::string meeting\_id, std::string title, std::string parent | Help requested |
