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

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

Issue 1580493004: Plumb audio focus support for spitzer clients. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@delegate_hookup
Patch Set: Fix crash, plumb. Created 4 years, 11 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"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/lazy_instance.h" 12 #include "base/lazy_instance.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/memory/shared_memory.h" 14 #include "base/memory/shared_memory.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "base/process/process.h" 16 #include "base/process/process.h"
17 #include "content/browser/bad_message.h" 17 #include "content/browser/bad_message.h"
18 #include "content/browser/browser_main_loop.h" 18 #include "content/browser/browser_main_loop.h"
19 #include "content/browser/child_process_security_policy_impl.h" 19 #include "content/browser/child_process_security_policy_impl.h"
20 #include "content/browser/loader/resource_dispatcher_host_impl.h" 20 #include "content/browser/loader/resource_dispatcher_host_impl.h"
21 #include "content/browser/media/audio_stream_monitor.h" 21 #include "content/browser/media/audio_stream_monitor.h"
22 #include "content/browser/media/capture/audio_mirroring_manager.h" 22 #include "content/browser/media/capture/audio_mirroring_manager.h"
23 #include "content/browser/media/media_internals.h" 23 #include "content/browser/media/media_internals.h"
24 #include "content/browser/media/media_web_contents_observer.h"
24 #include "content/browser/renderer_host/media/audio_input_device_manager.h" 25 #include "content/browser/renderer_host/media/audio_input_device_manager.h"
25 #include "content/browser/renderer_host/media/audio_sync_reader.h" 26 #include "content/browser/renderer_host/media/audio_sync_reader.h"
26 #include "content/browser/renderer_host/media/media_stream_manager.h" 27 #include "content/browser/renderer_host/media/media_stream_manager.h"
27 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" 28 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
28 #include "content/browser/renderer_host/render_widget_host_impl.h" 29 #include "content/browser/renderer_host/render_widget_host_impl.h"
29 #include "content/common/media/audio_messages.h" 30 #include "content/common/media/audio_messages.h"
30 #include "content/public/browser/content_browser_client.h" 31 #include "content/public/browser/content_browser_client.h"
31 #include "content/public/browser/media_device_id.h" 32 #include "content/public/browser/media_device_id.h"
32 #include "content/public/browser/media_observer.h" 33 #include "content/public/browser/media_observer.h"
33 #include "content/public/browser/render_frame_host.h" 34 #include "content/public/browser/render_frame_host.h"
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 base::SharedMemory* shared_memory() { 176 base::SharedMemory* shared_memory() {
176 return shared_memory_.get(); 177 return shared_memory_.get();
177 } 178 }
178 179
179 media::AudioOutputController::SyncReader* reader() const { 180 media::AudioOutputController::SyncReader* reader() const {
180 return reader_.get(); 181 return reader_.get();
181 } 182 }
182 183
183 bool playing() const { return playing_; } 184 bool playing() const { return playing_; }
184 void set_playing(bool playing) { playing_ = playing; } 185 void set_playing(bool playing) { playing_ = playing; }
186 void update_last_pause_time() { last_pause_time_ = base::TimeTicks::Now(); }
187 base::TimeTicks last_pause_time() { return last_pause_time_; }
185 188
186 private: 189 private:
187 // media::AudioOutputController::EventHandler implementation. 190 // media::AudioOutputController::EventHandler implementation.
188 void OnCreated() override; 191 void OnCreated() override;
189 void OnPlaying() override; 192 void OnPlaying() override;
190 void OnPaused() override; 193 void OnPaused() override;
191 void OnError() override; 194 void OnError() override;
192 195
193 AudioRendererHost* const host_; 196 AudioRendererHost* const host_;
194 const int stream_id_; 197 const int stream_id_;
195 198
196 // The routing ID of the source RenderFrame. 199 // The routing ID of the source RenderFrame.
197 const int render_frame_id_; 200 const int render_frame_id_;
198 201
199 // Shared memory for transmission of the audio data. Used by |reader_|. 202 // Shared memory for transmission of the audio data. Used by |reader_|.
200 const scoped_ptr<base::SharedMemory> shared_memory_; 203 const scoped_ptr<base::SharedMemory> shared_memory_;
201 204
202 // The synchronous reader to be used by |controller_|. 205 // The synchronous reader to be used by |controller_|.
203 const scoped_ptr<media::AudioOutputController::SyncReader> reader_; 206 const scoped_ptr<media::AudioOutputController::SyncReader> reader_;
204 207
205 // The AudioOutputController that manages the audio stream. 208 // The AudioOutputController that manages the audio stream.
206 const scoped_refptr<media::AudioOutputController> controller_; 209 const scoped_refptr<media::AudioOutputController> controller_;
207 210
208 bool playing_; 211 bool playing_;
212
213 base::TimeTicks last_pause_time_;
209 }; 214 };
210 215
211 AudioRendererHost::AudioEntry::AudioEntry( 216 AudioRendererHost::AudioEntry::AudioEntry(
212 AudioRendererHost* host, 217 AudioRendererHost* host,
213 int stream_id, 218 int stream_id,
214 int render_frame_id, 219 int render_frame_id,
215 const media::AudioParameters& params, 220 const media::AudioParameters& params,
216 const std::string& output_device_id, 221 const std::string& output_device_id,
217 scoped_ptr<base::SharedMemory> shared_memory, 222 scoped_ptr<base::SharedMemory> shared_memory,
218 scoped_ptr<media::AudioOutputController::SyncReader> reader) 223 scoped_ptr<media::AudioOutputController::SyncReader> reader)
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 635
631 void AudioRendererHost::OnPlayStream(int stream_id) { 636 void AudioRendererHost::OnPlayStream(int stream_id) {
632 DCHECK_CURRENTLY_ON(BrowserThread::IO); 637 DCHECK_CURRENTLY_ON(BrowserThread::IO);
633 638
634 AudioEntry* entry = LookupById(stream_id); 639 AudioEntry* entry = LookupById(stream_id);
635 if (!entry) { 640 if (!entry) {
636 SendErrorMessage(stream_id); 641 SendErrorMessage(stream_id);
637 return; 642 return;
638 } 643 }
639 644
645 if (entry->controller()->GetAudioParameters().effects() &
646 media::AudioParameters::FOCUSABLE) {
647 MediaWebContentsObserver::HasAudioFocus(
648 render_process_id_, entry->render_frame_id(),
649 base::Bind(&AudioRendererHost::OnFocusAvailable, this, stream_id,
650 base::TimeTicks::Now()));
651 } else {
652 entry->controller()->Play();
653 audio_log_->OnStarted(stream_id);
654 }
655 }
656
657 void AudioRendererHost::OnFocusAvailable(int stream_id,
658 base::TimeTicks play_time) {
659 // Abort the playback if:
660 // - The entry has been destroyed while focus was requested.
661 // - A subsequent pause has come through.
662 //
663 // A focus request never fails via this path. If it's denied a pause request
664 // will be issues directly to the player.
665 AudioEntry* entry = LookupById(stream_id);
666 if (!entry || play_time < entry->last_pause_time())
667 return;
668
640 entry->controller()->Play(); 669 entry->controller()->Play();
641 audio_log_->OnStarted(stream_id); 670 audio_log_->OnStarted(stream_id);
642 } 671 }
643 672
644 void AudioRendererHost::OnPauseStream(int stream_id) { 673 void AudioRendererHost::OnPauseStream(int stream_id) {
645 DCHECK_CURRENTLY_ON(BrowserThread::IO); 674 DCHECK_CURRENTLY_ON(BrowserThread::IO);
646 675
647 AudioEntry* entry = LookupById(stream_id); 676 AudioEntry* entry = LookupById(stream_id);
648 if (!entry) { 677 if (!entry) {
649 SendErrorMessage(stream_id); 678 SendErrorMessage(stream_id);
650 return; 679 return;
651 } 680 }
652 681
682 entry->update_last_pause_time();
653 entry->controller()->Pause(); 683 entry->controller()->Pause();
654 audio_log_->OnStopped(stream_id); 684 audio_log_->OnStopped(stream_id);
655 } 685 }
656 686
657 void AudioRendererHost::OnSetVolume(int stream_id, double volume) { 687 void AudioRendererHost::OnSetVolume(int stream_id, double volume) {
658 DCHECK_CURRENTLY_ON(BrowserThread::IO); 688 DCHECK_CURRENTLY_ON(BrowserThread::IO);
659 689
660 AudioEntry* entry = LookupById(stream_id); 690 AudioEntry* entry = LookupById(stream_id);
661 if (!entry) { 691 if (!entry) {
662 SendErrorMessage(stream_id); 692 SendErrorMessage(stream_id);
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 callback.Run(false, device_info); 891 callback.Run(false, device_info);
862 } 892 }
863 893
864 bool AudioRendererHost::IsAuthorizationStarted(int stream_id) { 894 bool AudioRendererHost::IsAuthorizationStarted(int stream_id) {
865 DCHECK_CURRENTLY_ON(BrowserThread::IO); 895 DCHECK_CURRENTLY_ON(BrowserThread::IO);
866 const auto& i = authorizations_.find(stream_id); 896 const auto& i = authorizations_.find(stream_id);
867 return i != authorizations_.end(); 897 return i != authorizations_.end();
868 } 898 }
869 899
870 } // namespace content 900 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698