mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Hopefully fix an assertion violation in voice chats.
This commit is contained in:
parent
4dd58b79e9
commit
cd52982752
1 changed files with 67 additions and 33 deletions
|
@ -246,7 +246,20 @@ private:
|
||||||
not_null<Row*> row,
|
not_null<Row*> row,
|
||||||
const std::optional<Data::GroupCallParticipant> &was,
|
const std::optional<Data::GroupCallParticipant> &was,
|
||||||
const Data::GroupCallParticipant *participant);
|
const Data::GroupCallParticipant *participant);
|
||||||
|
void updateRowInSoundingMap(
|
||||||
|
not_null<Row*> row,
|
||||||
|
bool wasSounding,
|
||||||
|
uint32 wasSsrc,
|
||||||
|
uint32 wasAdditionalSsrc,
|
||||||
|
const Data::GroupCallParticipant *participant);
|
||||||
|
void updateRowInSoundingMap(
|
||||||
|
not_null<Row*> row,
|
||||||
|
bool wasSounding,
|
||||||
|
uint32 wasSsrc,
|
||||||
|
bool nowSounding,
|
||||||
|
uint32 nowSsrc);
|
||||||
void removeRow(not_null<Row*> row);
|
void removeRow(not_null<Row*> row);
|
||||||
|
void removeRowFromSoundingMap(not_null<Row*> row);
|
||||||
void updateRowLevel(not_null<Row*> row, float level);
|
void updateRowLevel(not_null<Row*> row, float level);
|
||||||
void checkRowPosition(not_null<Row*> row);
|
void checkRowPosition(not_null<Row*> row);
|
||||||
[[nodiscard]] bool needToReorder(not_null<Row*> row) const;
|
[[nodiscard]] bool needToReorder(not_null<Row*> row) const;
|
||||||
|
@ -804,14 +817,50 @@ void Members::Controller::updateRow(
|
||||||
: 0;
|
: 0;
|
||||||
row->setSkipLevelUpdate(_skipRowLevelUpdate);
|
row->setSkipLevelUpdate(_skipRowLevelUpdate);
|
||||||
row->updateState(participant);
|
row->updateState(participant);
|
||||||
|
|
||||||
|
const auto wasNoSounding = _soundingRowBySsrc.empty();
|
||||||
|
updateRowInSoundingMap(
|
||||||
|
row,
|
||||||
|
wasSounding,
|
||||||
|
wasSsrc,
|
||||||
|
wasAdditionalSsrc,
|
||||||
|
participant);
|
||||||
|
const auto nowNoSounding = _soundingRowBySsrc.empty();
|
||||||
|
if (wasNoSounding && !nowNoSounding) {
|
||||||
|
_soundingAnimation.start();
|
||||||
|
} else if (nowNoSounding && !wasNoSounding) {
|
||||||
|
_soundingAnimation.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate()->peerListUpdateRow(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Members::Controller::updateRowInSoundingMap(
|
||||||
|
not_null<Row*> row,
|
||||||
|
bool wasSounding,
|
||||||
|
uint32 wasSsrc,
|
||||||
|
uint32 wasAdditionalSsrc,
|
||||||
|
const Data::GroupCallParticipant *participant) {
|
||||||
const auto nowSounding = row->sounding();
|
const auto nowSounding = row->sounding();
|
||||||
const auto nowSsrc = participant ? participant->ssrc : 0;
|
const auto nowSsrc = participant ? participant->ssrc : 0;
|
||||||
const auto nowAdditionalSsrc = participant
|
const auto nowAdditionalSsrc = participant
|
||||||
? GetAdditionalAudioSsrc(participant->videoParams)
|
? GetAdditionalAudioSsrc(participant->videoParams)
|
||||||
: 0;
|
: 0;
|
||||||
|
updateRowInSoundingMap(row, wasSounding, wasSsrc, nowSounding, nowSsrc);
|
||||||
|
updateRowInSoundingMap(
|
||||||
|
row,
|
||||||
|
wasSounding,
|
||||||
|
wasAdditionalSsrc,
|
||||||
|
nowSounding,
|
||||||
|
nowAdditionalSsrc);
|
||||||
|
}
|
||||||
|
|
||||||
const auto wasNoSounding = _soundingRowBySsrc.empty();
|
void Members::Controller::updateRowInSoundingMap(
|
||||||
|
not_null<Row*> row,
|
||||||
|
bool wasSounding,
|
||||||
|
uint32 wasSsrc,
|
||||||
|
bool nowSounding,
|
||||||
|
uint32 nowSsrc) {
|
||||||
if (wasSsrc == nowSsrc) {
|
if (wasSsrc == nowSsrc) {
|
||||||
if (nowSsrc && nowSounding != wasSounding) {
|
if (nowSsrc && nowSounding != wasSounding) {
|
||||||
if (nowSounding) {
|
if (nowSounding) {
|
||||||
|
@ -826,32 +875,14 @@ void Members::Controller::updateRow(
|
||||||
_soundingRowBySsrc.emplace(nowSsrc, row);
|
_soundingRowBySsrc.emplace(nowSsrc, row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (wasAdditionalSsrc == nowAdditionalSsrc) {
|
|
||||||
if (nowAdditionalSsrc && nowSounding != wasSounding) {
|
|
||||||
if (nowSounding) {
|
|
||||||
_soundingRowBySsrc.emplace(nowAdditionalSsrc, row);
|
|
||||||
} else {
|
|
||||||
_soundingRowBySsrc.remove(nowAdditionalSsrc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_soundingRowBySsrc.remove(wasAdditionalSsrc);
|
|
||||||
if (nowSounding && nowAdditionalSsrc) {
|
|
||||||
_soundingRowBySsrc.emplace(nowAdditionalSsrc, row);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto nowNoSounding = _soundingRowBySsrc.empty();
|
|
||||||
if (wasNoSounding && !nowNoSounding) {
|
|
||||||
_soundingAnimation.start();
|
|
||||||
} else if (nowNoSounding && !wasNoSounding) {
|
|
||||||
_soundingAnimation.stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate()->peerListUpdateRow(row);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Members::Controller::removeRow(not_null<Row*> row) {
|
void Members::Controller::removeRow(not_null<Row*> row) {
|
||||||
|
removeRowFromSoundingMap(row);
|
||||||
|
delegate()->peerListRemoveRow(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Members::Controller::removeRowFromSoundingMap(not_null<Row*> row) {
|
||||||
// There may be 0, 1 or 2 entries for a row.
|
// There may be 0, 1 or 2 entries for a row.
|
||||||
for (auto i = begin(_soundingRowBySsrc); i != end(_soundingRowBySsrc);) {
|
for (auto i = begin(_soundingRowBySsrc); i != end(_soundingRowBySsrc);) {
|
||||||
if (i->second == row) {
|
if (i->second == row) {
|
||||||
|
@ -860,7 +891,6 @@ void Members::Controller::removeRow(not_null<Row*> row) {
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delegate()->peerListRemoveRow(row);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Members::Controller::updateRowLevel(
|
void Members::Controller::updateRowLevel(
|
||||||
|
@ -944,18 +974,22 @@ void Members::Controller::prepareRows(not_null<Data::GroupCall*> real) {
|
||||||
auto changed = false;
|
auto changed = false;
|
||||||
auto count = delegate()->peerListFullRowsCount();
|
auto count = delegate()->peerListFullRowsCount();
|
||||||
for (auto i = 0; i != count;) {
|
for (auto i = 0; i != count;) {
|
||||||
auto row = delegate()->peerListRowAt(i);
|
const auto row = static_cast<Row*>(
|
||||||
auto participantPeer = row->peer();
|
delegate()->peerListRowAt(i).get());
|
||||||
if (isMe(participantPeer)) {
|
removeRowFromSoundingMap(row);
|
||||||
|
const auto participantPeer = row->peer();
|
||||||
|
const auto me = isMe(participantPeer);
|
||||||
|
if (me) {
|
||||||
foundMe = true;
|
foundMe = true;
|
||||||
++i;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if (real->participantByPeer(participantPeer)) {
|
if (const auto found = real->participantByPeer(participantPeer)) {
|
||||||
|
updateRowInSoundingMap(row, false, 0, 0, found);
|
||||||
|
++i;
|
||||||
|
} else if (me) {
|
||||||
++i;
|
++i;
|
||||||
} else {
|
} else {
|
||||||
changed = true;
|
changed = true;
|
||||||
removeRow(static_cast<Row*>(row.get()));
|
removeRow(row);
|
||||||
--count;
|
--count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue