OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/renderer/media/webrtc_audio_device_impl.h" | 5 #include "content/renderer/media/webrtc_audio_device_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
10 #include "base/win/windows_version.h" | 10 #include "base/win/windows_version.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 } | 44 } |
45 | 45 |
46 int32_t WebRtcAudioDeviceImpl::Release() { | 46 int32_t WebRtcAudioDeviceImpl::Release() { |
47 DCHECK(thread_checker_.CalledOnValidThread()); | 47 DCHECK(thread_checker_.CalledOnValidThread()); |
48 int ret = base::subtle::Barrier_AtomicIncrement(&ref_count_, -1); | 48 int ret = base::subtle::Barrier_AtomicIncrement(&ref_count_, -1); |
49 if (ret == 0) { | 49 if (ret == 0) { |
50 delete this; | 50 delete this; |
51 } | 51 } |
52 return ret; | 52 return ret; |
53 } | 53 } |
54 int WebRtcAudioDeviceImpl::CaptureData(const std::vector<int>& channels, | 54 void WebRtcAudioDeviceImpl::CaptureData(const std::vector<int>& channels, |
55 const int16* audio_data, | 55 const int16* audio_data, |
56 int sample_rate, | 56 int sample_rate, |
57 int number_of_channels, | 57 int number_of_channels, |
58 int number_of_frames, | 58 int number_of_frames) { |
59 int audio_delay_milliseconds, | |
60 int current_volume, | |
61 bool need_audio_processing, | |
62 bool key_pressed) { | |
63 int total_delay_ms = 0; | |
64 { | 59 { |
65 base::AutoLock auto_lock(lock_); | 60 base::AutoLock auto_lock(lock_); |
66 // Return immediately when not recording or |channels| is empty. | 61 // Return immediately when not recording or |channels| is empty. |
67 // See crbug.com/274017: renderer crash dereferencing invalid channels[0]. | 62 // See crbug.com/274017: renderer crash dereferencing invalid channels[0]. |
68 if (!recording_ || channels.empty()) | 63 if (!recording_ || channels.empty()) |
69 return 0; | 64 return; |
70 | |
71 // Store the reported audio delay locally. | |
72 input_delay_ms_ = audio_delay_milliseconds; | |
73 total_delay_ms = input_delay_ms_ + output_delay_ms_; | |
74 DVLOG(2) << "total delay: " << input_delay_ms_ + output_delay_ms_; | |
75 } | 65 } |
76 | 66 |
77 // Write audio samples in blocks of 10 milliseconds to the registered | 67 // Deliver 10ms of recorded 16-bit linear PCM audio. |
78 // webrtc::AudioTransport sink. Keep writing until our internal byte | 68 audio_transport_callback_->OnDataAvailable( |
79 // buffer is empty. | 69 &channels[0], channels.size(), audio_data, sample_rate, |
80 const int16* audio_buffer = audio_data; | 70 number_of_channels, number_of_frames, 0, 0, false, false); |
81 const int samples_per_10_msec = (sample_rate / 100); | |
82 int accumulated_audio_samples = 0; | |
83 uint32_t new_volume = 0; | |
84 while (accumulated_audio_samples < number_of_frames) { | |
85 // Deliver 10ms of recorded 16-bit linear PCM audio. | |
86 int new_mic_level = audio_transport_callback_->OnDataAvailable( | |
87 &channels[0], | |
88 channels.size(), | |
89 audio_buffer, | |
90 sample_rate, | |
91 number_of_channels, | |
92 samples_per_10_msec, | |
93 total_delay_ms, | |
94 current_volume, | |
95 key_pressed, | |
96 need_audio_processing); | |
97 | |
98 accumulated_audio_samples += samples_per_10_msec; | |
99 audio_buffer += samples_per_10_msec * number_of_channels; | |
100 | |
101 // The latest non-zero new microphone level will be returned. | |
102 if (new_mic_level) | |
103 new_volume = new_mic_level; | |
104 } | |
105 | |
106 return new_volume; | |
107 } | 71 } |
108 | 72 |
109 void WebRtcAudioDeviceImpl::SetCaptureFormat( | 73 void WebRtcAudioDeviceImpl::SetCaptureFormat( |
110 const media::AudioParameters& params) { | 74 const media::AudioParameters& params) { |
111 DVLOG(1) << "WebRtcAudioDeviceImpl::SetCaptureFormat()"; | 75 DVLOG(1) << "WebRtcAudioDeviceImpl::SetCaptureFormat()"; |
112 DCHECK(thread_checker_.CalledOnValidThread()); | 76 DCHECK(thread_checker_.CalledOnValidThread()); |
113 } | 77 } |
114 | 78 |
115 void WebRtcAudioDeviceImpl::RenderData(uint8* audio_data, | 79 void WebRtcAudioDeviceImpl::RenderData(uint8* audio_data, |
116 int number_of_channels, | 80 int number_of_channels, |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 for (CapturerList::const_iterator iter = capturers_.begin(); | 439 for (CapturerList::const_iterator iter = capturers_.begin(); |
476 iter != capturers_.end(); ++iter) { | 440 iter != capturers_.end(); ++iter) { |
477 if (!(*iter)->device_id().empty()) | 441 if (!(*iter)->device_id().empty()) |
478 return *iter; | 442 return *iter; |
479 } | 443 } |
480 | 444 |
481 return NULL; | 445 return NULL; |
482 } | 446 } |
483 | 447 |
484 } // namespace content | 448 } // namespace content |
OLD | NEW |