diff --git a/webrtc/modules/audio_device/android/audio_track_jni.cc b/webrtc/modules/audio_device/android/audio_track_jni.cc index 5bf3a5b8d7..67837f51fb 100644 --- a/webrtc/modules/audio_device/android/audio_track_jni.cc +++ b/webrtc/modules/audio_device/android/audio_track_jni.cc @@ -33,7 +33,7 @@ AudioTrackJni::JavaAudioTrack::JavaAudioTrack( NativeRegistration* native_reg, std::unique_ptr audio_track) : audio_track_(std::move(audio_track)), - init_playout_(native_reg->GetMethodId("initPlayout", "(II)V")), + init_playout_(native_reg->GetMethodId("initPlayout", "(II)Z")), start_playout_(native_reg->GetMethodId("startPlayout", "()Z")), stop_playout_(native_reg->GetMethodId("stopPlayout", "()Z")), set_stream_volume_(native_reg->GetMethodId("setStreamVolume", "(I)Z")), @@ -43,8 +43,8 @@ AudioTrackJni::JavaAudioTrack::JavaAudioTrack( AudioTrackJni::JavaAudioTrack::~JavaAudioTrack() {} -void AudioTrackJni::JavaAudioTrack::InitPlayout(int sample_rate, int channels) { - audio_track_->CallVoidMethod(init_playout_, sample_rate, channels); +bool AudioTrackJni::JavaAudioTrack::InitPlayout(int sample_rate, int channels) { + return audio_track_->CallBooleanMethod(init_playout_, sample_rate, channels); } bool AudioTrackJni::JavaAudioTrack::StartPlayout() { @@ -123,8 +123,11 @@ int32_t AudioTrackJni::InitPlayout() { RTC_DCHECK(thread_checker_.CalledOnValidThread()); RTC_DCHECK(!initialized_); RTC_DCHECK(!playing_); - j_audio_track_->InitPlayout( - audio_parameters_.sample_rate(), audio_parameters_.channels()); + if (!j_audio_track_->InitPlayout( + audio_parameters_.sample_rate(), audio_parameters_.channels())) { + ALOGE("InitPlayout failed!"); + return -1; + } initialized_ = true; return 0; } diff --git a/webrtc/modules/audio_device/android/audio_track_jni.h b/webrtc/modules/audio_device/android/audio_track_jni.h index 32b0b77033..82f2113f0a 100644 --- a/webrtc/modules/audio_device/android/audio_track_jni.h +++ b/webrtc/modules/audio_device/android/audio_track_jni.h @@ -47,7 +47,7 @@ class AudioTrackJni { std::unique_ptr audio_track); ~JavaAudioTrack(); - void InitPlayout(int sample_rate, int channels); + bool InitPlayout(int sample_rate, int channels); bool StartPlayout(); bool StopPlayout(); bool SetStreamVolume(int volume); diff --git a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java index 11eb51383d..593f998dd3 100644 --- a/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java +++ b/webrtc/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java @@ -152,7 +152,7 @@ class WebRtcAudioTrack { } } - private void initPlayout(int sampleRate, int channels) { + private boolean initPlayout(int sampleRate, int channels) { Logging.d(TAG, "initPlayout(sampleRate=" + sampleRate + ", channels=" + channels + ")"); final int bytesPerFrame = channels * (BITS_PER_SAMPLE / 8); @@ -191,17 +191,27 @@ class WebRtcAudioTrack { AudioTrack.MODE_STREAM); } catch (IllegalArgumentException e) { Logging.d(TAG, e.getMessage()); - return; + return false; } - assertTrue(audioTrack.getState() == AudioTrack.STATE_INITIALIZED); - assertTrue(audioTrack.getPlayState() == AudioTrack.PLAYSTATE_STOPPED); - assertTrue(audioTrack.getStreamType() == AudioManager.STREAM_VOICE_CALL); + + // It can happen that an AudioTrack is created but it was not successfully + // initialized upon creation. Seems to be the case e.g. when the maximum + // number of globally available audio tracks is exceeded. + if (audioTrack.getState() != AudioTrack.STATE_INITIALIZED) { + Logging.e(TAG, "Initialization of audio track failed."); + return false; + } + return true; } private boolean startPlayout() { Logging.d(TAG, "startPlayout"); assertTrue(audioTrack != null); assertTrue(audioThread == null); + if (audioTrack.getState() != AudioTrack.STATE_INITIALIZED) { + Logging.e(TAG, "Audio track is not successfully initialized."); + return false; + } audioThread = new AudioTrackThread("AudioTrackJavaThread"); audioThread.start(); return true;