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

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

Issue 2330393002: Change sync primitives ownership for audio rendering. (Closed)
Patch Set: Remove incorrect comment. Created 4 years, 3 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 (c) 2012 The Chromium Authors. All rights reserved. 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 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/browser/renderer_host/media/audio_renderer_host.h" 5 #include "content/browser/renderer_host/media/audio_renderer_host.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 !!RenderFrameHost::FromID(render_process_id, render_frame_id); 127 !!RenderFrameHost::FromID(render_process_id, render_frame_id);
128 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 128 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
129 base::Bind(callback, frame_exists)); 129 base::Bind(callback, frame_exists));
130 } 130 }
131 131
132 } // namespace 132 } // namespace
133 133
134 class AudioRendererHost::AudioEntry 134 class AudioRendererHost::AudioEntry
135 : public media::AudioOutputController::EventHandler { 135 : public media::AudioOutputController::EventHandler {
136 public: 136 public:
137 AudioEntry(AudioRendererHost* host,
138 int stream_id,
139 int render_frame_id,
140 const media::AudioParameters& params,
141 const std::string& output_device_id,
142 std::unique_ptr<base::SharedMemory> shared_memory,
143 std::unique_ptr<media::AudioOutputController::SyncReader> reader);
144 ~AudioEntry() override; 137 ~AudioEntry() override;
145 138
139 // Returns nullptr on failure.
140 static std::unique_ptr<AudioRendererHost::AudioEntry> Create(
141 AudioRendererHost* host,
142 int stream_id,
143 int render_frame_id,
144 const media::AudioParameters& params,
145 const std::string& output_device_id);
146
146 int stream_id() const { 147 int stream_id() const {
147 return stream_id_; 148 return stream_id_;
148 } 149 }
149 150
150 int render_frame_id() const { return render_frame_id_; } 151 int render_frame_id() const { return render_frame_id_; }
151 152
152 media::AudioOutputController* controller() const { return controller_.get(); } 153 media::AudioOutputController* controller() const { return controller_.get(); }
153 154
154 base::SharedMemory* shared_memory() { 155 AudioSyncReader* reader() const { return reader_.get(); }
155 return shared_memory_.get();
156 }
157 156
158 media::AudioOutputController::SyncReader* reader() const { 157 // Used by ARH to track the number of active streams for UMA stats.
159 return reader_.get();
160 }
161
162 bool playing() const { return playing_; } 158 bool playing() const { return playing_; }
163 void set_playing(bool playing) { playing_ = playing; } 159 void set_playing(bool playing) { playing_ = playing; }
164 160
165 private: 161 private:
162 AudioEntry(AudioRendererHost* host,
163 int stream_id,
164 int render_frame_id,
165 const media::AudioParameters& params,
166 const std::string& output_device_id,
167 std::unique_ptr<AudioSyncReader> reader);
168
166 // media::AudioOutputController::EventHandler implementation. 169 // media::AudioOutputController::EventHandler implementation.
167 void OnCreated() override; 170 void OnCreated() override;
168 void OnPlaying() override; 171 void OnPlaying() override;
169 void OnPaused() override; 172 void OnPaused() override;
170 void OnError() override; 173 void OnError() override;
171 174
172 AudioRendererHost* const host_; 175 AudioRendererHost* const host_;
173 const int stream_id_; 176 const int stream_id_;
174 177
175 // The routing ID of the source RenderFrame. 178 // The routing ID of the source RenderFrame.
176 const int render_frame_id_; 179 const int render_frame_id_;
177 180
178 // Shared memory for transmission of the audio data. Used by |reader_|.
179 const std::unique_ptr<base::SharedMemory> shared_memory_;
180
181 // The synchronous reader to be used by |controller_|. 181 // The synchronous reader to be used by |controller_|.
182 const std::unique_ptr<media::AudioOutputController::SyncReader> reader_; 182 const std::unique_ptr<AudioSyncReader> reader_;
183 183
184 // The AudioOutputController that manages the audio stream. 184 // The AudioOutputController that manages the audio stream.
185 const scoped_refptr<media::AudioOutputController> controller_; 185 const scoped_refptr<media::AudioOutputController> controller_;
186 186
187 bool playing_; 187 bool playing_;
188
189 DISALLOW_COPY_AND_ASSIGN(AudioEntry);
188 }; 190 };
189 191
190 AudioRendererHost::AudioEntry::AudioEntry( 192 AudioRendererHost::AudioEntry::AudioEntry(
191 AudioRendererHost* host, 193 AudioRendererHost* host,
192 int stream_id, 194 int stream_id,
193 int render_frame_id, 195 int render_frame_id,
194 const media::AudioParameters& params, 196 const media::AudioParameters& params,
195 const std::string& output_device_id, 197 const std::string& output_device_id,
196 std::unique_ptr<base::SharedMemory> shared_memory, 198 std::unique_ptr<AudioSyncReader> reader)
197 std::unique_ptr<media::AudioOutputController::SyncReader> reader)
198 : host_(host), 199 : host_(host),
199 stream_id_(stream_id), 200 stream_id_(stream_id),
200 render_frame_id_(render_frame_id), 201 render_frame_id_(render_frame_id),
201 shared_memory_(std::move(shared_memory)),
202 reader_(std::move(reader)), 202 reader_(std::move(reader)),
203 controller_(media::AudioOutputController::Create(host->audio_manager_, 203 controller_(media::AudioOutputController::Create(host->audio_manager_,
204 this, 204 this,
205 params, 205 params,
206 output_device_id, 206 output_device_id,
207 reader_.get())), 207 reader_.get())),
208 playing_(false) { 208 playing_(false) {
209 DCHECK(controller_.get()); 209 DCHECK(controller_);
210 } 210 }
211 211
212 AudioRendererHost::AudioEntry::~AudioEntry() {} 212 AudioRendererHost::AudioEntry::~AudioEntry() {}
213 213
214 // static
215 std::unique_ptr<AudioRendererHost::AudioEntry>
216 AudioRendererHost::AudioEntry::Create(AudioRendererHost* host,
217 int stream_id,
218 int render_frame_id,
219 const media::AudioParameters& params,
220 const std::string& output_device_id) {
221 std::unique_ptr<AudioSyncReader> reader(AudioSyncReader::Create(params));
222 if (!reader) {
223 return {};
224 }
225 return std::unique_ptr<AudioEntry>(
226 new AudioEntry(host, stream_id, render_frame_id, params, output_device_id,
o1ka 2016/09/16 10:51:59 (you can use base::WrapUnique instead as well http
Max Morin 2016/09/16 12:46:15 Done.
227 std::move(reader)));
228 }
229
214 /////////////////////////////////////////////////////////////////////////////// 230 ///////////////////////////////////////////////////////////////////////////////
215 // AudioRendererHost implementations. 231 // AudioRendererHost implementations.
216 232
217 AudioRendererHost::AudioRendererHost(int render_process_id, 233 AudioRendererHost::AudioRendererHost(int render_process_id,
218 media::AudioManager* audio_manager, 234 media::AudioManager* audio_manager,
219 AudioMirroringManager* mirroring_manager, 235 AudioMirroringManager* mirroring_manager,
220 MediaInternals* media_internals, 236 MediaInternals* media_internals,
221 MediaStreamManager* media_stream_manager, 237 MediaStreamManager* media_stream_manager,
222 const std::string& salt) 238 const std::string& salt)
223 : BrowserMessageFilter(AudioMsgStart), 239 : BrowserMessageFilter(AudioMsgStart),
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 ReportErrorAndClose(stream_id); 335 ReportErrorAndClose(stream_id);
320 return; 336 return;
321 } 337 }
322 338
323 AudioEntry* const entry = LookupById(stream_id); 339 AudioEntry* const entry = LookupById(stream_id);
324 if (!entry) { 340 if (!entry) {
325 ReportErrorAndClose(stream_id); 341 ReportErrorAndClose(stream_id);
326 return; 342 return;
327 } 343 }
328 344
329 // Once the audio stream is created then complete the creation process by 345 base::SharedMemory* shared_memory = entry->reader()->shared_memory();
330 // mapping shared memory and sharing with the renderer process. 346 base::CancelableSyncSocket* foreign_socket =
o1ka 2016/09/16 10:51:59 Could you transit all the comments to the new code
Max Morin 2016/09/16 12:46:15 Done.
331 base::SharedMemoryHandle foreign_memory_handle; 347 entry->reader()->foreign_socket();
332 if (!entry->shared_memory()->ShareToProcess(PeerHandle(), 348 base::SharedMemoryHandle memory_handle;
o1ka 2016/09/16 10:51:59 nit: I think foreign_memory_handle was more descri
Max Morin 2016/09/16 12:46:15 Done.
333 &foreign_memory_handle)) {
334 // If we failed to map and share the shared memory then close the audio
335 // stream and send an error message.
336 ReportErrorAndClose(entry->stream_id());
337 return;
338 }
339
340 AudioSyncReader* reader = static_cast<AudioSyncReader*>(entry->reader());
341
342 base::SyncSocket::TransitDescriptor socket_descriptor; 349 base::SyncSocket::TransitDescriptor socket_descriptor;
343 350 size_t shared_memory_size = shared_memory->requested_size();
344 // If we failed to prepare the sync socket for the renderer then we fail 351 if (!(shared_memory->ShareToProcess(PeerHandle(), &memory_handle) &&
345 // the construction of audio stream. 352 foreign_socket->PrepareTransitDescriptor(PeerHandle(),
346 if (!reader->PrepareForeignSocket(PeerHandle(), &socket_descriptor)) { 353 &socket_descriptor))) {
347 ReportErrorAndClose(entry->stream_id()); 354 ReportErrorAndClose(entry->stream_id());
348 return; 355 return;
349 } 356 }
350 357
351 Send(new AudioMsg_NotifyStreamCreated( 358 Send(new AudioMsg_NotifyStreamCreated(
352 entry->stream_id(), foreign_memory_handle, socket_descriptor, 359 stream_id, memory_handle, socket_descriptor,
353 entry->shared_memory()->requested_size())); 360 static_cast<uint32_t>(shared_memory_size)));
o1ka 2016/09/16 10:51:59 checked_cast? (https://cs.chromium.org/chromium/sr
Max Morin 2016/09/16 12:46:15 Done.
354 } 361 }
355 362
356 void AudioRendererHost::DidValidateRenderFrame(int stream_id, bool is_valid) { 363 void AudioRendererHost::DidValidateRenderFrame(int stream_id, bool is_valid) {
357 DCHECK_CURRENTLY_ON(BrowserThread::IO); 364 DCHECK_CURRENTLY_ON(BrowserThread::IO);
358 365
359 if (!is_valid) { 366 if (!is_valid) {
360 DLOG(WARNING) << "Render frame for stream (id=" << stream_id 367 DLOG(WARNING) << "Render frame for stream (id=" << stream_id
361 << ") no longer exists."; 368 << ") no longer exists.";
362 ReportErrorAndClose(stream_id); 369 ReportErrorAndClose(stream_id);
363 } 370 }
364 } 371 }
365 372
366 void AudioRendererHost::DoNotifyStreamStateChanged(int stream_id, 373 void AudioRendererHost::DoNotifyStreamStateChanged(int stream_id,
367 bool is_playing) { 374 bool is_playing) {
368 DCHECK_CURRENTLY_ON(BrowserThread::IO); 375 DCHECK_CURRENTLY_ON(BrowserThread::IO);
369 376
370 AudioEntry* const entry = LookupById(stream_id); 377 AudioEntry* const entry = LookupById(stream_id);
371 if (!entry) 378 if (!entry)
372 return; 379 return;
373 380
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 // a valid render frame. This validation is important for all the reasons 608 // a valid render frame. This validation is important for all the reasons
602 // stated in the comments above. This does not block stream creation, but will 609 // stated in the comments above. This does not block stream creation, but will
603 // force-close the stream later if validation fails. 610 // force-close the stream later if validation fails.
604 BrowserThread::PostTask( 611 BrowserThread::PostTask(
605 BrowserThread::UI, FROM_HERE, 612 BrowserThread::UI, FROM_HERE,
606 base::Bind(validate_render_frame_id_function_, render_process_id_, 613 base::Bind(validate_render_frame_id_function_, render_process_id_,
607 render_frame_id, 614 render_frame_id,
608 base::Bind(&AudioRendererHost::DidValidateRenderFrame, this, 615 base::Bind(&AudioRendererHost::DidValidateRenderFrame, this,
609 stream_id))); 616 stream_id)));
610 617
611 // Create the shared memory and share with the renderer process. 618 std::unique_ptr<AudioEntry> entry = AudioEntry::Create(
612 uint32_t shared_memory_size = sizeof(media::AudioOutputBufferParameters) + 619 this, stream_id, render_frame_id, params, device_unique_id);
613 AudioBus::CalculateMemorySize(params); 620 if (!entry) {
614 std::unique_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
615 if (!shared_memory->CreateAndMapAnonymous(shared_memory_size)) {
616 SendErrorMessage(stream_id); 621 SendErrorMessage(stream_id);
617 return; 622 return;
618 } 623 }
619
620 std::unique_ptr<AudioSyncReader> reader(
621 new AudioSyncReader(shared_memory.get(), params));
622 if (!reader->Init()) {
623 SendErrorMessage(stream_id);
624 return;
625 }
626 624
627 MediaObserver* const media_observer = 625 MediaObserver* const media_observer =
628 GetContentClient()->browser()->GetMediaObserver(); 626 GetContentClient()->browser()->GetMediaObserver();
629 if (media_observer) 627 if (media_observer)
630 media_observer->OnCreatingAudioStream(render_process_id_, render_frame_id); 628 media_observer->OnCreatingAudioStream(render_process_id_, render_frame_id);
631 629
632 std::unique_ptr<AudioEntry> entry(
633 new AudioEntry(this, stream_id, render_frame_id, params, device_unique_id,
634 std::move(shared_memory), std::move(reader)));
635 if (mirroring_manager_) { 630 if (mirroring_manager_) {
636 mirroring_manager_->AddDiverter( 631 mirroring_manager_->AddDiverter(
637 render_process_id_, entry->render_frame_id(), entry->controller()); 632 render_process_id_, entry->render_frame_id(), entry->controller());
638 } 633 }
639 audio_entries_.insert(std::make_pair(stream_id, entry.release())); 634 audio_entries_.insert(std::make_pair(stream_id, entry.release()));
640 g_audio_streams_tracker.Get().IncreaseStreamCount(); 635 g_audio_streams_tracker.Get().IncreaseStreamCount();
641 636
642 audio_log_->OnCreated(stream_id, params, device_unique_id); 637 audio_log_->OnCreated(stream_id, params, device_unique_id);
643 MediaInternals::GetInstance()->SetWebContentsTitleForAudioLogEntry( 638 MediaInternals::GetInstance()->SetWebContentsTitleForAudioLogEntry(
644 stream_id, render_process_id_, render_frame_id, audio_log_.get()); 639 stream_id, render_process_id_, render_frame_id, audio_log_.get());
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 callback.Run(false, device_info); 850 callback.Run(false, device_info);
856 } 851 }
857 852
858 bool AudioRendererHost::IsAuthorizationStarted(int stream_id) { 853 bool AudioRendererHost::IsAuthorizationStarted(int stream_id) {
859 DCHECK_CURRENTLY_ON(BrowserThread::IO); 854 DCHECK_CURRENTLY_ON(BrowserThread::IO);
860 const auto& i = authorizations_.find(stream_id); 855 const auto& i = authorizations_.find(stream_id);
861 return i != authorizations_.end(); 856 return i != authorizations_.end();
862 } 857 }
863 858
864 } // namespace content 859 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698