| OLD | NEW |
| 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 "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 } | 97 } |
| 98 | 98 |
| 99 return true; | 99 return true; |
| 100 } | 100 } |
| 101 | 101 |
| 102 std::string TranslateDefaultId(const std::string& device_id) { | 102 std::string TranslateDefaultId(const std::string& device_id) { |
| 103 return device_id.empty() ? media::AudioManagerBase::kDefaultDeviceId | 103 return device_id.empty() ? media::AudioManagerBase::kDefaultDeviceId |
| 104 : device_id; | 104 : device_id; |
| 105 } | 105 } |
| 106 | 106 |
| 107 void NotifyRenderProcessHostThatAudioStateChanged(int render_process_id) { | |
| 108 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 109 | |
| 110 RenderProcessHost* render_process_host = | |
| 111 RenderProcessHost::FromID(render_process_id); | |
| 112 | |
| 113 if (render_process_host) | |
| 114 render_process_host->AudioStateChanged(); | |
| 115 } | |
| 116 | |
| 117 } // namespace | 107 } // namespace |
| 118 | 108 |
| 119 class AudioRendererHost::AudioEntry | 109 class AudioRendererHost::AudioEntry |
| 120 : public media::AudioOutputController::EventHandler { | 110 : public media::AudioOutputController::EventHandler { |
| 121 public: | 111 public: |
| 122 AudioEntry(AudioRendererHost* host, | 112 AudioEntry(AudioRendererHost* host, |
| 123 int stream_id, | 113 int stream_id, |
| 124 int render_frame_id, | 114 int render_frame_id, |
| 125 const media::AudioParameters& params, | 115 const media::AudioParameters& params, |
| 126 const std::string& output_device_id, | 116 const std::string& output_device_id, |
| (...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 749 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 760 if (entry->playing() == is_playing) | 750 if (entry->playing() == is_playing) |
| 761 return; | 751 return; |
| 762 | 752 |
| 763 bool should_alert_resource_scheduler; | 753 bool should_alert_resource_scheduler; |
| 764 if (is_playing) { | 754 if (is_playing) { |
| 765 should_alert_resource_scheduler = | 755 should_alert_resource_scheduler = |
| 766 !RenderFrameHasActiveAudio(entry->render_frame_id()); | 756 !RenderFrameHasActiveAudio(entry->render_frame_id()); |
| 767 entry->set_playing(true); | 757 entry->set_playing(true); |
| 768 base::AtomicRefCountInc(&num_playing_streams_); | 758 base::AtomicRefCountInc(&num_playing_streams_); |
| 769 | |
| 770 // Inform the RenderProcessHost when audio starts playing for the first | |
| 771 // time. | |
| 772 if (base::AtomicRefCountIsOne(&num_playing_streams_)) { | |
| 773 BrowserThread::PostTask( | |
| 774 BrowserThread::UI, FROM_HERE, | |
| 775 base::Bind(&NotifyRenderProcessHostThatAudioStateChanged, | |
| 776 render_process_id_)); | |
| 777 } | |
| 778 } else { | 759 } else { |
| 779 entry->set_playing(false); | 760 entry->set_playing(false); |
| 780 should_alert_resource_scheduler = | 761 should_alert_resource_scheduler = |
| 781 !RenderFrameHasActiveAudio(entry->render_frame_id()); | 762 !RenderFrameHasActiveAudio(entry->render_frame_id()); |
| 782 | 763 base::AtomicRefCountDec(&num_playing_streams_); |
| 783 // Inform the RenderProcessHost when there is no more audio playing. | |
| 784 if (!base::AtomicRefCountDec(&num_playing_streams_)) { | |
| 785 BrowserThread::PostTask( | |
| 786 BrowserThread::UI, FROM_HERE, | |
| 787 base::Bind(&NotifyRenderProcessHostThatAudioStateChanged, | |
| 788 render_process_id_)); | |
| 789 } | |
| 790 } | 764 } |
| 791 | 765 |
| 792 if (should_alert_resource_scheduler && ResourceDispatcherHostImpl::Get()) { | 766 if (should_alert_resource_scheduler && ResourceDispatcherHostImpl::Get()) { |
| 793 BrowserThread::PostTaskAndReplyWithResult( | 767 BrowserThread::PostTaskAndReplyWithResult( |
| 794 BrowserThread::UI, FROM_HERE, | 768 BrowserThread::UI, FROM_HERE, |
| 795 base::Bind(&RenderFrameIdToRenderViewId, render_process_id_, | 769 base::Bind(&RenderFrameIdToRenderViewId, render_process_id_, |
| 796 entry->render_frame_id()), | 770 entry->render_frame_id()), |
| 797 base::Bind(&NotifyResourceDispatcherOfAudioStateChange, | 771 base::Bind(&NotifyResourceDispatcherOfAudioStateChange, |
| 798 render_process_id_, is_playing)); | 772 render_process_id_, is_playing)); |
| 799 } | 773 } |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 936 callback.Run(success, *new_info); | 910 callback.Run(success, *new_info); |
| 937 } | 911 } |
| 938 | 912 |
| 939 bool AudioRendererHost::IsAuthorizationStarted(int stream_id) { | 913 bool AudioRendererHost::IsAuthorizationStarted(int stream_id) { |
| 940 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 914 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 941 const auto& i = authorizations_.find(stream_id); | 915 const auto& i = authorizations_.find(stream_id); |
| 942 return i != authorizations_.end(); | 916 return i != authorizations_.end(); |
| 943 } | 917 } |
| 944 | 918 |
| 945 } // namespace content | 919 } // namespace content |
| OLD | NEW |