Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 << " - used session to create new sink."; | 72 << " - used session to create new sink."; |
| 73 | 73 |
| 74 // Cache a newly-created sink. | 74 // Cache a newly-created sink. |
| 75 base::AutoLock auto_lock(cache_lock_); | 75 base::AutoLock auto_lock(cache_lock_); |
| 76 cache_.push_back(cache_entry); | 76 cache_.push_back(cache_entry); |
| 77 | 77 |
| 78 } else { | 78 } else { |
| 79 // Ignore session id. | 79 // Ignore session id. |
| 80 base::AutoLock auto_lock(cache_lock_); | 80 base::AutoLock auto_lock(cache_lock_); |
| 81 | 81 |
| 82 auto cache_iter = | 82 if (media::AudioDeviceDescription::IsDefaultDevice(device_id)) { |
| 83 FindCacheEntry_Locked(source_render_frame_id, device_id, | 83 if (default_device_info_) |
| 84 security_origin, false /* unused_only */); | 84 return default_device_info_.value(); |
| 85 | 85 |
| 86 if (cache_iter != cache_.end()) { | 86 // Otherwise, there is no default device cached. |
| 87 // A matching cached sink is found. | 87 DCHECK(FindCacheEntry_Locked(source_render_frame_id, device_id, |
| 88 DVLOG(1) << "GetSinkInfo: address: " << cache_iter->sink.get() | 88 security_origin, false) == cache_.end()); |
| 89 << " - reused a cached sink."; | 89 } else { |
| 90 // Looking up a cached non-default device. | |
| 91 auto cache_iter = FindCacheEntry_Locked(source_render_frame_id, device_id, | |
| 92 security_origin, false); | |
| 90 | 93 |
| 91 return cache_iter->sink->GetOutputDeviceInfo(); | 94 if (cache_iter != cache_.end()) { |
| 95 // A matching cached sink is found. | |
| 96 DVLOG(1) << "GetSinkInfo: address: " << cache_iter->sink.get() | |
| 97 << " - reused a cached sink."; | |
| 98 | |
| 99 return cache_iter->sink->GetOutputDeviceInfo(); | |
| 100 } | |
| 92 } | 101 } |
| 93 | 102 |
| 94 // No matching sink found, create a new one. | 103 // No matching sink found, create a new one. |
| 95 cache_entry.device_id = device_id; | 104 cache_entry.device_id = device_id; |
| 96 cache_entry.sink = create_sink_cb_.Run( | 105 cache_entry.sink = create_sink_cb_.Run( |
| 97 source_render_frame_id, 0 /* session_id */, device_id, security_origin); | 106 source_render_frame_id, 0 /* session_id */, device_id, security_origin); |
| 98 | 107 |
| 99 DVLOG(1) << "GetSinkInfo: address: " << cache_entry.sink.get() | 108 DVLOG(1) << "GetSinkInfo: address: " << cache_entry.sink.get() |
| 100 << " - no matching cached sink found, created a new one."; | 109 << " - no matching cached sink found, created a new one."; |
| 101 | 110 |
| 102 // Cache a newly-created sink. | 111 // Cache a newly-created sink. |
| 103 cache_.push_back(cache_entry); | 112 cache_.push_back(cache_entry); |
| 113 | |
| 114 // Cache information for default output device. | |
|
DaleCurtis
2016/07/06 18:53:37
Do we want to cache this? We'll carry over bugs ar
o1ka
2016/07/13 09:52:41
removed
| |
| 115 if (media::AudioDeviceDescription::IsDefaultDevice(device_id)) | |
| 116 default_device_info_ = cache_entry.sink->GetOutputDeviceInfo(); | |
| 104 } | 117 } |
| 105 | 118 |
| 106 // Schedule it for deletion. | 119 // Schedule it for deletion. |
| 107 DeleteLaterIfUnused(cache_entry.sink.get()); | 120 DeleteLaterIfUnused(cache_entry.sink.get()); |
| 108 | 121 |
| 109 DVLOG(1) << "GetSinkInfo: address: " << cache_entry.sink.get() | 122 DVLOG(1) << "GetSinkInfo: address: " << cache_entry.sink.get() |
| 110 << " created. source_render_frame_id: " << source_render_frame_id | 123 << " created. source_render_frame_id: " << source_render_frame_id |
| 111 << " session_id: " << session_id << " device_id: " << device_id | 124 << " session_id: " << session_id << " device_id: " << device_id |
| 112 << " security_origin: " << security_origin; | 125 << " security_origin: " << security_origin; |
| 113 | 126 |
| 114 return cache_entry.sink->GetOutputDeviceInfo(); | 127 return cache_entry.sink->GetOutputDeviceInfo(); |
| 115 } | 128 } |
| 116 | 129 |
| 117 scoped_refptr<media::AudioRendererSink> AudioRendererSinkCacheImpl::GetSink( | 130 scoped_refptr<media::AudioRendererSink> AudioRendererSinkCacheImpl::GetSink( |
| 118 int source_render_frame_id, | 131 int source_render_frame_id, |
| 119 const std::string& device_id, | 132 const std::string& device_id, |
| 120 const url::Origin& security_origin) { | 133 const url::Origin& security_origin) { |
| 121 base::AutoLock auto_lock(cache_lock_); | 134 base::AutoLock auto_lock(cache_lock_); |
| 122 | 135 |
| 123 auto cache_iter = | 136 auto cache_iter = |
| 124 FindCacheEntry_Locked(source_render_frame_id, device_id, security_origin, | 137 FindCacheEntry_Locked(source_render_frame_id, device_id, security_origin, |
| 125 true /* unused_only */); | 138 true /* unused sink only */); |
| 126 | 139 |
| 127 if (cache_iter != cache_.end()) { | 140 if (cache_iter != cache_.end()) { |
| 128 // Found unused sink; mark it as used and return. | 141 // Found unused sink; mark it as used and return. |
| 129 DVLOG(1) << "GetSink: address: " << cache_iter->sink.get() | 142 DVLOG(1) << "GetSink: address: " << cache_iter->sink.get() |
| 130 << " - found unused cached sink, reusing it."; | 143 << " - found unused cached sink, reusing it."; |
| 131 | 144 |
| 132 cache_iter->used = true; | 145 cache_iter->used = true; |
| 133 return cache_iter->sink; | 146 return cache_iter->sink; |
| 134 } | 147 } |
| 135 | 148 |
| 136 // No unused sink is found, create one, mark it used, cache it and return. | 149 // No unused sink is found, create one, mark it used, cache it and return. |
| 137 CacheEntry cache_entry = { | 150 CacheEntry cache_entry = { |
| 138 source_render_frame_id, device_id, security_origin, | 151 source_render_frame_id, device_id, security_origin, |
| 139 create_sink_cb_.Run(source_render_frame_id, 0 /* session_id */, device_id, | 152 create_sink_cb_.Run(source_render_frame_id, 0 /* session_id */, device_id, |
| 140 security_origin), | 153 security_origin), |
| 141 true /* used */}; | 154 true /* used */}; |
| 142 | 155 |
| 143 cache_.push_back(cache_entry); | 156 cache_.push_back(cache_entry); |
| 144 | 157 |
| 158 // Update cached information for default output device. | |
| 159 if (media::AudioDeviceDescription::IsDefaultDevice(device_id)) | |
| 160 default_device_info_ = cache_entry.sink->GetOutputDeviceInfo(); | |
| 161 | |
| 145 DVLOG(1) << "GetSink: address: " << cache_entry.sink.get() | 162 DVLOG(1) << "GetSink: address: " << cache_entry.sink.get() |
| 146 << " - no unused cached sink found, created a new one." | 163 << " - no unused cached sink found, created a new one." |
| 147 << " source_render_frame_id: " << source_render_frame_id | 164 << " source_render_frame_id: " << source_render_frame_id |
| 148 << " device_id: " << device_id | 165 << " device_id: " << device_id |
| 149 << " security_origin: " << security_origin; | 166 << " security_origin: " << security_origin; |
| 150 return cache_entry.sink; | 167 return cache_entry.sink; |
| 151 } | 168 } |
| 152 | 169 |
| 153 void AudioRendererSinkCacheImpl::ReleaseSink( | 170 void AudioRendererSinkCacheImpl::ReleaseSink( |
| 154 const media::AudioRendererSink* sink_ptr) { | 171 const media::AudioRendererSink* sink_ptr) { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 244 return val.device_id == device_id && | 261 return val.device_id == device_id && |
| 245 val.security_origin == security_origin; | 262 val.security_origin == security_origin; |
| 246 }); | 263 }); |
| 247 }; | 264 }; |
| 248 | 265 |
| 249 int AudioRendererSinkCacheImpl::GetCacheSizeForTesting() { | 266 int AudioRendererSinkCacheImpl::GetCacheSizeForTesting() { |
| 250 return cache_.size(); | 267 return cache_.size(); |
| 251 } | 268 } |
| 252 | 269 |
| 253 } // namespace content | 270 } // namespace content |
| OLD | NEW |