0

[Chromecast] Cleanup the API for creating MediaPipelineBackend.

The patch also moves the construction of AudioManagerFactory to
PreCreateThreads stage, which happens just before AudioManager
is created.

Review URL: https://codereview.chromium.org/1385333002

Cr-Commit-Position: refs/heads/master@{#352766}
This commit is contained in:
alokp
2015-10-06 21:09:41 -07:00
committed by Commit bot
parent a7b3fa0ac4
commit a15b164543
8 changed files with 31 additions and 45 deletions

@ -213,13 +213,11 @@ void AddDefaultCommandLineSwitches(base::CommandLine* command_line) {
CastBrowserMainParts::CastBrowserMainParts(
const content::MainFunctionParams& parameters,
URLRequestContextFactory* url_request_context_factory,
scoped_ptr<::media::AudioManagerFactory> audio_manager_factory)
URLRequestContextFactory* url_request_context_factory)
: BrowserMainParts(),
cast_browser_process_(new CastBrowserProcess()),
parameters_(parameters),
url_request_context_factory_(url_request_context_factory),
audio_manager_factory_(audio_manager_factory.Pass()),
net_log_(new CastNetLog()) {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
AddDefaultCommandLineSwitches(command_line);
@ -236,10 +234,6 @@ void CastBrowserMainParts::PreMainMessageLoopStart() {
// Net/DNS metrics.
metrics::PreregisterAllGroupedHistograms();
// Set the platform's implementation of AudioManagerFactory.
if (audio_manager_factory_)
::media::AudioManager::SetFactory(audio_manager_factory_.release());
#if defined(OS_ANDROID)
net::NetworkChangeNotifier::SetFactory(
new net::NetworkChangeNotifierFactoryAndroid());
@ -273,6 +267,12 @@ int CastBrowserMainParts::PreCreateThreads() {
CHECK(PathService::Get(DIR_CAST_HOME, &home_dir));
if (!base::CreateDirectory(home_dir))
return 1;
// AudioManager is created immediately after threads are created, requiring
// AudioManagerFactory to be set beforehand.
scoped_ptr< ::media::AudioManagerFactory> audio_manager_factory =
cast_browser_process_->browser_client()->CreateAudioManagerFactory();
::media::AudioManager::SetFactory(audio_manager_factory.release());
#endif
#if defined(USE_AURA)

@ -6,15 +6,10 @@
#define CHROMECAST_BROWSER_CAST_BROWSER_MAIN_PARTS_H_
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "content/public/browser/browser_main_parts.h"
#include "content/public/common/main_function_params.h"
namespace media {
class AudioManagerFactory;
}
namespace net {
class NetLog;
}
@ -27,10 +22,8 @@ class URLRequestContextFactory;
class CastBrowserMainParts : public content::BrowserMainParts {
public:
// This class does not take ownership of |url_request_content_factory|.
CastBrowserMainParts(
const content::MainFunctionParams& parameters,
URLRequestContextFactory* url_request_context_factory,
scoped_ptr<::media::AudioManagerFactory> audio_manager_factory);
CastBrowserMainParts(const content::MainFunctionParams& parameters,
URLRequestContextFactory* url_request_context_factory);
~CastBrowserMainParts() override;
// content::BrowserMainParts implementation:
@ -45,7 +38,6 @@ class CastBrowserMainParts : public content::BrowserMainParts {
scoped_ptr<CastBrowserProcess> cast_browser_process_;
const content::MainFunctionParams parameters_; // For running browser tests.
URLRequestContextFactory* const url_request_context_factory_;
scoped_ptr<::media::AudioManagerFactory> audio_manager_factory_;
scoped_ptr<net::NetLog> net_log_;
DISALLOW_COPY_AND_ASSIGN(CastBrowserMainParts);

@ -80,18 +80,12 @@ scoped_ptr<CastService> CastContentBrowserClient::CreateCastService(
return make_scoped_ptr(new CastServiceSimple(browser_context, pref_service));
}
#if !defined(OS_ANDROID)
scoped_ptr<::media::AudioManagerFactory>
CastContentBrowserClient::CreateAudioManagerFactory() {
#if defined(OS_ANDROID)
// Return nullptr. The factory will not be set, and the default
// implementation of AudioManager will be used.
return scoped_ptr<::media::AudioManagerFactory>();
#else
return make_scoped_ptr(new media::CastAudioManagerFactory());
#endif
}
#if !defined(OS_ANDROID)
scoped_refptr<media::CmaMediaPipelineClient>
CastContentBrowserClient::CreateCmaMediaPipelineClient() {
return make_scoped_refptr(new media::CmaMediaPipelineClient());
@ -101,7 +95,7 @@ scoped_ptr<::media::BrowserCdmFactory>
CastContentBrowserClient::CreateBrowserCdmFactory() {
return make_scoped_ptr(new media::CastBrowserCdmFactory());
}
#endif
#endif // OS_ANDROID
void CastContentBrowserClient::ProcessExiting() {
// Finalize CastMediaShlib on media thread to ensure it's not accessed
@ -124,9 +118,8 @@ bool CastContentBrowserClient::EnableRemoteDebuggingImmediately() {
content::BrowserMainParts* CastContentBrowserClient::CreateBrowserMainParts(
const content::MainFunctionParams& parameters) {
content::BrowserMainParts* parts = new CastBrowserMainParts(
parameters, url_request_context_factory_.get(),
CreateAudioManagerFactory());
content::BrowserMainParts* parts =
new CastBrowserMainParts(parameters, url_request_context_factory_.get());
CastBrowserProcess::GetInstance()->SetCastContentBrowserClient(this);
return parts;
}

@ -61,10 +61,9 @@ class CastContentBrowserClient : public content::ContentBrowserClient {
PrefService* pref_service,
net::URLRequestContextGetter* request_context_getter);
// Provide an AudioManagerFactory instance for WebAudio playback.
#if !defined(OS_ANDROID)
virtual scoped_ptr<::media::AudioManagerFactory> CreateAudioManagerFactory();
#if !defined(OS_ANDROID)
// Creates a CmaMediaPipelineClient which is responsible to create (CMA
// backend)
// for media playback and watch media pipeline status, called once per media

@ -4,12 +4,10 @@
#include "chromecast/media/audio/cast_audio_manager.h"
#include "chromecast/base/task_runner_impl.h"
#include "chromecast/media/audio/cast_audio_output_stream.h"
#include "chromecast/media/base/media_message_loop.h"
#include "chromecast/public/cast_media_shlib.h"
#include "chromecast/public/media/media_pipeline_backend.h"
#include "chromecast/public/media/media_pipeline_device_params.h"
namespace {
// TODO(alokp): Query the preferred value from media backend.
@ -60,17 +58,12 @@ void CastAudioManager::GetAudioInputDeviceNames(
::media::CHANNEL_LAYOUT_STEREO, 48000, 16, 1024);
}
scoped_ptr<MediaPipelineBackend>
CastAudioManager::CreateMediaPipelineBackend() {
scoped_ptr<MediaPipelineBackend> CastAudioManager::CreateMediaPipelineBackend(
const MediaPipelineDeviceParams& params) {
DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
if (!backend_task_runner_)
backend_task_runner_.reset(new TaskRunnerImpl());
MediaPipelineDeviceParams device_params(
MediaPipelineDeviceParams::kModeIgnorePts, backend_task_runner_.get());
return scoped_ptr<MediaPipelineBackend>(
CastMediaShlib::CreateMediaPipelineBackend(device_params));
CastMediaShlib::CreateMediaPipelineBackend(params));
}
::media::AudioOutputStream* CastAudioManager::MakeLinearOutputStream(

@ -15,6 +15,7 @@ class TaskRunnerImpl;
namespace media {
class MediaPipelineBackend;
struct MediaPipelineDeviceParams;
class CastAudioManager : public ::media::AudioManagerBase {
public:
@ -32,7 +33,8 @@ class CastAudioManager : public ::media::AudioManagerBase {
// This must be called on cast media thread.
// See chromecast::media::MediaMessageLoop.
virtual scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend();
virtual scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend(
const MediaPipelineDeviceParams& params);
private:
// AudioManagerBase implementation.
@ -51,8 +53,6 @@ class CastAudioManager : public ::media::AudioManagerBase {
const std::string& output_device_id,
const ::media::AudioParameters& input_params) override;
scoped_ptr<TaskRunnerImpl> backend_task_runner_;
DISALLOW_COPY_AND_ASSIGN(CastAudioManager);
};

@ -8,6 +8,7 @@
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread_checker.h"
#include "chromecast/base/metrics/cast_metrics_helper.h"
#include "chromecast/base/task_runner_impl.h"
#include "chromecast/media/audio/cast_audio_manager.h"
#include "chromecast/media/base/media_message_loop.h"
#include "chromecast/media/cma/base/cast_decoder_buffer_impl.h"
@ -18,6 +19,7 @@
#include "chromecast/public/media/decrypt_context.h"
#include "chromecast/public/media/media_clock_device.h"
#include "chromecast/public/media/media_pipeline_backend.h"
#include "chromecast/public/media/media_pipeline_device_params.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/decoder_buffer.h"
@ -85,8 +87,12 @@ class CastAudioOutputStream::Backend {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(backend_ == nullptr);
backend_task_runner_.reset(new TaskRunnerImpl());
MediaPipelineDeviceParams device_params(
MediaPipelineDeviceParams::kModeIgnorePts, backend_task_runner_.get());
scoped_ptr<MediaPipelineBackend> pipeline_backend =
audio_manager->CreateMediaPipelineBackend();
audio_manager->CreateMediaPipelineBackend(device_params);
if (pipeline_backend && InitClockDevice(pipeline_backend->GetClock()) &&
InitAudioDevice(audio_params_, pipeline_backend->GetAudio())) {
backend_ = pipeline_backend.Pass();
@ -103,6 +109,7 @@ class CastAudioOutputStream::Backend {
backend_->GetAudio()->SetState(AudioPipelineDevice::kStateIdle);
}
backend_.reset();
backend_task_runner_.reset();
}
void Start() {
@ -157,6 +164,7 @@ class CastAudioOutputStream::Backend {
const ::media::AudioParameters audio_params_;
scoped_ptr<MediaPipelineBackend> backend_;
scoped_ptr<TaskRunnerImpl> backend_task_runner_;
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(Backend);
};

@ -182,7 +182,8 @@ class FakeAudioManager : public CastAudioManager {
~FakeAudioManager() override {}
// CastAudioManager overrides.
scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend() override {
scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend(
const MediaPipelineDeviceParams& params) override {
DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
DCHECK(!media_pipeline_backend_);