diff --git a/sdk/android/src/java/org/webrtc/audio/WebRtcAudioRecord.java b/sdk/android/src/java/org/webrtc/audio/WebRtcAudioRecord.java index 8136bca0f8..42570d80e4 100644 --- a/sdk/android/src/java/org/webrtc/audio/WebRtcAudioRecord.java +++ b/sdk/android/src/java/org/webrtc/audio/WebRtcAudioRecord.java @@ -93,7 +93,7 @@ class WebRtcAudioRecord { private volatile boolean microphoneMute; private boolean audioSourceMatchesRecordingSession; - private boolean audioConfigHasBeenVerified; + private boolean isAudioConfigVerified; private byte[] emptyBytes; private final @Nullable AudioRecordErrorCallback errorCallback; @@ -221,13 +221,20 @@ class WebRtcAudioRecord { return isNoiseSuppressorSupported; } + // Returns true if a valid call to verifyAudioConfig() has been done. Should always be + // checked before using the returned value of isAudioSourceMatchingRecordingSession(). @CalledByNative + boolean isAudioConfigVerified() { + return isAudioConfigVerified; + } + // Returns true if verifyAudioConfig() succeeds. This value is set after a specific delay when // startRecording() has been called. Hence, should preferably be called in combination with - // stopRecording() to ensure that it has been set properly. |audioConfigHasBeenChecked| is + // stopRecording() to ensure that it has been set properly. |isAudioConfigVerified| is // enabled in WebRtcAudioRecord to ensure that the returned value is valid. + @CalledByNative boolean isAudioSourceMatchingRecordingSession() { - if (!audioConfigHasBeenVerified) { + if (!isAudioConfigVerified) { Logging.w(TAG, "Audio configuration has not yet been verified"); return false; } @@ -434,7 +441,7 @@ class WebRtcAudioRecord { audioSourceMatchesRecordingSession = verifyAudioConfig(audioRecord.getAudioSource(), audioRecord.getAudioSessionId(), audioRecord.getFormat(), audioRecord.getRoutedDevice(), configs); - audioConfigHasBeenVerified = true; + isAudioConfigVerified = true; } } return numActiveRecordingSessions; diff --git a/sdk/android/src/jni/audio_device/audio_record_jni.cc b/sdk/android/src/jni/audio_device/audio_record_jni.cc index 5e39be9f6d..15c290c2ee 100644 --- a/sdk/android/src/jni/audio_device/audio_record_jni.cc +++ b/sdk/android/src/jni/audio_device/audio_record_jni.cc @@ -158,13 +158,17 @@ int32_t AudioRecordJni::StopRecording() { if (!initialized_ || !recording_) { return 0; } - const bool session_was_ok = - Java_WebRtcAudioRecord_isAudioSourceMatchingRecordingSession( - env_, j_audio_record_); - RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.SourceMatchesRecordingSession", - session_was_ok); - RTC_LOG(INFO) << "HISTOGRAM(WebRTC.Audio.SourceMatchesRecordingSession): " - << session_was_ok; + // Check if the audio source matched the activated recording session but only + // if a valid results exists to avoid invalid statistics. + if (Java_WebRtcAudioRecord_isAudioConfigVerified(env_, j_audio_record_)) { + const bool session_was_ok = + Java_WebRtcAudioRecord_isAudioSourceMatchingRecordingSession( + env_, j_audio_record_); + RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.SourceMatchesRecordingSession", + session_was_ok); + RTC_LOG(INFO) << "HISTOGRAM(WebRTC.Audio.SourceMatchesRecordingSession): " + << session_was_ok; + } if (!Java_WebRtcAudioRecord_stopRecording(env_, j_audio_record_)) { RTC_LOG(LS_ERROR) << "StopRecording failed"; return -1;