@@ -306,6 +306,11 @@ CollabRoom::CollabRoom(bool isServer, QString roomId, QWidget *parent) :
306
306
req.mutable_format ()->set_framerate (_frameRate);
307
307
req.mutable_format ()->set_framequality (_frameQuality);
308
308
309
+ if (!roomId.isEmpty ()) {
310
+ qDebug () << " Use previous room for reclaim host " << roomId;
311
+ req.set_reclaimroomid (roomId.toStdString ());
312
+ }
313
+
309
314
roomServer->createRoom (req);
310
315
roomOpenWaiting->setText (tr (" 正在创建房间" ));
311
316
} else {
@@ -343,7 +348,7 @@ CollabRoom::~CollabRoom() {
343
348
clientPeers.clear ();
344
349
} else {
345
350
ScopedQMutex _ (&peersLock);
346
- if (serverPeer != nullptr )
351
+ if (serverPeer)
347
352
serverPeer->close ();
348
353
serverPeer = nullptr ;
349
354
}
@@ -366,6 +371,12 @@ void CollabRoom::roomInfoSucceed(const vts::server::RspRoomInfo &info) {
366
371
QSettings settings;
367
372
368
373
this ->roomId = QString::fromStdString (info.roomid ());
374
+
375
+ if (isServer) {
376
+ settings.setValue (" previousHostRoomId" , this ->roomId );
377
+ settings.sync ();
378
+ }
379
+
369
380
quality.frameWidth = info.format ().framewidth ();
370
381
quality.frameHeight = info.format ().frameheight ();
371
382
quality.frameRate = info.format ().framerate ();
@@ -392,17 +403,11 @@ void CollabRoom::roomInfoSucceed(const vts::server::RspRoomInfo &info) {
392
403
}));
393
404
frameSendThread->start ();
394
405
395
- if (!isServer) {
396
- ScopedQMutex _ (&peersLock);
397
- serverPeer = std::make_unique<Peer>(this , QString::fromStdString (info.hostpeerid ()));
398
- serverPeer->startClient ();
399
- }
400
-
401
406
// If server, start sending heartbeat, and rtt update
402
407
if (isServer) {
403
408
heartbeat = std::unique_ptr<QThread>(QThread::create ([this ]() {
404
409
while (!exiting) {
405
- QThread::sleep (10 );
410
+ QThread::sleep (5 );
406
411
heartbeatUpdate ();
407
412
}
408
413
}));
@@ -480,6 +485,8 @@ void CollabRoom::fatalError(const QString &reason) {
480
485
error = tr (" 请求房间信息失败" );
481
486
} else if (reason == " room init error 4" ) {
482
487
error = tr (" 请求房间信息超时,请重试" );
488
+ } else if (reason == " room init error 5" ) {
489
+ error = tr (" 请求房间信息失败,可能是房间已不存在" );
483
490
} else if (reason == " room init error 14" ) {
484
491
error = tr (" 房间服务器连接错误,请检查网络" );
485
492
if (isPrivateRoomEndpoint) {
@@ -604,7 +611,7 @@ void CollabRoom::usageStatUpdate() {
604
611
}
605
612
} else {
606
613
ScopedQMutex _ (&peersLock);
607
- if (serverPeer != nullptr ) {
614
+ if (serverPeer) {
608
615
tx += serverPeer->txSpeed ();
609
616
rx += serverPeer->rxSpeed ();
610
617
}
@@ -649,6 +656,8 @@ void CollabRoom::setNick() {
649
656
}
650
657
qDebug () << " new nick" << n;
651
658
659
+ QSettings settings;
660
+ settings.setValue (" nick" , n);
652
661
roomServer->setNick (n.toStdString ());
653
662
}
654
663
@@ -941,7 +950,7 @@ void CollabRoom::spoutShareWorkerClient() {
941
950
// ffmpeg coverter
942
951
FrameToAv cvt (quality, [=, this ](auto av) {
943
952
ScopedQMutex _ (&peersLock);
944
- if (serverPeer != nullptr )
953
+ if (serverPeer)
945
954
serverPeer->sendAsync (std::move (av));
946
955
});
947
956
@@ -1056,7 +1065,7 @@ void CollabRoom::dxgiShareWorkerClient() {
1056
1065
// ffmpeg coverter
1057
1066
FrameToAv cvt (quality, [=, this ](auto av) {
1058
1067
ScopedQMutex _ (&peersLock);
1059
- if (serverPeer != nullptr )
1068
+ if (serverPeer)
1060
1069
serverPeer->sendAsync (std::move (av));
1061
1070
});
1062
1071
@@ -1200,6 +1209,9 @@ void CollabRoom::updatePeers(const google::protobuf::RepeatedPtrField<vts::serve
1200
1209
auto server = std::make_unique<Peer>(this , id);
1201
1210
server->startServer ();
1202
1211
clientPeers[id] = std::move (server);
1212
+
1213
+ consumeSdp ();
1214
+ consumeCandidate ();
1203
1215
}
1204
1216
clientPeers[id]->setNick (peer.nick ());
1205
1217
}
@@ -1212,6 +1224,31 @@ void CollabRoom::updatePeers(const google::protobuf::RepeatedPtrField<vts::serve
1212
1224
it++;
1213
1225
}
1214
1226
}
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
+ }
1215
1252
}
1216
1253
1217
1254
emit onUpdatePeersUi (peers);
@@ -1475,21 +1512,6 @@ void CollabRoom::onNotifyPeers(const vts::server::NotifyPeers &peers) {
1475
1512
updatePeers (peers.peers ());
1476
1513
}
1477
1514
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
-
1493
1515
void CollabRoom::onNotifyTurn (const std::string &turn) {
1494
1516
turnServer = QString::fromStdString (turn);
1495
1517
@@ -1499,22 +1521,94 @@ void CollabRoom::onNotifyTurn(const std::string &turn) {
1499
1521
peer.second ->startServer ();
1500
1522
}
1501
1523
} else {
1502
- serverPeer->startClient ();
1524
+ if (serverPeer)
1525
+ serverPeer->startClient ();
1503
1526
}
1504
1527
}
1505
1528
1506
1529
void CollabRoom::onNotifyCandidate (const vts::server::Candidate &candidate) {
1507
1530
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 ;
1514
1564
}
1515
1565
}
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++;
1518
1612
}
1519
1613
}
1520
1614
@@ -1535,7 +1629,8 @@ void CollabRoom::applyNewFrameFormat(const vts::server::FrameFormatSetting &fram
1535
1629
peer.second ->stopDecoder ();
1536
1630
}
1537
1631
} else {
1538
- serverPeer->stopDecoder ();
1632
+ if (serverPeer)
1633
+ serverPeer->stopDecoder ();
1539
1634
}
1540
1635
}
1541
1636
@@ -1581,7 +1676,8 @@ void CollabRoom::applyNewFrameFormat(const vts::server::FrameFormatSetting &fram
1581
1676
peer.second ->startDecoder ();
1582
1677
}
1583
1678
} else {
1584
- serverPeer->startDecoder ();
1679
+ if (serverPeer)
1680
+ serverPeer->startDecoder ();
1585
1681
}
1586
1682
}
1587
1683
0 commit comments