diff --git a/modules/audio_device/BUILD.gn b/modules/audio_device/BUILD.gn index b4f7035cf3..54b2039f13 100644 --- a/modules/audio_device/BUILD.gn +++ b/modules/audio_device/BUILD.gn @@ -201,6 +201,7 @@ rtc_source_set("audio_device_impl") { ":audio_device_default", ":audio_device_generic", "../../api:array_view", + "../../api:refcountedbase", "../../api:scoped_refptr", "../../api/task_queue", "../../api/task_queue:global_task_queue_factory", diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 2ad398fe55..7dc3e294d3 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -913,6 +913,7 @@ if (is_android) { ":base_jni", ":java_audio_device_module", ":opensles_audio_device_module", + "../../api:scoped_refptr", "../../modules/audio_device", "../../rtc_base:checks", "../../rtc_base:rtc_base_approved", @@ -1201,6 +1202,8 @@ if (is_android) { ":audio_device_module_base", ":base_jni", "../../api:array_view", + "../../api:refcountedbase", + "../../api:scoped_refptr", "../../modules/audio_device", "../../modules/audio_device:audio_device_buffer", "../../rtc_base:checks", diff --git a/sdk/android/native_api/audio_device_module/audio_device_android.cc b/sdk/android/native_api/audio_device_module/audio_device_android.cc index dd1b36740e..8374eefa02 100644 --- a/sdk/android/native_api/audio_device_module/audio_device_android.cc +++ b/sdk/android/native_api/audio_device_module/audio_device_android.cc @@ -14,6 +14,7 @@ #include #include "absl/memory/memory.h" +#include "api/scoped_refptr.h" #include "rtc_base/logging.h" #include "rtc_base/ref_count.h" #include "rtc_base/ref_counted_object.h" @@ -109,9 +110,10 @@ rtc::scoped_refptr CreateOpenSLESAudioDeviceModule( GetDefaultAudioParameters(env, application_context, &input_parameters, &output_parameters); // Create ADM from OpenSLESRecorder and OpenSLESPlayer. - auto engine_manager = absl::make_unique(); - auto audio_input = absl::make_unique( - input_parameters, engine_manager.get()); + rtc::scoped_refptr engine_manager( + new jni::OpenSLEngineManager()); + auto audio_input = absl::make_unique(input_parameters, + engine_manager); auto audio_output = absl::make_unique( output_parameters, std::move(engine_manager)); return CreateAudioDeviceModuleFromInputAndOutput( @@ -138,8 +140,11 @@ CreateJavaInputAndOpenSLESOutputAudioDeviceModule(JNIEnv* env, env, input_parameters, jni::kLowLatencyModeDelayEstimateInMilliseconds, jni::AudioRecordJni::CreateJavaWebRtcAudioRecord(env, j_context, j_audio_manager)); + + rtc::scoped_refptr engine_manager( + new jni::OpenSLEngineManager()); auto audio_output = absl::make_unique( - output_parameters, absl::make_unique()); + output_parameters, std::move(engine_manager)); return CreateAudioDeviceModuleFromInputAndOutput( AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio, false /* use_stereo_input */, false /* use_stereo_output */, diff --git a/sdk/android/src/jni/audio_device/opensles_common.h b/sdk/android/src/jni/audio_device/opensles_common.h index 0a8c115acc..605ddfc0eb 100644 --- a/sdk/android/src/jni/audio_device/opensles_common.h +++ b/sdk/android/src/jni/audio_device/opensles_common.h @@ -14,6 +14,7 @@ #include #include +#include "api/ref_counted_base.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/thread_checker.h" @@ -65,12 +66,12 @@ typedef ScopedSLObject ScopedSLObjectItf; // a reference to it. The engine object is only created at the first call // since OpenSL ES for Android only supports a single engine per application. // Subsequent calls returns the already created engine. -// Note: This class must be used single threaded and this is enfored by a thread -// checker. -class OpenSLEngineManager { +// Note: This class must be used single threaded and this is enforced by a +// thread checker. +class OpenSLEngineManager : public rtc::RefCountedBase { public: OpenSLEngineManager(); - ~OpenSLEngineManager(); + ~OpenSLEngineManager() override; SLObjectItf GetOpenSLEngine(); private: diff --git a/sdk/android/src/jni/audio_device/opensles_player.cc b/sdk/android/src/jni/audio_device/opensles_player.cc index 67d6c1fbcf..ea6bbc6b52 100644 --- a/sdk/android/src/jni/audio_device/opensles_player.cc +++ b/sdk/android/src/jni/audio_device/opensles_player.cc @@ -44,7 +44,7 @@ namespace jni { OpenSLESPlayer::OpenSLESPlayer( const AudioParameters& audio_parameters, - std::unique_ptr engine_manager) + rtc::scoped_refptr engine_manager) : audio_parameters_(audio_parameters), audio_device_buffer_(nullptr), initialized_(false), diff --git a/sdk/android/src/jni/audio_device/opensles_player.h b/sdk/android/src/jni/audio_device/opensles_player.h index d8befe50d0..4b8a0aaf2f 100644 --- a/sdk/android/src/jni/audio_device/opensles_player.h +++ b/sdk/android/src/jni/audio_device/opensles_player.h @@ -17,6 +17,7 @@ #include #include "absl/types/optional.h" +#include "api/scoped_refptr.h" #include "modules/audio_device/audio_device_buffer.h" #include "modules/audio_device/fine_audio_buffer.h" #include "modules/audio_device/include/audio_device_defines.h" @@ -60,7 +61,7 @@ class OpenSLESPlayer : public AudioOutput { static const int kNumOfOpenSLESBuffers = 2; OpenSLESPlayer(const AudioParameters& audio_parameters, - std::unique_ptr engine_manager); + rtc::scoped_refptr engine_manager); ~OpenSLESPlayer() override; int Init() override; @@ -159,7 +160,7 @@ class OpenSLESPlayer : public AudioOutput { // Example (kNumOfOpenSLESBuffers = 2): counts 0, 1, 0, 1, ... int buffer_index_; - std::unique_ptr engine_manager_; + const rtc::scoped_refptr engine_manager_; // This interface exposes creation methods for all the OpenSL ES object types. // It is the OpenSL ES API entry point. SLEngineItf engine_; diff --git a/sdk/android/src/jni/audio_device/opensles_recorder.cc b/sdk/android/src/jni/audio_device/opensles_recorder.cc index 4f1490728c..1ac2d83336 100644 --- a/sdk/android/src/jni/audio_device/opensles_recorder.cc +++ b/sdk/android/src/jni/audio_device/opensles_recorder.cc @@ -43,13 +43,14 @@ namespace webrtc { namespace jni { -OpenSLESRecorder::OpenSLESRecorder(const AudioParameters& audio_parameters, - OpenSLEngineManager* engine_manager) +OpenSLESRecorder::OpenSLESRecorder( + const AudioParameters& audio_parameters, + rtc::scoped_refptr engine_manager) : audio_parameters_(audio_parameters), audio_device_buffer_(nullptr), initialized_(false), recording_(false), - engine_manager_(engine_manager), + engine_manager_(std::move(engine_manager)), engine_(nullptr), recorder_(nullptr), simple_buffer_queue_(nullptr), diff --git a/sdk/android/src/jni/audio_device/opensles_recorder.h b/sdk/android/src/jni/audio_device/opensles_recorder.h index 6408be0f56..4856fd0155 100644 --- a/sdk/android/src/jni/audio_device/opensles_recorder.h +++ b/sdk/android/src/jni/audio_device/opensles_recorder.h @@ -17,6 +17,7 @@ #include +#include "api/scoped_refptr.h" #include "modules/audio_device/audio_device_buffer.h" #include "modules/audio_device/fine_audio_buffer.h" #include "modules/audio_device/include/audio_device_defines.h" @@ -63,7 +64,7 @@ class OpenSLESRecorder : public AudioInput { static const int kNumOfOpenSLESBuffers = 2; OpenSLESRecorder(const AudioParameters& audio_parameters, - OpenSLEngineManager* engine_manager); + rtc::scoped_refptr engine_manager); ~OpenSLESRecorder() override; int Init() override; @@ -148,7 +149,7 @@ class OpenSLESRecorder : public AudioInput { bool initialized_; bool recording_; - OpenSLEngineManager* const engine_manager_; + const rtc::scoped_refptr engine_manager_; // This interface exposes creation methods for all the OpenSL ES object types. // It is the OpenSL ES API entry point. SLEngineItf engine_;