1 /*
2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "sdk/android/native_api/audio_device_module/audio_device_android.h"
12
13 #include <stdlib.h>
14
15 #include <memory>
16 #include <utility>
17
18 #include "api/scoped_refptr.h"
19 #include "rtc_base/logging.h"
20 #include "rtc_base/ref_count.h"
21
22 #if defined(WEBRTC_AUDIO_DEVICE_INCLUDE_ANDROID_AAUDIO)
23 #include "sdk/android/src/jni/audio_device/aaudio_player.h"
24 #include "sdk/android/src/jni/audio_device/aaudio_recorder.h"
25 #endif
26
27 #include "sdk/android/src/jni/audio_device/audio_record_jni.h"
28 #include "sdk/android/src/jni/audio_device/audio_track_jni.h"
29 #include "sdk/android/src/jni/audio_device/opensles_player.h"
30 #include "sdk/android/src/jni/audio_device/opensles_recorder.h"
31 #include "system_wrappers/include/metrics.h"
32
33 namespace webrtc {
34
35 namespace {
36
GetDefaultAudioParameters(JNIEnv * env,jobject application_context,AudioParameters * input_parameters,AudioParameters * output_parameters)37 void GetDefaultAudioParameters(JNIEnv* env,
38 jobject application_context,
39 AudioParameters* input_parameters,
40 AudioParameters* output_parameters) {
41 const JavaParamRef<jobject> j_context(application_context);
42 const ScopedJavaLocalRef<jobject> j_audio_manager =
43 jni::GetAudioManager(env, j_context);
44 const int input_sample_rate = jni::GetDefaultSampleRate(env, j_audio_manager);
45 const int output_sample_rate =
46 jni::GetDefaultSampleRate(env, j_audio_manager);
47 jni::GetAudioParameters(env, j_context, j_audio_manager, input_sample_rate,
48 output_sample_rate, false /* use_stereo_input */,
49 false /* use_stereo_output */, input_parameters,
50 output_parameters);
51 }
52
53 } // namespace
54
55 #if defined(WEBRTC_AUDIO_DEVICE_INCLUDE_ANDROID_AAUDIO)
CreateAAudioAudioDeviceModule(JNIEnv * env,jobject application_context)56 rtc::scoped_refptr<AudioDeviceModule> CreateAAudioAudioDeviceModule(
57 JNIEnv* env,
58 jobject application_context) {
59 RTC_DLOG(LS_INFO) << __FUNCTION__;
60 // Get default audio input/output parameters.
61 AudioParameters input_parameters;
62 AudioParameters output_parameters;
63 GetDefaultAudioParameters(env, application_context, &input_parameters,
64 &output_parameters);
65 // Create ADM from AAudioRecorder and AAudioPlayer.
66 return CreateAudioDeviceModuleFromInputAndOutput(
67 AudioDeviceModule::kAndroidAAudioAudio, false /* use_stereo_input */,
68 false /* use_stereo_output */,
69 jni::kLowLatencyModeDelayEstimateInMilliseconds,
70 std::make_unique<jni::AAudioRecorder>(input_parameters),
71 std::make_unique<jni::AAudioPlayer>(output_parameters));
72 }
73 #endif
74
CreateJavaAudioDeviceModule(JNIEnv * env,jobject application_context)75 rtc::scoped_refptr<AudioDeviceModule> CreateJavaAudioDeviceModule(
76 JNIEnv* env,
77 jobject application_context) {
78 RTC_DLOG(LS_INFO) << __FUNCTION__;
79 // Get default audio input/output parameters.
80 const JavaParamRef<jobject> j_context(application_context);
81 const ScopedJavaLocalRef<jobject> j_audio_manager =
82 jni::GetAudioManager(env, j_context);
83 AudioParameters input_parameters;
84 AudioParameters output_parameters;
85 GetDefaultAudioParameters(env, application_context, &input_parameters,
86 &output_parameters);
87 // Create ADM from AudioRecord and AudioTrack.
88 auto audio_input = std::make_unique<jni::AudioRecordJni>(
89 env, input_parameters, jni::kHighLatencyModeDelayEstimateInMilliseconds,
90 jni::AudioRecordJni::CreateJavaWebRtcAudioRecord(env, j_context,
91 j_audio_manager));
92 auto audio_output = std::make_unique<jni::AudioTrackJni>(
93 env, output_parameters,
94 jni::AudioTrackJni::CreateJavaWebRtcAudioTrack(env, j_context,
95 j_audio_manager));
96 return CreateAudioDeviceModuleFromInputAndOutput(
97 AudioDeviceModule::kAndroidJavaAudio, false /* use_stereo_input */,
98 false /* use_stereo_output */,
99 jni::kHighLatencyModeDelayEstimateInMilliseconds, std::move(audio_input),
100 std::move(audio_output));
101 }
102
CreateOpenSLESAudioDeviceModule(JNIEnv * env,jobject application_context)103 rtc::scoped_refptr<AudioDeviceModule> CreateOpenSLESAudioDeviceModule(
104 JNIEnv* env,
105 jobject application_context) {
106 RTC_DLOG(LS_INFO) << __FUNCTION__;
107 // Get default audio input/output parameters.
108 AudioParameters input_parameters;
109 AudioParameters output_parameters;
110 GetDefaultAudioParameters(env, application_context, &input_parameters,
111 &output_parameters);
112 // Create ADM from OpenSLESRecorder and OpenSLESPlayer.
113 rtc::scoped_refptr<jni::OpenSLEngineManager> engine_manager(
114 new jni::OpenSLEngineManager());
115 auto audio_input =
116 std::make_unique<jni::OpenSLESRecorder>(input_parameters, engine_manager);
117 auto audio_output = std::make_unique<jni::OpenSLESPlayer>(
118 output_parameters, std::move(engine_manager));
119 return CreateAudioDeviceModuleFromInputAndOutput(
120 AudioDeviceModule::kAndroidOpenSLESAudio, false /* use_stereo_input */,
121 false /* use_stereo_output */,
122 jni::kLowLatencyModeDelayEstimateInMilliseconds, std::move(audio_input),
123 std::move(audio_output));
124 }
125
126 rtc::scoped_refptr<AudioDeviceModule>
CreateJavaInputAndOpenSLESOutputAudioDeviceModule(JNIEnv * env,jobject application_context)127 CreateJavaInputAndOpenSLESOutputAudioDeviceModule(JNIEnv* env,
128 jobject application_context) {
129 RTC_DLOG(LS_INFO) << __FUNCTION__;
130 // Get default audio input/output parameters.
131 const JavaParamRef<jobject> j_context(application_context);
132 const ScopedJavaLocalRef<jobject> j_audio_manager =
133 jni::GetAudioManager(env, j_context);
134 AudioParameters input_parameters;
135 AudioParameters output_parameters;
136 GetDefaultAudioParameters(env, application_context, &input_parameters,
137 &output_parameters);
138 // Create ADM from AudioRecord and OpenSLESPlayer.
139 auto audio_input = std::make_unique<jni::AudioRecordJni>(
140 env, input_parameters, jni::kLowLatencyModeDelayEstimateInMilliseconds,
141 jni::AudioRecordJni::CreateJavaWebRtcAudioRecord(env, j_context,
142 j_audio_manager));
143
144 rtc::scoped_refptr<jni::OpenSLEngineManager> engine_manager(
145 new jni::OpenSLEngineManager());
146 auto audio_output = std::make_unique<jni::OpenSLESPlayer>(
147 output_parameters, std::move(engine_manager));
148 return CreateAudioDeviceModuleFromInputAndOutput(
149 AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio,
150 false /* use_stereo_input */, false /* use_stereo_output */,
151 jni::kLowLatencyModeDelayEstimateInMilliseconds, std::move(audio_input),
152 std::move(audio_output));
153 }
154
155 } // namespace webrtc
156