dm: прямой обмен сообщениями (DM) + soundtouch + архитектура звонков

- src/dm/: dm_core/dm_crypto/dm_mailbox — прямой обмен сообщениями (DM)
- lib/soundtouch-master/: vendored SoundTouch (изменение темпа/высоты аудио)
- doc/dm_arch.md, doc/chat_call_arch.md: архитектура DM и звонков
- tests: test_dm.c, test_dm_e2e.c
- chat: рефакторинг chat_* модулей, member_sync, invite_build
- chatgui/chatgui-android: синхронизация с новым API чата
- lib/u_async, debug_config, utun_instance: сопутствующие изменения
This commit is contained in:
evgeny committed 2026-09-15 21:09:17 +03:00
1 parent 761f64cf76
commit 73fe99b33f
123 files changed
+14095 -1270

No files matched your search

+10 -4
View File
@@ -66,8 +66,11 @@ void MemberListModel::setChannel(const QString& channelId, bool isOwner) {
endResetModel();
if (!channelId.isEmpty()) {
char* ch = u_strdup(channelId.toUtf8().constData());
gui_bridge_post_uasync_fn(chat_core_request_member_list_trampoline, ch);
struct chat_member_list_req* req = (struct chat_member_list_req*)u_calloc(1, sizeof(*req));
if (!req) return;
req->inst = gui_bridge_get_inst();
strncpy(req->ch_id, channelId.toUtf8().constData(), sizeof(req->ch_id) - 1);
gui_bridge_post_uasync_fn(chat_core_request_member_list_trampoline, req);
}
}
@@ -77,8 +80,11 @@ void MemberListModel::refresh() {
void MemberListModel::refreshRtt() {
if (m_channelId.isEmpty()) return;
char* ch = u_strdup(m_channelId.toUtf8().constData());
gui_bridge_post_uasync_fn(chat_core_request_member_rtt_trampoline, ch);
struct chat_member_list_req* req = (struct chat_member_list_req*)u_calloc(1, sizeof(*req));
if (!req) return;
req->inst = gui_bridge_get_inst();
strncpy(req->ch_id, m_channelId.toUtf8().constData(), sizeof(req->ch_id) - 1);
gui_bridge_post_uasync_fn(chat_core_request_member_rtt_trampoline, req);
}
quint64 MemberListModel::nodeIdAt(int row) const {