12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // Copyright 2018 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "services/audio/log_factory_adapter.h"
- #include <utility>
- #include "mojo/public/cpp/bindings/pending_receiver.h"
- #include "services/audio/log_adapter.h"
- namespace audio {
- const int kMaxPendingLogRequests = 500;
- struct LogFactoryAdapter::PendingLogRequest {
- PendingLogRequest(media::mojom::AudioLogComponent component,
- int component_id,
- mojo::PendingReceiver<media::mojom::AudioLog> receiver)
- : component(component),
- component_id(component_id),
- receiver(std::move(receiver)) {}
- PendingLogRequest(PendingLogRequest&& other) = default;
- PendingLogRequest& operator=(PendingLogRequest&& other) = default;
- ~PendingLogRequest() = default;
- media::mojom::AudioLogComponent component;
- int component_id;
- mojo::PendingReceiver<media::mojom::AudioLog> receiver;
- };
- LogFactoryAdapter::LogFactoryAdapter() = default;
- LogFactoryAdapter::~LogFactoryAdapter() = default;
- void LogFactoryAdapter::SetLogFactory(
- mojo::PendingRemote<media::mojom::AudioLogFactory> log_factory) {
- if (log_factory_) {
- LOG(WARNING) << "Attempting to set log factory more than once. Ignoring "
- "request.";
- return;
- }
- log_factory_.Bind(std::move(log_factory));
- while (!pending_requests_.empty()) {
- auto& front = pending_requests_.front();
- log_factory_->CreateAudioLog(front.component, front.component_id,
- std::move(front.receiver));
- pending_requests_.pop();
- }
- }
- std::unique_ptr<media::AudioLog> LogFactoryAdapter::CreateAudioLog(
- AudioComponent component,
- int component_id) {
- mojo::PendingRemote<media::mojom::AudioLog> remote_audio_log;
- auto audio_log_receiver = remote_audio_log.InitWithNewPipeAndPassReceiver();
- media::mojom::AudioLogComponent mojo_component =
- static_cast<media::mojom::AudioLogComponent>(component);
- if (log_factory_) {
- log_factory_->CreateAudioLog(mojo_component, component_id,
- std::move(audio_log_receiver));
- } else if (pending_requests_.size() >= kMaxPendingLogRequests) {
- LOG(WARNING) << "Maximum number of queued log requests exceeded. Fulfilling"
- " request with fake log.";
- return fake_log_factory_.CreateAudioLog(component, component_id);
- } else {
- pending_requests_.emplace(mojo_component, component_id,
- std::move(audio_log_receiver));
- }
- return std::make_unique<LogAdapter>(std::move(remote_audio_log));
- }
- } // namespace audio
|