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 |