blob: 75dbaf315f509dbb9b2fc4a0f8156a499a956602 [file] [log] [blame]
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +00001/*
2 * Copyright (c) 2013 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_
12#define MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/audio_device/android/audio_manager.h"
15#include "modules/audio_device/audio_device_generic.h"
16#include "rtc_base/checks.h"
17#include "rtc_base/logging.h"
18#include "rtc_base/thread_checker.h"
henrikafe55c382015-06-05 11:45:56 +020019
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000020namespace webrtc {
21
22// InputType/OutputType can be any class that implements the capturing/rendering
23// part of the AudioDeviceGeneric API.
henrikab2619892015-05-18 16:49:16 +020024// Construction and destruction must be done on one and the same thread. Each
henrikg91d6ede2015-09-17 00:24:34 -070025// internal implementation of InputType and OutputType will RTC_DCHECK if that
26// is not the case. All implemented methods must also be called on the same
27// thread. See comments in each InputType/OutputType class for more info.
henrikab2619892015-05-18 16:49:16 +020028// It is possible to call the two static methods (SetAndroidAudioDeviceObjects
29// and ClearAndroidAudioDeviceObjects) from a different thread but both will
henrikg91d6ede2015-09-17 00:24:34 -070030// RTC_CHECK that the calling thread is attached to a Java VM.
henrikab2619892015-05-18 16:49:16 +020031
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000032template <class InputType, class OutputType>
33class AudioDeviceTemplate : public AudioDeviceGeneric {
34 public:
henrikab2619892015-05-18 16:49:16 +020035 AudioDeviceTemplate(AudioDeviceModule::AudioLayer audio_layer,
36 AudioManager* audio_manager)
37 : audio_layer_(audio_layer),
38 audio_manager_(audio_manager),
39 output_(audio_manager_),
40 input_(audio_manager_),
41 initialized_(false) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010042 RTC_LOG(INFO) << __FUNCTION__;
henrikg91d6ede2015-09-17 00:24:34 -070043 RTC_CHECK(audio_manager);
henrikab2619892015-05-18 16:49:16 +020044 audio_manager_->SetActiveAudioLayer(audio_layer);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000045 }
46
Mirko Bonadei675513b2017-11-09 11:09:25 +010047 virtual ~AudioDeviceTemplate() { RTC_LOG(INFO) << __FUNCTION__; }
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000048
49 int32_t ActiveAudioLayer(
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +000050 AudioDeviceModule::AudioLayer& audioLayer) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +010051 RTC_LOG(INFO) << __FUNCTION__;
henrikab2619892015-05-18 16:49:16 +020052 audioLayer = audio_layer_;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000053 return 0;
henrikab2619892015-05-18 16:49:16 +020054 }
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000055
Max Morin84cab202016-07-01 13:35:19 +020056 InitStatus Init() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +010057 RTC_LOG(INFO) << __FUNCTION__;
henrikg91d6ede2015-09-17 00:24:34 -070058 RTC_DCHECK(thread_checker_.CalledOnValidThread());
59 RTC_DCHECK(!initialized_);
Max Morin84cab202016-07-01 13:35:19 +020060 if (!audio_manager_->Init()) {
61 return InitStatus::OTHER_ERROR;
62 }
kaorimatz9deaa862015-08-21 18:38:50 -070063 if (output_.Init() != 0) {
64 audio_manager_->Close();
Max Morin84cab202016-07-01 13:35:19 +020065 return InitStatus::PLAYOUT_ERROR;
kaorimatz9deaa862015-08-21 18:38:50 -070066 }
67 if (input_.Init() != 0) {
68 output_.Terminate();
69 audio_manager_->Close();
Max Morin84cab202016-07-01 13:35:19 +020070 return InitStatus::RECORDING_ERROR;
kaorimatz9deaa862015-08-21 18:38:50 -070071 }
72 initialized_ = true;
Max Morin84cab202016-07-01 13:35:19 +020073 return InitStatus::OK;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000074 }
75
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +000076 int32_t Terminate() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +010077 RTC_LOG(INFO) << __FUNCTION__;
henrikg91d6ede2015-09-17 00:24:34 -070078 RTC_DCHECK(thread_checker_.CalledOnValidThread());
kaorimatz9deaa862015-08-21 18:38:50 -070079 int32_t err = input_.Terminate();
80 err |= output_.Terminate();
81 err |= !audio_manager_->Close();
82 initialized_ = false;
henrikg91d6ede2015-09-17 00:24:34 -070083 RTC_DCHECK_EQ(err, 0);
kaorimatz9deaa862015-08-21 18:38:50 -070084 return err;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000085 }
86
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +000087 bool Initialized() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +010088 RTC_LOG(INFO) << __FUNCTION__;
henrikg91d6ede2015-09-17 00:24:34 -070089 RTC_DCHECK(thread_checker_.CalledOnValidThread());
henrikab2619892015-05-18 16:49:16 +020090 return initialized_;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000091 }
92
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +000093 int16_t PlayoutDevices() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +010094 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org962c6242015-02-23 11:54:05 +000095 return 1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +000096 }
97
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +000098 int16_t RecordingDevices() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +010099 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000100 return 1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000101 }
102
Mirko Bonadei72c42502017-11-09 09:33:23 +0100103 int32_t PlayoutDeviceName(uint16_t index,
104 char name[kAdmMaxDeviceNameSize],
105 char guid[kAdmMaxGuidSize]) override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000106 FATAL() << "Should never be called";
107 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000108 }
109
Mirko Bonadei72c42502017-11-09 09:33:23 +0100110 int32_t RecordingDeviceName(uint16_t index,
111 char name[kAdmMaxDeviceNameSize],
112 char guid[kAdmMaxGuidSize]) override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000113 FATAL() << "Should never be called";
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000114 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000115 }
116
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000117 int32_t SetPlayoutDevice(uint16_t index) override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000118 // OK to use but it has no effect currently since device selection is
119 // done using Andoid APIs instead.
Mirko Bonadei675513b2017-11-09 11:09:25 +0100120 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000121 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000122 }
123
124 int32_t SetPlayoutDevice(
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000125 AudioDeviceModule::WindowsDeviceType device) override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000126 FATAL() << "Should never be called";
127 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000128 }
129
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000130 int32_t SetRecordingDevice(uint16_t index) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000131 // OK to use but it has no effect currently since device selection is
132 // done using Andoid APIs instead.
Mirko Bonadei675513b2017-11-09 11:09:25 +0100133 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000134 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000135 }
136
137 int32_t SetRecordingDevice(
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000138 AudioDeviceModule::WindowsDeviceType device) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000139 FATAL() << "Should never be called";
140 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000141 }
142
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000143 int32_t PlayoutIsAvailable(bool& available) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100144 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000145 available = true;
146 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000147 }
148
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000149 int32_t InitPlayout() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100150 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000151 return output_.InitPlayout();
152 }
153
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000154 bool PlayoutIsInitialized() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100155 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000156 return output_.PlayoutIsInitialized();
157 }
158
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000159 int32_t RecordingIsAvailable(bool& available) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100160 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000161 available = true;
162 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000163 }
164
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000165 int32_t InitRecording() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100166 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000167 return input_.InitRecording();
168 }
169
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000170 bool RecordingIsInitialized() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100171 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000172 return input_.RecordingIsInitialized();
173 }
174
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000175 int32_t StartPlayout() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100176 RTC_LOG(INFO) << __FUNCTION__;
henrikafe55c382015-06-05 11:45:56 +0200177 if (!audio_manager_->IsCommunicationModeEnabled()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100178 RTC_LOG(WARNING)
Max Morin098e6c52016-06-28 09:36:25 +0200179 << "The application should use MODE_IN_COMMUNICATION audio mode!";
henrikafe55c382015-06-05 11:45:56 +0200180 }
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000181 return output_.StartPlayout();
182 }
183
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000184 int32_t StopPlayout() override {
henrikaa125d7d2015-04-10 15:19:24 +0200185 // Avoid using audio manger (JNI/Java cost) if playout was inactive.
186 if (!Playing())
187 return 0;
Mirko Bonadei675513b2017-11-09 11:09:25 +0100188 RTC_LOG(INFO) << __FUNCTION__;
henrika09bf1a12015-04-10 11:46:55 +0200189 int32_t err = output_.StopPlayout();
henrika09bf1a12015-04-10 11:46:55 +0200190 return err;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000191 }
192
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000193 bool Playing() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100194 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000195 return output_.Playing();
196 }
197
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000198 int32_t StartRecording() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100199 RTC_LOG(INFO) << __FUNCTION__;
henrikafe55c382015-06-05 11:45:56 +0200200 if (!audio_manager_->IsCommunicationModeEnabled()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100201 RTC_LOG(WARNING)
Max Morin098e6c52016-06-28 09:36:25 +0200202 << "The application should use MODE_IN_COMMUNICATION audio mode!";
henrikafe55c382015-06-05 11:45:56 +0200203 }
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000204 return input_.StartRecording();
205 }
206
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000207 int32_t StopRecording() override {
henrikaa125d7d2015-04-10 15:19:24 +0200208 // Avoid using audio manger (JNI/Java cost) if recording was inactive.
Mirko Bonadei675513b2017-11-09 11:09:25 +0100209 RTC_LOG(INFO) << __FUNCTION__;
henrikaa125d7d2015-04-10 15:19:24 +0200210 if (!Recording())
211 return 0;
henrika09bf1a12015-04-10 11:46:55 +0200212 int32_t err = input_.StopRecording();
henrika09bf1a12015-04-10 11:46:55 +0200213 return err;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000214 }
215
Mirko Bonadei72c42502017-11-09 09:33:23 +0100216 bool Recording() const override { return input_.Recording(); }
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000217
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000218 int32_t SetAGC(bool enable) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000219 if (enable) {
220 FATAL() << "Should never be called";
221 }
222 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000223 }
224
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000225 bool AGC() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100226 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000227 return false;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000228 }
229
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000230 int32_t InitSpeaker() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100231 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000232 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000233 }
234
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000235 bool SpeakerIsInitialized() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100236 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000237 return true;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000238 }
239
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000240 int32_t InitMicrophone() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100241 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000242 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000243 }
244
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000245 bool MicrophoneIsInitialized() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100246 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000247 return true;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000248 }
249
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000250 int32_t SpeakerVolumeIsAvailable(bool& available) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100251 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100252 return output_.SpeakerVolumeIsAvailable(available);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000253 }
254
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000255 int32_t SetSpeakerVolume(uint32_t volume) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100256 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100257 return output_.SetSpeakerVolume(volume);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000258 }
259
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000260 int32_t SpeakerVolume(uint32_t& volume) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100261 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100262 return output_.SpeakerVolume(volume);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000263 }
264
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000265 int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100266 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100267 return output_.MaxSpeakerVolume(maxVolume);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000268 }
269
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000270 int32_t MinSpeakerVolume(uint32_t& minVolume) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100271 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100272 return output_.MinSpeakerVolume(minVolume);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000273 }
274
Mirko Bonadei72c42502017-11-09 09:33:23 +0100275 int32_t MicrophoneVolumeIsAvailable(bool& available) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000276 available = false;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000277 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000278 }
279
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000280 int32_t SetMicrophoneVolume(uint32_t volume) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000281 FATAL() << "Should never be called";
282 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000283 }
284
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000285 int32_t MicrophoneVolume(uint32_t& volume) const override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000286 FATAL() << "Should never be called";
287 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000288 }
289
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000290 int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000291 FATAL() << "Should never be called";
292 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000293 }
294
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000295 int32_t MinMicrophoneVolume(uint32_t& minVolume) const override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000296 FATAL() << "Should never be called";
297 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000298 }
299
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000300 int32_t SpeakerMuteIsAvailable(bool& available) override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000301 FATAL() << "Should never be called";
302 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000303 }
304
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000305 int32_t SetSpeakerMute(bool enable) override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000306 FATAL() << "Should never be called";
307 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000308 }
309
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000310 int32_t SpeakerMute(bool& enabled) const override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000311 FATAL() << "Should never be called";
312 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000313 }
314
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000315 int32_t MicrophoneMuteIsAvailable(bool& available) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000316 FATAL() << "Not implemented";
317 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000318 }
319
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000320 int32_t SetMicrophoneMute(bool enable) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000321 FATAL() << "Not implemented";
322 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000323 }
324
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000325 int32_t MicrophoneMute(bool& enabled) const override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000326 FATAL() << "Not implemented";
327 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000328 }
329
henrika76535de2017-09-11 01:25:55 -0700330 // Returns true if the audio manager has been configured to support stereo
331 // and false otherwised. Default is mono.
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000332 int32_t StereoPlayoutIsAvailable(bool& available) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100333 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700334 available = audio_manager_->IsStereoPlayoutSupported();
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000335 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000336 }
337
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000338 int32_t SetStereoPlayout(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100339 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700340 bool available = audio_manager_->IsStereoPlayoutSupported();
341 // Android does not support changes between mono and stero on the fly.
342 // Instead, the native audio layer is configured via the audio manager
343 // to either support mono or stereo. It is allowed to call this method
344 // if that same state is not modified.
345 return (enable == available) ? 0 : -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000346 }
347
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000348 int32_t StereoPlayout(bool& enabled) const override {
henrika76535de2017-09-11 01:25:55 -0700349 enabled = audio_manager_->IsStereoPlayoutSupported();
350 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000351 }
352
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000353 int32_t StereoRecordingIsAvailable(bool& available) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100354 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700355 available = audio_manager_->IsStereoRecordSupported();
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000356 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000357 }
358
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000359 int32_t SetStereoRecording(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100360 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700361 bool available = audio_manager_->IsStereoRecordSupported();
362 // Android does not support changes between mono and stero on the fly.
363 // Instead, the native audio layer is configured via the audio manager
364 // to either support mono or stereo. It is allowed to call this method
365 // if that same state is not modified.
366 return (enable == available) ? 0 : -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000367 }
368
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000369 int32_t StereoRecording(bool& enabled) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100370 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700371 enabled = audio_manager_->IsStereoRecordSupported();
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000372 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000373 }
374
henrikab2619892015-05-18 16:49:16 +0200375 int32_t PlayoutDelay(uint16_t& delay_ms) const override {
376 // Best guess we can do is to use half of the estimated total delay.
377 delay_ms = audio_manager_->GetDelayEstimateInMilliseconds() / 2;
henrikg91d6ede2015-09-17 00:24:34 -0700378 RTC_DCHECK_GT(delay_ms, 0);
henrikab2619892015-05-18 16:49:16 +0200379 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000380 }
381
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000382 void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100383 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000384 output_.AttachAudioBuffer(audioBuffer);
385 input_.AttachAudioBuffer(audioBuffer);
386 }
387
henrikab2619892015-05-18 16:49:16 +0200388 // Returns true if the device both supports built in AEC and the device
389 // is not blacklisted.
henrika918b5542016-09-19 15:44:09 +0200390 // Currently, if OpenSL ES is used in both directions, this method will still
391 // report the correct value and it has the correct effect. As an example:
392 // a device supports built in AEC and this method returns true. Libjingle
393 // will then disable the WebRTC based AEC and that will work for all devices
394 // (mainly Nexus) even when OpenSL ES is used for input since our current
395 // implementation will enable built-in AEC by default also for OpenSL ES.
396 // The only "bad" thing that happens today is that when Libjingle calls
397 // OpenSLESRecorder::EnableBuiltInAEC() it will not have any real effect and
398 // a "Not Implemented" log will be filed. This non-perfect state will remain
399 // until I have added full support for audio effects based on OpenSL ES APIs.
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000400 bool BuiltInAECIsAvailable() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100401 RTC_LOG(INFO) << __FUNCTION__;
henrikab2619892015-05-18 16:49:16 +0200402 return audio_manager_->IsAcousticEchoCancelerSupported();
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000403 }
404
henrika918b5542016-09-19 15:44:09 +0200405 // TODO(henrika): add implementation for OpenSL ES based audio as well.
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000406 int32_t EnableBuiltInAEC(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100407 RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikg91d6ede2015-09-17 00:24:34 -0700408 RTC_CHECK(BuiltInAECIsAvailable()) << "HW AEC is not available";
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000409 return input_.EnableBuiltInAEC(enable);
410 }
411
henrikac14f5ff2015-09-23 14:08:33 +0200412 // Returns true if the device both supports built in AGC and the device
413 // is not blacklisted.
henrika918b5542016-09-19 15:44:09 +0200414 // TODO(henrika): add implementation for OpenSL ES based audio as well.
415 // In addition, see comments for BuiltInAECIsAvailable().
henrikac14f5ff2015-09-23 14:08:33 +0200416 bool BuiltInAGCIsAvailable() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100417 RTC_LOG(INFO) << __FUNCTION__;
henrikac14f5ff2015-09-23 14:08:33 +0200418 return audio_manager_->IsAutomaticGainControlSupported();
419 }
420
henrika918b5542016-09-19 15:44:09 +0200421 // TODO(henrika): add implementation for OpenSL ES based audio as well.
henrikac14f5ff2015-09-23 14:08:33 +0200422 int32_t EnableBuiltInAGC(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100423 RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikac14f5ff2015-09-23 14:08:33 +0200424 RTC_CHECK(BuiltInAGCIsAvailable()) << "HW AGC is not available";
425 return input_.EnableBuiltInAGC(enable);
426 }
427
428 // Returns true if the device both supports built in NS and the device
429 // is not blacklisted.
henrika918b5542016-09-19 15:44:09 +0200430 // TODO(henrika): add implementation for OpenSL ES based audio as well.
431 // In addition, see comments for BuiltInAECIsAvailable().
henrikac14f5ff2015-09-23 14:08:33 +0200432 bool BuiltInNSIsAvailable() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100433 RTC_LOG(INFO) << __FUNCTION__;
henrikac14f5ff2015-09-23 14:08:33 +0200434 return audio_manager_->IsNoiseSuppressorSupported();
435 }
436
henrika918b5542016-09-19 15:44:09 +0200437 // TODO(henrika): add implementation for OpenSL ES based audio as well.
henrikac14f5ff2015-09-23 14:08:33 +0200438 int32_t EnableBuiltInNS(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100439 RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikac14f5ff2015-09-23 14:08:33 +0200440 RTC_CHECK(BuiltInNSIsAvailable()) << "HW NS is not available";
441 return input_.EnableBuiltInNS(enable);
442 }
443
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000444 private:
henrikab2619892015-05-18 16:49:16 +0200445 rtc::ThreadChecker thread_checker_;
446
447 // Local copy of the audio layer set during construction of the
448 // AudioDeviceModuleImpl instance. Read only value.
449 const AudioDeviceModule::AudioLayer audio_layer_;
450
451 // Non-owning raw pointer to AudioManager instance given to use at
452 // construction. The real object is owned by AudioDeviceModuleImpl and the
453 // life time is the same as that of the AudioDeviceModuleImpl, hence there
454 // is no risk of reading a NULL pointer at any time in this class.
455 AudioManager* const audio_manager_;
456
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000457 OutputType output_;
henrikab2619892015-05-18 16:49:16 +0200458
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000459 InputType input_;
henrikab2619892015-05-18 16:49:16 +0200460
461 bool initialized_;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000462};
463
464} // namespace webrtc
465
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200466#endif // MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_