diff --git a/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java b/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java index e4abc0ff08..9f644c337c 100644 --- a/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java +++ b/sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java @@ -143,9 +143,8 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { samplesReadyCallback, useHardwareAcousticEchoCanceler, useHardwareNoiseSuppressor); final WebRtcAudioTrack audioOutput = new WebRtcAudioTrack(context, audioManager, audioTrackErrorCallback); - final long nativeAudioDeviceModule = nativeCreateAudioDeviceModule(context, audioManager, - audioInput, audioOutput, sampleRate, useStereoInput, useStereoOutput); - return new JavaAudioDeviceModule(audioInput, audioOutput, nativeAudioDeviceModule); + return new JavaAudioDeviceModule(context, audioManager, audioInput, audioOutput, sampleRate, + useStereoInput, useStereoOutput); } } @@ -233,27 +232,47 @@ public class JavaAudioDeviceModule implements AudioDeviceModule { return WebRtcAudioEffects.isNoiseSuppressorSupported(); } + private final Context context; + private final AudioManager audioManager; private final WebRtcAudioRecord audioInput; private final WebRtcAudioTrack audioOutput; + private final int sampleRate; + private final boolean useStereoInput; + private final boolean useStereoOutput; + + private final Object nativeLock = new Object(); private long nativeAudioDeviceModule; - private JavaAudioDeviceModule( - WebRtcAudioRecord audioInput, WebRtcAudioTrack audioOutput, long nativeAudioDeviceModule) { + private JavaAudioDeviceModule(Context context, AudioManager audioManager, + WebRtcAudioRecord audioInput, WebRtcAudioTrack audioOutput, int sampleRate, + boolean useStereoInput, boolean useStereoOutput) { + this.context = context; + this.audioManager = audioManager; this.audioInput = audioInput; this.audioOutput = audioOutput; - this.nativeAudioDeviceModule = nativeAudioDeviceModule; + this.sampleRate = sampleRate; + this.useStereoInput = useStereoInput; + this.useStereoOutput = useStereoOutput; } @Override public long getNativeAudioDeviceModulePointer() { - return nativeAudioDeviceModule; + synchronized (nativeLock) { + if (nativeAudioDeviceModule == 0) { + nativeAudioDeviceModule = nativeCreateAudioDeviceModule(context, audioManager, audioInput, + audioOutput, sampleRate, useStereoInput, useStereoOutput); + } + return nativeAudioDeviceModule; + } } @Override public void release() { - if (nativeAudioDeviceModule != 0) { - JniCommon.nativeReleaseRef(nativeAudioDeviceModule); - nativeAudioDeviceModule = 0; + synchronized (nativeLock) { + if (nativeAudioDeviceModule != 0) { + JniCommon.nativeReleaseRef(nativeAudioDeviceModule); + nativeAudioDeviceModule = 0; + } } }