blob: 9fb72bdbbb49b3fe4c5d9a8cc01fe3adc352895a [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 InitSpeaker() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100219 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000220 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000221 }
222
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000223 bool SpeakerIsInitialized() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100224 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000225 return true;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000226 }
227
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000228 int32_t InitMicrophone() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100229 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000230 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000231 }
232
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000233 bool MicrophoneIsInitialized() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100234 RTC_LOG(INFO) << __FUNCTION__;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000235 return true;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000236 }
237
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000238 int32_t SpeakerVolumeIsAvailable(bool& available) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100239 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100240 return output_.SpeakerVolumeIsAvailable(available);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000241 }
242
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000243 int32_t SetSpeakerVolume(uint32_t volume) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100244 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100245 return output_.SetSpeakerVolume(volume);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000246 }
247
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000248 int32_t SpeakerVolume(uint32_t& volume) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100249 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100250 return output_.SpeakerVolume(volume);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000251 }
252
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000253 int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100254 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100255 return output_.MaxSpeakerVolume(maxVolume);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000256 }
257
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000258 int32_t MinSpeakerVolume(uint32_t& minVolume) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100259 RTC_LOG(INFO) << __FUNCTION__;
henrika8324b522015-03-27 10:56:23 +0100260 return output_.MinSpeakerVolume(minVolume);
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000261 }
262
Mirko Bonadei72c42502017-11-09 09:33:23 +0100263 int32_t MicrophoneVolumeIsAvailable(bool& available) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000264 available = false;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000265 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000266 }
267
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000268 int32_t SetMicrophoneVolume(uint32_t volume) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000269 FATAL() << "Should never be called";
270 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000271 }
272
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000273 int32_t MicrophoneVolume(uint32_t& volume) const override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000274 FATAL() << "Should never be called";
275 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000276 }
277
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000278 int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000279 FATAL() << "Should never be called";
280 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000281 }
282
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000283 int32_t MinMicrophoneVolume(uint32_t& minVolume) const override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000284 FATAL() << "Should never be called";
285 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000286 }
287
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000288 int32_t SpeakerMuteIsAvailable(bool& available) override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000289 FATAL() << "Should never be called";
290 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000291 }
292
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000293 int32_t SetSpeakerMute(bool enable) override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000294 FATAL() << "Should never be called";
295 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000296 }
297
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000298 int32_t SpeakerMute(bool& enabled) const override {
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000299 FATAL() << "Should never be called";
300 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000301 }
302
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000303 int32_t MicrophoneMuteIsAvailable(bool& available) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000304 FATAL() << "Not implemented";
305 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000306 }
307
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000308 int32_t SetMicrophoneMute(bool enable) override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000309 FATAL() << "Not implemented";
310 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000311 }
312
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000313 int32_t MicrophoneMute(bool& enabled) const override {
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000314 FATAL() << "Not implemented";
315 return -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000316 }
317
henrika76535de2017-09-11 01:25:55 -0700318 // Returns true if the audio manager has been configured to support stereo
319 // and false otherwised. Default is mono.
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000320 int32_t StereoPlayoutIsAvailable(bool& available) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100321 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700322 available = audio_manager_->IsStereoPlayoutSupported();
henrika@webrtc.org962c6242015-02-23 11:54:05 +0000323 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000324 }
325
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000326 int32_t SetStereoPlayout(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100327 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700328 bool available = audio_manager_->IsStereoPlayoutSupported();
329 // Android does not support changes between mono and stero on the fly.
330 // Instead, the native audio layer is configured via the audio manager
331 // to either support mono or stereo. It is allowed to call this method
332 // if that same state is not modified.
333 return (enable == available) ? 0 : -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000334 }
335
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000336 int32_t StereoPlayout(bool& enabled) const override {
henrika76535de2017-09-11 01:25:55 -0700337 enabled = audio_manager_->IsStereoPlayoutSupported();
338 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000339 }
340
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000341 int32_t StereoRecordingIsAvailable(bool& available) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100342 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700343 available = audio_manager_->IsStereoRecordSupported();
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000344 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000345 }
346
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000347 int32_t SetStereoRecording(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100348 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700349 bool available = audio_manager_->IsStereoRecordSupported();
350 // Android does not support changes between mono and stero on the fly.
351 // Instead, the native audio layer is configured via the audio manager
352 // to either support mono or stereo. It is allowed to call this method
353 // if that same state is not modified.
354 return (enable == available) ? 0 : -1;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000355 }
356
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000357 int32_t StereoRecording(bool& enabled) const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100358 RTC_LOG(INFO) << __FUNCTION__;
henrika76535de2017-09-11 01:25:55 -0700359 enabled = audio_manager_->IsStereoRecordSupported();
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000360 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000361 }
362
henrikab2619892015-05-18 16:49:16 +0200363 int32_t PlayoutDelay(uint16_t& delay_ms) const override {
364 // Best guess we can do is to use half of the estimated total delay.
365 delay_ms = audio_manager_->GetDelayEstimateInMilliseconds() / 2;
henrikg91d6ede2015-09-17 00:24:34 -0700366 RTC_DCHECK_GT(delay_ms, 0);
henrikab2619892015-05-18 16:49:16 +0200367 return 0;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000368 }
369
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000370 void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100371 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000372 output_.AttachAudioBuffer(audioBuffer);
373 input_.AttachAudioBuffer(audioBuffer);
374 }
375
henrikab2619892015-05-18 16:49:16 +0200376 // Returns true if the device both supports built in AEC and the device
377 // is not blacklisted.
henrika918b5542016-09-19 15:44:09 +0200378 // Currently, if OpenSL ES is used in both directions, this method will still
379 // report the correct value and it has the correct effect. As an example:
380 // a device supports built in AEC and this method returns true. Libjingle
381 // will then disable the WebRTC based AEC and that will work for all devices
382 // (mainly Nexus) even when OpenSL ES is used for input since our current
383 // implementation will enable built-in AEC by default also for OpenSL ES.
384 // The only "bad" thing that happens today is that when Libjingle calls
385 // OpenSLESRecorder::EnableBuiltInAEC() it will not have any real effect and
386 // a "Not Implemented" log will be filed. This non-perfect state will remain
387 // until I have added full support for audio effects based on OpenSL ES APIs.
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000388 bool BuiltInAECIsAvailable() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100389 RTC_LOG(INFO) << __FUNCTION__;
henrikab2619892015-05-18 16:49:16 +0200390 return audio_manager_->IsAcousticEchoCancelerSupported();
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000391 }
392
henrika918b5542016-09-19 15:44:09 +0200393 // TODO(henrika): add implementation for OpenSL ES based audio as well.
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +0000394 int32_t EnableBuiltInAEC(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100395 RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikg91d6ede2015-09-17 00:24:34 -0700396 RTC_CHECK(BuiltInAECIsAvailable()) << "HW AEC is not available";
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000397 return input_.EnableBuiltInAEC(enable);
398 }
399
henrikac14f5ff2015-09-23 14:08:33 +0200400 // Returns true if the device both supports built in AGC and the device
401 // is not blacklisted.
henrika918b5542016-09-19 15:44:09 +0200402 // TODO(henrika): add implementation for OpenSL ES based audio as well.
403 // In addition, see comments for BuiltInAECIsAvailable().
henrikac14f5ff2015-09-23 14:08:33 +0200404 bool BuiltInAGCIsAvailable() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100405 RTC_LOG(INFO) << __FUNCTION__;
henrikac14f5ff2015-09-23 14:08:33 +0200406 return audio_manager_->IsAutomaticGainControlSupported();
407 }
408
henrika918b5542016-09-19 15:44:09 +0200409 // TODO(henrika): add implementation for OpenSL ES based audio as well.
henrikac14f5ff2015-09-23 14:08:33 +0200410 int32_t EnableBuiltInAGC(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100411 RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikac14f5ff2015-09-23 14:08:33 +0200412 RTC_CHECK(BuiltInAGCIsAvailable()) << "HW AGC is not available";
413 return input_.EnableBuiltInAGC(enable);
414 }
415
416 // Returns true if the device both supports built in NS and the device
417 // is not blacklisted.
henrika918b5542016-09-19 15:44:09 +0200418 // TODO(henrika): add implementation for OpenSL ES based audio as well.
419 // In addition, see comments for BuiltInAECIsAvailable().
henrikac14f5ff2015-09-23 14:08:33 +0200420 bool BuiltInNSIsAvailable() const override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100421 RTC_LOG(INFO) << __FUNCTION__;
henrikac14f5ff2015-09-23 14:08:33 +0200422 return audio_manager_->IsNoiseSuppressorSupported();
423 }
424
henrika918b5542016-09-19 15:44:09 +0200425 // TODO(henrika): add implementation for OpenSL ES based audio as well.
henrikac14f5ff2015-09-23 14:08:33 +0200426 int32_t EnableBuiltInNS(bool enable) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100427 RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikac14f5ff2015-09-23 14:08:33 +0200428 RTC_CHECK(BuiltInNSIsAvailable()) << "HW NS is not available";
429 return input_.EnableBuiltInNS(enable);
430 }
431
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000432 private:
henrikab2619892015-05-18 16:49:16 +0200433 rtc::ThreadChecker thread_checker_;
434
435 // Local copy of the audio layer set during construction of the
436 // AudioDeviceModuleImpl instance. Read only value.
437 const AudioDeviceModule::AudioLayer audio_layer_;
438
439 // Non-owning raw pointer to AudioManager instance given to use at
440 // construction. The real object is owned by AudioDeviceModuleImpl and the
441 // life time is the same as that of the AudioDeviceModuleImpl, hence there
442 // is no risk of reading a NULL pointer at any time in this class.
443 AudioManager* const audio_manager_;
444
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000445 OutputType output_;
henrikab2619892015-05-18 16:49:16 +0200446
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000447 InputType input_;
henrikab2619892015-05-18 16:49:16 +0200448
449 bool initialized_;
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000450};
451
452} // namespace webrtc
453
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200454#endif // MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_