Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(330)

Side by Side Diff: content/renderer/media/media_stream_audio_track.cc

Issue 1834323002: MediaStream audio: Refactor 3 separate "glue" implementations into one. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more work on creating ended tracks; 10ms default audio buffer size; comments tweaked Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/media_stream_audio_track.h" 5 #include "content/renderer/media/media_stream_audio_track.h"
6 6
7 #include "base/callback_helpers.h" 7 #include "base/callback_helpers.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "content/public/renderer/media_stream_audio_sink.h"
10 #include "media/base/audio_bus.h"
9 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" 11 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
10 #include "third_party/webrtc/api/mediastreaminterface.h"
11 12
12 namespace content { 13 namespace content {
13 14
14 MediaStreamAudioTrack::MediaStreamAudioTrack(bool is_local_track) 15 MediaStreamAudioTrack::MediaStreamAudioTrack(bool is_local_track)
15 : MediaStreamTrack(is_local_track) { 16 : MediaStreamTrack(is_local_track), is_enabled_(true), weak_factory_(this) {
16 DVLOG(1) << "MediaStreamAudioTrack::MediaStreamAudioTrack(is a " 17 DVLOG(1) << "MediaStreamAudioTrack@" << this << "::MediaStreamAudioTrack("
17 << (is_local_track ? "local" : "remote") << " track)"; 18 << (is_local_track ? "local" : "remote") << " track)";
18 } 19 }
19 20
20 MediaStreamAudioTrack::~MediaStreamAudioTrack() { 21 MediaStreamAudioTrack::~MediaStreamAudioTrack() {
21 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 22 DCHECK(thread_checker_.CalledOnValidThread());
22 DVLOG(1) << "MediaStreamAudioTrack::~MediaStreamAudioTrack()"; 23 DVLOG(1) << "MediaStreamAudioTrack@" << this << " is being destroyed.";
23 DCHECK(stop_callback_.is_null()) 24 DCHECK(stop_callback_.is_null())
24 << "BUG: Subclass must ensure Stop() is called."; 25 << "BUG: Subclass must ensure Stop() is called.";
25 } 26 }
26 27
27 // static 28 // static
28 MediaStreamAudioTrack* MediaStreamAudioTrack::From( 29 MediaStreamAudioTrack* MediaStreamAudioTrack::From(
29 const blink::WebMediaStreamTrack& track) { 30 const blink::WebMediaStreamTrack& track) {
30 if (track.isNull() || 31 if (track.isNull() ||
31 track.source().getType() != blink::WebMediaStreamSource::TypeAudio) { 32 track.source().getType() != blink::WebMediaStreamSource::TypeAudio) {
32 return nullptr; 33 return nullptr;
33 } 34 }
34 return static_cast<MediaStreamAudioTrack*>(track.getExtraData()); 35 return static_cast<MediaStreamAudioTrack*>(track.getExtraData());
35 } 36 }
36 37
38 void MediaStreamAudioTrack::AddSink(MediaStreamAudioSink* sink) {
39 DCHECK(thread_checker_.CalledOnValidThread());
40
41 // If the track has already stopped, just notify the sink of this fact without
42 // adding it.
43 if (stop_callback_.is_null()) {
44 sink->OnReadyStateChanged(blink::WebMediaStreamSource::ReadyStateEnded);
45 return;
46 }
47
48 DVLOG(1) << "Adding MediaStreamAudioSink@" << sink
49 << " to MediaStreamAudioTrack@" << this << '.';
50 deliverer_.AddConsumer(sink);
51 }
52
53 void MediaStreamAudioTrack::RemoveSink(MediaStreamAudioSink* sink) {
54 DCHECK(thread_checker_.CalledOnValidThread());
55 deliverer_.RemoveConsumer(sink);
56 DVLOG(1) << "Removed MediaStreamAudioSink@" << sink
57 << " from MediaStreamAudioTrack@" << this << '.';
58 }
59
60 media::AudioParameters MediaStreamAudioTrack::GetOutputFormat() const {
61 return deliverer_.GetAudioParameters();
62 }
63
64 void MediaStreamAudioTrack::SetEnabled(bool enabled) {
65 DCHECK(thread_checker_.CalledOnValidThread());
66 DVLOG(1) << "MediaStreamAudioTrack@" << this << "::SetEnabled("
67 << (enabled ? 'Y' : 'N') << ')';
68 {
69 base::AutoLock auto_lock(enabled_lock_);
70 if (is_enabled_ == enabled)
71 return;
72 is_enabled_ = enabled;
tommi (sloooow) - chröme 2016/04/25 21:07:16 nit: would it make sense for this to be an atomic?
miu 2016/04/28 20:18:49 Done.
73 }
74
75 std::vector<MediaStreamAudioSink*> sinks_to_notify;
76 deliverer_.GetConsumerList(&sinks_to_notify);
77 for (MediaStreamAudioSink* sink : sinks_to_notify)
78 sink->OnEnabledChanged(enabled);
79 }
80
81 void* MediaStreamAudioTrack::GetClassIdentifier() const {
82 return nullptr;
83 }
84
37 void MediaStreamAudioTrack::Start(const base::Closure& stop_callback) { 85 void MediaStreamAudioTrack::Start(const base::Closure& stop_callback) {
38 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 86 DCHECK(thread_checker_.CalledOnValidThread());
39 DCHECK(!stop_callback.is_null()); 87 DCHECK(!stop_callback.is_null());
40 DCHECK(stop_callback_.is_null()); 88 DCHECK(stop_callback_.is_null());
41 DVLOG(1) << "MediaStreamAudioTrack::Start()"; 89 DVLOG(1) << "Starting MediaStreamAudioTrack@" << this << '.';
42 stop_callback_ = stop_callback; 90 stop_callback_ = stop_callback;
43 } 91 }
44 92
45 void MediaStreamAudioTrack::Stop() { 93 void MediaStreamAudioTrack::Stop() {
46 DCHECK(main_render_thread_checker_.CalledOnValidThread()); 94 DCHECK(thread_checker_.CalledOnValidThread());
47 DVLOG(1) << "MediaStreamAudioTrack::Stop()"; 95 DVLOG(1) << "Stopping MediaStreamAudioTrack@" << this << '.';
96
48 if (!stop_callback_.is_null()) 97 if (!stop_callback_.is_null())
49 base::ResetAndReturn(&stop_callback_).Run(); 98 base::ResetAndReturn(&stop_callback_).Run();
99
50 OnStop(); 100 OnStop();
101
102 std::vector<MediaStreamAudioSink*> sinks_to_end;
103 deliverer_.GetConsumerList(&sinks_to_end);
104 for (MediaStreamAudioSink* sink : sinks_to_end) {
105 deliverer_.RemoveConsumer(sink);
106 sink->OnReadyStateChanged(blink::WebMediaStreamSource::ReadyStateEnded);
107 }
108
109 weak_factory_.InvalidateWeakPtrs();
51 } 110 }
52 111
53 void MediaStreamAudioTrack::OnStop() {} 112 void MediaStreamAudioTrack::OnStop() {}
54 113
55 webrtc::AudioTrackInterface* MediaStreamAudioTrack::GetAudioAdapter() { 114 void MediaStreamAudioTrack::OnSetFormat(const media::AudioParameters& params) {
56 NOTREACHED(); 115 deliverer_.OnSetFormat(params);
57 return nullptr; 116 }
117
118 void MediaStreamAudioTrack::OnData(const media::AudioBus& audio_bus,
119 base::TimeTicks reference_time) {
120 bool enabled;
121 {
122 base::AutoLock auto_lock(enabled_lock_);
tommi (sloooow) - chröme 2016/04/25 21:07:16 using an atomic might actually make a difference h
miu 2016/04/28 20:18:49 Done. My understanding is that the timing of when
o1ka 2016/04/29 09:53:46 Could you put it into a comment?
miu 2016/05/04 02:47:53 Done.
123 enabled = is_enabled_;
124 }
125
126 if (enabled) {
127 deliverer_.OnData(audio_bus, reference_time);
128 } else {
129 // The W3C spec requires silent audio to flow while a track is disabled.
130 if (!silent_bus_ || silent_bus_->channels() != audio_bus.channels() ||
131 silent_bus_->frames() != audio_bus.frames()) {
132 silent_bus_ = media::AudioBus::Create(audio_bus.channels(),
133 audio_bus.frames());
134 silent_bus_->Zero();
135 }
136 deliverer_.OnData(*silent_bus_, reference_time);
137 }
58 } 138 }
59 139
60 } // namespace content 140 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698