| Index: content/renderer/media/external_media_stream_audio_source.cc
|
| diff --git a/content/renderer/media/media_interface_provider.cc b/content/renderer/media/external_media_stream_audio_source.cc
|
| similarity index 10%
|
| copy from content/renderer/media/media_interface_provider.cc
|
| copy to content/renderer/media/external_media_stream_audio_source.cc
|
| index 239111224ad88445e94d295789170ccee11989b4..e9bd1ca5f37abcc2e57b4b1ebc3929a1ec71f0be 100644
|
| --- a/content/renderer/media/media_interface_provider.cc
|
| +++ b/content/renderer/media/external_media_stream_audio_source.cc
|
| @@ -2,67 +2,80 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "content/renderer/media/media_interface_provider.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "media/mojo/interfaces/content_decryption_module.mojom.h"
|
| -#include "media/mojo/interfaces/renderer.mojom.h"
|
| -#include "mojo/public/cpp/bindings/interface_request.h"
|
| -#include "services/shell/public/cpp/connect.h"
|
| +#include "content/renderer/media/external_media_stream_audio_source.h"
|
|
|
| namespace content {
|
|
|
| -MediaInterfaceProvider::MediaInterfaceProvider(
|
| - const ConnectToApplicationCB& connect_to_app_cb)
|
| - : connect_to_app_cb_(connect_to_app_cb) {
|
| - DCHECK(!connect_to_app_cb_.is_null());
|
| +ExternalMediaStreamAudioSource::ExternalMediaStreamAudioSource(
|
| + scoped_refptr<media::AudioCapturerSource> source,
|
| + int sample_rate,
|
| + media::ChannelLayout channel_layout,
|
| + int frames_per_buffer,
|
| + bool is_remote)
|
| + : MediaStreamAudioSource(!is_remote), source_(std::move(source)),
|
| + was_started_(false) {
|
| + DVLOG(1)
|
| + << "ExternalMediaStreamAudioSource::ExternalMediaStreamAudioSource()";
|
| + DCHECK(source_.get());
|
| + MediaStreamAudioSource::SetFormat(media::AudioParameters(
|
| + media::AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
|
| + sample_rate,
|
| + 16, // Legacy parameter (data is always in 32-bit float format).
|
| + frames_per_buffer));
|
| }
|
|
|
| -MediaInterfaceProvider::~MediaInterfaceProvider() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| +ExternalMediaStreamAudioSource::~ExternalMediaStreamAudioSource() {
|
| + DVLOG(1)
|
| + << "ExternalMediaStreamAudioSource::~ExternalMediaStreamAudioSource()";
|
| + EnsureSourceIsStopped();
|
| }
|
|
|
| -void MediaInterfaceProvider::GetInterface(const mojo::String& interface_name,
|
| - mojo::ScopedMessagePipeHandle pipe) {
|
| - DVLOG(1) << __FUNCTION__;
|
| +bool ExternalMediaStreamAudioSource::EnsureSourceIsStarted() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - if (interface_name == media::interfaces::ContentDecryptionModule::Name_) {
|
| - GetMediaServiceFactory()->CreateCdm(
|
| - mojo::MakeRequest<media::interfaces::ContentDecryptionModule>(
|
| - std::move(pipe)));
|
| - } else if (interface_name == media::interfaces::Renderer::Name_) {
|
| - GetMediaServiceFactory()->CreateRenderer(
|
| - mojo::MakeRequest<media::interfaces::Renderer>(std::move(pipe)));
|
| - } else if (interface_name == media::interfaces::AudioDecoder::Name_) {
|
| - GetMediaServiceFactory()->CreateAudioDecoder(
|
| - mojo::MakeRequest<media::interfaces::AudioDecoder>(std::move(pipe)));
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| + if (was_started_)
|
| + return true;
|
| + VLOG(1) << "Starting externally-provided "
|
| + << (is_local_source() ? "local" : "remote")
|
| + << " source with audio parameters={"
|
| + << GetAudioParameters().AsHumanReadableString() << "}.";
|
| + source_->Initialize(GetAudioParameters(), this, -1);
|
| + source_->Start();
|
| + was_started_ = true;
|
| + return true;
|
| }
|
|
|
| -media::interfaces::ServiceFactory*
|
| -MediaInterfaceProvider::GetMediaServiceFactory() {
|
| - DVLOG(1) << __FUNCTION__;
|
| +void ExternalMediaStreamAudioSource::EnsureSourceIsStopped() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - if (!media_service_factory_) {
|
| - shell::mojom::InterfaceProviderPtr interface_provider =
|
| - connect_to_app_cb_.Run(GURL("mojo:media"));
|
| - shell::GetInterface(interface_provider.get(), &media_service_factory_);
|
| - media_service_factory_.set_connection_error_handler(base::Bind(
|
| - &MediaInterfaceProvider::OnConnectionError, base::Unretained(this)));
|
| - }
|
| -
|
| - return media_service_factory_.get();
|
| + if (!source_)
|
| + return;
|
| + if (was_started_)
|
| + source_->Stop();
|
| + source_ = nullptr;
|
| + VLOG(1) << "Stopped externally-provided "
|
| + << (is_local_source() ? "local" : "remote")
|
| + << " source with audio parameters={"
|
| + << GetAudioParameters().AsHumanReadableString() << "}.";
|
| }
|
|
|
| -void MediaInterfaceProvider::OnConnectionError() {
|
| - DVLOG(1) << __FUNCTION__;
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| +void ExternalMediaStreamAudioSource::Capture(const media::AudioBus* audio_bus,
|
| + int audio_delay_milliseconds,
|
| + double volume,
|
| + bool key_pressed) {
|
| + DCHECK(audio_bus);
|
| + // TODO(miu): Plumbing is needed to determine the actual capture timestamp
|
| + // of the audio, instead of just snapshotting TimeTicks::Now(), for proper
|
| + // audio/video sync. http://crbug.com/335335
|
| + MediaStreamAudioSource::DeliverDataToTracks(
|
| + *audio_bus,
|
| + base::TimeTicks::Now() -
|
| + base::TimeDelta::FromMilliseconds(audio_delay_milliseconds));
|
| +}
|
|
|
| - media_service_factory_.reset();
|
| +void ExternalMediaStreamAudioSource::OnCaptureError(const std::string& why) {
|
| + // As of this writing, this method doesn't get called for anything useful,
|
| + // and all other implementors just log the message, but don't disconnect sinks
|
| + // or take any other action. So, just log the error.
|
| + LOG(ERROR) << why;
|
| }
|
|
|
| } // namespace content
|
|
|