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 |