Skip to content

Commit 1d26c7b

Browse files
committed
修复昵称,提高连接稳定性,房主在退出后不会销毁房间,可以连回,心跳允许3次失败
1 parent 4e2bb09 commit 1d26c7b

7 files changed

+220
-57
lines changed

core/room_server.cpp

+7-16
Original file line numberDiff line numberDiff line change
@@ -203,20 +203,6 @@ void RoomServer::setNat(int type) {
203203
}
204204
}
205205

206-
void RoomServer::setRtt(const vts::server::ReqRtt &rtt) {
207-
auto context = getCtx();
208-
if (context == nullptr)
209-
return;
210-
211-
vts::server::RspCommon rsp;
212-
auto status = service->SetRtt(context.get(), rtt, &rsp);
213-
if (!status.ok()) {
214-
qDebug() << __FUNCTION__ << "failed:" << status.error_message().c_str();
215-
emit room->onRoomServerError(__FUNCTION__, status.error_message().c_str());
216-
requestHasFailed = true;
217-
}
218-
}
219-
220206
void RoomServer::setStat(const vts::server::ReqStat &stat) {
221207
auto context = getCtx();
222208
if (context == nullptr)
@@ -226,8 +212,13 @@ void RoomServer::setStat(const vts::server::ReqStat &stat) {
226212
auto status = service->SetStat(context.get(), stat, &rsp);
227213
if (!status.ok()) {
228214
qDebug() << __FUNCTION__ << "failed:" << status.error_message().c_str();
229-
emit room->onRoomServerError(__FUNCTION__, status.error_message().c_str());
230-
requestHasFailed = true;
215+
heartbeatFailureCount++;
216+
if (heartbeatFailureCount >= 3) {
217+
requestHasFailed = true;
218+
emit room->onRoomServerError(__FUNCTION__, status.error_message().c_str());
219+
}
220+
} else {
221+
heartbeatFailureCount = 0;
231222
}
232223
}
233224

core/room_server.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class RoomServer {
1919
std::atomic_bool destroyed = false;
2020

2121
std::atomic_bool requestHasFailed = false;
22+
std::atomic_int heartbeatFailureCount = 0;
2223

2324
std::unique_ptr<QThread> natThread;
2425
std::unique_ptr<QThread> notifyThread;
@@ -53,7 +54,6 @@ class RoomServer {
5354
void startReceiveNotify();
5455
void startNatTypeDetect();
5556

56-
void setRtt(const vts::server::ReqRtt& rtt);
5757
void setStat(const vts::server::ReqStat& stat);
5858
void setNick(const std::string& nick);
5959
void setTurn(const std::string& turn);

ui/windows/collabroom.cpp

+133-37
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ CollabRoom::CollabRoom(bool isServer, QString roomId, QWidget *parent) :
306306
req.mutable_format()->set_framerate(_frameRate);
307307
req.mutable_format()->set_framequality(_frameQuality);
308308

309+
if (!roomId.isEmpty()) {
310+
qDebug() << "Use previous room for reclaim host " << roomId;
311+
req.set_reclaimroomid(roomId.toStdString());
312+
}
313+
309314
roomServer->createRoom(req);
310315
roomOpenWaiting->setText(tr("正在创建房间"));
311316
} else {
@@ -343,7 +348,7 @@ CollabRoom::~CollabRoom() {
343348
clientPeers.clear();
344349
} else {
345350
ScopedQMutex _(&peersLock);
346-
if (serverPeer != nullptr)
351+
if (serverPeer)
347352
serverPeer->close();
348353
serverPeer = nullptr;
349354
}
@@ -366,6 +371,12 @@ void CollabRoom::roomInfoSucceed(const vts::server::RspRoomInfo &info) {
366371
QSettings settings;
367372

368373
this->roomId = QString::fromStdString(info.roomid());
374+
375+
if (isServer) {
376+
settings.setValue("previousHostRoomId", this->roomId);
377+
settings.sync();
378+
}
379+
369380
quality.frameWidth = info.format().framewidth();
370381
quality.frameHeight = info.format().frameheight();
371382
quality.frameRate = info.format().framerate();
@@ -392,17 +403,11 @@ void CollabRoom::roomInfoSucceed(const vts::server::RspRoomInfo &info) {
392403
}));
393404
frameSendThread->start();
394405

395-
if (!isServer) {
396-
ScopedQMutex _(&peersLock);
397-
serverPeer = std::make_unique<Peer>(this, QString::fromStdString(info.hostpeerid()));
398-
serverPeer->startClient();
399-
}
400-
401406
// If server, start sending heartbeat, and rtt update
402407
if (isServer) {
403408
heartbeat = std::unique_ptr<QThread>(QThread::create([this]() {
404409
while (!exiting) {
405-
QThread::sleep(10);
410+
QThread::sleep(5);
406411
heartbeatUpdate();
407412
}
408413
}));
@@ -480,6 +485,8 @@ void CollabRoom::fatalError(const QString &reason) {
480485
error = tr("请求房间信息失败");
481486
} else if (reason == "room init error 4") {
482487
error = tr("请求房间信息超时,请重试");
488+
} else if (reason == "room init error 5") {
489+
error = tr("请求房间信息失败,可能是房间已不存在");
483490
} else if (reason == "room init error 14") {
484491
error = tr("房间服务器连接错误,请检查网络");
485492
if (isPrivateRoomEndpoint) {
@@ -604,7 +611,7 @@ void CollabRoom::usageStatUpdate() {
604611
}
605612
} else {
606613
ScopedQMutex _(&peersLock);
607-
if (serverPeer != nullptr) {
614+
if (serverPeer) {
608615
tx += serverPeer->txSpeed();
609616
rx += serverPeer->rxSpeed();
610617
}
@@ -649,6 +656,8 @@ void CollabRoom::setNick() {
649656
}
650657
qDebug() << "new nick" << n;
651658

659+
QSettings settings;
660+
settings.setValue("nick", n);
652661
roomServer->setNick(n.toStdString());
653662
}
654663

@@ -941,7 +950,7 @@ void CollabRoom::spoutShareWorkerClient() {
941950
// ffmpeg coverter
942951
FrameToAv cvt(quality, [=, this](auto av) {
943952
ScopedQMutex _(&peersLock);
944-
if (serverPeer != nullptr)
953+
if (serverPeer)
945954
serverPeer->sendAsync(std::move(av));
946955
});
947956

@@ -1056,7 +1065,7 @@ void CollabRoom::dxgiShareWorkerClient() {
10561065
// ffmpeg coverter
10571066
FrameToAv cvt(quality, [=, this](auto av) {
10581067
ScopedQMutex _(&peersLock);
1059-
if (serverPeer != nullptr)
1068+
if (serverPeer)
10601069
serverPeer->sendAsync(std::move(av));
10611070
});
10621071

@@ -1200,6 +1209,9 @@ void CollabRoom::updatePeers(const google::protobuf::RepeatedPtrField<vts::serve
12001209
auto server = std::make_unique<Peer>(this, id);
12011210
server->startServer();
12021211
clientPeers[id] = std::move(server);
1212+
1213+
consumeSdp();
1214+
consumeCandidate();
12031215
}
12041216
clientPeers[id]->setNick(peer.nick());
12051217
}
@@ -1212,6 +1224,31 @@ void CollabRoom::updatePeers(const google::protobuf::RepeatedPtrField<vts::serve
12121224
it++;
12131225
}
12141226
}
1227+
} else {
1228+
QString newServerId;
1229+
for (const auto &peer: peers) {
1230+
// Find clients
1231+
if (peer.isserver()) {
1232+
auto id = QString::fromStdString(peer.peerid());
1233+
newServerId = id;
1234+
break;
1235+
}
1236+
}
1237+
1238+
if (newServerId != currentServerPeerId) {
1239+
currentServerPeerId = newServerId;
1240+
ScopedQMutex _(&peersLock);
1241+
if (newServerId.isEmpty() && serverPeer) {
1242+
serverPeer->close();
1243+
serverPeer = nullptr;
1244+
} else {
1245+
serverPeer = std::make_unique<Peer>(this, newServerId);
1246+
serverPeer->startClient();
1247+
1248+
consumeSdp();
1249+
consumeCandidate();
1250+
}
1251+
}
12151252
}
12161253

12171254
emit onUpdatePeersUi(peers);
@@ -1475,21 +1512,6 @@ void CollabRoom::onNotifyPeers(const vts::server::NotifyPeers &peers) {
14751512
updatePeers(peers.peers());
14761513
}
14771514

1478-
void CollabRoom::onNotifySdp(const vts::server::Sdp &sdp) {
1479-
ScopedQMutex _(&peersLock);
1480-
auto from = QString::fromStdString(sdp.frompeerid());
1481-
if (isServer) {
1482-
for (auto &peer: clientPeers) {
1483-
if (peer.first == from) {
1484-
qDebug() << "client" << peer.first << "offered sdp to server";
1485-
peer.second->setRemoteSdp(sdp);
1486-
}
1487-
}
1488-
} else {
1489-
serverPeer->setRemoteSdp(sdp);
1490-
}
1491-
}
1492-
14931515
void CollabRoom::onNotifyTurn(const std::string &turn) {
14941516
turnServer = QString::fromStdString(turn);
14951517

@@ -1499,22 +1521,94 @@ void CollabRoom::onNotifyTurn(const std::string &turn) {
14991521
peer.second->startServer();
15001522
}
15011523
} else {
1502-
serverPeer->startClient();
1524+
if (serverPeer)
1525+
serverPeer->startClient();
15031526
}
15041527
}
15051528

15061529
void CollabRoom::onNotifyCandidate(const vts::server::Candidate &candidate) {
15071530
ScopedQMutex _(&peersLock);
1508-
auto from = QString::fromStdString(candidate.frompeerid());
1509-
if (isServer) {
1510-
for (auto &peer: clientPeers) {
1511-
if (peer.first == from) {
1512-
qDebug() << "client" << peer.first << "offered candidate to server";
1513-
peer.second->addRemoteCandidate(candidate);
1531+
candidateQueue.emplace_back(candidate, QDateTime::currentDateTime());
1532+
consumeCandidate();
1533+
}
1534+
1535+
void CollabRoom::onNotifySdp(const vts::server::Sdp &sdp) {
1536+
ScopedQMutex _(&peersLock);
1537+
sdpQueue.emplace_back(sdp, QDateTime::currentDateTime());
1538+
consumeSdp();
1539+
}
1540+
1541+
void CollabRoom::consumeCandidate() {
1542+
for (auto it = candidateQueue.begin(); it != candidateQueue.end(); ) {
1543+
auto candidate = std::get<0>(*it);
1544+
auto from = QString::fromStdString(candidate.frompeerid());
1545+
if (isServer) {
1546+
auto consumed = false;
1547+
for (auto &peer: clientPeers) {
1548+
if (peer.first == from) {
1549+
qDebug() << "client" << peer.first << "offered candidate to server";
1550+
peer.second->addRemoteCandidate(candidate);
1551+
it = candidateQueue.erase(it);
1552+
consumed = true;
1553+
break;
1554+
}
1555+
}
1556+
if (consumed) {
1557+
continue;
1558+
}
1559+
} else {
1560+
if (serverPeer) {
1561+
serverPeer->addRemoteCandidate(candidate);
1562+
it = candidateQueue.erase(it);
1563+
continue;
15141564
}
15151565
}
1516-
} else {
1517-
serverPeer->addRemoteCandidate(candidate);
1566+
it++;
1567+
}
1568+
1569+
for (auto it = candidateQueue.begin(); it != candidateQueue.end(); ) {
1570+
if (std::get<1>(*it).addSecs(300) < QDateTime::currentDateTime()) {
1571+
it = candidateQueue.erase(it);
1572+
continue;
1573+
}
1574+
it++;
1575+
}
1576+
}
1577+
1578+
void CollabRoom::consumeSdp() {
1579+
for (auto it = sdpQueue.begin(); it != sdpQueue.end(); ) {
1580+
auto sdp = std::get<0>(*it);
1581+
auto from = QString::fromStdString(sdp.frompeerid());
1582+
if (isServer) {
1583+
auto consumed = false;
1584+
for (auto &peer: clientPeers) {
1585+
if (peer.first == from) {
1586+
qDebug() << "client" << peer.first << "offered sdp to server";
1587+
peer.second->setRemoteSdp(sdp);
1588+
it = sdpQueue.erase(it);
1589+
consumed = true;
1590+
break;
1591+
}
1592+
}
1593+
if (consumed) {
1594+
continue;
1595+
}
1596+
} else {
1597+
if (serverPeer) {
1598+
serverPeer->setRemoteSdp(sdp);
1599+
it = sdpQueue.erase(it);
1600+
continue;
1601+
}
1602+
}
1603+
it++;
1604+
}
1605+
1606+
for (auto it = sdpQueue.begin(); it != sdpQueue.end(); ) {
1607+
if (std::get<1>(*it).addSecs(300) < QDateTime::currentDateTime()) {
1608+
it = sdpQueue.erase(it);
1609+
continue;
1610+
}
1611+
it++;
15181612
}
15191613
}
15201614

@@ -1535,7 +1629,8 @@ void CollabRoom::applyNewFrameFormat(const vts::server::FrameFormatSetting &fram
15351629
peer.second->stopDecoder();
15361630
}
15371631
} else {
1538-
serverPeer->stopDecoder();
1632+
if (serverPeer)
1633+
serverPeer->stopDecoder();
15391634
}
15401635
}
15411636

@@ -1581,7 +1676,8 @@ void CollabRoom::applyNewFrameFormat(const vts::server::FrameFormatSetting &fram
15811676
peer.second->startDecoder();
15821677
}
15831678
} else {
1584-
serverPeer->startDecoder();
1679+
if (serverPeer)
1680+
serverPeer->startDecoder();
15851681
}
15861682
}
15871683

ui/windows/collabroom.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include <QJsonDocument>
1414
#include <map>
1515
#include <QDateTime>
16+
#include <vector>
17+
#include <tuple>
1618

1719
extern "C" {
1820
#include <libavcodec/avcodec.h>
@@ -24,7 +26,6 @@ namespace Ui {
2426
}
2527

2628
class DxCapture;
27-
2829
class DxgiOutput;
2930

3031
// This is the collab main logic
@@ -119,6 +120,9 @@ private slots:
119120
void onNotifyDestroy();
120121
void onNotifyForceIdr();
121122

123+
void consumeCandidate();
124+
void consumeSdp();
125+
122126
void applyNewFrameFormat(const vts::server::FrameFormatSetting &frame);
123127
void setShareInfo(bool start);
124128

@@ -160,6 +164,10 @@ private slots:
160164
std::map<QString, std::unique_ptr<Peer>> clientPeers;
161165
// As client
162166
std::unique_ptr<Peer> serverPeer;
167+
QString currentServerPeerId;
168+
169+
std::vector<std::tuple<vts::server::Candidate, QDateTime>> candidateQueue;
170+
std::vector<std::tuple<vts::server::Sdp, QDateTime>> sdpQueue;
163171

164172
std::unique_ptr<QThread> heartbeat;
165173
std::unique_ptr<QTimer> spoutDiscovery;

0 commit comments

Comments
 (0)