From cc013305ac15d7ebaef9782a30722c405ec45f14 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 9 Jul 2021 13:03:53 +0300 Subject: [PATCH] Apply local volume / mute to additional audio stream. --- .../calls/group/calls_group_call.cpp | 56 +++++++++++-------- .../calls/group/calls_group_call.h | 3 + 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/Telegram/SourceFiles/calls/group/calls_group_call.cpp b/Telegram/SourceFiles/calls/group/calls_group_call.cpp index 467ab573a..bc904c118 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_call.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_call.cpp @@ -986,22 +986,12 @@ void GroupCall::join(const MTPInputGroupCall &inputCall) { return (_instance != nullptr); }) | rpl::start_with_next([=](const Update &update) { if (!update.now) { - _instance->removeSsrcs({ update.was->ssrc }); + _instance->removeSsrcs({ + update.was->ssrc, + GetAdditionalAudioSsrc(update.was->videoParams), + }); } else { - const auto &now = *update.now; - const auto &was = update.was; - const auto volumeChanged = was - ? (was->volume != now.volume - || was->mutedByMe != now.mutedByMe) - : (now.volume != Group::kDefaultVolume || now.mutedByMe); - if (volumeChanged) { - _instance->setVolume( - now.ssrc, - (now.mutedByMe - ? 0. - : (now.volume - / float64(Group::kDefaultVolume)))); - } + updateInstanceVolume(update.was, *update.now); } }, _lifetime); @@ -2642,15 +2632,33 @@ void GroupCall::updateInstanceVolumes() { const auto &participants = real->participants(); for (const auto &participant : participants) { - const auto setVolume = participant.mutedByMe - || (participant.volume != Group::kDefaultVolume); - if (setVolume && participant.ssrc) { - _instance->setVolume( - participant.ssrc, - (participant.mutedByMe - ? 0. - : (participant.volume / float64(Group::kDefaultVolume)))); - } + updateInstanceVolume(std::nullopt, participant); + } +} + +void GroupCall::updateInstanceVolume( + const std::optional &was, + const Data::GroupCallParticipant &now) { + const auto nonDefault = now.mutedByMe + || (now.volume != Group::kDefaultVolume); + const auto volumeChanged = was + ? (was->volume != now.volume || was->mutedByMe != now.mutedByMe) + : nonDefault; + const auto additionalSsrc = GetAdditionalAudioSsrc(now.videoParams); + const auto set = now.ssrc + && (volumeChanged || (was && was->ssrc != now.ssrc)); + const auto additionalSet = additionalSsrc + && (volumeChanged + || (was && (GetAdditionalAudioSsrc(was->videoParams) + != additionalSsrc))); + const auto localVolume = now.mutedByMe + ? 0. + : (now.volume / float64(Group::kDefaultVolume)); + if (set) { + _instance->setVolume(now.ssrc, localVolume); + } + if (additionalSet) { + _instance->setVolume(additionalSsrc, localVolume); } } diff --git a/Telegram/SourceFiles/calls/group/calls_group_call.h b/Telegram/SourceFiles/calls/group/calls_group_call.h index c8eb713dc..64c49901a 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_call.h +++ b/Telegram/SourceFiles/calls/group/calls_group_call.h @@ -484,6 +484,9 @@ private: void sendSelfUpdate(SendUpdateType type); void updateInstanceMuteState(); void updateInstanceVolumes(); + void updateInstanceVolume( + const std::optional &was, + const Data::GroupCallParticipant &now); void applyMeInCallLocally(); void rejoin(); void leave();