Apply local volume / mute to additional audio stream.

This commit is contained in:
John Preston 2021-07-09 13:03:53 +03:00
parent f17fc0b670
commit cc013305ac
2 changed files with 35 additions and 24 deletions

View file

@ -986,22 +986,12 @@ void GroupCall::join(const MTPInputGroupCall &inputCall) {
return (_instance != nullptr); return (_instance != nullptr);
}) | rpl::start_with_next([=](const Update &update) { }) | rpl::start_with_next([=](const Update &update) {
if (!update.now) { if (!update.now) {
_instance->removeSsrcs({ update.was->ssrc }); _instance->removeSsrcs({
update.was->ssrc,
GetAdditionalAudioSsrc(update.was->videoParams),
});
} else { } else {
const auto &now = *update.now; updateInstanceVolume(update.was, *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))));
}
} }
}, _lifetime); }, _lifetime);
@ -2642,15 +2632,33 @@ void GroupCall::updateInstanceVolumes() {
const auto &participants = real->participants(); const auto &participants = real->participants();
for (const auto &participant : participants) { for (const auto &participant : participants) {
const auto setVolume = participant.mutedByMe updateInstanceVolume(std::nullopt, participant);
|| (participant.volume != Group::kDefaultVolume); }
if (setVolume && participant.ssrc) { }
_instance->setVolume(
participant.ssrc, void GroupCall::updateInstanceVolume(
(participant.mutedByMe const std::optional<Data::GroupCallParticipant> &was,
? 0. const Data::GroupCallParticipant &now) {
: (participant.volume / float64(Group::kDefaultVolume)))); 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);
} }
} }

View file

@ -484,6 +484,9 @@ private:
void sendSelfUpdate(SendUpdateType type); void sendSelfUpdate(SendUpdateType type);
void updateInstanceMuteState(); void updateInstanceMuteState();
void updateInstanceVolumes(); void updateInstanceVolumes();
void updateInstanceVolume(
const std::optional<Data::GroupCallParticipant> &was,
const Data::GroupCallParticipant &now);
void applyMeInCallLocally(); void applyMeInCallLocally();
void rejoin(); void rejoin();
void leave(); void leave();