Commit 17ff699d authored by Max Morin's avatar Max Morin Committed by Commit Bot

Reland "Bind StreamFactory in audio service."

This is a reland of 21f2ef4c

Per offline discussion, this code is fine.

Original change's description:
> Bind StreamFactory in audio service.
>
> Bug: 803102
> Change-Id: I4d8cb112445095045c492488f7c3b8d9853b6c23
> Reviewed-on: https://chromium-review.googlesource.com/1004634
> Commit-Queue: Max Morin <maxmorin@chromium.org>
> Reviewed-by: Kinuko Yasuda <kinuko@chromium.org>
> Reviewed-by: Olga Sharonova <olka@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#549481}

Tbr: 
Bug: 803102
Change-Id: I3b14b633dd1419eae570d2b9ab411fc8732fad4c
Reviewed-on: https://chromium-review.googlesource.com/1005080Reviewed-by: default avatarMax Morin <maxmorin@chromium.org>
Commit-Queue: Max Morin <maxmorin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#549504}
parent 45abe121
...@@ -74,6 +74,7 @@ source_set("tests") { ...@@ -74,6 +74,7 @@ source_set("tests") {
"input_stream_unittest.cc", "input_stream_unittest.cc",
"output_controller_unittest.cc", "output_controller_unittest.cc",
"output_stream_unittest.cc", "output_stream_unittest.cc",
"stream_factory_unittest.cc",
"sync_reader_unittest.cc", "sync_reader_unittest.cc",
"test/audio_system_to_service_adapter_test.cc", "test/audio_system_to_service_adapter_test.cc",
"test/debug_recording_session_unittest.cc", "test/debug_recording_session_unittest.cc",
......
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
"service_manager:connector": { "service_manager:connector": {
"provides": { "provides": {
"info": [ "audio::mojom::SystemInfo" ], "info": [ "audio::mojom::SystemInfo" ],
"debug_recording": [ "audio::mojom::DebugRecording" ] "debug_recording": [ "audio::mojom::DebugRecording" ],
"stream_factory": [ "audio::mojom::StreamFactory" ]
}, },
"requires": { "requires": {
"service_manager": [ "service_manager:all_users" ] "service_manager": [ "service_manager:all_users" ]
......
...@@ -10,6 +10,9 @@ import "mojo/public/mojom/base/unguessable_token.mojom"; ...@@ -10,6 +10,9 @@ import "mojo/public/mojom/base/unguessable_token.mojom";
// (like the browser process) to create streams. Note that while the factory // (like the browser process) to create streams. Note that while the factory
// interface itself is only for trusted clients, the created streams and data // interface itself is only for trusted clients, the created streams and data
// pipes may be forwarded to untrusted clients. // pipes may be forwarded to untrusted clients.
//
// The client must keep the connection to the factory while streams are
// running.
// TODO(803102): Add other stream creation functionality to this interface. // TODO(803102): Add other stream creation functionality to this interface.
interface StreamFactory { interface StreamFactory {
// Creates an AudioOutputStream and returns the AudioDataPipe it reads data // Creates an AudioOutputStream and returns the AudioDataPipe it reads data
......
...@@ -90,6 +90,14 @@ void Service::BindDebugRecordingRequest(mojom::DebugRecordingRequest request) { ...@@ -90,6 +90,14 @@ void Service::BindDebugRecordingRequest(mojom::DebugRecordingRequest request) {
ref_factory_->CreateRef()); ref_factory_->CreateRef());
} }
void Service::BindStreamFactoryRequest(mojom::StreamFactoryRequest request) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(ref_factory_);
if (!stream_factory_)
stream_factory_.emplace(audio_manager_accessor_->GetAudioManager());
stream_factory_->Bind(std::move(request), ref_factory_->CreateRef());
}
void Service::MaybeRequestQuitDelayed() { void Service::MaybeRequestQuitDelayed() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (quit_timeout_ <= base::TimeDelta()) if (quit_timeout_ <= base::TimeDelta())
......
...@@ -10,10 +10,13 @@ ...@@ -10,10 +10,13 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/optional.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "services/audio/public/mojom/debug_recording.mojom.h" #include "services/audio/public/mojom/debug_recording.mojom.h"
#include "services/audio/public/mojom/stream_factory.mojom.h"
#include "services/audio/public/mojom/system_info.mojom.h" #include "services/audio/public/mojom/system_info.mojom.h"
#include "services/audio/stream_factory.h"
#include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/binder_registry.h"
#include "services/service_manager/public/cpp/service.h" #include "services/service_manager/public/cpp/service.h"
...@@ -64,6 +67,7 @@ class Service : public service_manager::Service { ...@@ -64,6 +67,7 @@ class Service : public service_manager::Service {
private: private:
void BindSystemInfoRequest(mojom::SystemInfoRequest request); void BindSystemInfoRequest(mojom::SystemInfoRequest request);
void BindDebugRecordingRequest(mojom::DebugRecordingRequest request); void BindDebugRecordingRequest(mojom::DebugRecordingRequest request);
void BindStreamFactoryRequest(mojom::StreamFactoryRequest request);
void MaybeRequestQuitDelayed(); void MaybeRequestQuitDelayed();
void MaybeRequestQuit(); void MaybeRequestQuit();
...@@ -81,6 +85,7 @@ class Service : public service_manager::Service { ...@@ -81,6 +85,7 @@ class Service : public service_manager::Service {
std::unique_ptr<AudioManagerAccessor> audio_manager_accessor_; std::unique_ptr<AudioManagerAccessor> audio_manager_accessor_;
std::unique_ptr<SystemInfo> system_info_; std::unique_ptr<SystemInfo> system_info_;
std::unique_ptr<DebugRecording> debug_recording_; std::unique_ptr<DebugRecording> debug_recording_;
base::Optional<StreamFactory> stream_factory_;
service_manager::BinderRegistry registry_; service_manager::BinderRegistry registry_;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <utility> #include <utility>
#include "services/audio/output_stream.h" #include "services/audio/output_stream.h"
#include "services/service_manager/public/cpp/service_context_ref.h"
namespace audio { namespace audio {
...@@ -17,9 +18,11 @@ StreamFactory::~StreamFactory() { ...@@ -17,9 +18,11 @@ StreamFactory::~StreamFactory() {
DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
} }
void StreamFactory::BindRequest(mojom::StreamFactoryRequest request) { void StreamFactory::Bind(
mojom::StreamFactoryRequest request,
std::unique_ptr<service_manager::ServiceContextRef> context_ref) {
DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
bindings_.AddBinding(this, std::move(request)); bindings_.AddBinding(this, std::move(request), std::move(context_ref));
} }
void StreamFactory::CreateOutputStream( void StreamFactory::CreateOutputStream(
......
...@@ -27,6 +27,10 @@ class AudioManager; ...@@ -27,6 +27,10 @@ class AudioManager;
class AudioParameters; class AudioParameters;
} // namespace media } // namespace media
namespace service_manager {
class ServiceContextRef;
}
namespace audio { namespace audio {
class OutputStream; class OutputStream;
...@@ -40,7 +44,8 @@ class StreamFactory final : public mojom::StreamFactory { ...@@ -40,7 +44,8 @@ class StreamFactory final : public mojom::StreamFactory {
explicit StreamFactory(media::AudioManager* audio_manager); explicit StreamFactory(media::AudioManager* audio_manager);
~StreamFactory() final; ~StreamFactory() final;
void BindRequest(mojom::StreamFactoryRequest request); void Bind(mojom::StreamFactoryRequest request,
std::unique_ptr<service_manager::ServiceContextRef> context_ref);
// StreamFactory implementation. // StreamFactory implementation.
void CreateOutputStream( void CreateOutputStream(
...@@ -63,7 +68,10 @@ class StreamFactory final : public mojom::StreamFactory { ...@@ -63,7 +68,10 @@ class StreamFactory final : public mojom::StreamFactory {
media::AudioManager* const audio_manager_; media::AudioManager* const audio_manager_;
mojo::BindingSet<mojom::StreamFactory> bindings_; mojo::BindingSet<mojom::StreamFactory,
std::unique_ptr<service_manager::ServiceContextRef>>
bindings_;
OutputStreamSet output_streams_; OutputStreamSet output_streams_;
DISALLOW_COPY_AND_ASSIGN(StreamFactory); DISALLOW_COPY_AND_ASSIGN(StreamFactory);
......
// 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/stream_factory.h"
#include <memory>
#include "base/test/scoped_task_environment.h"
#include "media/audio/mock_audio_manager.h"
#include "media/audio/test_audio_thread.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "services/audio/public/mojom/stream_factory.mojom.h"
#include "services/service_manager/public/cpp/service_context_ref.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace audio {
// Stream creation is tested as part of the stream unit tests.
TEST(AudioServiceStreamFactoryTest, TakesServiceRef) {
base::test::ScopedTaskEnvironment env;
service_manager::ServiceContextRefFactory ref_factory{base::DoNothing()};
media::MockAudioManager audio_manager(
std::make_unique<media::TestAudioThread>());
StreamFactory factory(&audio_manager);
mojom::StreamFactoryPtr factory_ptr;
factory.Bind(mojo::MakeRequest(&factory_ptr), ref_factory.CreateRef());
EXPECT_FALSE(ref_factory.HasNoRefs());
factory_ptr.reset();
env.RunUntilIdle();
EXPECT_TRUE(ref_factory.HasNoRefs());
audio_manager.Shutdown();
}
} // namespace audio
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment