[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:
@@ -213,13 +213,11 @@ void AddDefaultCommandLineSwitches(base::CommandLine* command_line) {
|
|||||||
|
|
||||||
CastBrowserMainParts::CastBrowserMainParts(
|
CastBrowserMainParts::CastBrowserMainParts(
|
||||||
const content::MainFunctionParams& parameters,
|
const content::MainFunctionParams& parameters,
|
||||||
URLRequestContextFactory* url_request_context_factory,
|
URLRequestContextFactory* url_request_context_factory)
|
||||||
scoped_ptr<::media::AudioManagerFactory> audio_manager_factory)
|
|
||||||
: BrowserMainParts(),
|
: BrowserMainParts(),
|
||||||
cast_browser_process_(new CastBrowserProcess()),
|
cast_browser_process_(new CastBrowserProcess()),
|
||||||
parameters_(parameters),
|
parameters_(parameters),
|
||||||
url_request_context_factory_(url_request_context_factory),
|
url_request_context_factory_(url_request_context_factory),
|
||||||
audio_manager_factory_(audio_manager_factory.Pass()),
|
|
||||||
net_log_(new CastNetLog()) {
|
net_log_(new CastNetLog()) {
|
||||||
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
||||||
AddDefaultCommandLineSwitches(command_line);
|
AddDefaultCommandLineSwitches(command_line);
|
||||||
@@ -236,10 +234,6 @@ void CastBrowserMainParts::PreMainMessageLoopStart() {
|
|||||||
// Net/DNS metrics.
|
// Net/DNS metrics.
|
||||||
metrics::PreregisterAllGroupedHistograms();
|
metrics::PreregisterAllGroupedHistograms();
|
||||||
|
|
||||||
// Set the platform's implementation of AudioManagerFactory.
|
|
||||||
if (audio_manager_factory_)
|
|
||||||
::media::AudioManager::SetFactory(audio_manager_factory_.release());
|
|
||||||
|
|
||||||
#if defined(OS_ANDROID)
|
#if defined(OS_ANDROID)
|
||||||
net::NetworkChangeNotifier::SetFactory(
|
net::NetworkChangeNotifier::SetFactory(
|
||||||
new net::NetworkChangeNotifierFactoryAndroid());
|
new net::NetworkChangeNotifierFactoryAndroid());
|
||||||
@@ -273,6 +267,12 @@ int CastBrowserMainParts::PreCreateThreads() {
|
|||||||
CHECK(PathService::Get(DIR_CAST_HOME, &home_dir));
|
CHECK(PathService::Get(DIR_CAST_HOME, &home_dir));
|
||||||
if (!base::CreateDirectory(home_dir))
|
if (!base::CreateDirectory(home_dir))
|
||||||
return 1;
|
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
|
#endif
|
||||||
|
|
||||||
#if defined(USE_AURA)
|
#if defined(USE_AURA)
|
||||||
|
@@ -6,15 +6,10 @@
|
|||||||
#define CHROMECAST_BROWSER_CAST_BROWSER_MAIN_PARTS_H_
|
#define CHROMECAST_BROWSER_CAST_BROWSER_MAIN_PARTS_H_
|
||||||
|
|
||||||
#include "base/macros.h"
|
#include "base/macros.h"
|
||||||
#include "base/memory/ref_counted.h"
|
|
||||||
#include "base/memory/scoped_ptr.h"
|
#include "base/memory/scoped_ptr.h"
|
||||||
#include "content/public/browser/browser_main_parts.h"
|
#include "content/public/browser/browser_main_parts.h"
|
||||||
#include "content/public/common/main_function_params.h"
|
#include "content/public/common/main_function_params.h"
|
||||||
|
|
||||||
namespace media {
|
|
||||||
class AudioManagerFactory;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace net {
|
namespace net {
|
||||||
class NetLog;
|
class NetLog;
|
||||||
}
|
}
|
||||||
@@ -27,10 +22,8 @@ class URLRequestContextFactory;
|
|||||||
class CastBrowserMainParts : public content::BrowserMainParts {
|
class CastBrowserMainParts : public content::BrowserMainParts {
|
||||||
public:
|
public:
|
||||||
// This class does not take ownership of |url_request_content_factory|.
|
// This class does not take ownership of |url_request_content_factory|.
|
||||||
CastBrowserMainParts(
|
CastBrowserMainParts(const content::MainFunctionParams& parameters,
|
||||||
const content::MainFunctionParams& parameters,
|
URLRequestContextFactory* url_request_context_factory);
|
||||||
URLRequestContextFactory* url_request_context_factory,
|
|
||||||
scoped_ptr<::media::AudioManagerFactory> audio_manager_factory);
|
|
||||||
~CastBrowserMainParts() override;
|
~CastBrowserMainParts() override;
|
||||||
|
|
||||||
// content::BrowserMainParts implementation:
|
// content::BrowserMainParts implementation:
|
||||||
@@ -45,7 +38,6 @@ class CastBrowserMainParts : public content::BrowserMainParts {
|
|||||||
scoped_ptr<CastBrowserProcess> cast_browser_process_;
|
scoped_ptr<CastBrowserProcess> cast_browser_process_;
|
||||||
const content::MainFunctionParams parameters_; // For running browser tests.
|
const content::MainFunctionParams parameters_; // For running browser tests.
|
||||||
URLRequestContextFactory* const url_request_context_factory_;
|
URLRequestContextFactory* const url_request_context_factory_;
|
||||||
scoped_ptr<::media::AudioManagerFactory> audio_manager_factory_;
|
|
||||||
scoped_ptr<net::NetLog> net_log_;
|
scoped_ptr<net::NetLog> net_log_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(CastBrowserMainParts);
|
DISALLOW_COPY_AND_ASSIGN(CastBrowserMainParts);
|
||||||
|
@@ -80,18 +80,12 @@ scoped_ptr<CastService> CastContentBrowserClient::CreateCastService(
|
|||||||
return make_scoped_ptr(new CastServiceSimple(browser_context, pref_service));
|
return make_scoped_ptr(new CastServiceSimple(browser_context, pref_service));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(OS_ANDROID)
|
||||||
scoped_ptr<::media::AudioManagerFactory>
|
scoped_ptr<::media::AudioManagerFactory>
|
||||||
CastContentBrowserClient::CreateAudioManagerFactory() {
|
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());
|
return make_scoped_ptr(new media::CastAudioManagerFactory());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(OS_ANDROID)
|
|
||||||
scoped_refptr<media::CmaMediaPipelineClient>
|
scoped_refptr<media::CmaMediaPipelineClient>
|
||||||
CastContentBrowserClient::CreateCmaMediaPipelineClient() {
|
CastContentBrowserClient::CreateCmaMediaPipelineClient() {
|
||||||
return make_scoped_refptr(new media::CmaMediaPipelineClient());
|
return make_scoped_refptr(new media::CmaMediaPipelineClient());
|
||||||
@@ -101,7 +95,7 @@ scoped_ptr<::media::BrowserCdmFactory>
|
|||||||
CastContentBrowserClient::CreateBrowserCdmFactory() {
|
CastContentBrowserClient::CreateBrowserCdmFactory() {
|
||||||
return make_scoped_ptr(new media::CastBrowserCdmFactory());
|
return make_scoped_ptr(new media::CastBrowserCdmFactory());
|
||||||
}
|
}
|
||||||
#endif
|
#endif // OS_ANDROID
|
||||||
|
|
||||||
void CastContentBrowserClient::ProcessExiting() {
|
void CastContentBrowserClient::ProcessExiting() {
|
||||||
// Finalize CastMediaShlib on media thread to ensure it's not accessed
|
// Finalize CastMediaShlib on media thread to ensure it's not accessed
|
||||||
@@ -124,9 +118,8 @@ bool CastContentBrowserClient::EnableRemoteDebuggingImmediately() {
|
|||||||
|
|
||||||
content::BrowserMainParts* CastContentBrowserClient::CreateBrowserMainParts(
|
content::BrowserMainParts* CastContentBrowserClient::CreateBrowserMainParts(
|
||||||
const content::MainFunctionParams& parameters) {
|
const content::MainFunctionParams& parameters) {
|
||||||
content::BrowserMainParts* parts = new CastBrowserMainParts(
|
content::BrowserMainParts* parts =
|
||||||
parameters, url_request_context_factory_.get(),
|
new CastBrowserMainParts(parameters, url_request_context_factory_.get());
|
||||||
CreateAudioManagerFactory());
|
|
||||||
CastBrowserProcess::GetInstance()->SetCastContentBrowserClient(this);
|
CastBrowserProcess::GetInstance()->SetCastContentBrowserClient(this);
|
||||||
return parts;
|
return parts;
|
||||||
}
|
}
|
||||||
|
@@ -61,10 +61,9 @@ class CastContentBrowserClient : public content::ContentBrowserClient {
|
|||||||
PrefService* pref_service,
|
PrefService* pref_service,
|
||||||
net::URLRequestContextGetter* request_context_getter);
|
net::URLRequestContextGetter* request_context_getter);
|
||||||
|
|
||||||
// Provide an AudioManagerFactory instance for WebAudio playback.
|
#if !defined(OS_ANDROID)
|
||||||
virtual scoped_ptr<::media::AudioManagerFactory> CreateAudioManagerFactory();
|
virtual scoped_ptr<::media::AudioManagerFactory> CreateAudioManagerFactory();
|
||||||
|
|
||||||
#if !defined(OS_ANDROID)
|
|
||||||
// Creates a CmaMediaPipelineClient which is responsible to create (CMA
|
// Creates a CmaMediaPipelineClient which is responsible to create (CMA
|
||||||
// backend)
|
// backend)
|
||||||
// for media playback and watch media pipeline status, called once per media
|
// 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/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/audio/cast_audio_output_stream.h"
|
||||||
#include "chromecast/media/base/media_message_loop.h"
|
#include "chromecast/media/base/media_message_loop.h"
|
||||||
#include "chromecast/public/cast_media_shlib.h"
|
#include "chromecast/public/cast_media_shlib.h"
|
||||||
#include "chromecast/public/media/media_pipeline_backend.h"
|
#include "chromecast/public/media/media_pipeline_backend.h"
|
||||||
#include "chromecast/public/media/media_pipeline_device_params.h"
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
// TODO(alokp): Query the preferred value from media backend.
|
// TODO(alokp): Query the preferred value from media backend.
|
||||||
@@ -60,17 +58,12 @@ void CastAudioManager::GetAudioInputDeviceNames(
|
|||||||
::media::CHANNEL_LAYOUT_STEREO, 48000, 16, 1024);
|
::media::CHANNEL_LAYOUT_STEREO, 48000, 16, 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
scoped_ptr<MediaPipelineBackend>
|
scoped_ptr<MediaPipelineBackend> CastAudioManager::CreateMediaPipelineBackend(
|
||||||
CastAudioManager::CreateMediaPipelineBackend() {
|
const MediaPipelineDeviceParams& params) {
|
||||||
DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
|
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>(
|
return scoped_ptr<MediaPipelineBackend>(
|
||||||
CastMediaShlib::CreateMediaPipelineBackend(device_params));
|
CastMediaShlib::CreateMediaPipelineBackend(params));
|
||||||
}
|
}
|
||||||
|
|
||||||
::media::AudioOutputStream* CastAudioManager::MakeLinearOutputStream(
|
::media::AudioOutputStream* CastAudioManager::MakeLinearOutputStream(
|
||||||
|
@@ -15,6 +15,7 @@ class TaskRunnerImpl;
|
|||||||
namespace media {
|
namespace media {
|
||||||
|
|
||||||
class MediaPipelineBackend;
|
class MediaPipelineBackend;
|
||||||
|
struct MediaPipelineDeviceParams;
|
||||||
|
|
||||||
class CastAudioManager : public ::media::AudioManagerBase {
|
class CastAudioManager : public ::media::AudioManagerBase {
|
||||||
public:
|
public:
|
||||||
@@ -32,7 +33,8 @@ class CastAudioManager : public ::media::AudioManagerBase {
|
|||||||
|
|
||||||
// This must be called on cast media thread.
|
// This must be called on cast media thread.
|
||||||
// See chromecast::media::MediaMessageLoop.
|
// See chromecast::media::MediaMessageLoop.
|
||||||
virtual scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend();
|
virtual scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend(
|
||||||
|
const MediaPipelineDeviceParams& params);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// AudioManagerBase implementation.
|
// AudioManagerBase implementation.
|
||||||
@@ -51,8 +53,6 @@ class CastAudioManager : public ::media::AudioManagerBase {
|
|||||||
const std::string& output_device_id,
|
const std::string& output_device_id,
|
||||||
const ::media::AudioParameters& input_params) override;
|
const ::media::AudioParameters& input_params) override;
|
||||||
|
|
||||||
scoped_ptr<TaskRunnerImpl> backend_task_runner_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(CastAudioManager);
|
DISALLOW_COPY_AND_ASSIGN(CastAudioManager);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
#include "base/synchronization/waitable_event.h"
|
#include "base/synchronization/waitable_event.h"
|
||||||
#include "base/threading/thread_checker.h"
|
#include "base/threading/thread_checker.h"
|
||||||
#include "chromecast/base/metrics/cast_metrics_helper.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/audio/cast_audio_manager.h"
|
||||||
#include "chromecast/media/base/media_message_loop.h"
|
#include "chromecast/media/base/media_message_loop.h"
|
||||||
#include "chromecast/media/cma/base/cast_decoder_buffer_impl.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/decrypt_context.h"
|
||||||
#include "chromecast/public/media/media_clock_device.h"
|
#include "chromecast/public/media/media_clock_device.h"
|
||||||
#include "chromecast/public/media/media_pipeline_backend.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/bind_to_current_loop.h"
|
||||||
#include "media/base/decoder_buffer.h"
|
#include "media/base/decoder_buffer.h"
|
||||||
|
|
||||||
@@ -85,8 +87,12 @@ class CastAudioOutputStream::Backend {
|
|||||||
DCHECK(thread_checker_.CalledOnValidThread());
|
DCHECK(thread_checker_.CalledOnValidThread());
|
||||||
DCHECK(backend_ == nullptr);
|
DCHECK(backend_ == nullptr);
|
||||||
|
|
||||||
|
backend_task_runner_.reset(new TaskRunnerImpl());
|
||||||
|
MediaPipelineDeviceParams device_params(
|
||||||
|
MediaPipelineDeviceParams::kModeIgnorePts, backend_task_runner_.get());
|
||||||
|
|
||||||
scoped_ptr<MediaPipelineBackend> pipeline_backend =
|
scoped_ptr<MediaPipelineBackend> pipeline_backend =
|
||||||
audio_manager->CreateMediaPipelineBackend();
|
audio_manager->CreateMediaPipelineBackend(device_params);
|
||||||
if (pipeline_backend && InitClockDevice(pipeline_backend->GetClock()) &&
|
if (pipeline_backend && InitClockDevice(pipeline_backend->GetClock()) &&
|
||||||
InitAudioDevice(audio_params_, pipeline_backend->GetAudio())) {
|
InitAudioDevice(audio_params_, pipeline_backend->GetAudio())) {
|
||||||
backend_ = pipeline_backend.Pass();
|
backend_ = pipeline_backend.Pass();
|
||||||
@@ -103,6 +109,7 @@ class CastAudioOutputStream::Backend {
|
|||||||
backend_->GetAudio()->SetState(AudioPipelineDevice::kStateIdle);
|
backend_->GetAudio()->SetState(AudioPipelineDevice::kStateIdle);
|
||||||
}
|
}
|
||||||
backend_.reset();
|
backend_.reset();
|
||||||
|
backend_task_runner_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Start() {
|
void Start() {
|
||||||
@@ -157,6 +164,7 @@ class CastAudioOutputStream::Backend {
|
|||||||
|
|
||||||
const ::media::AudioParameters audio_params_;
|
const ::media::AudioParameters audio_params_;
|
||||||
scoped_ptr<MediaPipelineBackend> backend_;
|
scoped_ptr<MediaPipelineBackend> backend_;
|
||||||
|
scoped_ptr<TaskRunnerImpl> backend_task_runner_;
|
||||||
base::ThreadChecker thread_checker_;
|
base::ThreadChecker thread_checker_;
|
||||||
DISALLOW_COPY_AND_ASSIGN(Backend);
|
DISALLOW_COPY_AND_ASSIGN(Backend);
|
||||||
};
|
};
|
||||||
|
@@ -182,7 +182,8 @@ class FakeAudioManager : public CastAudioManager {
|
|||||||
~FakeAudioManager() override {}
|
~FakeAudioManager() override {}
|
||||||
|
|
||||||
// CastAudioManager overrides.
|
// CastAudioManager overrides.
|
||||||
scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend() override {
|
scoped_ptr<MediaPipelineBackend> CreateMediaPipelineBackend(
|
||||||
|
const MediaPipelineDeviceParams& params) override {
|
||||||
DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
|
DCHECK(media::MediaMessageLoop::GetTaskRunner()->BelongsToCurrentThread());
|
||||||
DCHECK(!media_pipeline_backend_);
|
DCHECK(!media_pipeline_backend_);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user