Commit 8045942e authored by Olga Sharonova's avatar Olga Sharonova Committed by Commit Bot

Move CreateInProcessLoopbackStream responsibilities to AudioLoopbackStreamCreator

We'll be moving ForwardingAudioStreamFactory and stream brokers to IO thread.
Simplifying dependencies now.

Bug: 866440,852880,866442
Change-Id: Icf1634916ccb60c67f5b85f017328dcfa89947e7
Reviewed-on: https://chromium-review.googlesource.com/1215963
Commit-Queue: Olga Sharonova <olka@chromium.org>
Reviewed-by: default avatarMax Morin <maxmorin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589903}
parent 55f9bf5d
...@@ -13,49 +13,11 @@ ...@@ -13,49 +13,11 @@
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "media/audio/audio_device_description.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "services/audio/public/mojom/constants.mojom.h" #include "services/audio/public/mojom/constants.mojom.h"
#include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/connector.h"
namespace content { namespace content {
namespace {
// A mojom::RendererAudioInputStreamFactoryClient that holds a
// AudioLoopbackStreamCreator::StreamCreatedCallback. The callback runs when the
// requested audio stream is created.
class StreamCreatedCallbackAdapter final
: public mojom::RendererAudioInputStreamFactoryClient {
public:
explicit StreamCreatedCallbackAdapter(
const AudioLoopbackStreamCreator::StreamCreatedCallback& callback)
: callback_(callback) {
DCHECK(callback_);
}
~StreamCreatedCallbackAdapter() override {}
// mojom::RendererAudioInputStreamFactoryClient implementation.
void StreamCreated(
media::mojom::AudioInputStreamPtr stream,
media::mojom::AudioInputStreamClientRequest client_request,
media::mojom::ReadOnlyAudioDataPipePtr data_pipe,
bool initially_muted,
const base::Optional<base::UnguessableToken>& stream_id) override {
DCHECK(!initially_muted); // Loopback streams shouldn't be started muted.
callback_.Run(std::move(stream), std::move(client_request),
std::move(data_pipe));
}
private:
const AudioLoopbackStreamCreator::StreamCreatedCallback callback_;
DISALLOW_COPY_AND_ASSIGN(StreamCreatedCallbackAdapter);
};
} // namespace
ForwardingAudioStreamFactory::ForwardingAudioStreamFactory( ForwardingAudioStreamFactory::ForwardingAudioStreamFactory(
WebContents* web_contents, WebContents* web_contents,
std::unique_ptr<service_manager::Connector> connector, std::unique_ptr<service_manager::Connector> connector,
...@@ -183,29 +145,6 @@ void ForwardingAudioStreamFactory::CreateLoopbackStream( ...@@ -183,29 +145,6 @@ void ForwardingAudioStreamFactory::CreateLoopbackStream(
.GetLowForSerialization()); .GetLowForSerialization());
} }
void ForwardingAudioStreamFactory::CreateInProcessLoopbackStream(
RenderFrameHost* frame_of_source_web_contents,
const media::AudioParameters& params,
uint32_t shared_memory_count,
const AudioLoopbackStreamCreator::StreamCreatedCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
mojom::RendererAudioInputStreamFactoryClientPtr client;
mojo::MakeStrongBinding(
std::make_unique<StreamCreatedCallbackAdapter>(callback),
mojo::MakeRequest(&client));
if (frame_of_source_web_contents) {
CreateLoopbackStream(nullptr, frame_of_source_web_contents, params,
shared_memory_count, true /* mute_source */,
std::move(client));
} else {
// A null |frame_of_source_web_contents| requests system-wide loopback.
CreateInputStream(nullptr,
media::AudioDeviceDescription::kLoopbackWithMuteDeviceId,
params, shared_memory_count, false /* enable_agc */,
nullptr /* processing_config */, std::move(client));
}
}
void ForwardingAudioStreamFactory::SetMuted(bool muted) { void ForwardingAudioStreamFactory::SetMuted(bool muted) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK_NE(muted, IsMuted()); DCHECK_NE(muted, IsMuted());
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include "content/browser/media/audio_stream_broker.h" #include "content/browser/media/audio_stream_broker.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "content/common/media/renderer_audio_input_stream_factory.mojom.h" #include "content/common/media/renderer_audio_input_stream_factory.mojom.h"
#include "content/public/browser/audio_loopback_stream_creator.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
#include "services/audio/public/mojom/stream_factory.mojom.h" #include "services/audio/public/mojom/stream_factory.mojom.h"
...@@ -86,15 +85,6 @@ class CONTENT_EXPORT ForwardingAudioStreamFactory final ...@@ -86,15 +85,6 @@ class CONTENT_EXPORT ForwardingAudioStreamFactory final
bool mute_source, bool mute_source,
mojom::RendererAudioInputStreamFactoryClientPtr renderer_factory_client); mojom::RendererAudioInputStreamFactoryClientPtr renderer_factory_client);
// Creates a loopback stream that captures the audio from
// |frame_of_source_web_contents|, or the default system playback if the
// source is not provided. The source/system audio is muted during capturing.
void CreateInProcessLoopbackStream(
RenderFrameHost* frame_of_source_web_contents,
const media::AudioParameters& params,
uint32_t shared_memory_count,
const AudioLoopbackStreamCreator::StreamCreatedCallback& callback);
// Sets the muting state for all output streams created through this factory. // Sets the muting state for all output streams created through this factory.
void SetMuted(bool muted); void SetMuted(bool muted);
......
...@@ -8,10 +8,48 @@ ...@@ -8,10 +8,48 @@
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/common/service_manager_connection.h" #include "content/public/common/service_manager_connection.h"
#include "media/audio/audio_device_description.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/connector.h"
namespace content { namespace content {
namespace {
// A mojom::RendererAudioInputStreamFactoryClient that holds a
// AudioLoopbackStreamCreator::StreamCreatedCallback. The callback runs when the
// requested audio stream is created.
class StreamCreatedCallbackAdapter final
: public mojom::RendererAudioInputStreamFactoryClient {
public:
explicit StreamCreatedCallbackAdapter(
const AudioLoopbackStreamCreator::StreamCreatedCallback& callback)
: callback_(callback) {
DCHECK(callback_);
}
~StreamCreatedCallbackAdapter() override {}
// mojom::RendererAudioInputStreamFactoryClient implementation.
void StreamCreated(
media::mojom::AudioInputStreamPtr stream,
media::mojom::AudioInputStreamClientRequest client_request,
media::mojom::ReadOnlyAudioDataPipePtr data_pipe,
bool initially_muted,
const base::Optional<base::UnguessableToken>& stream_id) override {
DCHECK(!initially_muted); // Loopback streams shouldn't be started muted.
callback_.Run(std::move(stream), std::move(client_request),
std::move(data_pipe));
}
private:
const AudioLoopbackStreamCreator::StreamCreatedCallback callback_;
DISALLOW_COPY_AND_ASSIGN(StreamCreatedCallbackAdapter);
};
} // namespace
InProcessAudioLoopbackStreamCreator::InProcessAudioLoopbackStreamCreator() InProcessAudioLoopbackStreamCreator::InProcessAudioLoopbackStreamCreator()
: factory_(nullptr, : factory_(nullptr,
content::ServiceManagerConnection::GetForProcess() content::ServiceManagerConnection::GetForProcess()
...@@ -37,8 +75,21 @@ void InProcessAudioLoopbackStreamCreator::CreateLoopbackStream( ...@@ -37,8 +75,21 @@ void InProcessAudioLoopbackStreamCreator::CreateLoopbackStream(
loopback_source_frame = loopback_source->GetMainFrame(); loopback_source_frame = loopback_source->GetMainFrame();
DCHECK(loopback_source_frame); DCHECK(loopback_source_frame);
} }
factory_.CreateInProcessLoopbackStream(loopback_source_frame, params, mojom::RendererAudioInputStreamFactoryClientPtr client;
total_segments, callback); mojo::MakeStrongBinding(
std::make_unique<StreamCreatedCallbackAdapter>(callback),
mojo::MakeRequest(&client));
if (loopback_source_frame) {
factory_.CreateLoopbackStream(nullptr, loopback_source_frame, params,
total_segments, true /* mute_source */,
std::move(client));
} else {
// A null |frame_of_source_web_contents| requests system-wide loopback.
factory_.CreateInputStream(
nullptr, media::AudioDeviceDescription::kLoopbackWithMuteDeviceId,
params, total_segments, false /* enable_agc */,
nullptr /* processing_config */, std::move(client));
}
} }
} // namespace content } // namespace content
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