local_muter.cc 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/audio/local_muter.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "services/audio/loopback_group_member.h"
  8. namespace audio {
  9. LocalMuter::LocalMuter(LoopbackCoordinator* coordinator,
  10. const base::UnguessableToken& group_id)
  11. : coordinator_(coordinator), group_id_(group_id) {
  12. DCHECK(coordinator_);
  13. coordinator_->AddObserver(group_id_, this);
  14. coordinator_->ForEachMemberInGroup(
  15. group_id_, base::BindRepeating([](LoopbackGroupMember* member) {
  16. member->StartMuting();
  17. }));
  18. receivers_.set_disconnect_handler(
  19. base::BindRepeating(&LocalMuter::OnBindingLost, base::Unretained(this)));
  20. }
  21. LocalMuter::~LocalMuter() {
  22. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  23. coordinator_->ForEachMemberInGroup(
  24. group_id_, base::BindRepeating([](LoopbackGroupMember* member) {
  25. member->StopMuting();
  26. }));
  27. coordinator_->RemoveObserver(group_id_, this);
  28. }
  29. void LocalMuter::SetAllBindingsLostCallback(base::RepeatingClosure callback) {
  30. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  31. all_bindings_lost_callback_ = callback;
  32. }
  33. void LocalMuter::AddReceiver(
  34. mojo::PendingAssociatedReceiver<media::mojom::LocalMuter> receiver) {
  35. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  36. receivers_.Add(this, std::move(receiver));
  37. }
  38. void LocalMuter::OnMemberJoinedGroup(LoopbackGroupMember* member) {
  39. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  40. member->StartMuting();
  41. }
  42. void LocalMuter::OnMemberLeftGroup(LoopbackGroupMember* member) {
  43. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  44. // No change to muting state.
  45. }
  46. void LocalMuter::OnBindingLost() {
  47. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  48. if (!HasReceivers()) {
  49. all_bindings_lost_callback_.Run();
  50. }
  51. }
  52. } // namespace audio