| Index: content/renderer/media/media_stream_audio_source.cc
|
| diff --git a/content/renderer/media/media_stream_audio_source.cc b/content/renderer/media/media_stream_audio_source.cc
|
| index 6e99deb54cda931b947c7511889371100fe7b57f..d2027fd939e797db1171625fcf469f8466c2fd36 100644
|
| --- a/content/renderer/media/media_stream_audio_source.cc
|
| +++ b/content/renderer/media/media_stream_audio_source.cc
|
| @@ -4,25 +4,28 @@
|
|
|
| #include "content/renderer/media/media_stream_audio_source.h"
|
|
|
| -#include "base/bind.h"
|
| -#include "content/renderer/media/media_stream_audio_track.h"
|
| +#include "content/renderer/media/webrtc_local_audio_track.h"
|
| +#include "content/renderer/render_frame_impl.h"
|
| #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
|
| -#include "third_party/WebKit/public/platform/WebString.h"
|
|
|
| namespace content {
|
|
|
| -MediaStreamAudioSource::MediaStreamAudioSource(bool is_local_source)
|
| - : is_local_source_(is_local_source),
|
| - is_stopped_(false),
|
| +MediaStreamAudioSource::MediaStreamAudioSource(
|
| + int render_frame_id,
|
| + const StreamDeviceInfo& device_info,
|
| + const SourceStoppedCallback& stop_callback,
|
| + PeerConnectionDependencyFactory* factory)
|
| + : render_frame_id_(render_frame_id), factory_(factory),
|
| weak_factory_(this) {
|
| - DVLOG(1) << "MediaStreamAudioSource@" << this << "::MediaStreamAudioSource("
|
| - << (is_local_source_ ? "local" : "remote") << " source)";
|
| + SetDeviceInfo(device_info);
|
| + SetStopCallback(stop_callback);
|
| }
|
|
|
| -MediaStreamAudioSource::~MediaStreamAudioSource() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DVLOG(1) << "MediaStreamAudioSource@" << this << " is being destroyed.";
|
| +MediaStreamAudioSource::MediaStreamAudioSource()
|
| + : render_frame_id_(-1), factory_(NULL), weak_factory_(this) {
|
| }
|
| +
|
| +MediaStreamAudioSource::~MediaStreamAudioSource() {}
|
|
|
| // static
|
| MediaStreamAudioSource* MediaStreamAudioSource::From(
|
| @@ -34,106 +37,50 @@
|
| return static_cast<MediaStreamAudioSource*>(source.getExtraData());
|
| }
|
|
|
| -bool MediaStreamAudioSource::ConnectToTrack(
|
| - const blink::WebMediaStreamTrack& blink_track) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!blink_track.isNull());
|
| +void MediaStreamAudioSource::DoStopSource() {
|
| + if (audio_capturer_)
|
| + audio_capturer_->Stop();
|
| + if (webaudio_capturer_)
|
| + webaudio_capturer_->Stop();
|
| +}
|
|
|
| - // Sanity-check that there is not already a MediaStreamAudioTrack instance
|
| - // associated with |blink_track|.
|
| - if (MediaStreamAudioTrack::From(blink_track)) {
|
| - LOG(DFATAL)
|
| - << "Attempting to connect another source to a WebMediaStreamTrack.";
|
| - return false;
|
| +void MediaStreamAudioSource::AddTrack(
|
| + const blink::WebMediaStreamTrack& track,
|
| + const blink::WebMediaConstraints& constraints,
|
| + const ConstraintsCallback& callback) {
|
| + // TODO(xians): Properly implement for audio sources.
|
| + if (!local_audio_source_.get()) {
|
| + if (!factory_->InitializeMediaStreamAudioSource(render_frame_id_,
|
| + constraints, this)) {
|
| + // The source failed to start.
|
| + // UserMediaClientImpl rely on the |stop_callback| to be triggered when
|
| + // the last track is removed from the source. But in this case, the
|
| + // source is is not even started. So we need to fail both adding the
|
| + // track and trigger |stop_callback|.
|
| + callback.Run(this, MEDIA_DEVICE_TRACK_START_FAILURE, "");
|
| + StopSource();
|
| + return;
|
| + }
|
| }
|
|
|
| - // Unless the source has already been permanently stopped, ensure it is
|
| - // started. If the source cannot start, the new MediaStreamAudioTrack will be
|
| - // initialized to the stopped/ended state.
|
| - if (!is_stopped_) {
|
| - if (!EnsureSourceIsStarted())
|
| - StopSource();
|
| - }
|
| -
|
| - // Create and initialize a new MediaStreamAudioTrack and pass ownership of it
|
| - // to the WebMediaStreamTrack.
|
| - blink::WebMediaStreamTrack mutable_blink_track = blink_track;
|
| - mutable_blink_track.setExtraData(
|
| - CreateMediaStreamAudioTrack(blink_track.id().utf8()).release());
|
| -
|
| - // Propagate initial "enabled" state.
|
| - MediaStreamAudioTrack* const track = MediaStreamAudioTrack::From(blink_track);
|
| - DCHECK(track);
|
| - track->SetEnabled(blink_track.isEnabled());
|
| -
|
| - // If the source is stopped, do not start the track.
|
| - if (is_stopped_)
|
| - return false;
|
| -
|
| - track->Start(base::Bind(&MediaStreamAudioSource::StopAudioDeliveryTo,
|
| - weak_factory_.GetWeakPtr(), track));
|
| - DVLOG(1) << "Adding MediaStreamAudioTrack@" << track
|
| - << " as a consumer of MediaStreamAudioSource@" << this << '.';
|
| - deliverer_.AddConsumer(track);
|
| - return true;
|
| -}
|
| -
|
| -media::AudioParameters MediaStreamAudioSource::GetAudioParameters() const {
|
| - return deliverer_.GetAudioParameters();
|
| -}
|
| -
|
| -void* MediaStreamAudioSource::GetClassIdentifier() const {
|
| - return nullptr;
|
| -}
|
| -
|
| -std::unique_ptr<MediaStreamAudioTrack>
|
| -MediaStreamAudioSource::CreateMediaStreamAudioTrack(const std::string& id) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - return std::unique_ptr<MediaStreamAudioTrack>(
|
| - new MediaStreamAudioTrack(is_local_source()));
|
| -}
|
| -
|
| -bool MediaStreamAudioSource::EnsureSourceIsStarted() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DVLOG(1) << "MediaStreamAudioSource@" << this << "::EnsureSourceIsStarted()";
|
| - return true;
|
| -}
|
| -
|
| -void MediaStreamAudioSource::EnsureSourceIsStopped() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DVLOG(1) << "MediaStreamAudioSource@" << this << "::EnsureSourceIsStopped()";
|
| -}
|
| -
|
| -void MediaStreamAudioSource::SetFormat(const media::AudioParameters& params) {
|
| - DVLOG(1) << "MediaStreamAudioSource@" << this << "::SetFormat("
|
| - << params.AsHumanReadableString() << "), was previously set to {"
|
| - << deliverer_.GetAudioParameters().AsHumanReadableString() << "}.";
|
| - deliverer_.OnSetFormat(params);
|
| -}
|
| -
|
| -void MediaStreamAudioSource::DeliverDataToTracks(
|
| - const media::AudioBus& audio_bus,
|
| - base::TimeTicks reference_time) {
|
| - deliverer_.OnData(audio_bus, reference_time);
|
| -}
|
| -
|
| -void MediaStreamAudioSource::DoStopSource() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - EnsureSourceIsStopped();
|
| - is_stopped_ = true;
|
| + factory_->CreateLocalAudioTrack(track);
|
| + callback.Run(this, MEDIA_DEVICE_OK, "");
|
| }
|
|
|
| void MediaStreamAudioSource::StopAudioDeliveryTo(MediaStreamAudioTrack* track) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - const bool did_remove_last_track = deliverer_.RemoveConsumer(track);
|
| - DVLOG(1) << "Removed MediaStreamAudioTrack@" << track
|
| - << " as a consumer of MediaStreamAudioSource@" << this << '.';
|
| -
|
| - // The W3C spec requires a source automatically stop when the last track is
|
| - // stopped.
|
| - if (!is_stopped_ && did_remove_last_track)
|
| - MediaStreamSource::StopSource();
|
| + DCHECK(track);
|
| + if (audio_capturer_) {
|
| + // The cast here is safe because only WebRtcLocalAudioTracks are ever used
|
| + // with WebRtcAudioCapturer sources.
|
| + //
|
| + // TODO(miu): That said, this ugly cast won't be necessary after my
|
| + // soon-upcoming refactoring change.
|
| + audio_capturer_->RemoveTrack(static_cast<WebRtcLocalAudioTrack*>(track));
|
| + }
|
| + if (webaudio_capturer_) {
|
| + // A separate source is created for each track, so just stop the source.
|
| + webaudio_capturer_->Stop();
|
| + }
|
| }
|
|
|
| } // namespace content
|
|
|