OLD | NEW |
---|---|
(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 | |
OLD | NEW |