Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: webrtc/voice_engine/transmit_mixer.cc

Issue 1466353003: Work around data race in TransmitMixer. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
11 #include "webrtc/voice_engine/transmit_mixer.h" 11 #include "webrtc/voice_engine/transmit_mixer.h"
12 12
13 #include "webrtc/base/format_macros.h" 13 #include "webrtc/base/format_macros.h"
14 #include "webrtc/modules/utility/include/audio_frame_operations.h" 14 #include "webrtc/modules/utility/include/audio_frame_operations.h"
15 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 15 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
16 #include "webrtc/system_wrappers/include/event_wrapper.h" 16 #include "webrtc/system_wrappers/include/event_wrapper.h"
17 #include "webrtc/system_wrappers/include/logging.h" 17 #include "webrtc/system_wrappers/include/logging.h"
18 #include "webrtc/system_wrappers/include/trace.h" 18 #include "webrtc/system_wrappers/include/trace.h"
19 #include "webrtc/voice_engine/channel.h" 19 #include "webrtc/voice_engine/channel.h"
20 #include "webrtc/voice_engine/channel_manager.h" 20 #include "webrtc/voice_engine/channel_manager.h"
21 #include "webrtc/voice_engine/include/voe_external_media.h" 21 #include "webrtc/voice_engine/include/voe_external_media.h"
22 #include "webrtc/voice_engine/statistics.h" 22 #include "webrtc/voice_engine/statistics.h"
23 #include "webrtc/voice_engine/utility.h" 23 #include "webrtc/voice_engine/utility.h"
24 #include "webrtc/voice_engine/voe_base_impl.h" 24 #include "webrtc/voice_engine/voe_base_impl.h"
25 25
26 #define WEBRTC_ABS(a) (((a) < 0) ? -(a) : (a))
27
28 namespace webrtc { 26 namespace webrtc {
29 namespace voe { 27 namespace voe {
30 28
31 // TODO(ajm): The thread safety of this is dubious... 29 // TODO(ajm): The thread safety of this is dubious...
32 void 30 void
33 TransmitMixer::OnPeriodicProcess() 31 TransmitMixer::OnPeriodicProcess()
34 { 32 {
35 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1), 33 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
36 "TransmitMixer::OnPeriodicProcess()"); 34 "TransmitMixer::OnPeriodicProcess()");
37 35
38 #if defined(WEBRTC_VOICE_ENGINE_TYPING_DETECTION) 36 #if defined(WEBRTC_VOICE_ENGINE_TYPING_DETECTION)
39 if (_typingNoiseWarningPending) 37 bool send_typing_noise_warning = false;
38 bool typing_noise_detected = false;
40 { 39 {
40 CriticalSectionScoped cs(&_critSect);
41 if (_typingNoiseWarningPending) {
42 send_typing_noise_warning = true;
43 typing_noise_detected = _typingNoiseDetected;
44 _typingNoiseWarningPending = false;
45 }
46 }
47 if (send_typing_noise_warning) {
41 CriticalSectionScoped cs(&_callbackCritSect); 48 CriticalSectionScoped cs(&_callbackCritSect);
42 if (_voiceEngineObserverPtr) 49 if (_voiceEngineObserverPtr) {
43 { 50 if (typing_noise_detected) {
44 if (_typingNoiseDetected) {
45 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1), 51 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
46 "TransmitMixer::OnPeriodicProcess() => " 52 "TransmitMixer::OnPeriodicProcess() => "
47 "CallbackOnError(VE_TYPING_NOISE_WARNING)"); 53 "CallbackOnError(VE_TYPING_NOISE_WARNING)");
48 _voiceEngineObserverPtr->CallbackOnError( 54 _voiceEngineObserverPtr->CallbackOnError(
49 -1, 55 -1,
50 VE_TYPING_NOISE_WARNING); 56 VE_TYPING_NOISE_WARNING);
51 } else { 57 } else {
52 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1), 58 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
53 "TransmitMixer::OnPeriodicProcess() => " 59 "TransmitMixer::OnPeriodicProcess() => "
54 "CallbackOnError(VE_TYPING_NOISE_OFF_WARNING)"); 60 "CallbackOnError(VE_TYPING_NOISE_OFF_WARNING)");
55 _voiceEngineObserverPtr->CallbackOnError( 61 _voiceEngineObserverPtr->CallbackOnError(
56 -1, 62 -1,
57 VE_TYPING_NOISE_OFF_WARNING); 63 VE_TYPING_NOISE_OFF_WARNING);
58 } 64 }
59 } 65 }
60 _typingNoiseWarningPending = false;
61 } 66 }
62 #endif 67 #endif
63 68
64 bool saturationWarning = false; 69 bool saturationWarning = false;
65 { 70 {
66 // Modify |_saturationWarning| under lock to avoid conflict with write op 71 // Modify |_saturationWarning| under lock to avoid conflict with write op
67 // in ProcessAudio and also ensure that we don't hold the lock during the 72 // in ProcessAudio and also ensure that we don't hold the lock during the
68 // callback. 73 // callback.
69 CriticalSectionScoped cs(&_critSect); 74 CriticalSectionScoped cs(&_critSect);
70 saturationWarning = _saturationWarning; 75 saturationWarning = _saturationWarning;
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 #ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION 1277 #ifdef WEBRTC_VOICE_ENGINE_TYPING_DETECTION
1273 void TransmitMixer::TypingDetection(bool keyPressed) 1278 void TransmitMixer::TypingDetection(bool keyPressed)
1274 { 1279 {
1275 // We let the VAD determine if we're using this feature or not. 1280 // We let the VAD determine if we're using this feature or not.
1276 if (_audioFrame.vad_activity_ == AudioFrame::kVadUnknown) { 1281 if (_audioFrame.vad_activity_ == AudioFrame::kVadUnknown) {
1277 return; 1282 return;
1278 } 1283 }
1279 1284
1280 bool vadActive = _audioFrame.vad_activity_ == AudioFrame::kVadActive; 1285 bool vadActive = _audioFrame.vad_activity_ == AudioFrame::kVadActive;
1281 if (_typingDetection.Process(keyPressed, vadActive)) { 1286 if (_typingDetection.Process(keyPressed, vadActive)) {
1287 CriticalSectionScoped cs(&_critSect);
1282 _typingNoiseWarningPending = true; 1288 _typingNoiseWarningPending = true;
1283 _typingNoiseDetected = true; 1289 _typingNoiseDetected = true;
1284 } else { 1290 } else {
1291 CriticalSectionScoped cs(&_critSect);
1285 // If there is already a warning pending, do not change the state. 1292 // If there is already a warning pending, do not change the state.
1286 // Otherwise set a warning pending if last callback was for noise detected. 1293 // Otherwise set a warning pending if last callback was for noise detected.
1287 if (!_typingNoiseWarningPending && _typingNoiseDetected) { 1294 if (!_typingNoiseWarningPending && _typingNoiseDetected) {
1288 _typingNoiseWarningPending = true; 1295 _typingNoiseWarningPending = true;
1289 _typingNoiseDetected = false; 1296 _typingNoiseDetected = false;
1290 } 1297 }
1291 } 1298 }
1292 } 1299 }
1293 #endif 1300 #endif
1294 1301
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 void TransmitMixer::EnableStereoChannelSwapping(bool enable) { 1335 void TransmitMixer::EnableStereoChannelSwapping(bool enable) {
1329 swap_stereo_channels_ = enable; 1336 swap_stereo_channels_ = enable;
1330 } 1337 }
1331 1338
1332 bool TransmitMixer::IsStereoChannelSwappingEnabled() { 1339 bool TransmitMixer::IsStereoChannelSwappingEnabled() {
1333 return swap_stereo_channels_; 1340 return swap_stereo_channels_;
1334 } 1341 }
1335 1342
1336 } // namespace voe 1343 } // namespace voe
1337 } // namespace webrtc 1344 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698