Android audio manager: Move responsibility of OpenSLES engine

The OpenSLES engine is currently managed by the AudioManager which is
a generic class shared between different kinds of audio input/output.
This CL moves the responsibility of the OpenSLES engine to the actual
OpenSLES implementations.

Bug: webrtc:7452
Change-Id: Iecccb03ec5cd12ce2f3fdc44daaedae27aecf88b
Reviewed-on: https://webrtc-review.googlesource.com/64520
Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
Reviewed-by: Paulina Hensman <phensman@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22661}
This commit is contained in:
Magnus Jedvert
2018-03-28 21:26:57 +02:00
committed by Commit Bot
parent 1a18e0ac46
commit e2971ec2ab
9 changed files with 121 additions and 114 deletions

View File

@ -28,59 +28,72 @@
namespace webrtc {
namespace {
// This template function takes care of some boiler plate.
template <typename AudioInputT, typename AudioOutputT>
rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceModuleTemplate(
AudioDeviceModule::AudioLayer audio_layer,
JNIEnv* env,
jobject application_context) {
auto audio_manager = rtc::MakeUnique<android_adm::AudioManager>(
env, audio_layer, JavaParamRef<jobject>(application_context));
auto audio_input = rtc::MakeUnique<AudioInputT>(audio_manager.get());
auto audio_output = rtc::MakeUnique<AudioOutputT>(audio_manager.get());
return CreateAudioDeviceModuleFromInputAndOutput(
audio_layer, std::move(audio_manager), std::move(audio_input),
std::move(audio_output));
}
} // namespace
#if defined(AUDIO_DEVICE_INCLUDE_ANDROID_AAUDIO)
rtc::scoped_refptr<AudioDeviceModule> CreateAAudioAudioDeviceModule(
JNIEnv* env,
jobject application_context) {
RTC_LOG(INFO) << __FUNCTION__;
return CreateAudioDeviceModuleTemplate<android_adm::AAudioRecorder,
android_adm::AAudioPlayer>(
AudioDeviceModule::kAndroidAAudioAudio, env, application_context);
const AudioDeviceModule::AudioLayer audio_layer =
AudioDeviceModule::kAndroidAAudioAudio;
auto audio_manager = rtc::MakeUnique<android_adm::AudioManager>(
env, audio_layer, JavaParamRef<jobject>(application_context));
auto audio_input =
rtc::MakeUnique<android_adm::AAudioRecorder>(audio_manager.get());
auto audio_output =
rtc::MakeUnique<android_adm::AAudioPlayer>(audio_manager.get());
return CreateAudioDeviceModuleFromInputAndOutput(
audio_layer, std::move(audio_manager), std::move(audio_input),
std::move(audio_output));
}
#endif
rtc::scoped_refptr<AudioDeviceModule> CreateJavaAudioDeviceModule(
JNIEnv* env,
jobject application_context) {
return CreateAudioDeviceModuleTemplate<android_adm::AudioRecordJni,
android_adm::AudioTrackJni>(
AudioDeviceModule::kAndroidJavaAudio, env, application_context);
const AudioDeviceModule::AudioLayer audio_layer =
AudioDeviceModule::kAndroidJavaAudio;
auto audio_manager = rtc::MakeUnique<android_adm::AudioManager>(
env, audio_layer, JavaParamRef<jobject>(application_context));
auto audio_input =
rtc::MakeUnique<android_adm::AudioRecordJni>(audio_manager.get());
auto audio_output =
rtc::MakeUnique<android_adm::AudioTrackJni>(audio_manager.get());
return CreateAudioDeviceModuleFromInputAndOutput(
audio_layer, std::move(audio_manager), std::move(audio_input),
std::move(audio_output));
}
rtc::scoped_refptr<AudioDeviceModule> CreateOpenSLESAudioDeviceModule(
JNIEnv* env,
jobject application_context) {
return CreateAudioDeviceModuleTemplate<android_adm::OpenSLESRecorder,
android_adm::OpenSLESPlayer>(
AudioDeviceModule::kAndroidJavaAudio, env, application_context);
const AudioDeviceModule::AudioLayer audio_layer =
AudioDeviceModule::kAndroidOpenSLESAudio;
auto engine_manager = rtc::MakeUnique<android_adm::OpenSLEngineManager>();
auto audio_manager = rtc::MakeUnique<android_adm::AudioManager>(
env, audio_layer, JavaParamRef<jobject>(application_context));
auto audio_input = rtc::MakeUnique<android_adm::OpenSLESRecorder>(
audio_manager.get(), engine_manager.get());
auto audio_output = rtc::MakeUnique<android_adm::OpenSLESPlayer>(
audio_manager.get(), std::move(engine_manager));
return CreateAudioDeviceModuleFromInputAndOutput(
audio_layer, std::move(audio_manager), std::move(audio_input),
std::move(audio_output));
}
rtc::scoped_refptr<AudioDeviceModule>
CreateJavaInputAndOpenSLESOutputAudioDeviceModule(JNIEnv* env,
jobject application_context) {
return CreateAudioDeviceModuleTemplate<android_adm::AudioRecordJni,
android_adm::OpenSLESPlayer>(
AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio, env,
application_context);
const AudioDeviceModule::AudioLayer audio_layer =
AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio;
auto audio_manager = rtc::MakeUnique<android_adm::AudioManager>(
env, audio_layer, JavaParamRef<jobject>(application_context));
auto audio_input =
rtc::MakeUnique<android_adm::AudioRecordJni>(audio_manager.get());
auto audio_output = rtc::MakeUnique<android_adm::OpenSLESPlayer>(
audio_manager.get(), rtc::MakeUnique<android_adm::OpenSLEngineManager>());
return CreateAudioDeviceModuleFromInputAndOutput(
audio_layer, std::move(audio_manager), std::move(audio_input),
std::move(audio_output));
}
} // namespace webrtc