log_factory_adapter.cc 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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/log_factory_adapter.h"
  5. #include <utility>
  6. #include "mojo/public/cpp/bindings/pending_receiver.h"
  7. #include "services/audio/log_adapter.h"
  8. namespace audio {
  9. const int kMaxPendingLogRequests = 500;
  10. struct LogFactoryAdapter::PendingLogRequest {
  11. PendingLogRequest(media::mojom::AudioLogComponent component,
  12. int component_id,
  13. mojo::PendingReceiver<media::mojom::AudioLog> receiver)
  14. : component(component),
  15. component_id(component_id),
  16. receiver(std::move(receiver)) {}
  17. PendingLogRequest(PendingLogRequest&& other) = default;
  18. PendingLogRequest& operator=(PendingLogRequest&& other) = default;
  19. ~PendingLogRequest() = default;
  20. media::mojom::AudioLogComponent component;
  21. int component_id;
  22. mojo::PendingReceiver<media::mojom::AudioLog> receiver;
  23. };
  24. LogFactoryAdapter::LogFactoryAdapter() = default;
  25. LogFactoryAdapter::~LogFactoryAdapter() = default;
  26. void LogFactoryAdapter::SetLogFactory(
  27. mojo::PendingRemote<media::mojom::AudioLogFactory> log_factory) {
  28. if (log_factory_) {
  29. LOG(WARNING) << "Attempting to set log factory more than once. Ignoring "
  30. "request.";
  31. return;
  32. }
  33. log_factory_.Bind(std::move(log_factory));
  34. while (!pending_requests_.empty()) {
  35. auto& front = pending_requests_.front();
  36. log_factory_->CreateAudioLog(front.component, front.component_id,
  37. std::move(front.receiver));
  38. pending_requests_.pop();
  39. }
  40. }
  41. std::unique_ptr<media::AudioLog> LogFactoryAdapter::CreateAudioLog(
  42. AudioComponent component,
  43. int component_id) {
  44. mojo::PendingRemote<media::mojom::AudioLog> remote_audio_log;
  45. auto audio_log_receiver = remote_audio_log.InitWithNewPipeAndPassReceiver();
  46. media::mojom::AudioLogComponent mojo_component =
  47. static_cast<media::mojom::AudioLogComponent>(component);
  48. if (log_factory_) {
  49. log_factory_->CreateAudioLog(mojo_component, component_id,
  50. std::move(audio_log_receiver));
  51. } else if (pending_requests_.size() >= kMaxPendingLogRequests) {
  52. LOG(WARNING) << "Maximum number of queued log requests exceeded. Fulfilling"
  53. " request with fake log.";
  54. return fake_log_factory_.CreateAudioLog(component, component_id);
  55. } else {
  56. pending_requests_.emplace(mojo_component, component_id,
  57. std::move(audio_log_receiver));
  58. }
  59. return std::make_unique<LogAdapter>(std::move(remote_audio_log));
  60. }
  61. } // namespace audio