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/process/process.h" | 10 #include "base/process/process.h" |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 } | 111 } |
112 | 112 |
113 void AudioInputRendererHost::OnData(media::AudioInputController* controller, | 113 void AudioInputRendererHost::OnData(media::AudioInputController* controller, |
114 const uint8* data, | 114 const uint8* data, |
115 uint32 size) { | 115 uint32 size) { |
116 NOTREACHED() << "Only low-latency mode is supported."; | 116 NOTREACHED() << "Only low-latency mode is supported."; |
117 } | 117 } |
118 | 118 |
119 void AudioInputRendererHost::DoCompleteCreation( | 119 void AudioInputRendererHost::DoCompleteCreation( |
120 media::AudioInputController* controller) { | 120 media::AudioInputController* controller) { |
121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 121 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
122 | 122 |
123 AudioEntry* entry = LookupByController(controller); | 123 AudioEntry* entry = LookupByController(controller); |
124 if (!entry) | 124 if (!entry) |
125 return; | 125 return; |
126 | 126 |
127 if (!PeerHandle()) { | 127 if (!PeerHandle()) { |
128 NOTREACHED() << "Renderer process handle is invalid."; | 128 NOTREACHED() << "Renderer process handle is invalid."; |
129 DeleteEntryOnError(entry, INVALID_PEER_HANDLE); | 129 DeleteEntryOnError(entry, INVALID_PEER_HANDLE); |
130 return; | 130 return; |
131 } | 131 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 } | 165 } |
166 | 166 |
167 Send(new AudioInputMsg_NotifyStreamCreated(entry->stream_id, | 167 Send(new AudioInputMsg_NotifyStreamCreated(entry->stream_id, |
168 foreign_memory_handle, foreign_socket_handle, | 168 foreign_memory_handle, foreign_socket_handle, |
169 entry->shared_memory.requested_size(), | 169 entry->shared_memory.requested_size(), |
170 entry->shared_memory_segment_count)); | 170 entry->shared_memory_segment_count)); |
171 } | 171 } |
172 | 172 |
173 void AudioInputRendererHost::DoSendRecordingMessage( | 173 void AudioInputRendererHost::DoSendRecordingMessage( |
174 media::AudioInputController* controller) { | 174 media::AudioInputController* controller) { |
175 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 175 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
176 // TODO(henrika): See crbug.com/115262 for details on why this method | 176 // TODO(henrika): See crbug.com/115262 for details on why this method |
177 // should be implemented. | 177 // should be implemented. |
178 } | 178 } |
179 | 179 |
180 void AudioInputRendererHost::DoHandleError( | 180 void AudioInputRendererHost::DoHandleError( |
181 media::AudioInputController* controller, | 181 media::AudioInputController* controller, |
182 media::AudioInputController::ErrorCode error_code) { | 182 media::AudioInputController::ErrorCode error_code) { |
183 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 183 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
184 MediaStreamManager::SendMessageToNativeLog( | 184 MediaStreamManager::SendMessageToNativeLog( |
185 base::StringPrintf("AudioInputController error: %d", error_code)); | 185 base::StringPrintf("AudioInputController error: %d", error_code)); |
186 | 186 |
187 AudioEntry* entry = LookupByController(controller); | 187 AudioEntry* entry = LookupByController(controller); |
188 if (!entry) | 188 if (!entry) |
189 return; | 189 return; |
190 | 190 |
191 audio_log_->OnError(entry->stream_id); | 191 audio_log_->OnError(entry->stream_id); |
192 DeleteEntryOnError(entry, AUDIO_INPUT_CONTROLLER_ERROR); | 192 DeleteEntryOnError(entry, AUDIO_INPUT_CONTROLLER_ERROR); |
193 } | 193 } |
(...skipping 10 matching lines...) Expand all Loading... |
204 IPC_END_MESSAGE_MAP_EX() | 204 IPC_END_MESSAGE_MAP_EX() |
205 | 205 |
206 return handled; | 206 return handled; |
207 } | 207 } |
208 | 208 |
209 void AudioInputRendererHost::OnCreateStream( | 209 void AudioInputRendererHost::OnCreateStream( |
210 int stream_id, | 210 int stream_id, |
211 int render_view_id, | 211 int render_view_id, |
212 int session_id, | 212 int session_id, |
213 const AudioInputHostMsg_CreateStream_Config& config) { | 213 const AudioInputHostMsg_CreateStream_Config& config) { |
214 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 214 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
215 | 215 |
216 DVLOG(1) << "AudioInputRendererHost@" << this | 216 DVLOG(1) << "AudioInputRendererHost@" << this |
217 << "::OnCreateStream(stream_id=" << stream_id | 217 << "::OnCreateStream(stream_id=" << stream_id |
218 << ", render_view_id=" << render_view_id | 218 << ", render_view_id=" << render_view_id |
219 << ", session_id=" << session_id << ")"; | 219 << ", session_id=" << session_id << ")"; |
220 DCHECK_GT(render_view_id, 0); | 220 DCHECK_GT(render_view_id, 0); |
221 | 221 |
222 // media::AudioParameters is validated in the deserializer. | 222 // media::AudioParameters is validated in the deserializer. |
223 if (LookupById(stream_id) != NULL) { | 223 if (LookupById(stream_id) != NULL) { |
224 SendErrorMessage(stream_id, STREAM_ALREADY_EXISTS); | 224 SendErrorMessage(stream_id, STREAM_ALREADY_EXISTS); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 // to the map. | 316 // to the map. |
317 entry->stream_id = stream_id; | 317 entry->stream_id = stream_id; |
318 audio_entries_.insert(std::make_pair(stream_id, entry.release())); | 318 audio_entries_.insert(std::make_pair(stream_id, entry.release())); |
319 | 319 |
320 MediaStreamManager::SendMessageToNativeLog( | 320 MediaStreamManager::SendMessageToNativeLog( |
321 "Audio input stream created successfully."); | 321 "Audio input stream created successfully."); |
322 audio_log_->OnCreated(stream_id, audio_params, device_id); | 322 audio_log_->OnCreated(stream_id, audio_params, device_id); |
323 } | 323 } |
324 | 324 |
325 void AudioInputRendererHost::OnRecordStream(int stream_id) { | 325 void AudioInputRendererHost::OnRecordStream(int stream_id) { |
326 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 326 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
327 | 327 |
328 AudioEntry* entry = LookupById(stream_id); | 328 AudioEntry* entry = LookupById(stream_id); |
329 if (!entry) { | 329 if (!entry) { |
330 SendErrorMessage(stream_id, INVALID_AUDIO_ENTRY); | 330 SendErrorMessage(stream_id, INVALID_AUDIO_ENTRY); |
331 return; | 331 return; |
332 } | 332 } |
333 | 333 |
334 entry->controller->Record(); | 334 entry->controller->Record(); |
335 audio_log_->OnStarted(stream_id); | 335 audio_log_->OnStarted(stream_id); |
336 } | 336 } |
337 | 337 |
338 void AudioInputRendererHost::OnCloseStream(int stream_id) { | 338 void AudioInputRendererHost::OnCloseStream(int stream_id) { |
339 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 339 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
340 | 340 |
341 AudioEntry* entry = LookupById(stream_id); | 341 AudioEntry* entry = LookupById(stream_id); |
342 | 342 |
343 if (entry) | 343 if (entry) |
344 CloseAndDeleteStream(entry); | 344 CloseAndDeleteStream(entry); |
345 } | 345 } |
346 | 346 |
347 void AudioInputRendererHost::OnSetVolume(int stream_id, double volume) { | 347 void AudioInputRendererHost::OnSetVolume(int stream_id, double volume) { |
348 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 348 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
349 | 349 |
350 AudioEntry* entry = LookupById(stream_id); | 350 AudioEntry* entry = LookupById(stream_id); |
351 if (!entry) { | 351 if (!entry) { |
352 SendErrorMessage(stream_id, INVALID_AUDIO_ENTRY); | 352 SendErrorMessage(stream_id, INVALID_AUDIO_ENTRY); |
353 return; | 353 return; |
354 } | 354 } |
355 | 355 |
356 entry->controller->SetVolume(volume); | 356 entry->controller->SetVolume(volume); |
357 audio_log_->OnSetVolume(stream_id, volume); | 357 audio_log_->OnSetVolume(stream_id, volume); |
358 } | 358 } |
359 | 359 |
360 void AudioInputRendererHost::SendErrorMessage( | 360 void AudioInputRendererHost::SendErrorMessage( |
361 int stream_id, ErrorCode error_code) { | 361 int stream_id, ErrorCode error_code) { |
362 MediaStreamManager::SendMessageToNativeLog( | 362 MediaStreamManager::SendMessageToNativeLog( |
363 base::StringPrintf("AudioInputRendererHost error: %d", error_code)); | 363 base::StringPrintf("AudioInputRendererHost error: %d", error_code)); |
364 Send(new AudioInputMsg_NotifyStreamStateChanged( | 364 Send(new AudioInputMsg_NotifyStreamStateChanged( |
365 stream_id, media::AudioInputIPCDelegate::kError)); | 365 stream_id, media::AudioInputIPCDelegate::kError)); |
366 } | 366 } |
367 | 367 |
368 void AudioInputRendererHost::DeleteEntries() { | 368 void AudioInputRendererHost::DeleteEntries() { |
369 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 369 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
370 | 370 |
371 for (AudioEntryMap::iterator i = audio_entries_.begin(); | 371 for (AudioEntryMap::iterator i = audio_entries_.begin(); |
372 i != audio_entries_.end(); ++i) { | 372 i != audio_entries_.end(); ++i) { |
373 CloseAndDeleteStream(i->second); | 373 CloseAndDeleteStream(i->second); |
374 } | 374 } |
375 } | 375 } |
376 | 376 |
377 void AudioInputRendererHost::CloseAndDeleteStream(AudioEntry* entry) { | 377 void AudioInputRendererHost::CloseAndDeleteStream(AudioEntry* entry) { |
378 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 378 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
379 | 379 |
380 if (!entry->pending_close) { | 380 if (!entry->pending_close) { |
381 entry->controller->Close(base::Bind(&AudioInputRendererHost::DeleteEntry, | 381 entry->controller->Close(base::Bind(&AudioInputRendererHost::DeleteEntry, |
382 this, entry)); | 382 this, entry)); |
383 entry->pending_close = true; | 383 entry->pending_close = true; |
384 audio_log_->OnClosed(entry->stream_id); | 384 audio_log_->OnClosed(entry->stream_id); |
385 } | 385 } |
386 } | 386 } |
387 | 387 |
388 void AudioInputRendererHost::DeleteEntry(AudioEntry* entry) { | 388 void AudioInputRendererHost::DeleteEntry(AudioEntry* entry) { |
389 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 389 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
390 | 390 |
391 // Delete the entry when this method goes out of scope. | 391 // Delete the entry when this method goes out of scope. |
392 scoped_ptr<AudioEntry> entry_deleter(entry); | 392 scoped_ptr<AudioEntry> entry_deleter(entry); |
393 | 393 |
394 // Erase the entry from the map. | 394 // Erase the entry from the map. |
395 audio_entries_.erase(entry->stream_id); | 395 audio_entries_.erase(entry->stream_id); |
396 } | 396 } |
397 | 397 |
398 void AudioInputRendererHost::DeleteEntryOnError(AudioEntry* entry, | 398 void AudioInputRendererHost::DeleteEntryOnError(AudioEntry* entry, |
399 ErrorCode error_code) { | 399 ErrorCode error_code) { |
400 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 400 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
401 | 401 |
402 // Sends the error message first before we close the stream because | 402 // Sends the error message first before we close the stream because |
403 // |entry| is destroyed in DeleteEntry(). | 403 // |entry| is destroyed in DeleteEntry(). |
404 SendErrorMessage(entry->stream_id, error_code); | 404 SendErrorMessage(entry->stream_id, error_code); |
405 CloseAndDeleteStream(entry); | 405 CloseAndDeleteStream(entry); |
406 } | 406 } |
407 | 407 |
408 AudioInputRendererHost::AudioEntry* AudioInputRendererHost::LookupById( | 408 AudioInputRendererHost::AudioEntry* AudioInputRendererHost::LookupById( |
409 int stream_id) { | 409 int stream_id) { |
410 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 410 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
411 | 411 |
412 AudioEntryMap::iterator i = audio_entries_.find(stream_id); | 412 AudioEntryMap::iterator i = audio_entries_.find(stream_id); |
413 if (i != audio_entries_.end()) | 413 if (i != audio_entries_.end()) |
414 return i->second; | 414 return i->second; |
415 return NULL; | 415 return NULL; |
416 } | 416 } |
417 | 417 |
418 AudioInputRendererHost::AudioEntry* AudioInputRendererHost::LookupByController( | 418 AudioInputRendererHost::AudioEntry* AudioInputRendererHost::LookupByController( |
419 media::AudioInputController* controller) { | 419 media::AudioInputController* controller) { |
420 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 420 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
421 | 421 |
422 // Iterate the map of entries. | 422 // Iterate the map of entries. |
423 // TODO(hclam): Implement a faster look up method. | 423 // TODO(hclam): Implement a faster look up method. |
424 for (AudioEntryMap::iterator i = audio_entries_.begin(); | 424 for (AudioEntryMap::iterator i = audio_entries_.begin(); |
425 i != audio_entries_.end(); ++i) { | 425 i != audio_entries_.end(); ++i) { |
426 if (controller == i->second->controller.get()) | 426 if (controller == i->second->controller.get()) |
427 return i->second; | 427 return i->second; |
428 } | 428 } |
429 return NULL; | 429 return NULL; |
430 } | 430 } |
431 | 431 |
432 } // namespace content | 432 } // namespace content |
OLD | NEW |