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_input_renderer_host.h" | 5 #include "content/browser/renderer_host/media/audio_input_renderer_host.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/shared_memory.h" | 8 #include "base/memory/shared_memory.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/numerics/safe_math.h" | 10 #include "base/numerics/safe_math.h" |
11 #include "base/process/process.h" | 11 #include "base/process/process.h" |
12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
13 #include "content/browser/media/capture/web_contents_audio_input_stream.h" | 13 #include "content/browser/media/capture/web_contents_audio_input_stream.h" |
14 #include "content/browser/media/capture/web_contents_capture_util.h" | 14 #include "content/browser/media/capture/web_contents_capture_util.h" |
15 #include "content/browser/media/media_internals.h" | 15 #include "content/browser/media/media_internals.h" |
16 #include "content/browser/renderer_host/media/audio_input_device_manager.h" | 16 #include "content/browser/renderer_host/media/audio_input_device_manager.h" |
17 #include "content/browser/renderer_host/media/audio_input_sync_writer.h" | 17 #include "content/browser/renderer_host/media/audio_input_sync_writer.h" |
18 #include "content/browser/renderer_host/media/media_stream_manager.h" | 18 #include "content/browser/renderer_host/media/media_stream_manager.h" |
19 #include "media/audio/audio_manager_base.h" | 19 #include "media/audio/audio_manager_base.h" |
20 #include "media/base/audio_bus.h" | 20 #include "media/base/audio_bus.h" |
21 | 21 |
22 namespace { | |
23 void LogMessage(int stream_id, const std::string& msg, bool add_prefix) { | |
no longer working on chromium
2014/08/29 12:33:20
nit, empty line after the namespace {
henrika (OOO until Aug 14)
2014/08/29 12:51:29
Done.
| |
24 std::ostringstream oss; | |
25 oss << "[stream_id=" << stream_id << "] "; | |
26 if (add_prefix) | |
27 oss << "AIRH::"; | |
28 oss << msg; | |
29 content::MediaStreamManager::SendMessageToNativeLog(oss.str()); | |
30 DVLOG(1) << oss.str(); | |
31 } | |
32 } | |
no longer working on chromium
2014/08/29 12:33:20
ditto
henrika (OOO until Aug 14)
2014/08/29 12:51:29
Done.
| |
33 | |
22 namespace content { | 34 namespace content { |
23 | 35 |
24 struct AudioInputRendererHost::AudioEntry { | 36 struct AudioInputRendererHost::AudioEntry { |
25 AudioEntry(); | 37 AudioEntry(); |
26 ~AudioEntry(); | 38 ~AudioEntry(); |
27 | 39 |
28 // The AudioInputController that manages the audio input stream. | 40 // The AudioInputController that manages the audio input stream. |
29 scoped_refptr<media::AudioInputController> controller; | 41 scoped_refptr<media::AudioInputController> controller; |
30 | 42 |
31 // The audio input stream ID in the render view. | 43 // The audio input stream ID in the render view. |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
126 this, | 138 this, |
127 make_scoped_refptr(controller), | 139 make_scoped_refptr(controller), |
128 message)); | 140 message)); |
129 } | 141 } |
130 | 142 |
131 void AudioInputRendererHost::DoCompleteCreation( | 143 void AudioInputRendererHost::DoCompleteCreation( |
132 media::AudioInputController* controller) { | 144 media::AudioInputController* controller) { |
133 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 145 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
134 | 146 |
135 AudioEntry* entry = LookupByController(controller); | 147 AudioEntry* entry = LookupByController(controller); |
136 if (!entry) | 148 if (!entry) { |
149 NOTREACHED() << "AudioInputController is invalid."; | |
137 return; | 150 return; |
151 } | |
138 | 152 |
139 if (!PeerHandle()) { | 153 if (!PeerHandle()) { |
140 NOTREACHED() << "Renderer process handle is invalid."; | 154 NOTREACHED() << "Renderer process handle is invalid."; |
141 DeleteEntryOnError(entry, INVALID_PEER_HANDLE); | 155 DeleteEntryOnError(entry, INVALID_PEER_HANDLE); |
142 return; | 156 return; |
143 } | 157 } |
144 | 158 |
145 if (!entry->controller->SharedMemoryAndSyncSocketMode()) { | 159 if (!entry->controller->SharedMemoryAndSyncSocketMode()) { |
146 NOTREACHED() << "Only shared-memory/sync-socket mode is supported."; | 160 NOTREACHED() << "Only shared-memory/sync-socket mode is supported."; |
147 DeleteEntryOnError(entry, INVALID_LATENCY_MODE); | 161 DeleteEntryOnError(entry, INVALID_LATENCY_MODE); |
(...skipping 21 matching lines...) Expand all Loading... | |
169 #endif | 183 #endif |
170 | 184 |
171 // If we failed to prepare the sync socket for the renderer then we fail | 185 // If we failed to prepare the sync socket for the renderer then we fail |
172 // the construction of audio input stream. | 186 // the construction of audio input stream. |
173 if (!writer->PrepareForeignSocketHandle(PeerHandle(), | 187 if (!writer->PrepareForeignSocketHandle(PeerHandle(), |
174 &foreign_socket_handle)) { | 188 &foreign_socket_handle)) { |
175 DeleteEntryOnError(entry, SYNC_SOCKET_ERROR); | 189 DeleteEntryOnError(entry, SYNC_SOCKET_ERROR); |
176 return; | 190 return; |
177 } | 191 } |
178 | 192 |
193 LogMessage(entry->stream_id, | |
194 "DoCompleteCreation => IPC channel and stream are now open", | |
195 true); | |
196 | |
179 Send(new AudioInputMsg_NotifyStreamCreated(entry->stream_id, | 197 Send(new AudioInputMsg_NotifyStreamCreated(entry->stream_id, |
180 foreign_memory_handle, foreign_socket_handle, | 198 foreign_memory_handle, foreign_socket_handle, |
181 entry->shared_memory.requested_size(), | 199 entry->shared_memory.requested_size(), |
182 entry->shared_memory_segment_count)); | 200 entry->shared_memory_segment_count)); |
183 } | 201 } |
184 | 202 |
185 void AudioInputRendererHost::DoSendRecordingMessage( | 203 void AudioInputRendererHost::DoSendRecordingMessage( |
186 media::AudioInputController* controller) { | 204 media::AudioInputController* controller) { |
187 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 205 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
188 // TODO(henrika): See crbug.com/115262 for details on why this method | 206 // TODO(henrika): See crbug.com/115262 for details on why this method |
189 // should be implemented. | 207 // should be implemented. |
208 AudioEntry* entry = LookupByController(controller); | |
209 if (!entry) { | |
210 NOTREACHED() << "AudioInputController is invalid."; | |
211 return; | |
212 } | |
213 LogMessage(entry->stream_id, | |
214 "DoSendRecordingMessage => stream is now started", | |
215 true); | |
190 } | 216 } |
191 | 217 |
192 void AudioInputRendererHost::DoHandleError( | 218 void AudioInputRendererHost::DoHandleError( |
193 media::AudioInputController* controller, | 219 media::AudioInputController* controller, |
194 media::AudioInputController::ErrorCode error_code) { | 220 media::AudioInputController::ErrorCode error_code) { |
195 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 221 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
196 // Log all errors even it is ignored later. | 222 AudioEntry* entry = LookupByController(controller); |
197 MediaStreamManager::SendMessageToNativeLog( | 223 if (!entry) { |
198 base::StringPrintf("AudioInputController error: %d", error_code)); | 224 NOTREACHED() << "AudioInputController is invalid."; |
225 return; | |
226 } | |
199 | 227 |
200 // This is a fix for crbug.com/357501. The error can be triggered when closing | 228 // This is a fix for crbug.com/357501. The error can be triggered when closing |
201 // the lid on Macs, which causes more problems than it fixes. | 229 // the lid on Macs, which causes more problems than it fixes. |
202 // Also, in crbug.com/357569, the goal is to remove usage of the error since | 230 // Also, in crbug.com/357569, the goal is to remove usage of the error since |
203 // it was added to solve a crash on Windows that no longer can be reproduced. | 231 // it was added to solve a crash on Windows that no longer can be reproduced. |
204 if (error_code == media::AudioInputController::NO_DATA_ERROR) { | 232 if (error_code == media::AudioInputController::NO_DATA_ERROR) { |
205 DVLOG(1) << "AudioInputRendererHost@" << this << "::DoHandleError: " | 233 // TODO(henrika): it might be possible to do something other than just |
206 << "NO_DATA_ERROR ignored."; | 234 // logging when we detect many NO_DATA_ERROR calls for a stream. |
235 LogMessage(entry->stream_id, "AIC => NO_DATA_ERROR", false); | |
207 return; | 236 return; |
208 } | 237 } |
209 | 238 |
210 AudioEntry* entry = LookupByController(controller); | 239 std::ostringstream oss; |
211 if (!entry) | 240 oss << "AIC reports error_code=" << error_code; |
212 return; | 241 LogMessage(entry->stream_id, oss.str(), false); |
213 | 242 |
214 audio_log_->OnError(entry->stream_id); | 243 audio_log_->OnError(entry->stream_id); |
215 DeleteEntryOnError(entry, AUDIO_INPUT_CONTROLLER_ERROR); | 244 DeleteEntryOnError(entry, AUDIO_INPUT_CONTROLLER_ERROR); |
216 } | 245 } |
217 | 246 |
218 void AudioInputRendererHost::DoLog(media::AudioInputController* controller, | 247 void AudioInputRendererHost::DoLog(media::AudioInputController* controller, |
219 const std::string& message) { | 248 const std::string& message) { |
220 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 249 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
221 AudioEntry* entry = LookupByController(controller); | 250 AudioEntry* entry = LookupByController(controller); |
222 if (!entry) | 251 if (!entry) { |
252 NOTREACHED() << "AudioInputController is invalid."; | |
223 return; | 253 return; |
254 } | |
224 | 255 |
225 // Add stream ID and current audio level reported by AIC to native log. | 256 // Add stream ID and current audio level reported by AIC to native log. |
226 std::string log_string = | 257 LogMessage(entry->stream_id, message, false); |
227 base::StringPrintf("[stream_id=%d] ", entry->stream_id); | |
228 log_string += message; | |
229 MediaStreamManager::SendMessageToNativeLog(log_string); | |
230 DVLOG(1) << log_string; | |
231 } | 258 } |
232 | 259 |
233 bool AudioInputRendererHost::OnMessageReceived(const IPC::Message& message) { | 260 bool AudioInputRendererHost::OnMessageReceived(const IPC::Message& message) { |
234 bool handled = true; | 261 bool handled = true; |
235 IPC_BEGIN_MESSAGE_MAP(AudioInputRendererHost, message) | 262 IPC_BEGIN_MESSAGE_MAP(AudioInputRendererHost, message) |
236 IPC_MESSAGE_HANDLER(AudioInputHostMsg_CreateStream, OnCreateStream) | 263 IPC_MESSAGE_HANDLER(AudioInputHostMsg_CreateStream, OnCreateStream) |
237 IPC_MESSAGE_HANDLER(AudioInputHostMsg_RecordStream, OnRecordStream) | 264 IPC_MESSAGE_HANDLER(AudioInputHostMsg_RecordStream, OnRecordStream) |
238 IPC_MESSAGE_HANDLER(AudioInputHostMsg_CloseStream, OnCloseStream) | 265 IPC_MESSAGE_HANDLER(AudioInputHostMsg_CloseStream, OnCloseStream) |
239 IPC_MESSAGE_HANDLER(AudioInputHostMsg_SetVolume, OnSetVolume) | 266 IPC_MESSAGE_HANDLER(AudioInputHostMsg_SetVolume, OnSetVolume) |
240 IPC_MESSAGE_UNHANDLED(handled = false) | 267 IPC_MESSAGE_UNHANDLED(handled = false) |
241 IPC_END_MESSAGE_MAP() | 268 IPC_END_MESSAGE_MAP() |
242 | 269 |
243 return handled; | 270 return handled; |
244 } | 271 } |
245 | 272 |
246 void AudioInputRendererHost::OnCreateStream( | 273 void AudioInputRendererHost::OnCreateStream( |
247 int stream_id, | 274 int stream_id, |
248 int render_view_id, | 275 int render_view_id, |
249 int session_id, | 276 int session_id, |
250 const AudioInputHostMsg_CreateStream_Config& config) { | 277 const AudioInputHostMsg_CreateStream_Config& config) { |
251 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 278 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
252 | 279 |
253 DVLOG(1) << "AudioInputRendererHost@" << this | 280 std::ostringstream oss; |
254 << "::OnCreateStream(stream_id=" << stream_id | 281 oss << "[stream_id=" << stream_id << "] " |
255 << ", render_view_id=" << render_view_id | 282 << "AIRH::OnCreateStream(render_view_id=" << render_view_id |
256 << ", session_id=" << session_id << ")"; | 283 << ", session_id=" << session_id << ")"; |
257 DCHECK_GT(render_view_id, 0); | 284 DCHECK_GT(render_view_id, 0); |
258 | 285 |
259 // media::AudioParameters is validated in the deserializer. | 286 // media::AudioParameters is validated in the deserializer. |
260 if (LookupById(stream_id) != NULL) { | 287 if (LookupById(stream_id) != NULL) { |
261 SendErrorMessage(stream_id, STREAM_ALREADY_EXISTS); | 288 SendErrorMessage(stream_id, STREAM_ALREADY_EXISTS); |
262 return; | 289 return; |
263 } | 290 } |
264 | 291 |
265 media::AudioParameters audio_params(config.params); | 292 media::AudioParameters audio_params(config.params); |
266 if (media_stream_manager_->audio_input_device_manager()-> | 293 if (media_stream_manager_->audio_input_device_manager()-> |
(...skipping 13 matching lines...) Expand all Loading... | |
280 audio_input_device_manager()->GetOpenedDeviceInfoById(session_id); | 307 audio_input_device_manager()->GetOpenedDeviceInfoById(session_id); |
281 if (!info) { | 308 if (!info) { |
282 SendErrorMessage(stream_id, PERMISSION_DENIED); | 309 SendErrorMessage(stream_id, PERMISSION_DENIED); |
283 DLOG(WARNING) << "No permission has been granted to input stream with " | 310 DLOG(WARNING) << "No permission has been granted to input stream with " |
284 << "session_id=" << session_id; | 311 << "session_id=" << session_id; |
285 return; | 312 return; |
286 } | 313 } |
287 | 314 |
288 device_id = info->device.id; | 315 device_id = info->device.id; |
289 device_name = info->device.name; | 316 device_name = info->device.name; |
317 oss << ": device_name=" << device_name; | |
290 } | 318 } |
291 | 319 |
292 // Create a new AudioEntry structure. | 320 // Create a new AudioEntry structure. |
293 scoped_ptr<AudioEntry> entry(new AudioEntry()); | 321 scoped_ptr<AudioEntry> entry(new AudioEntry()); |
294 | 322 |
295 const uint32 segment_size = | 323 const uint32 segment_size = |
296 (sizeof(media::AudioInputBufferParameters) + | 324 (sizeof(media::AudioInputBufferParameters) + |
297 media::AudioBus::CalculateMemorySize(audio_params)); | 325 media::AudioBus::CalculateMemorySize(audio_params)); |
298 entry->shared_memory_segment_count = config.shared_memory_count; | 326 entry->shared_memory_segment_count = config.shared_memory_count; |
299 | 327 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
343 user_input_monitor_); | 371 user_input_monitor_); |
344 } | 372 } |
345 | 373 |
346 if (!entry->controller.get()) { | 374 if (!entry->controller.get()) { |
347 SendErrorMessage(stream_id, STREAM_CREATE_ERROR); | 375 SendErrorMessage(stream_id, STREAM_CREATE_ERROR); |
348 return; | 376 return; |
349 } | 377 } |
350 | 378 |
351 // Set the initial AGC state for the audio input stream. Note that, the AGC | 379 // Set the initial AGC state for the audio input stream. Note that, the AGC |
352 // is only supported in AUDIO_PCM_LOW_LATENCY mode. | 380 // is only supported in AUDIO_PCM_LOW_LATENCY mode. |
353 if (config.params.format() == media::AudioParameters::AUDIO_PCM_LOW_LATENCY) | 381 if (config.params.format() == media::AudioParameters::AUDIO_PCM_LOW_LATENCY) { |
354 entry->controller->SetAutomaticGainControl(config.automatic_gain_control); | 382 entry->controller->SetAutomaticGainControl(config.automatic_gain_control); |
383 oss << ", AGC=" << config.automatic_gain_control; | |
384 } | |
385 | |
386 MediaStreamManager::SendMessageToNativeLog(oss.str()); | |
387 DVLOG(1) << oss.str(); | |
355 | 388 |
356 // Since the controller was created successfully, create an entry and add it | 389 // Since the controller was created successfully, create an entry and add it |
357 // to the map. | 390 // to the map. |
358 entry->stream_id = stream_id; | 391 entry->stream_id = stream_id; |
359 audio_entries_.insert(std::make_pair(stream_id, entry.release())); | 392 audio_entries_.insert(std::make_pair(stream_id, entry.release())); |
360 | |
361 MediaStreamManager::SendMessageToNativeLog( | |
362 "Audio input stream created successfully. Device name: " + device_name); | |
363 audio_log_->OnCreated(stream_id, audio_params, device_id); | 393 audio_log_->OnCreated(stream_id, audio_params, device_id); |
364 } | 394 } |
365 | 395 |
366 void AudioInputRendererHost::OnRecordStream(int stream_id) { | 396 void AudioInputRendererHost::OnRecordStream(int stream_id) { |
367 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 397 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
398 LogMessage(stream_id, "OnRecordStream", true); | |
368 | 399 |
369 AudioEntry* entry = LookupById(stream_id); | 400 AudioEntry* entry = LookupById(stream_id); |
370 if (!entry) { | 401 if (!entry) { |
371 SendErrorMessage(stream_id, INVALID_AUDIO_ENTRY); | 402 SendErrorMessage(stream_id, INVALID_AUDIO_ENTRY); |
372 return; | 403 return; |
373 } | 404 } |
374 | 405 |
375 entry->controller->Record(); | 406 entry->controller->Record(); |
376 audio_log_->OnStarted(stream_id); | 407 audio_log_->OnStarted(stream_id); |
377 } | 408 } |
378 | 409 |
379 void AudioInputRendererHost::OnCloseStream(int stream_id) { | 410 void AudioInputRendererHost::OnCloseStream(int stream_id) { |
380 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 411 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
412 LogMessage(stream_id, "OnCloseStream", true); | |
381 | 413 |
382 AudioEntry* entry = LookupById(stream_id); | 414 AudioEntry* entry = LookupById(stream_id); |
383 | 415 |
384 if (entry) | 416 if (entry) |
385 CloseAndDeleteStream(entry); | 417 CloseAndDeleteStream(entry); |
386 } | 418 } |
387 | 419 |
388 void AudioInputRendererHost::OnSetVolume(int stream_id, double volume) { | 420 void AudioInputRendererHost::OnSetVolume(int stream_id, double volume) { |
389 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 421 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
390 | 422 |
391 AudioEntry* entry = LookupById(stream_id); | 423 AudioEntry* entry = LookupById(stream_id); |
392 if (!entry) { | 424 if (!entry) { |
393 SendErrorMessage(stream_id, INVALID_AUDIO_ENTRY); | 425 SendErrorMessage(stream_id, INVALID_AUDIO_ENTRY); |
394 return; | 426 return; |
395 } | 427 } |
396 | 428 |
397 entry->controller->SetVolume(volume); | 429 entry->controller->SetVolume(volume); |
398 audio_log_->OnSetVolume(stream_id, volume); | 430 audio_log_->OnSetVolume(stream_id, volume); |
399 } | 431 } |
400 | 432 |
401 void AudioInputRendererHost::SendErrorMessage( | 433 void AudioInputRendererHost::SendErrorMessage( |
402 int stream_id, ErrorCode error_code) { | 434 int stream_id, ErrorCode error_code) { |
403 MediaStreamManager::SendMessageToNativeLog( | 435 std::string err_msg = |
404 base::StringPrintf("AudioInputRendererHost error: %d", error_code)); | 436 base::StringPrintf("SendErrorMessage(error_code=%d)", error_code); |
437 LogMessage(stream_id, err_msg, true); | |
438 | |
405 Send(new AudioInputMsg_NotifyStreamStateChanged( | 439 Send(new AudioInputMsg_NotifyStreamStateChanged( |
406 stream_id, media::AudioInputIPCDelegate::kError)); | 440 stream_id, media::AudioInputIPCDelegate::kError)); |
407 } | 441 } |
408 | 442 |
409 void AudioInputRendererHost::DeleteEntries() { | 443 void AudioInputRendererHost::DeleteEntries() { |
410 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 444 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
411 | 445 |
412 for (AudioEntryMap::iterator i = audio_entries_.begin(); | 446 for (AudioEntryMap::iterator i = audio_entries_.begin(); |
413 i != audio_entries_.end(); ++i) { | 447 i != audio_entries_.end(); ++i) { |
414 CloseAndDeleteStream(i->second); | 448 CloseAndDeleteStream(i->second); |
415 } | 449 } |
416 } | 450 } |
417 | 451 |
418 void AudioInputRendererHost::CloseAndDeleteStream(AudioEntry* entry) { | 452 void AudioInputRendererHost::CloseAndDeleteStream(AudioEntry* entry) { |
419 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 453 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
420 | 454 |
421 if (!entry->pending_close) { | 455 if (!entry->pending_close) { |
456 LogMessage(entry->stream_id, "CloseAndDeleteStream", true); | |
422 entry->controller->Close(base::Bind(&AudioInputRendererHost::DeleteEntry, | 457 entry->controller->Close(base::Bind(&AudioInputRendererHost::DeleteEntry, |
423 this, entry)); | 458 this, entry)); |
424 entry->pending_close = true; | 459 entry->pending_close = true; |
425 audio_log_->OnClosed(entry->stream_id); | 460 audio_log_->OnClosed(entry->stream_id); |
426 } | 461 } |
427 } | 462 } |
428 | 463 |
429 void AudioInputRendererHost::DeleteEntry(AudioEntry* entry) { | 464 void AudioInputRendererHost::DeleteEntry(AudioEntry* entry) { |
430 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 465 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
466 LogMessage(entry->stream_id, "DeleteEntry => stream is now closed", true); | |
431 | 467 |
432 // Delete the entry when this method goes out of scope. | 468 // Delete the entry when this method goes out of scope. |
433 scoped_ptr<AudioEntry> entry_deleter(entry); | 469 scoped_ptr<AudioEntry> entry_deleter(entry); |
434 | 470 |
435 // Erase the entry from the map. | 471 // Erase the entry from the map. |
436 audio_entries_.erase(entry->stream_id); | 472 audio_entries_.erase(entry->stream_id); |
437 } | 473 } |
438 | 474 |
439 void AudioInputRendererHost::DeleteEntryOnError(AudioEntry* entry, | 475 void AudioInputRendererHost::DeleteEntryOnError(AudioEntry* entry, |
440 ErrorCode error_code) { | 476 ErrorCode error_code) { |
(...skipping 23 matching lines...) Expand all Loading... | |
464 // TODO(hclam): Implement a faster look up method. | 500 // TODO(hclam): Implement a faster look up method. |
465 for (AudioEntryMap::iterator i = audio_entries_.begin(); | 501 for (AudioEntryMap::iterator i = audio_entries_.begin(); |
466 i != audio_entries_.end(); ++i) { | 502 i != audio_entries_.end(); ++i) { |
467 if (controller == i->second->controller.get()) | 503 if (controller == i->second->controller.get()) |
468 return i->second; | 504 return i->second; |
469 } | 505 } |
470 return NULL; | 506 return NULL; |
471 } | 507 } |
472 | 508 |
473 } // namespace content | 509 } // namespace content |
OLD | NEW |