OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 30 matching lines...) Expand all Loading... |
41 class AudioProcessingImpl : public AudioProcessing { | 41 class AudioProcessingImpl : public AudioProcessing { |
42 public: | 42 public: |
43 // Methods forcing APM to run in a single-threaded manner. | 43 // Methods forcing APM to run in a single-threaded manner. |
44 // Acquires both the render and capture locks. | 44 // Acquires both the render and capture locks. |
45 explicit AudioProcessingImpl(const webrtc::Config& config); | 45 explicit AudioProcessingImpl(const webrtc::Config& config); |
46 // AudioProcessingImpl takes ownership of beamformer. | 46 // AudioProcessingImpl takes ownership of beamformer. |
47 AudioProcessingImpl(const webrtc::Config& config, | 47 AudioProcessingImpl(const webrtc::Config& config, |
48 NonlinearBeamformer* beamformer); | 48 NonlinearBeamformer* beamformer); |
49 ~AudioProcessingImpl() override; | 49 ~AudioProcessingImpl() override; |
50 int Initialize() override; | 50 int Initialize() override; |
51 int Initialize(int input_sample_rate_hz, | 51 int Initialize(int capture_input_sample_rate_hz, |
52 int output_sample_rate_hz, | 52 int capture_output_sample_rate_hz, |
53 int reverse_sample_rate_hz, | 53 int render_sample_rate_hz, |
54 ChannelLayout input_layout, | 54 ChannelLayout capture_input_layout, |
55 ChannelLayout output_layout, | 55 ChannelLayout capture_output_layout, |
56 ChannelLayout reverse_layout) override; | 56 ChannelLayout render_input_layout) override; |
57 int Initialize(const ProcessingConfig& processing_config) override; | 57 int Initialize(const ProcessingConfig& processing_config) override; |
58 void ApplyConfig(const AudioProcessing::Config& config) override; | 58 void ApplyConfig(const AudioProcessing::Config& config) override; |
59 void SetExtraOptions(const webrtc::Config& config) override; | 59 void SetExtraOptions(const webrtc::Config& config) override; |
60 void UpdateHistogramsOnCallEnd() override; | 60 void UpdateHistogramsOnCallEnd() override; |
61 int StartDebugRecording(const char filename[kMaxFilenameSize], | 61 int StartDebugRecording(const char filename[kMaxFilenameSize], |
62 int64_t max_log_size_bytes) override; | 62 int64_t max_log_size_bytes) override; |
63 int StartDebugRecording(FILE* handle, int64_t max_log_size_bytes) override; | 63 int StartDebugRecording(FILE* handle, int64_t max_log_size_bytes) override; |
64 | 64 |
65 int StartDebugRecordingForPlatformFile(rtc::PlatformFile handle) override; | 65 int StartDebugRecordingForPlatformFile(rtc::PlatformFile handle) override; |
66 int StopDebugRecording() override; | 66 int StopDebugRecording() override; |
(...skipping 19 matching lines...) Expand all Loading... |
86 void set_stream_key_pressed(bool key_pressed) override; | 86 void set_stream_key_pressed(bool key_pressed) override; |
87 | 87 |
88 // Render-side exclusive methods possibly running APM in a | 88 // Render-side exclusive methods possibly running APM in a |
89 // multi-threaded manner. Acquire the render lock. | 89 // multi-threaded manner. Acquire the render lock. |
90 int ProcessReverseStream(AudioFrame* frame) override; | 90 int ProcessReverseStream(AudioFrame* frame) override; |
91 int AnalyzeReverseStream(const float* const* data, | 91 int AnalyzeReverseStream(const float* const* data, |
92 size_t samples_per_channel, | 92 size_t samples_per_channel, |
93 int sample_rate_hz, | 93 int sample_rate_hz, |
94 ChannelLayout layout) override; | 94 ChannelLayout layout) override; |
95 int ProcessReverseStream(const float* const* src, | 95 int ProcessReverseStream(const float* const* src, |
96 const StreamConfig& reverse_input_config, | 96 const StreamConfig& input_config, |
97 const StreamConfig& reverse_output_config, | 97 const StreamConfig& output_config, |
98 float* const* dest) override; | 98 float* const* dest) override; |
99 | 99 |
100 // Methods only accessed from APM submodules or | 100 // Methods only accessed from APM submodules or |
101 // from AudioProcessing tests in a single-threaded manner. | 101 // from AudioProcessing tests in a single-threaded manner. |
102 // Hence there is no need for locks in these. | 102 // Hence there is no need for locks in these. |
103 int proc_sample_rate_hz() const override; | 103 int proc_sample_rate_hz() const override; |
104 int proc_split_sample_rate_hz() const override; | 104 int proc_split_sample_rate_hz() const override; |
105 size_t num_input_channels() const override; | 105 size_t num_input_channels() const override; |
106 size_t num_proc_channels() const override; | 106 size_t num_proc_channels() const override; |
107 size_t num_output_channels() const override; | 107 size_t num_output_channels() const override; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 bool force_initialization) | 207 bool force_initialization) |
208 EXCLUSIVE_LOCKS_REQUIRED(crit_render_); | 208 EXCLUSIVE_LOCKS_REQUIRED(crit_render_); |
209 | 209 |
210 // Method for updating the state keeping track of the active submodules. | 210 // Method for updating the state keeping track of the active submodules. |
211 // Returns a bool indicating whether the state has changed. | 211 // Returns a bool indicating whether the state has changed. |
212 bool UpdateActiveSubmoduleStates() EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 212 bool UpdateActiveSubmoduleStates() EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); |
213 | 213 |
214 // Methods requiring APM running in a single-threaded manner. | 214 // Methods requiring APM running in a single-threaded manner. |
215 // Are called with both the render and capture locks already | 215 // Are called with both the render and capture locks already |
216 // acquired. | 216 // acquired. |
217 void InitializeExperimentalAgc() | |
218 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); | |
219 void InitializeTransient() | 217 void InitializeTransient() |
220 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); | 218 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); |
221 void InitializeBeamformer() | 219 void InitializeBeamformer() |
222 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); | 220 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); |
223 void InitializeIntelligibility() | 221 void InitializeIntelligibility() |
224 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); | 222 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); |
225 void InitializeHighPassFilter() | |
226 EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | |
227 void InitializeNoiseSuppression() | |
228 EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | |
229 void InitializeLevelEstimator() | |
230 EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | |
231 void InitializeVoiceDetection() | |
232 EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | |
233 void InitializeEchoCanceller() | |
234 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); | |
235 void InitializeGainController() | |
236 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); | |
237 void InitializeEchoControlMobile() | |
238 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); | |
239 int InitializeLocked(const ProcessingConfig& config) | 223 int InitializeLocked(const ProcessingConfig& config) |
240 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); | 224 EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); |
241 void InitializeLevelController() EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 225 void InitializeLevelController() EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); |
242 | 226 |
243 // Capture-side exclusive methods possibly running APM in a multi-threaded | 227 // Capture-side exclusive methods possibly running APM in a multi-threaded |
244 // manner that are called with the render lock already acquired. | 228 // manner that are called with the render lock already acquired. |
245 int ProcessStreamLocked() EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 229 int ProcessCaptureStreamLocked() EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); |
246 void MaybeUpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 230 void MaybeUpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); |
247 | 231 |
248 // Render-side exclusive methods possibly running APM in a multi-threaded | 232 // Render-side exclusive methods possibly running APM in a multi-threaded |
249 // manner that are called with the render lock already acquired. | 233 // manner that are called with the render lock already acquired. |
250 // TODO(ekm): Remove once all clients updated to new interface. | 234 // TODO(ekm): Remove once all clients updated to new interface. |
251 int AnalyzeReverseStreamLocked(const float* const* src, | 235 int AnalyzeReverseStreamLocked(const float* const* src, |
252 const StreamConfig& input_config, | 236 const StreamConfig& input_config, |
253 const StreamConfig& output_config) | 237 const StreamConfig& output_config) |
254 EXCLUSIVE_LOCKS_REQUIRED(crit_render_); | 238 EXCLUSIVE_LOCKS_REQUIRED(crit_render_); |
255 int ProcessReverseStreamLocked() EXCLUSIVE_LOCKS_REQUIRED(crit_render_); | 239 int ProcessRenderStreamLocked() EXCLUSIVE_LOCKS_REQUIRED(crit_render_); |
256 | 240 |
257 // Debug dump methods that are internal and called without locks. | 241 // Debug dump methods that are internal and called without locks. |
258 // TODO(peah): Make thread safe. | 242 // TODO(peah): Make thread safe. |
259 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 243 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
260 // TODO(andrew): make this more graceful. Ideally we would split this stuff | 244 // TODO(andrew): make this more graceful. Ideally we would split this stuff |
261 // out into a separate class with an "enabled" and "disabled" implementation. | 245 // out into a separate class with an "enabled" and "disabled" implementation. |
262 static int WriteMessageToDebugFile(FileWrapper* debug_file, | 246 static int WriteMessageToDebugFile(FileWrapper* debug_file, |
263 int64_t* filesize_limit_bytes, | 247 int64_t* filesize_limit_bytes, |
264 rtc::CriticalSection* crit_debug, | 248 rtc::CriticalSection* crit_debug, |
265 ApmDebugDumpThreadState* debug_state); | 249 ApmDebugDumpThreadState* debug_state); |
(...skipping 29 matching lines...) Expand all Loading... |
295 // As this is only accessed internally of APM, and all internal methods in APM | 279 // As this is only accessed internally of APM, and all internal methods in APM |
296 // either are holding the render or capture locks, this construct is safe as | 280 // either are holding the render or capture locks, this construct is safe as |
297 // it is not possible to read the variables while writing them. | 281 // it is not possible to read the variables while writing them. |
298 struct ApmFormatState { | 282 struct ApmFormatState { |
299 ApmFormatState() | 283 ApmFormatState() |
300 : // Format of processing streams at input/output call sites. | 284 : // Format of processing streams at input/output call sites. |
301 api_format({{{kSampleRate16kHz, 1, false}, | 285 api_format({{{kSampleRate16kHz, 1, false}, |
302 {kSampleRate16kHz, 1, false}, | 286 {kSampleRate16kHz, 1, false}, |
303 {kSampleRate16kHz, 1, false}, | 287 {kSampleRate16kHz, 1, false}, |
304 {kSampleRate16kHz, 1, false}}}), | 288 {kSampleRate16kHz, 1, false}}}), |
305 rev_proc_format(kSampleRate16kHz, 1) {} | 289 render_processing_format(kSampleRate16kHz, 1) {} |
306 ProcessingConfig api_format; | 290 ProcessingConfig api_format; |
307 StreamConfig rev_proc_format; | 291 StreamConfig render_processing_format; |
308 } formats_; | 292 } formats_; |
309 | 293 |
310 // APM constants. | 294 // APM constants. |
311 const struct ApmConstants { | 295 const struct ApmConstants { |
312 ApmConstants(int agc_startup_min_volume, bool use_experimental_agc) | 296 ApmConstants(int agc_startup_min_volume, bool use_experimental_agc) |
313 : // Format of processing streams at input/output call sites. | 297 : // Format of processing streams at input/output call sites. |
314 agc_startup_min_volume(agc_startup_min_volume), | 298 agc_startup_min_volume(agc_startup_min_volume), |
315 use_experimental_agc(use_experimental_agc) {} | 299 use_experimental_agc(use_experimental_agc) {} |
316 int agc_startup_min_volume; | 300 int agc_startup_min_volume; |
317 bool use_experimental_agc; | 301 bool use_experimental_agc; |
318 } constants_; | 302 } constants_; |
319 | 303 |
320 struct ApmCaptureState { | 304 struct ApmCaptureState { |
321 ApmCaptureState(bool transient_suppressor_enabled, | 305 ApmCaptureState(bool transient_suppressor_enabled, |
322 const std::vector<Point>& array_geometry, | 306 const std::vector<Point>& array_geometry, |
323 SphericalPointf target_direction); | 307 SphericalPointf target_direction); |
324 ~ApmCaptureState(); | 308 ~ApmCaptureState(); |
325 int aec_system_delay_jumps; | 309 int aec_system_delay_jumps; |
326 int delay_offset_ms; | 310 int delay_offset_ms; |
327 bool was_stream_delay_set; | 311 bool was_stream_delay_set; |
328 int last_stream_delay_ms; | 312 int last_stream_delay_ms; |
329 int last_aec_system_delay_ms; | 313 int last_aec_system_delay_ms; |
330 int stream_delay_jumps; | 314 int stream_delay_jumps; |
331 bool output_will_be_muted; | 315 bool output_will_be_muted; |
332 bool key_pressed; | 316 bool key_pressed; |
333 bool transient_suppressor_enabled; | 317 bool transient_suppressor_enabled; |
334 std::vector<Point> array_geometry; | 318 std::vector<Point> array_geometry; |
335 SphericalPointf target_direction; | 319 SphericalPointf target_direction; |
336 std::unique_ptr<AudioBuffer> capture_audio; | 320 std::unique_ptr<AudioBuffer> capture_audio; |
337 // Only the rate and samples fields of fwd_proc_format_ are used because the | 321 // Only the rate and samples fields of capture_processing_format_ are used |
338 // forward processing number of channels is mutable and is tracked by the | 322 // because the capture processing number of channels is mutable and is |
339 // capture_audio_. | 323 // tracked by the capture_audio_. |
340 StreamConfig fwd_proc_format; | 324 StreamConfig capture_processing_format; |
341 int split_rate; | 325 int split_rate; |
342 } capture_ GUARDED_BY(crit_capture_); | 326 } capture_ GUARDED_BY(crit_capture_); |
343 | 327 |
344 struct ApmCaptureNonLockedState { | 328 struct ApmCaptureNonLockedState { |
345 ApmCaptureNonLockedState(bool beamformer_enabled, | 329 ApmCaptureNonLockedState(bool beamformer_enabled, |
346 bool intelligibility_enabled) | 330 bool intelligibility_enabled) |
347 : fwd_proc_format(kSampleRate16kHz), | 331 : capture_processing_format(kSampleRate16kHz), |
348 split_rate(kSampleRate16kHz), | 332 split_rate(kSampleRate16kHz), |
349 stream_delay_ms(0), | 333 stream_delay_ms(0), |
350 beamformer_enabled(beamformer_enabled), | 334 beamformer_enabled(beamformer_enabled), |
351 intelligibility_enabled(intelligibility_enabled) {} | 335 intelligibility_enabled(intelligibility_enabled) {} |
352 // Only the rate and samples fields of fwd_proc_format_ are used because the | 336 // Only the rate and samples fields of capture_processing_format_ are used |
353 // forward processing number of channels is mutable and is tracked by the | 337 // because the forward processing number of channels is mutable and is |
354 // capture_audio_. | 338 // tracked by the capture_audio_. |
355 StreamConfig fwd_proc_format; | 339 StreamConfig capture_processing_format; |
356 int split_rate; | 340 int split_rate; |
357 int stream_delay_ms; | 341 int stream_delay_ms; |
358 bool beamformer_enabled; | 342 bool beamformer_enabled; |
359 bool intelligibility_enabled; | 343 bool intelligibility_enabled; |
360 bool level_controller_enabled = false; | 344 bool level_controller_enabled = false; |
361 } capture_nonlocked_; | 345 } capture_nonlocked_; |
362 | 346 |
363 struct ApmRenderState { | 347 struct ApmRenderState { |
364 ApmRenderState(); | 348 ApmRenderState(); |
365 ~ApmRenderState(); | 349 ~ApmRenderState(); |
366 std::unique_ptr<AudioConverter> render_converter; | 350 std::unique_ptr<AudioConverter> render_converter; |
367 std::unique_ptr<AudioBuffer> render_audio; | 351 std::unique_ptr<AudioBuffer> render_audio; |
368 } render_ GUARDED_BY(crit_render_); | 352 } render_ GUARDED_BY(crit_render_); |
369 }; | 353 }; |
370 | 354 |
371 } // namespace webrtc | 355 } // namespace webrtc |
372 | 356 |
373 #endif // WEBRTC_MODULES_AUDIO_PROCESSING_AUDIO_PROCESSING_IMPL_H_ | 357 #endif // WEBRTC_MODULES_AUDIO_PROCESSING_AUDIO_PROCESSING_IMPL_H_ |
OLD | NEW |