AI automatically translates all comments in the code into English (#3917)

This commit is contained in:
alex
2024-09-19 14:53:50 +08:00
committed by GitHub
parent 046de691cb
commit 4152dcd409
279 changed files with 10602 additions and 3038 deletions

View File

@@ -93,20 +93,24 @@ API_EXPORT void API_CALL mk_env_init2(int thread_num,
int ssl_is_path,
const char *ssl,
const char *ssl_pwd) {
//确保只初始化一次
// 确保只初始化一次 [AUTO-TRANSLATED:e4b32b0f]
// Ensure initialization only happens once
static onceToken token([&]() {
if (log_mask & LOG_CONSOLE) {
//控制台日志
// 控制台日志 [AUTO-TRANSLATED:5c00e83f]
// Console log
Logger::Instance().add(std::make_shared<ConsoleChannel>("ConsoleChannel", (LogLevel) log_level));
}
if (log_mask & LOG_CALLBACK) {
//广播日志
// 广播日志 [AUTO-TRANSLATED:67556df8]
// Broadcast log
Logger::Instance().add(std::make_shared<EventChannel>("EventChannel", (LogLevel) log_level));
}
if (log_mask & LOG_FILE) {
//日志文件
// 日志文件 [AUTO-TRANSLATED:afacc934]
// Log file
auto channel = std::make_shared<FileChannel>("FileChannel",
log_file_path ? File::absolutePath("", log_file_path) :
exeDir() + "log/", (LogLevel) log_level);
@@ -114,15 +118,18 @@ API_EXPORT void API_CALL mk_env_init2(int thread_num,
Logger::Instance().add(channel);
}
//异步日志线程
// 异步日志线程 [AUTO-TRANSLATED:1cc193a1]
// Asynchronous log thread
Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());
//设置线程数
// 设置线程数 [AUTO-TRANSLATED:22ec5cc9]
// Set thread count
EventPollerPool::setPoolSize(thread_num);
WorkThreadPool::setPoolSize(thread_num);
if (ini && ini[0]) {
//设置配置文件
// 设置配置文件 [AUTO-TRANSLATED:2216856d]
// Set configuration file
if (ini_is_path) {
try {
mINI::Instance().parseFile(ini);
@@ -136,7 +143,8 @@ API_EXPORT void API_CALL mk_env_init2(int thread_num,
}
if (ssl && ssl[0]) {
//设置ssl证书
// 设置ssl证书 [AUTO-TRANSLATED:e441027c]
// Set SSL certificate
SSL_Initor::Instance().loadCertificate(ssl, true, ssl_pwd ? ssl_pwd : "", ssl_is_path);
}
});
@@ -157,7 +165,8 @@ API_EXPORT void API_CALL mk_set_option(const char *key, const char *val) {
return;
}
mINI::Instance()[key] = val;
//广播配置文件热加载
// 广播配置文件热加载 [AUTO-TRANSLATED:7ae561f3]
// Broadcast configuration file hot reload
NOTICE_EMIT(BroadcastReloadConfigArgs, Broadcast::kBroadcastReloadConfig);
}
@@ -226,7 +235,8 @@ API_EXPORT uint16_t API_CALL mk_rtmp_server_start(uint16_t port, int ssl) {
API_EXPORT uint16_t API_CALL mk_rtp_server_start(uint16_t port){
#ifdef ENABLE_RTPPROXY
try {
//创建rtp 服务器
// 创建rtp 服务器 [AUTO-TRANSLATED:480fda83]
// Create RTP server
rtpServer = std::make_shared<RtpServer>();
rtpServer->start(port);
return rtpServer->getPort();
@@ -244,7 +254,8 @@ API_EXPORT uint16_t API_CALL mk_rtp_server_start(uint16_t port){
API_EXPORT uint16_t API_CALL mk_rtc_server_start(uint16_t port) {
#ifdef ENABLE_WEBRTC
try {
//创建rtc udp服务器
// 创建rtc udp服务器 [AUTO-TRANSLATED:9287972e]
// Create RTC UDP server
rtcServer_udp = std::make_shared<UdpServer>();
rtcServer_udp->setOnCreateSocket([](const EventPoller::Ptr &poller, const Buffer::Ptr &buf, struct sockaddr *, int) {
if (!buf) {
@@ -252,13 +263,15 @@ API_EXPORT uint16_t API_CALL mk_rtc_server_start(uint16_t port) {
}
auto new_poller = WebRtcSession::queryPoller(buf);
if (!new_poller) {
//该数据对应的webrtc对象未找到丢弃之
// 该数据对应的webrtc对象未找到丢弃之 [AUTO-TRANSLATED:d401f8cb]
// The WebRTC object corresponding to this data was not found, discard it
return Socket::Ptr();
}
return Socket::createSocket(new_poller, false);
});
rtcServer_udp->start<WebRtcSession>(port);
//创建rtc tcp服务器
// 创建rtc tcp服务器 [AUTO-TRANSLATED:1eefd92f]
// Create RTC TCP server
rtcServer_tcp = std::make_shared<TcpServer>();
rtcServer_tcp->start<WebRtcSession>(rtcServer_udp->getPort());
return rtcServer_udp->getPort();
@@ -328,7 +341,8 @@ API_EXPORT uint16_t API_CALL mk_srt_server_start(uint16_t port) {
}
auto new_poller = SRT::SrtSession::queryPoller(buf);
if (!new_poller) {
//握手第一阶段
// 握手第一阶段 [AUTO-TRANSLATED:6b3abcd4]
// Handshake stage one
return Socket::createSocket(poller, false);
}
return Socket::createSocket(new_poller, false);

View File

@@ -228,7 +228,8 @@ API_EXPORT mk_track API_CALL mk_media_source_get_track(const mk_media_source ctx
API_EXPORT float API_CALL mk_media_source_get_track_loss(const mk_media_source ctx, const mk_track track) {
assert(ctx);
MediaSource *src = (MediaSource *)ctx;
// rtp推流只有一个统计器但是可能有多个track如果短时间多次获取间隔丢包率第二次会获取为-1
// rtp推流只有一个统计器但是可能有多个track如果短时间多次获取间隔丢包率第二次会获取为-1 [AUTO-TRANSLATED:b30fec2c]
// RTP streaming has only one statistics object, but there may be multiple tracks. If the packet loss rate is obtained multiple times in a short period, the second time will be obtained as -1
return src->getLossRate((*((Track::Ptr *)track))->getTrackType());
}
@@ -608,7 +609,8 @@ API_EXPORT void API_CALL mk_rtc_send_datachannel(const mk_rtc_transport ctx, uin
std::string msg_str(msg, len);
std::weak_ptr<WebRtcTransport> weak_trans = transport->shared_from_this();
transport->getPoller()->async([streamId, ppid, msg_str, weak_trans]() {
// 切换线程后再操作
// 切换线程后再操作 [AUTO-TRANSLATED:12d77fca]
// Operate after switching threads
if (auto trans = weak_trans.lock()) {
trans->sendDatachannel(streamId, ppid, msg_str.c_str(), msg_str.size());
}

View File

@@ -45,12 +45,14 @@ H264Splitter::~H264Splitter() {
ssize_t H264Splitter::onRecvHeader(const char *data, size_t len) {
auto frame = Factory::getFrameFromPtr(_h265 ? CodecH265 : CodecH264, (char *)data, len, 0, 0);
if (_have_decode_frame && (frame->decodeAble() || frame->configFrame())) {
// 缓存中存在可解码帧且下一帧是可解码帧或者配置帧那么flush缓存
// 缓存中存在可解码帧且下一帧是可解码帧或者配置帧那么flush缓存 [AUTO-TRANSLATED:2c52093b]
// Flush the cache if there are decodable frames in the cache and the next frame is a decodable frame or a configuration frame.
_cb(_buffer.data(), _buffer.size());
_buffer.assign(data, len);
_have_decode_frame = frame->decodeAble();
} else {
// 还需要缓存
// 还需要缓存 [AUTO-TRANSLATED:a4dc19cb]
// Still need to cache
_buffer.append(data, len);
_have_decode_frame = _have_decode_frame || frame->decodeAble();
}
@@ -59,10 +61,12 @@ ssize_t H264Splitter::onRecvHeader(const char *data, size_t len) {
const char *H264Splitter::onSearchPacketTail(const char *data, size_t len) {
for (size_t i = 2; len > 2 && i < len - 2; ++i) {
//判断0x00 00 01
// 判断0x00 00 01 [AUTO-TRANSLATED:afa3d4c2]
// Determine if it is 0x00 00 01
if (data[i] == 0 && data[i + 1] == 0 && data[i + 2] == 1) {
if (i > 0 && data[i - 1] == 0) {
//找到0x00 00 00 01
// 找到0x00 00 00 01 [AUTO-TRANSLATED:96a10021]
// Find 0x00 00 00 01
return data + i - 1;
}
return data + i;

View File

@@ -21,7 +21,8 @@ public:
using Ptr = std::shared_ptr<MediaHelper>;
MediaHelper(const char *vhost, const char *app, const char *stream, float duration, const ProtocolOption &option) {
_poller = EventPollerPool::Instance().getPoller();
// 在poller线程中创建DevChannel(MultiMediaSourceMuxer)对象,确保严格的线程安全限制
// 在poller线程中创建DevChannel(MultiMediaSourceMuxer)对象,确保严格的线程安全限制 [AUTO-TRANSLATED:d5063d7a]
// Create a DevChannel (MultiMediaSourceMuxer) object in the poller thread to ensure strict thread safety restrictions
auto tuple = MediaTuple{vhost, app, stream};
_poller->sync([&]() { _channel = std::make_shared<DevChannel>(tuple, duration, option); });
}
@@ -58,14 +59,17 @@ public:
}
protected:
// 通知其停止推流
// 通知其停止推流 [AUTO-TRANSLATED:d69d10d8]
// Notify it to stop streaming
bool close(MediaSource &sender) override {
if (!_on_close) {
//未设置回调,没法关闭
// 未设置回调,没法关闭 [AUTO-TRANSLATED:2c1423fe]
// No callback is set, so it cannot be closed
WarnL << "请使用mk_media_set_on_close函数设置回调函数!";
return false;
}
//请在回调中调用mk_media_release函数释放资源,否则MediaSource::close()操作不会生效
// 请在回调中调用mk_media_release函数释放资源,否则MediaSource::close()操作不会生效 [AUTO-TRANSLATED:da067eb0]
// Please call the mk_media_release function to release resources in the callback, otherwise the MediaSource::close() operation will not take effect
_on_close(_on_close_data.get());
WarnL << "close media: " << sender.getUrl();
return true;
@@ -78,7 +82,8 @@ protected:
return _on_seek(_on_seek_data.get(), stamp);
}
// 通知暂停或恢复
// 通知暂停或恢复 [AUTO-TRANSLATED:ee3c219f]
// Notify pause or resume
bool pause(MediaSource &sender, bool pause) override {
if (!_on_pause) {
return false;
@@ -86,7 +91,8 @@ protected:
return _on_pause(_on_pause_data.get(), pause);
}
//通知倍数播放
// 通知倍数播放 [AUTO-TRANSLATED:12e66e3f]
// Notify playback speed
bool speed(MediaSource &sender, float speed) override {
if (!_on_speed) {
return false;
@@ -297,7 +303,8 @@ API_EXPORT void API_CALL mk_media_start_send_rtp2(mk_media ctx, const char *dst_
args.close_delay_ms = 30 * 1000;
args.con_type = (mediakit::MediaSourceEvent::SendRtpArgs::ConType)con_type;
// sender参数无用
// sender参数无用 [AUTO-TRANSLATED:21590ae5]
// The sender parameter is useless
auto ref = *obj;
std::shared_ptr<void> ptr(user_data, user_data_free ? user_data_free : [](void *) {});
(*obj)->getChannel()->getOwnerPoller(MediaSource::NullMediaSource())->async([args, ref, cb, ptr]() {
@@ -335,7 +342,8 @@ API_EXPORT void API_CALL mk_media_start_send_rtp4(mk_media ctx, const char *dst_
args.close_delay_ms = (*ini_ptr)["close_delay_ms"].empty() ? 30000 : (*ini_ptr)["close_delay_ms"].as<int>();
args.rtcp_timeout_ms = (*ini_ptr)["rtcp_timeout_ms"].empty() ? 30000 : (*ini_ptr)["rtcp_timeout_ms"].as<int>();
args.rtcp_send_interval_ms = (*ini_ptr)["rtcp_send_interval_ms"].empty() ? 5000 : (*ini_ptr)["rtcp_send_interval_ms"].as<int>();
// sender参数无用
// sender参数无用 [AUTO-TRANSLATED:21590ae5]
// The sender parameter is useless
auto ref = *obj;
std::shared_ptr<void> ptr(
user_data, user_data_free ? user_data_free : [](void *) {});
@@ -351,7 +359,8 @@ API_EXPORT void API_CALL mk_media_start_send_rtp4(mk_media ctx, const char *dst_
API_EXPORT void API_CALL mk_media_stop_send_rtp(mk_media ctx, const char *ssrc) {
assert(ctx);
MediaHelper::Ptr *obj = (MediaHelper::Ptr *)ctx;
// sender参数无用
// sender参数无用 [AUTO-TRANSLATED:21590ae5]
// The sender parameter is useless
auto ref = *obj;
string ssrc_str = ssrc ? ssrc : "";
(*obj)->getChannel()->getOwnerPoller(MediaSource::NullMediaSource())->async([ref, ssrc_str]() {

View File

@@ -57,14 +57,16 @@ public:
void onEvent(bool is_shutdown, const SockException &ex){
lock_guard<recursive_mutex> lck(_mtx);
if (is_shutdown) {
//播放中断
// 播放中断 [AUTO-TRANSLATED:9b841156]
// Play interrupted
if (_on_shutdown) {
_on_shutdown(_on_shutdown_data.get(), ex.getErrCode(), ex.what(), nullptr, 0);
}
return;
}
//播放结果
// 播放结果 [AUTO-TRANSLATED:15f1e8fe]
// Play result
if (_on_play) {
auto cpp_tracks = _player->getTracks(false);
mk_track tracks[TrackMax] = {nullptr};
@@ -118,7 +120,8 @@ API_EXPORT void API_CALL mk_player_set_option(mk_player ctx,const char* key,cons
auto player = obj.getPlayer();
string key_str(key), val_str(val);
player->getPoller()->async([key_str,val_str,player](){
//切换线程后再操作
// 切换线程后再操作 [AUTO-TRANSLATED:b8f01c71]
// Operate after switching threads
(*player)[key_str] = val_str;
});
}
@@ -128,7 +131,8 @@ API_EXPORT void API_CALL mk_player_play(mk_player ctx, const char *url) {
auto player = obj.getPlayer();
string url_str(url);
player->getPoller()->async([url_str,player](){
//切换线程后再操作
// 切换线程后再操作 [AUTO-TRANSLATED:b8f01c71]
// Operate after switching threads
player->play(url_str);
});
}
@@ -138,7 +142,8 @@ API_EXPORT void API_CALL mk_player_pause(mk_player ctx, int pause) {
MediaPlayerForC &obj = **((MediaPlayerForC::Ptr *)ctx);
auto player = obj.getPlayer();
player->getPoller()->async([pause,player](){
//切换线程后再操作
// 切换线程后再操作 [AUTO-TRANSLATED:b8f01c71]
// Operate after switching threads
player->pause(pause);
});
}
@@ -148,7 +153,8 @@ API_EXPORT void API_CALL mk_player_speed(mk_player ctx, float speed) {
MediaPlayerForC &obj = **((MediaPlayerForC::Ptr *) ctx);
auto player = obj.getPlayer();
player->getPoller()->async([speed, player]() {
//切换线程后再操作
// 切换线程后再操作 [AUTO-TRANSLATED:b8f01c71]
// Operate after switching threads
player->speed(speed);
});
}
@@ -158,7 +164,8 @@ API_EXPORT void API_CALL mk_player_seekto(mk_player ctx, float progress) {
MediaPlayerForC &obj = **((MediaPlayerForC::Ptr *)ctx);
auto player = obj.getPlayer();
player->getPoller()->async([progress,player](){
//切换线程后再操作
// 切换线程后再操作 [AUTO-TRANSLATED:b8f01c71]
// Operate after switching threads
player->seekTo(progress);
});
}
@@ -168,7 +175,8 @@ API_EXPORT void API_CALL mk_player_seekto_pos(mk_player ctx, int seek_pos) {
MediaPlayerForC &obj = **((MediaPlayerForC::Ptr *) ctx);
auto player = obj.getPlayer();
player->getPoller()->async([seek_pos, player]() {
//切换线程后再操作
// 切换线程后再操作 [AUTO-TRANSLATED:b8f01c71]
// Operate after switching threads
player->seekTo((uint32_t) seek_pos);
});
}

View File

@@ -53,7 +53,8 @@ API_EXPORT void API_CALL mk_proxy_player_set_option(mk_proxy_player ctx, const c
PlayerProxy::Ptr &obj = *((PlayerProxy::Ptr *) ctx);
std::string key_str(key), val_str(val);
obj->getPoller()->async([obj,key_str,val_str](){
//切换线程再操作
// 切换线程再操作 [AUTO-TRANSLATED:b78259f9]
// Switch threads and then operate
(*obj)[key_str] = val_str;
});
}
@@ -63,7 +64,8 @@ API_EXPORT void API_CALL mk_proxy_player_play(mk_proxy_player ctx, const char *u
PlayerProxy::Ptr &obj = *((PlayerProxy::Ptr *) ctx);
std::string url_str(url);
obj->getPoller()->async([obj,url_str](){
//切换线程再操作
// 切换线程再操作 [AUTO-TRANSLATED:b78259f9]
// Switch threads and then operate
obj->play(url_str);
});
}
@@ -77,7 +79,8 @@ API_EXPORT void API_CALL mk_proxy_player_set_on_close2(mk_proxy_player ctx, on_m
PlayerProxy::Ptr &obj = *((PlayerProxy::Ptr *)ctx);
std::shared_ptr<void> ptr(user_data, user_data_free ? user_data_free : [](void *) {});
obj->getPoller()->async([obj, cb, ptr]() {
// 切换线程再操作
// 切换线程再操作 [AUTO-TRANSLATED:bae49fee]
// Switch threads and then operate
obj->setOnClose([cb, ptr](const SockException &ex) {
if (cb) {
cb(ptr.get(), ex.getErrCode(), ex.what(), ex.getCustomCode());
@@ -91,7 +94,8 @@ API_EXPORT void API_CALL mk_proxy_player_set_on_play_result(mk_proxy_player ctx,
PlayerProxy::Ptr &obj = *((PlayerProxy::Ptr *)ctx);
std::shared_ptr<void> ptr(user_data, user_data_free ? user_data_free : [](void *) {});
obj->getPoller()->async([obj, cb, ptr]() {
// 切换线程再操作
// 切换线程再操作 [AUTO-TRANSLATED:bae49fee]
// Switch threads and then operate
obj->setPlayCallbackOnce([cb, ptr](const SockException &ex) {
if (cb) {
cb(ptr.get(), ex.getErrCode(), ex.what(), ex.getCustomCode());

View File

@@ -39,7 +39,8 @@ API_EXPORT void API_CALL mk_pusher_set_option(mk_pusher ctx, const char *key, co
MediaPusher::Ptr &obj = *((MediaPusher::Ptr *)ctx);
std::string key_str(key), val_str(val);
obj->getPoller()->async([obj,key_str,val_str](){
//切换线程再操作
// 切换线程再操作 [AUTO-TRANSLATED:b78259f9]
// Switch threads and then operate
(*obj)[key_str] = val_str;
});
}
@@ -49,7 +50,8 @@ API_EXPORT void API_CALL mk_pusher_publish(mk_pusher ctx,const char *url){
MediaPusher::Ptr &obj = *((MediaPusher::Ptr *)ctx);
std::string url_str(url);
obj->getPoller()->async([obj,url_str](){
//切换线程再操作
// 切换线程再操作 [AUTO-TRANSLATED:b78259f9]
// Switch threads and then operate
obj->publish(url_str);
});
}
@@ -63,7 +65,8 @@ API_EXPORT void API_CALL mk_pusher_set_on_result2(mk_pusher ctx, on_mk_push_even
MediaPusher::Ptr &obj = *((MediaPusher::Ptr *)ctx);
std::shared_ptr<void> ptr(user_data, user_data_free ? user_data_free : [](void *) {});
obj->getPoller()->async([obj, cb, ptr]() {
// 切换线程再操作
// 切换线程再操作 [AUTO-TRANSLATED:bae49fee]
// Switch threads and then operate
obj->setOnPublished([cb, ptr](const SockException &ex) { cb(ptr.get(), ex.getErrCode(), ex.what()); });
});
}
@@ -77,7 +80,8 @@ API_EXPORT void API_CALL mk_pusher_set_on_shutdown2(mk_pusher ctx, on_mk_push_ev
MediaPusher::Ptr &obj = *((MediaPusher::Ptr *)ctx);
std::shared_ptr<void> ptr(user_data, user_data_free ? user_data_free : [](void *) {});
obj->getPoller()->async([obj, cb, ptr]() {
// 切换线程再操作
// 切换线程再操作 [AUTO-TRANSLATED:bae49fee]
// Switch threads and then operate
obj->setOnShutdown([cb, ptr](const SockException &ex) { cb(ptr.get(), ex.getErrCode(), ex.what()); });
});
}

View File

@@ -37,7 +37,8 @@ API_EXPORT int API_CALL mk_flv_recorder_start(mk_flv_recorder ctx, const char *v
}
}
///////////////////////////////////////////hls/mp4录制/////////////////////////////////////////////
// /////////////////////////////////////////hls/mp4录制///////////////////////////////////////////// [AUTO-TRANSLATED:99c61c68]
// /////////////////////////////////////////hls/mp4 recording/////////////////////////////////////////////
static inline bool isRecording(Recorder::type type, const string &vhost, const string &app, const string &stream_id){
auto src = MediaSource::find(vhost, app, stream_id);

View File

@@ -242,11 +242,13 @@ API_EXPORT uint16_t API_CALL mk_tcp_server_start(uint16_t port, mk_tcp_type type
s_tcp_server[type]->start<SessionWithSSL<SessionForC> >(port);
break;
case mk_type_ws:
//此处你也可以修改WebSocketHeader::BINARY
// 此处你也可以修改WebSocketHeader::BINARY [AUTO-TRANSLATED:706abaab]
// You can also modify WebSocketHeader::BINARY here
s_tcp_server[type]->start<WebSocketSession<SessionForC, HttpSession, WebSocketHeader::TEXT> >(port);
break;
case mk_type_wss:
//此处你也可以修改WebSocketHeader::BINARY
// 此处你也可以修改WebSocketHeader::BINARY [AUTO-TRANSLATED:706abaab]
// You can also modify WebSocketHeader::BINARY here
s_tcp_server[type]->start<WebSocketSession<SessionForC, HttpsSession, WebSocketHeader::TEXT> >(port);
break;
default:
@@ -307,10 +309,12 @@ TcpClientForC::Ptr *mk_tcp_client_create_l(mk_tcp_client_events *events, mk_tcp_
case mk_type_ssl:
return (TcpClientForC::Ptr *)new std::shared_ptr<SessionWithSSL<TcpClientForC> >(new SessionWithSSL<TcpClientForC>(events));
case mk_type_ws:
//此处你也可以修改WebSocketHeader::BINARY
// 此处你也可以修改WebSocketHeader::BINARY [AUTO-TRANSLATED:706abaab]
// You can also modify WebSocketHeader::BINARY here
return (TcpClientForC::Ptr *)new std::shared_ptr<WebSocketClient<TcpClientForC, WebSocketHeader::TEXT, false> >(new WebSocketClient<TcpClientForC, WebSocketHeader::TEXT, false>(events));
case mk_type_wss:
//此处你也可以修改WebSocketHeader::BINARY
// 此处你也可以修改WebSocketHeader::BINARY [AUTO-TRANSLATED:706abaab]
// You can also modify WebSocketHeader::BINARY
return (TcpClientForC::Ptr *)new std::shared_ptr<WebSocketClient<TcpClientForC, WebSocketHeader::TEXT, true> >(new WebSocketClient<TcpClientForC, WebSocketHeader::TEXT, true>(events));
default:
return nullptr;

View File

@@ -134,7 +134,8 @@ API_EXPORT void API_CALL mk_timer_release(mk_timer ctx){
class WorkThreadPoolForC : public TaskExecutorGetterImp {
public:
WorkThreadPoolForC(const char *name, size_t n_thread, int priority) {
//最低优先级
// 最低优先级 [AUTO-TRANSLATED:cd1f0dbc]
// Lowest priority
addPoller(name, n_thread, (ThreadPool::Priority) priority, false);
}

View File

@@ -63,7 +63,8 @@ API_EXPORT mk_ini API_CALL mk_ini_default() {
static void emit_ini_file_reload(mk_ini ini) {
if (ini == mk_ini_default()) {
// 广播配置文件热加载
// 广播配置文件热加载 [AUTO-TRANSLATED:86a0c1be]
// Broadcast configuration hot reload
NOTICE_EMIT(BroadcastReloadConfigArgs, Broadcast::kBroadcastReloadConfig);
}
}
@@ -223,7 +224,8 @@ API_EXPORT void API_CALL mk_get_statistic(on_mk_get_statistic_cb func, void *use
(*obj).emplace(prefix + pr.first, std::move(pr.second));
}
}
// 触发回调
// 触发回调 [AUTO-TRANSLATED:ae2ff258]
// Trigger callback
cb(*obj);
});