1 /* 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 11 #ifndef WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_ 12 #define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_ 13 14 #include <android/log.h> 15 16 #include "webrtc/base/checks.h" 17 #include "webrtc/base/thread_checker.h" 18 #include "webrtc/modules/audio_device/android/audio_manager.h" 19 #include "webrtc/modules/audio_device/audio_device_generic.h" 20 #include "webrtc/system_wrappers/include/trace.h" 21 22 #define TAG "AudioDeviceTemplate" 23 #define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__) 24 25 namespace webrtc { 26 27 // InputType/OutputType can be any class that implements the capturing/rendering 28 // part of the AudioDeviceGeneric API. 29 // Construction and destruction must be done on one and the same thread. Each 30 // internal implementation of InputType and OutputType will RTC_DCHECK if that 31 // is not the case. All implemented methods must also be called on the same 32 // thread. See comments in each InputType/OutputType class for more info. 33 // It is possible to call the two static methods (SetAndroidAudioDeviceObjects 34 // and ClearAndroidAudioDeviceObjects) from a different thread but both will 35 // RTC_CHECK that the calling thread is attached to a Java VM. 36 37 template <class InputType, class OutputType> 38 class AudioDeviceTemplate : public AudioDeviceGeneric { 39 public: 40 AudioDeviceTemplate(AudioDeviceModule::AudioLayer audio_layer, 41 AudioManager* audio_manager) 42 : audio_layer_(audio_layer), 43 audio_manager_(audio_manager), 44 output_(audio_manager_), 45 input_(audio_manager_), 46 initialized_(false) { 47 RTC_CHECK(audio_manager); 48 audio_manager_->SetActiveAudioLayer(audio_layer); 49 } 50 51 virtual ~AudioDeviceTemplate() { 52 } 53 54 int32_t ActiveAudioLayer( 55 AudioDeviceModule::AudioLayer& audioLayer) const override { 56 audioLayer = audio_layer_; 57 return 0; 58 } 59 60 int32_t Init() override { 61 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 62 RTC_DCHECK(!initialized_); 63 if (!audio_manager_->Init()) 64 return -1; 65 if (output_.Init() != 0) { 66 audio_manager_->Close(); 67 return -1; 68 } 69 if (input_.Init() != 0) { 70 output_.Terminate(); 71 audio_manager_->Close(); 72 return -1; 73 } 74 initialized_ = true; 75 return 0; 76 } 77 78 int32_t Terminate() override { 79 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 80 int32_t err = input_.Terminate(); 81 err |= output_.Terminate(); 82 err |= !audio_manager_->Close(); 83 initialized_ = false; 84 RTC_DCHECK_EQ(err, 0); 85 return err; 86 } 87 88 bool Initialized() const override { 89 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 90 return initialized_; 91 } 92 93 int16_t PlayoutDevices() override { 94 return 1; 95 } 96 97 int16_t RecordingDevices() override { 98 return 1; 99 } 100 101 int32_t PlayoutDeviceName( 102 uint16_t index, 103 char name[kAdmMaxDeviceNameSize], 104 char guid[kAdmMaxGuidSize]) override { 105 FATAL() << "Should never be called"; 106 return -1; 107 } 108 109 int32_t RecordingDeviceName( 110 uint16_t index, 111 char name[kAdmMaxDeviceNameSize], 112 char guid[kAdmMaxGuidSize]) override { 113 FATAL() << "Should never be called"; 114 return -1; 115 } 116 117 int32_t SetPlayoutDevice(uint16_t index) override { 118 // OK to use but it has no effect currently since device selection is 119 // done using Andoid APIs instead. 120 return 0; 121 } 122 123 int32_t SetPlayoutDevice( 124 AudioDeviceModule::WindowsDeviceType device) override { 125 FATAL() << "Should never be called"; 126 return -1; 127 } 128 129 int32_t SetRecordingDevice(uint16_t index) override { 130 // OK to use but it has no effect currently since device selection is 131 // done using Andoid APIs instead. 132 return 0; 133 } 134 135 int32_t SetRecordingDevice( 136 AudioDeviceModule::WindowsDeviceType device) override { 137 FATAL() << "Should never be called"; 138 return -1; 139 } 140 141 int32_t PlayoutIsAvailable(bool& available) override { 142 available = true; 143 return 0; 144 } 145 146 int32_t InitPlayout() override { 147 return output_.InitPlayout(); 148 } 149 150 bool PlayoutIsInitialized() const override { 151 return output_.PlayoutIsInitialized(); 152 } 153 154 int32_t RecordingIsAvailable(bool& available) override { 155 available = true; 156 return 0; 157 } 158 159 int32_t InitRecording() override { 160 return input_.InitRecording(); 161 } 162 163 bool RecordingIsInitialized() const override { 164 return input_.RecordingIsInitialized(); 165 } 166 167 int32_t StartPlayout() override { 168 if (!audio_manager_->IsCommunicationModeEnabled()) { 169 ALOGW("The application should use MODE_IN_COMMUNICATION audio mode!"); 170 } 171 return output_.StartPlayout(); 172 } 173 174 int32_t StopPlayout() override { 175 // Avoid using audio manger (JNI/Java cost) if playout was inactive. 176 if (!Playing()) 177 return 0; 178 int32_t err = output_.StopPlayout(); 179 return err; 180 } 181 182 bool Playing() const override { 183 return output_.Playing(); 184 } 185 186 int32_t StartRecording() override { 187 if (!audio_manager_->IsCommunicationModeEnabled()) { 188 ALOGW("The application should use MODE_IN_COMMUNICATION audio mode!"); 189 } 190 return input_.StartRecording(); 191 } 192 193 int32_t StopRecording() override { 194 // Avoid using audio manger (JNI/Java cost) if recording was inactive. 195 if (!Recording()) 196 return 0; 197 int32_t err = input_.StopRecording(); 198 return err; 199 } 200 201 bool Recording() const override { 202 return input_.Recording() ; 203 } 204 205 int32_t SetAGC(bool enable) override { 206 if (enable) { 207 FATAL() << "Should never be called"; 208 } 209 return -1; 210 } 211 212 bool AGC() const override { 213 return false; 214 } 215 216 int32_t SetWaveOutVolume( 217 uint16_t volumeLeft, uint16_t volumeRight) override { 218 FATAL() << "Should never be called"; 219 return -1; 220 } 221 222 int32_t WaveOutVolume( 223 uint16_t& volumeLeft, uint16_t& volumeRight) const override { 224 FATAL() << "Should never be called"; 225 return -1; 226 } 227 228 int32_t InitSpeaker() override { 229 return 0; 230 } 231 232 bool SpeakerIsInitialized() const override { 233 return true; 234 } 235 236 int32_t InitMicrophone() override { 237 return 0; 238 } 239 240 bool MicrophoneIsInitialized() const override { 241 return true; 242 } 243 244 int32_t SpeakerVolumeIsAvailable(bool& available) override { 245 return output_.SpeakerVolumeIsAvailable(available); 246 } 247 248 int32_t SetSpeakerVolume(uint32_t volume) override { 249 return output_.SetSpeakerVolume(volume); 250 } 251 252 int32_t SpeakerVolume(uint32_t& volume) const override { 253 return output_.SpeakerVolume(volume); 254 } 255 256 int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override { 257 return output_.MaxSpeakerVolume(maxVolume); 258 } 259 260 int32_t MinSpeakerVolume(uint32_t& minVolume) const override { 261 return output_.MinSpeakerVolume(minVolume); 262 } 263 264 int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const override { 265 FATAL() << "Should never be called"; 266 return -1; 267 } 268 269 int32_t MicrophoneVolumeIsAvailable(bool& available) override{ 270 available = false; 271 FATAL() << "Should never be called"; 272 return -1; 273 } 274 275 int32_t SetMicrophoneVolume(uint32_t volume) override { 276 FATAL() << "Should never be called"; 277 return -1; 278 } 279 280 int32_t MicrophoneVolume(uint32_t& volume) const override { 281 FATAL() << "Should never be called"; 282 return -1; 283 } 284 285 int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override { 286 FATAL() << "Should never be called"; 287 return -1; 288 } 289 290 int32_t MinMicrophoneVolume(uint32_t& minVolume) const override { 291 FATAL() << "Should never be called"; 292 return -1; 293 } 294 295 int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const override { 296 FATAL() << "Should never be called"; 297 return -1; 298 } 299 300 int32_t SpeakerMuteIsAvailable(bool& available) override { 301 FATAL() << "Should never be called"; 302 return -1; 303 } 304 305 int32_t SetSpeakerMute(bool enable) override { 306 FATAL() << "Should never be called"; 307 return -1; 308 } 309 310 int32_t SpeakerMute(bool& enabled) const override { 311 FATAL() << "Should never be called"; 312 return -1; 313 } 314 315 int32_t MicrophoneMuteIsAvailable(bool& available) override { 316 FATAL() << "Not implemented"; 317 return -1; 318 } 319 320 int32_t SetMicrophoneMute(bool enable) override { 321 FATAL() << "Not implemented"; 322 return -1; 323 } 324 325 int32_t MicrophoneMute(bool& enabled) const override { 326 FATAL() << "Not implemented"; 327 return -1; 328 } 329 330 int32_t MicrophoneBoostIsAvailable(bool& available) override { 331 FATAL() << "Should never be called"; 332 return -1; 333 } 334 335 int32_t SetMicrophoneBoost(bool enable) override { 336 FATAL() << "Should never be called"; 337 return -1; 338 } 339 340 int32_t MicrophoneBoost(bool& enabled) const override { 341 FATAL() << "Should never be called"; 342 return -1; 343 } 344 345 int32_t StereoPlayoutIsAvailable(bool& available) override { 346 available = false; 347 return 0; 348 } 349 350 // TODO(henrika): add support. 351 int32_t SetStereoPlayout(bool enable) override { 352 return -1; 353 } 354 355 // TODO(henrika): add support. 356 int32_t StereoPlayout(bool& enabled) const override { 357 enabled = false; 358 FATAL() << "Should never be called"; 359 return -1; 360 } 361 362 int32_t StereoRecordingIsAvailable(bool& available) override { 363 available = false; 364 return 0; 365 } 366 367 int32_t SetStereoRecording(bool enable) override { 368 return -1; 369 } 370 371 int32_t StereoRecording(bool& enabled) const override { 372 enabled = false; 373 return 0; 374 } 375 376 int32_t SetPlayoutBuffer( 377 const AudioDeviceModule::BufferType type, uint16_t sizeMS) override { 378 FATAL() << "Should never be called"; 379 return -1; 380 } 381 382 int32_t PlayoutBuffer( 383 AudioDeviceModule::BufferType& type, uint16_t& sizeMS) const override { 384 FATAL() << "Should never be called"; 385 return -1; 386 } 387 388 int32_t PlayoutDelay(uint16_t& delay_ms) const override { 389 // Best guess we can do is to use half of the estimated total delay. 390 delay_ms = audio_manager_->GetDelayEstimateInMilliseconds() / 2; 391 RTC_DCHECK_GT(delay_ms, 0); 392 return 0; 393 } 394 395 int32_t RecordingDelay(uint16_t& delay_ms) const override { 396 // Best guess we can do is to use half of the estimated total delay. 397 delay_ms = audio_manager_->GetDelayEstimateInMilliseconds() / 2; 398 RTC_DCHECK_GT(delay_ms, 0); 399 return 0; 400 } 401 402 int32_t CPULoad(uint16_t& load) const override { 403 FATAL() << "Should never be called"; 404 return -1; 405 } 406 407 bool PlayoutWarning() const override { 408 return false; 409 } 410 411 bool PlayoutError() const override { 412 return false; 413 } 414 415 bool RecordingWarning() const override { 416 return false; 417 } 418 419 bool RecordingError() const override { 420 return false; 421 } 422 423 void ClearPlayoutWarning() override {} 424 425 void ClearPlayoutError() override {} 426 427 void ClearRecordingWarning() override {} 428 429 void ClearRecordingError() override {} 430 431 void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override { 432 output_.AttachAudioBuffer(audioBuffer); 433 input_.AttachAudioBuffer(audioBuffer); 434 } 435 436 // TODO(henrika): remove 437 int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) override { 438 FATAL() << "Should never be called"; 439 return -1; 440 } 441 442 int32_t SetLoudspeakerStatus(bool enable) override { 443 FATAL() << "Should never be called"; 444 return -1; 445 } 446 447 int32_t GetLoudspeakerStatus(bool& enable) const override { 448 FATAL() << "Should never be called"; 449 return -1; 450 } 451 452 // Returns true if the device both supports built in AEC and the device 453 // is not blacklisted. 454 bool BuiltInAECIsAvailable() const override { 455 return audio_manager_->IsAcousticEchoCancelerSupported(); 456 } 457 458 int32_t EnableBuiltInAEC(bool enable) override { 459 RTC_CHECK(BuiltInAECIsAvailable()) << "HW AEC is not available"; 460 return input_.EnableBuiltInAEC(enable); 461 } 462 463 // Returns true if the device both supports built in AGC and the device 464 // is not blacklisted. 465 bool BuiltInAGCIsAvailable() const override { 466 return audio_manager_->IsAutomaticGainControlSupported(); 467 } 468 469 int32_t EnableBuiltInAGC(bool enable) override { 470 RTC_CHECK(BuiltInAGCIsAvailable()) << "HW AGC is not available"; 471 return input_.EnableBuiltInAGC(enable); 472 } 473 474 // Returns true if the device both supports built in NS and the device 475 // is not blacklisted. 476 bool BuiltInNSIsAvailable() const override { 477 return audio_manager_->IsNoiseSuppressorSupported(); 478 } 479 480 int32_t EnableBuiltInNS(bool enable) override { 481 RTC_CHECK(BuiltInNSIsAvailable()) << "HW NS is not available"; 482 return input_.EnableBuiltInNS(enable); 483 } 484 485 private: 486 rtc::ThreadChecker thread_checker_; 487 488 // Local copy of the audio layer set during construction of the 489 // AudioDeviceModuleImpl instance. Read only value. 490 const AudioDeviceModule::AudioLayer audio_layer_; 491 492 // Non-owning raw pointer to AudioManager instance given to use at 493 // construction. The real object is owned by AudioDeviceModuleImpl and the 494 // life time is the same as that of the AudioDeviceModuleImpl, hence there 495 // is no risk of reading a NULL pointer at any time in this class. 496 AudioManager* const audio_manager_; 497 498 OutputType output_; 499 500 InputType input_; 501 502 bool initialized_; 503 }; 504 505 } // namespace webrtc 506 507 #endif // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_ 508