Chromium Code Reviews| 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 #ifndef CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_IMPL_H_ | 5 #ifndef CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_IMPL_H_ |
| 6 #define CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_IMPL_H_ | 6 #define CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_IMPL_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 84 // .---------------------. | 84 // .---------------------. |
| 85 // | 85 // |
| 86 // (*) Using SyncSocket for inter-process synchronization with low latency. | 86 // (*) Using SyncSocket for inter-process synchronization with low latency. |
| 87 // The actual data is transferred via SharedMemory. IPC is not involved | 87 // The actual data is transferred via SharedMemory. IPC is not involved |
| 88 // in the actual media transfer. | 88 // in the actual media transfer. |
| 89 // | 89 // |
| 90 // Implementation notes: | 90 // Implementation notes: |
| 91 // | 91 // |
| 92 // - This class must be created on the main render thread. | 92 // - This class must be created on the main render thread. |
| 93 // - The webrtc::AudioDeviceModule is reference counted. | 93 // - The webrtc::AudioDeviceModule is reference counted. |
| 94 // - Recording is currently not supported on Mac OS X. | 94 // - Regarding the AGC: It aims at maintaining the same speech loudness level |
|
tommi (sloooow) - chröme
2012/03/26 15:26:40
s/It aims at maintaining/It aims to maintain
It's
henrika (OOO until Aug 14)
2012/03/27 09:20:38
Modified to "It aims to maintain a constant speech
| |
| 95 // from the microphone. This is done by both controlling the analog | |
| 96 // microphone gain and applying a digital gain. The microphone gain on the | |
|
tommi (sloooow) - chröme
2012/03/26 15:26:40
s/a digital gain/digital gain
henrika (OOO until Aug 14)
2012/03/27 09:20:38
Done.
| |
| 97 // sound card is slowly increased/decreased during speech only. By observing | |
| 98 // the microphone control slider you can see it move when you speak. If you | |
| 99 // scream, the slider moves downwards and then upwards again when you return | |
| 100 // to normal. It is not uncommon that the slider hits the maximum. This | |
| 101 // means that the maximum analog gain is not large enough to give the | |
| 102 // desired loudness. Nevertheless, we can in general still attain the | |
| 103 // desired loudness. If the microphone control slider is moved manually, | |
| 104 // the analog adaptation restarts and returns to roughly the same position | |
|
tommi (sloooow) - chröme
2012/03/26 15:26:40
s/analog adaptation/gain adaptation.
henrika (OOO until Aug 14)
2012/03/27 09:20:38
Actually, it is only the analog part that restarts
| |
| 105 // as before the change if the circumstances are still the same. When the | |
| 106 // input microphone signal causes saturation, the level is decreased | |
| 107 // dramatically and has to re-adapt towards the old level. The adaptation | |
| 108 // is a slowly varying process and at the beginning of a call this is | |
|
tommi (sloooow) - chröme
2012/03/26 15:26:40
s/beginning of a call/beginning of capture
(there
henrika (OOO until Aug 14)
2012/03/27 09:20:38
Done.
| |
| 109 // noticed by a slow increase in volume. Smaller changes in microphone input | |
| 110 // level is leveled out by the built-in digital control. For larger | |
| 111 // differences we need to rely on the slow adaptation. | |
| 95 // | 112 // |
| 96 class CONTENT_EXPORT WebRtcAudioDeviceImpl | 113 class CONTENT_EXPORT WebRtcAudioDeviceImpl |
| 97 : NON_EXPORTED_BASE(public webrtc::AudioDeviceModule), | 114 : NON_EXPORTED_BASE(public webrtc::AudioDeviceModule), |
| 98 public media::AudioRendererSink::RenderCallback, | 115 public media::AudioRendererSink::RenderCallback, |
| 99 public AudioInputDevice::CaptureCallback, | 116 public AudioInputDevice::CaptureCallback, |
| 100 public AudioInputDevice::CaptureEventHandler { | 117 public AudioInputDevice::CaptureEventHandler { |
| 101 public: | 118 public: |
| 102 // Methods called on main render thread. | 119 // Methods called on main render thread. |
| 103 WebRtcAudioDeviceImpl(); | 120 WebRtcAudioDeviceImpl(); |
| 104 | 121 |
| 105 // webrtc::RefCountedModule implementation. | 122 // webrtc::RefCountedModule implementation. |
| 106 // The creator must call AddRef() after construction and use Release() | 123 // The creator must call AddRef() after construction and use Release() |
| 107 // to release the reference and delete this object. | 124 // to release the reference and delete this object. |
| 108 virtual int32_t AddRef() OVERRIDE; | 125 virtual int32_t AddRef() OVERRIDE; |
| 109 virtual int32_t Release() OVERRIDE; | 126 virtual int32_t Release() OVERRIDE; |
| 110 | 127 |
| 111 // We need this one to support runnable method tasks. | 128 // We need this one to support runnable method tasks. |
| 112 static bool ImplementsThreadSafeReferenceCounting() { return true; } | 129 static bool ImplementsThreadSafeReferenceCounting() { return true; } |
| 113 | 130 |
| 114 // AudioDevice::RenderCallback implementation. | 131 // AudioDevice::RenderCallback implementation. |
| 115 virtual size_t Render(const std::vector<float*>& audio_data, | 132 virtual size_t Render(const std::vector<float*>& audio_data, |
| 116 size_t number_of_frames, | 133 size_t number_of_frames, |
| 117 size_t audio_delay_milliseconds) OVERRIDE; | 134 size_t audio_delay_milliseconds) OVERRIDE; |
| 118 virtual void OnRenderError() OVERRIDE; | 135 virtual void OnRenderError() OVERRIDE; |
| 119 | 136 |
| 120 // AudioInputDevice::CaptureCallback implementation. | 137 // AudioInputDevice::CaptureCallback implementation. |
| 121 virtual void Capture(const std::vector<float*>& audio_data, | 138 virtual void Capture(const std::vector<float*>& audio_data, |
| 122 size_t number_of_frames, | 139 size_t number_of_frames, |
| 123 size_t audio_delay_milliseconds) OVERRIDE; | 140 size_t audio_delay_milliseconds, |
| 141 double volume) OVERRIDE; | |
| 124 virtual void OnCaptureError() OVERRIDE; | 142 virtual void OnCaptureError() OVERRIDE; |
| 125 | 143 |
| 126 // AudioInputDevice::CaptureEventHandler implementation. | 144 // AudioInputDevice::CaptureEventHandler implementation. |
| 127 virtual void OnDeviceStarted(const std::string& device_id) OVERRIDE; | 145 virtual void OnDeviceStarted(const std::string& device_id) OVERRIDE; |
| 128 virtual void OnDeviceStopped() OVERRIDE; | 146 virtual void OnDeviceStopped() OVERRIDE; |
| 129 | 147 |
| 130 // webrtc::Module implementation. | 148 // webrtc::Module implementation. |
| 131 virtual int32_t ChangeUniqueId(const int32_t id) OVERRIDE; | 149 virtual int32_t ChangeUniqueId(const int32_t id) OVERRIDE; |
| 132 virtual int32_t TimeUntilNextProcess() OVERRIDE; | 150 virtual int32_t TimeUntilNextProcess() OVERRIDE; |
| 133 virtual int32_t Process() OVERRIDE; | 151 virtual int32_t Process() OVERRIDE; |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 251 virtual int32_t GetLoudspeakerStatus(bool* enabled) const OVERRIDE; | 269 virtual int32_t GetLoudspeakerStatus(bool* enabled) const OVERRIDE; |
| 252 | 270 |
| 253 // Sets the session id. | 271 // Sets the session id. |
| 254 void SetSessionId(int session_id); | 272 void SetSessionId(int session_id); |
| 255 | 273 |
| 256 // Accessors. | 274 // Accessors. |
| 257 size_t input_buffer_size() const { | 275 size_t input_buffer_size() const { |
| 258 return input_audio_parameters_.frames_per_buffer(); | 276 return input_audio_parameters_.frames_per_buffer(); |
| 259 } | 277 } |
| 260 size_t output_buffer_size() const { | 278 size_t output_buffer_size() const { |
| 261 return input_audio_parameters_.frames_per_buffer(); | 279 return output_audio_parameters_.frames_per_buffer(); |
| 262 } | 280 } |
| 263 int input_channels() const { | 281 int input_channels() const { |
| 264 return input_audio_parameters_.channels(); | 282 return input_audio_parameters_.channels(); |
| 265 } | 283 } |
| 266 int output_channels() const { | 284 int output_channels() const { |
| 267 return output_audio_parameters_.channels(); | 285 return output_audio_parameters_.channels(); |
| 268 } | 286 } |
| 269 int input_sample_rate() const { | 287 int input_sample_rate() const { |
| 270 return input_audio_parameters_.sample_rate(); | 288 return input_audio_parameters_.sample_rate(); |
| 271 } | 289 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 329 | 347 |
| 330 // Protects |recording_|, |output_delay_ms_|, |input_delay_ms_|. | 348 // Protects |recording_|, |output_delay_ms_|, |input_delay_ms_|. |
| 331 mutable base::Lock lock_; | 349 mutable base::Lock lock_; |
| 332 | 350 |
| 333 int bytes_per_sample_; | 351 int bytes_per_sample_; |
| 334 | 352 |
| 335 bool initialized_; | 353 bool initialized_; |
| 336 bool playing_; | 354 bool playing_; |
| 337 bool recording_; | 355 bool recording_; |
| 338 | 356 |
| 357 // Local copy of the current Automatic Gain Control state. | |
| 358 bool agc_is_enabled_; | |
| 359 | |
| 339 DISALLOW_COPY_AND_ASSIGN(WebRtcAudioDeviceImpl); | 360 DISALLOW_COPY_AND_ASSIGN(WebRtcAudioDeviceImpl); |
| 340 }; | 361 }; |
| 341 | 362 |
| 342 #endif // CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_IMPL_H_ | 363 #endif // CONTENT_RENDERER_MEDIA_WEBRTC_AUDIO_DEVICE_IMPL_H_ |
| OLD | NEW |