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

Side by Side Diff: content/renderer/media/audio_renderer_sink_cache_impl.cc

Issue 2124503002: UMA stats for AudioRendererSinkCache utilization. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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 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/metrics/histogram_macros.h"
10 #include "base/synchronization/lock.h" 11 #include "base/synchronization/lock.h"
11 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
12 #include "content/renderer/media/audio_device_factory.h" 13 #include "content/renderer/media/audio_device_factory.h"
13 #include "content/renderer/media/audio_renderer_sink_cache_impl.h" 14 #include "content/renderer/media/audio_renderer_sink_cache_impl.h"
14 #include "media/audio/audio_device_description.h" 15 #include "media/audio/audio_device_description.h"
15 #include "media/base/audio_renderer_sink.h" 16 #include "media/base/audio_renderer_sink.h"
16 #include "url/origin.h" 17 #include "url/origin.h"
17 18
18 namespace content { 19 namespace content {
19 20
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 82
82 auto cache_iter = 83 auto cache_iter =
83 FindCacheEntry_Locked(source_render_frame_id, device_id, 84 FindCacheEntry_Locked(source_render_frame_id, device_id,
84 security_origin, false /* unused_only */); 85 security_origin, false /* unused_only */);
85 86
86 if (cache_iter != cache_.end()) { 87 if (cache_iter != cache_.end()) {
87 // A matching cached sink is found. 88 // A matching cached sink is found.
88 DVLOG(1) << "GetSinkInfo: address: " << cache_iter->sink.get() 89 DVLOG(1) << "GetSinkInfo: address: " << cache_iter->sink.get()
89 << " - reused a cached sink."; 90 << " - reused a cached sink.";
90 91
92 UMA_HISTOGRAM_BOOLEAN("Media.Audio.SinkCache.GetOutputDeviceInfoHit",
93 true);
91 return cache_iter->sink->GetOutputDeviceInfo(); 94 return cache_iter->sink->GetOutputDeviceInfo();
92 } 95 }
93 96
94 // No matching sink found, create a new one. 97 // No matching sink found, create a new one.
95 cache_entry.device_id = device_id; 98 cache_entry.device_id = device_id;
96 cache_entry.sink = create_sink_cb_.Run( 99 cache_entry.sink = create_sink_cb_.Run(
97 source_render_frame_id, 0 /* session_id */, device_id, security_origin); 100 source_render_frame_id, 0 /* session_id */, device_id, security_origin);
98 101
99 DVLOG(1) << "GetSinkInfo: address: " << cache_entry.sink.get() 102 DVLOG(1) << "GetSinkInfo: address: " << cache_entry.sink.get()
100 << " - no matching cached sink found, created a new one."; 103 << " - no matching cached sink found, created a new one.";
101 104
102 // Cache a newly-created sink. 105 // Cache a newly-created sink.
103 cache_.push_back(cache_entry); 106 cache_.push_back(cache_entry);
104 } 107 }
105 108
109 UMA_HISTOGRAM_BOOLEAN("Media.Audio.SinkCache.GetOutputDeviceInfoHit", false);
Henrik Grunell 2016/07/04 14:24:59 It would be nice to have the session ID case in it
o1ka 2016/07/06 13:17:30 Done.
110
106 // Schedule it for deletion. 111 // Schedule it for deletion.
107 DeleteLaterIfUnused(cache_entry.sink.get()); 112 DeleteLaterIfUnused(cache_entry.sink.get());
108 113
109 DVLOG(1) << "GetSinkInfo: address: " << cache_entry.sink.get() 114 DVLOG(1) << "GetSinkInfo: address: " << cache_entry.sink.get()
110 << " created. source_render_frame_id: " << source_render_frame_id 115 << " created. source_render_frame_id: " << source_render_frame_id
111 << " session_id: " << session_id << " device_id: " << device_id 116 << " session_id: " << session_id << " device_id: " << device_id
112 << " security_origin: " << security_origin; 117 << " security_origin: " << security_origin;
113 118
114 return cache_entry.sink->GetOutputDeviceInfo(); 119 return cache_entry.sink->GetOutputDeviceInfo();
115 } 120 }
116 121
117 scoped_refptr<media::AudioRendererSink> AudioRendererSinkCacheImpl::GetSink( 122 scoped_refptr<media::AudioRendererSink> AudioRendererSinkCacheImpl::GetSink(
118 int source_render_frame_id, 123 int source_render_frame_id,
119 const std::string& device_id, 124 const std::string& device_id,
120 const url::Origin& security_origin) { 125 const url::Origin& security_origin) {
126 UMA_HISTOGRAM_BOOLEAN("Media.Audio.SinkCache.UsedForSinkCreation", true);
Henrik Grunell 2016/07/04 14:24:59 False is never recorded?
o1ka 2016/07/06 13:17:30 Recorded in AudioDeviceFactory
127
121 base::AutoLock auto_lock(cache_lock_); 128 base::AutoLock auto_lock(cache_lock_);
122 129
123 auto cache_iter = 130 auto cache_iter =
124 FindCacheEntry_Locked(source_render_frame_id, device_id, security_origin, 131 FindCacheEntry_Locked(source_render_frame_id, device_id, security_origin,
125 true /* unused_only */); 132 true /* unused_only */);
126 133
127 if (cache_iter != cache_.end()) { 134 if (cache_iter != cache_.end()) {
128 // Found unused sink; mark it as used and return. 135 // Found unused sink; mark it as used and return.
129 DVLOG(1) << "GetSink: address: " << cache_iter->sink.get() 136 DVLOG(1) << "GetSink: address: " << cache_iter->sink.get()
130 << " - found unused cached sink, reusing it."; 137 << " - found unused cached sink, reusing it.";
131 138
132 cache_iter->used = true; 139 cache_iter->used = true;
140 UMA_HISTOGRAM_BOOLEAN("Media.Audio.SinkCache.InfoSinkReusedForOutput",
Henrik Grunell 2016/07/04 14:24:59 I don't understand this histogram. Seems to record
o1ka 2016/07/06 13:17:30 Discussed offline.
141 true);
133 return cache_iter->sink; 142 return cache_iter->sink;
134 } 143 }
135 144
136 // No unused sink is found, create one, mark it used, cache it and return. 145 // No unused sink is found, create one, mark it used, cache it and return.
137 CacheEntry cache_entry = { 146 CacheEntry cache_entry = {
138 source_render_frame_id, device_id, security_origin, 147 source_render_frame_id, device_id, security_origin,
139 create_sink_cb_.Run(source_render_frame_id, 0 /* session_id */, device_id, 148 create_sink_cb_.Run(source_render_frame_id, 0 /* session_id */, device_id,
140 security_origin), 149 security_origin),
141 true /* used */}; 150 true /* used */};
142 151
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 << "Attempt to delete a non-aquired sink."; 207 << "Attempt to delete a non-aquired sink.";
199 208
200 if (!force_delete_used && cache_iter->used) { 209 if (!force_delete_used && cache_iter->used) {
201 DVLOG(1) << "DeleteSink: address: " << sink_ptr 210 DVLOG(1) << "DeleteSink: address: " << sink_ptr
202 << " sink in use, skipping deletion."; 211 << " sink in use, skipping deletion.";
203 return; 212 return;
204 } 213 }
205 214
206 // To stop the sink before deletion if it's not used, we need to hold 215 // To stop the sink before deletion if it's not used, we need to hold
207 // a ref to it. 216 // a ref to it.
208 if (!cache_iter->used) 217 if (!cache_iter->used) {
209 sink_to_stop = cache_iter->sink; 218 sink_to_stop = cache_iter->sink;
219 UMA_HISTOGRAM_BOOLEAN("Media.Audio.SinkCache.InfoSinkReusedForOutput",
220 false);
221 }
210 222
211 cache_.erase(cache_iter); 223 cache_.erase(cache_iter);
212 DVLOG(1) << "DeleteSink: address: " << sink_ptr; 224 DVLOG(1) << "DeleteSink: address: " << sink_ptr;
213 } // Lock scope; 225 } // Lock scope;
214 226
215 // Stop the sink out of the lock scope. 227 // Stop the sink out of the lock scope.
216 if (sink_to_stop.get()) { 228 if (sink_to_stop.get()) {
217 DCHECK_EQ(sink_ptr, sink_to_stop.get()); 229 DCHECK_EQ(sink_ptr, sink_to_stop.get());
218 sink_to_stop->Stop(); 230 sink_to_stop->Stop();
219 DVLOG(1) << "DeleteSink: address: " << sink_ptr << " stopped."; 231 DVLOG(1) << "DeleteSink: address: " << sink_ptr << " stopped.";
(...skipping 24 matching lines...) Expand all
244 return val.device_id == device_id && 256 return val.device_id == device_id &&
245 val.security_origin == security_origin; 257 val.security_origin == security_origin;
246 }); 258 });
247 }; 259 };
248 260
249 int AudioRendererSinkCacheImpl::GetCacheSizeForTesting() { 261 int AudioRendererSinkCacheImpl::GetCacheSizeForTesting() {
250 return cache_.size(); 262 return cache_.size();
251 } 263 }
252 264
253 } // namespace content 265 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698