Added ability to apply volume and mute user in group calls locally only.

This commit is contained in:
23rd 2021-01-15 14:22:12 +03:00
parent 827c950468
commit 250add3a96
5 changed files with 27 additions and 11 deletions

View File

@ -871,12 +871,20 @@ void GroupCall::setCurrentAudioDevice(bool input, const QString &deviceId) {
}
}
void GroupCall::toggleMute(not_null<UserData*> user, bool mute) {
editParticipant(user, mute, std::nullopt);
void GroupCall::toggleMute(const Group::MuteRequest &data) {
if (data.locallyOnly) {
applyParticipantLocally(data.user, data.mute, std::nullopt);
} else {
editParticipant(data.user, data.mute, std::nullopt);
}
}
void GroupCall::changeVolume(not_null<UserData*> user, int volume) {
editParticipant(user, false, volume);
void GroupCall::changeVolume(const Group::VolumeRequest &data) {
if (data.locallyOnly) {
applyParticipantLocally(data.user, false, data.volume);
} else {
editParticipant(data.user, false, data.volume);
}
}
void GroupCall::editParticipant(

View File

@ -35,6 +35,11 @@ struct LastSpokeTimes;
namespace Calls {
namespace Group {
struct MuteRequest;
struct VolumeRequest;
} // namespace Group
enum class MuteState {
Active,
PushToTalk,
@ -131,8 +136,8 @@ public:
//void setAudioVolume(bool input, float level);
void setAudioDuckingEnabled(bool enabled);
void toggleMute(not_null<UserData*> user, bool mute);
void changeVolume(not_null<UserData*> user, int volume);
void toggleMute(const Group::MuteRequest &data);
void changeVolume(const Group::VolumeRequest &data);
std::variant<int, not_null<UserData*>> inviteUsers(
const std::vector<not_null<UserData*>> &users);

View File

@ -17,11 +17,13 @@ constexpr auto kMaxVolume = 20000;
struct MuteRequest {
not_null<UserData*> user;
bool mute = false;
bool locallyOnly = false;
};
struct VolumeRequest {
not_null<UserData*> user;
int volume = kDefaultVolume;
bool finalized = true;
bool locallyOnly = false;
};
} // namespace Calls::Group

View File

@ -1166,10 +1166,11 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
.mute = mute,
});
});
const auto changeVolume = crl::guard(this, [=](int volume) {
const auto changeVolume = crl::guard(this, [=](int volume, bool local) {
_changeVolumeRequests.fire(Group::VolumeRequest{
.user = user,
.volume = std::clamp(volume, 1, Group::kMaxVolume),
.locallyOnly = local,
});
});
@ -1245,10 +1246,10 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
&& muteState != Row::State::MutedByMe) {
const auto volume = real->volume();
result->addAction(QString("Increase volume (%1%)").arg(volume / 100.), [=] {
changeVolume(volume + 2000);
changeVolume(volume + 2000, false);
});
result->addAction(QString("Decrease volume (%1%)").arg(volume / 100.), [=] {
changeVolume(volume - 2000);
changeVolume(volume - 2000, false);
});
}
}

View File

@ -508,14 +508,14 @@ void GroupPanel::initWithCall(GroupCall *call) {
_members->toggleMuteRequests(
) | rpl::start_with_next([=](Group::MuteRequest request) {
if (_call) {
_call->toggleMute(request.user, request.mute);
_call->toggleMute(request);
}
}, _callLifetime);
_members->changeVolumeRequests(
) | rpl::start_with_next([=](Group::VolumeRequest request) {
if (_call) {
_call->changeVolume(request.user, request.volume);
_call->changeVolume(request);
}
}, _callLifetime);