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

Side by Side Diff: content/browser/renderer_host/media/web_contents_audio_input_stream.cc

Issue 11413078: Tab Audio Capture: Browser-side connect/disconnect functionality. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minor tweaks and added some useful comments. Created 8 years 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/media/web_contents_audio_input_stream.h"
6
7 #include <string>
8
9 #include "base/bind.h"
10 #include "base/logging.h"
11 #include "content/browser/renderer_host/media/audio_renderer_host.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "media/base/bind_to_loop.h"
14
15 namespace content {
16
17 //static
18 WebContentsAudioInputStream* WebContentsAudioInputStream::Create(
19 const std::string& device_id,
20 const media::AudioParameters& params) {
21 int render_process_id;
22 int render_view_id;
23 if (!WebContentsCaptureUtil::ExtractTabCaptureTarget(
24 device_id, &render_process_id, &render_view_id)) {
25 return NULL;
26 }
27
28 return new WebContentsAudioInputStream(
29 render_process_id, render_view_id, params);
30 }
31
32 WebContentsAudioInputStream::WebContentsAudioInputStream(
33 int render_process_id, int render_view_id,
34 const media::AudioParameters& params)
35 : params_(params),
36 thread_checker_(),
37 state_(kConstructed),
38 target_render_process_id_(render_process_id),
39 target_render_view_id_(render_view_id) {
40 }
41
42 WebContentsAudioInputStream::~WebContentsAudioInputStream() {
43 DCHECK(!tracker_) << "BUG: Close() not called after Open().";
44 }
45
46 bool WebContentsAudioInputStream::Open() {
47 DCHECK(thread_checker_.CalledOnValidThread());
48
49 if (state_ != kConstructed) {
50 return false;
51 }
52
53 state_ = kOpened;
54
55 DCHECK(!tracker_);
56 tracker_ = new WebContentsCaptureUtil::RenderViewTracker();
57 tracker_->Start(
58 target_render_process_id_, target_render_view_id_,
59 media::BindToLoop(
60 base::MessageLoopProxy::current(),
61 base::Bind(&WebContentsAudioInputStream::OnTargetChanged, this)));
62
63 return true;
64 }
65
66 void WebContentsAudioInputStream::Start(AudioInputCallback* callback) {
67 DCHECK(thread_checker_.CalledOnValidThread());
68
69 if (state_ != kOpened) {
70 return;
71 }
72
73 state_ = kRecording;
74
75 AudioRendererHost::StartMirroring(
76 target_render_process_id_, target_render_view_id_, this);
77 }
78
79 void WebContentsAudioInputStream::Stop() {
80 DCHECK(thread_checker_.CalledOnValidThread());
81
82 if (state_ != kRecording) {
83 return;
84 }
85
86 AudioRendererHost::StopMirroring(
87 target_render_process_id_, target_render_view_id_, this);
88
89 state_ = kOpened;
90 }
91
92 void WebContentsAudioInputStream::Close() {
93 DCHECK(thread_checker_.CalledOnValidThread());
94
95 Stop();
96
97 tracker_->Stop();
98 tracker_ = NULL;
99
100 state_ = kClosed;
101 }
102
103 void WebContentsAudioInputStream::OnTargetChanged(int render_process_id,
104 int render_view_id) {
105 DCHECK(thread_checker_.CalledOnValidThread());
106
107 if (target_render_process_id_ == render_process_id &&
108 target_render_view_id_ == render_view_id) {
109 return;
110 }
111
112 if (state_ == kRecording) {
113 AudioRendererHost::StopMirroring(
Alpha Left Google 2012/11/28 20:02:25 This is on IO thread right?
miu 2012/11/28 22:05:50 Nope. Audio thread. See my other comments for ex
114 target_render_process_id_, target_render_view_id_, this);
115 }
116
117 target_render_process_id_ = render_process_id;
118 target_render_view_id_ = render_view_id;
119
120 if (state_ == kRecording) {
121 AudioRendererHost::StartMirroring(
122 target_render_process_id_, target_render_view_id_, this);
123 }
124 }
125
126 double WebContentsAudioInputStream::GetMaxVolume() {
127 return 1.0;
128 }
129
130 void WebContentsAudioInputStream::SetVolume(double volume) {
131 // no-op
132 }
133
134 double WebContentsAudioInputStream::GetVolume() {
135 return 1.0;
136 }
137
138 void WebContentsAudioInputStream::SetAutomaticGainControl(bool enabled) {
139 // no-op
140 }
141
142 bool WebContentsAudioInputStream::GetAutomaticGainControl() {
143 return false;
144 }
145
146 void WebContentsAudioInputStream::AddInput(
147 media::AudioOutputStream::AudioSourceCallback* callback,
148 const media::AudioParameters& params){
149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
150
151 DCHECK(!source_params_.count(callback)) << "BUG: Adding same callback twice.";
152 source_params_.insert(std::make_pair(callback, params));
153
154 DVLOG(1) << "STUB: WebContentsAudioInputStream@" << this
155 << "->AddInput(" << callback << ')';
156 }
157
158 void WebContentsAudioInputStream::RemoveInput(
159 media::AudioOutputStream::AudioSourceCallback* callback) {
160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
161
162 DCHECK(source_params_.count(callback)) << "BUG: Removing unknown callback.";
163 source_params_.erase(callback);
164
165 DVLOG(1) << "STUB: WebContentsAudioInputStream@" << this
166 << "->RemoveInput(" << callback << ')';
167 }
168
169 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698