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) { void GroupCall::toggleMute(const Group::MuteRequest &data) {
editParticipant(user, mute, std::nullopt); 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) { void GroupCall::changeVolume(const Group::VolumeRequest &data) {
editParticipant(user, false, volume); if (data.locallyOnly) {
applyParticipantLocally(data.user, false, data.volume);
} else {
editParticipant(data.user, false, data.volume);
}
} }
void GroupCall::editParticipant( void GroupCall::editParticipant(

View file

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

View file

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

View file

@ -1166,10 +1166,11 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
.mute = mute, .mute = mute,
}); });
}); });
const auto changeVolume = crl::guard(this, [=](int volume) { const auto changeVolume = crl::guard(this, [=](int volume, bool local) {
_changeVolumeRequests.fire(Group::VolumeRequest{ _changeVolumeRequests.fire(Group::VolumeRequest{
.user = user, .user = user,
.volume = std::clamp(volume, 1, Group::kMaxVolume), .volume = std::clamp(volume, 1, Group::kMaxVolume),
.locallyOnly = local,
}); });
}); });
@ -1245,10 +1246,10 @@ base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
&& muteState != Row::State::MutedByMe) { && muteState != Row::State::MutedByMe) {
const auto volume = real->volume(); const auto volume = real->volume();
result->addAction(QString("Increase volume (%1%)").arg(volume / 100.), [=] { 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.), [=] { 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( _members->toggleMuteRequests(
) | rpl::start_with_next([=](Group::MuteRequest request) { ) | rpl::start_with_next([=](Group::MuteRequest request) {
if (_call) { if (_call) {
_call->toggleMute(request.user, request.mute); _call->toggleMute(request);
} }
}, _callLifetime); }, _callLifetime);
_members->changeVolumeRequests( _members->changeVolumeRequests(
) | rpl::start_with_next([=](Group::VolumeRequest request) { ) | rpl::start_with_next([=](Group::VolumeRequest request) {
if (_call) { if (_call) {
_call->changeVolume(request.user, request.volume); _call->changeVolume(request);
} }
}, _callLifetime); }, _callLifetime);