power_observer_helper.cc 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright 2017 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 "media/audio/power_observer_helper.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/logging.h"
  8. #include "base/power_monitor/power_monitor.h"
  9. namespace media {
  10. PowerObserverHelper::PowerObserverHelper(
  11. scoped_refptr<base::SequencedTaskRunner> task_runner,
  12. base::RepeatingClosure suspend_callback,
  13. base::RepeatingClosure resume_callback)
  14. : task_runner_(std::move(task_runner)),
  15. suspend_callback_(std::move(suspend_callback)),
  16. resume_callback_(std::move(resume_callback)) {
  17. DCHECK(!suspend_callback_.is_null());
  18. DCHECK(!resume_callback_.is_null());
  19. // The PowerMonitor requires significant setup (a CFRunLoop and preallocated
  20. // IO ports) so it's not available under unit tests. See the OSX impl of
  21. // base::PowerMonitorDeviceSource for more details.
  22. // TODO(grunell): We could be suspending when adding this as observer, and
  23. // we won't be notified about that. See if we can add
  24. // PowerMonitorSource::IsSuspending() so that this can be checked here.
  25. base::PowerMonitor::AddPowerSuspendObserver(this);
  26. }
  27. PowerObserverHelper::~PowerObserverHelper() {
  28. DCHECK(task_runner_->RunsTasksInCurrentSequence());
  29. base::PowerMonitor::RemovePowerSuspendObserver(this);
  30. }
  31. bool PowerObserverHelper::IsSuspending() const {
  32. DCHECK(task_runner_->RunsTasksInCurrentSequence());
  33. return is_suspending_;
  34. }
  35. void PowerObserverHelper::OnSuspend() {
  36. DVLOG(1) << "OnSuspend";
  37. if (!task_runner_->RunsTasksInCurrentSequence()) {
  38. task_runner_->PostTask(FROM_HERE,
  39. base::BindOnce(&PowerObserverHelper::OnSuspend,
  40. weak_factory_.GetWeakPtr()));
  41. return;
  42. }
  43. is_suspending_ = true;
  44. suspend_callback_.Run();
  45. }
  46. void PowerObserverHelper::OnResume() {
  47. DVLOG(1) << "OnResume";
  48. if (!task_runner_->RunsTasksInCurrentSequence()) {
  49. task_runner_->PostTask(FROM_HERE,
  50. base::BindOnce(&PowerObserverHelper::OnResume,
  51. weak_factory_.GetWeakPtr()));
  52. return;
  53. }
  54. is_suspending_ = false;
  55. resume_callback_.Run();
  56. }
  57. } // namespace media