| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 RTC_DCHECK(voe_codec->plfreq != new_plfreq); | 361 RTC_DCHECK(voe_codec->plfreq != new_plfreq); |
| 362 voe_codec->plfreq = new_plfreq; | 362 voe_codec->plfreq = new_plfreq; |
| 363 } | 363 } |
| 364 } | 364 } |
| 365 | 365 |
| 366 // Gets the default set of options applied to the engine. Historically, these | 366 // Gets the default set of options applied to the engine. Historically, these |
| 367 // were supplied as a combination of flags from the channel manager (ec, agc, | 367 // were supplied as a combination of flags from the channel manager (ec, agc, |
| 368 // ns, and highpass) and the rest hardcoded in InitInternal. | 368 // ns, and highpass) and the rest hardcoded in InitInternal. |
| 369 AudioOptions GetDefaultEngineOptions() { | 369 AudioOptions GetDefaultEngineOptions() { |
| 370 AudioOptions options; | 370 AudioOptions options; |
| 371 options.echo_cancellation = rtc::Maybe<bool>(true); | 371 options.echo_cancellation = rtc::Optional<bool>(true); |
| 372 options.auto_gain_control = rtc::Maybe<bool>(true); | 372 options.auto_gain_control = rtc::Optional<bool>(true); |
| 373 options.noise_suppression = rtc::Maybe<bool>(true); | 373 options.noise_suppression = rtc::Optional<bool>(true); |
| 374 options.highpass_filter = rtc::Maybe<bool>(true); | 374 options.highpass_filter = rtc::Optional<bool>(true); |
| 375 options.stereo_swapping = rtc::Maybe<bool>(false); | 375 options.stereo_swapping = rtc::Optional<bool>(false); |
| 376 options.audio_jitter_buffer_max_packets = rtc::Maybe<int>(50); | 376 options.audio_jitter_buffer_max_packets = rtc::Optional<int>(50); |
| 377 options.audio_jitter_buffer_fast_accelerate = rtc::Maybe<bool>(false); | 377 options.audio_jitter_buffer_fast_accelerate = rtc::Optional<bool>(false); |
| 378 options.typing_detection = rtc::Maybe<bool>(true); | 378 options.typing_detection = rtc::Optional<bool>(true); |
| 379 options.adjust_agc_delta = rtc::Maybe<int>(0); | 379 options.adjust_agc_delta = rtc::Optional<int>(0); |
| 380 options.experimental_agc = rtc::Maybe<bool>(false); | 380 options.experimental_agc = rtc::Optional<bool>(false); |
| 381 options.extended_filter_aec = rtc::Maybe<bool>(false); | 381 options.extended_filter_aec = rtc::Optional<bool>(false); |
| 382 options.delay_agnostic_aec = rtc::Maybe<bool>(false); | 382 options.delay_agnostic_aec = rtc::Optional<bool>(false); |
| 383 options.experimental_ns = rtc::Maybe<bool>(false); | 383 options.experimental_ns = rtc::Optional<bool>(false); |
| 384 options.aec_dump = rtc::Maybe<bool>(false); | 384 options.aec_dump = rtc::Optional<bool>(false); |
| 385 return options; | 385 return options; |
| 386 } | 386 } |
| 387 | 387 |
| 388 std::string GetEnableString(bool enable) { | 388 std::string GetEnableString(bool enable) { |
| 389 return enable ? "enable" : "disable"; | 389 return enable ? "enable" : "disable"; |
| 390 } | 390 } |
| 391 | 391 |
| 392 webrtc::AudioState::Config MakeAudioStateConfig(VoEWrapper* voe_wrapper) { | 392 webrtc::AudioState::Config MakeAudioStateConfig(VoEWrapper* voe_wrapper) { |
| 393 webrtc::AudioState::Config config; | 393 webrtc::AudioState::Config config; |
| 394 config.voice_engine = voe_wrapper->engine(); | 394 config.voice_engine = voe_wrapper->engine(); |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 webrtc::AgcModes agc_mode = webrtc::kAgcAdaptiveAnalog; | 633 webrtc::AgcModes agc_mode = webrtc::kAgcAdaptiveAnalog; |
| 634 webrtc::NsModes ns_mode = webrtc::kNsHighSuppression; | 634 webrtc::NsModes ns_mode = webrtc::kNsHighSuppression; |
| 635 if (options.aecm_generate_comfort_noise) { | 635 if (options.aecm_generate_comfort_noise) { |
| 636 LOG(LS_VERBOSE) << "Comfort noise explicitly set to " | 636 LOG(LS_VERBOSE) << "Comfort noise explicitly set to " |
| 637 << *options.aecm_generate_comfort_noise | 637 << *options.aecm_generate_comfort_noise |
| 638 << " (default is false)."; | 638 << " (default is false)."; |
| 639 } | 639 } |
| 640 | 640 |
| 641 #if defined(IOS) | 641 #if defined(IOS) |
| 642 // On iOS, VPIO provides built-in EC and AGC. | 642 // On iOS, VPIO provides built-in EC and AGC. |
| 643 options.echo_cancellation = rtc::Maybe<bool>(false); | 643 options.echo_cancellation = rtc::Optional<bool>(false); |
| 644 options.auto_gain_control = rtc::Maybe<bool>(false); | 644 options.auto_gain_control = rtc::Optional<bool>(false); |
| 645 LOG(LS_INFO) << "Always disable AEC and AGC on iOS. Use built-in instead."; | 645 LOG(LS_INFO) << "Always disable AEC and AGC on iOS. Use built-in instead."; |
| 646 #elif defined(ANDROID) | 646 #elif defined(ANDROID) |
| 647 ec_mode = webrtc::kEcAecm; | 647 ec_mode = webrtc::kEcAecm; |
| 648 #endif | 648 #endif |
| 649 | 649 |
| 650 #if defined(IOS) || defined(ANDROID) | 650 #if defined(IOS) || defined(ANDROID) |
| 651 // Set the AGC mode for iOS as well despite disabling it above, to avoid | 651 // Set the AGC mode for iOS as well despite disabling it above, to avoid |
| 652 // unsupported configuration errors from webrtc. | 652 // unsupported configuration errors from webrtc. |
| 653 agc_mode = webrtc::kAgcFixedDigital; | 653 agc_mode = webrtc::kAgcFixedDigital; |
| 654 options.typing_detection = rtc::Maybe<bool>(false); | 654 options.typing_detection = rtc::Optional<bool>(false); |
| 655 options.experimental_agc = rtc::Maybe<bool>(false); | 655 options.experimental_agc = rtc::Optional<bool>(false); |
| 656 options.extended_filter_aec = rtc::Maybe<bool>(false); | 656 options.extended_filter_aec = rtc::Optional<bool>(false); |
| 657 options.experimental_ns = rtc::Maybe<bool>(false); | 657 options.experimental_ns = rtc::Optional<bool>(false); |
| 658 #endif | 658 #endif |
| 659 | 659 |
| 660 // Delay Agnostic AEC automatically turns on EC if not set except on iOS | 660 // Delay Agnostic AEC automatically turns on EC if not set except on iOS |
| 661 // where the feature is not supported. | 661 // where the feature is not supported. |
| 662 bool use_delay_agnostic_aec = false; | 662 bool use_delay_agnostic_aec = false; |
| 663 #if !defined(IOS) | 663 #if !defined(IOS) |
| 664 if (options.delay_agnostic_aec) { | 664 if (options.delay_agnostic_aec) { |
| 665 use_delay_agnostic_aec = *options.delay_agnostic_aec; | 665 use_delay_agnostic_aec = *options.delay_agnostic_aec; |
| 666 if (use_delay_agnostic_aec) { | 666 if (use_delay_agnostic_aec) { |
| 667 options.echo_cancellation = rtc::Maybe<bool>(true); | 667 options.echo_cancellation = rtc::Optional<bool>(true); |
| 668 options.extended_filter_aec = rtc::Maybe<bool>(true); | 668 options.extended_filter_aec = rtc::Optional<bool>(true); |
| 669 ec_mode = webrtc::kEcConference; | 669 ec_mode = webrtc::kEcConference; |
| 670 } | 670 } |
| 671 } | 671 } |
| 672 #endif | 672 #endif |
| 673 | 673 |
| 674 webrtc::VoEAudioProcessing* voep = voe_wrapper_->processing(); | 674 webrtc::VoEAudioProcessing* voep = voe_wrapper_->processing(); |
| 675 | 675 |
| 676 if (options.echo_cancellation) { | 676 if (options.echo_cancellation) { |
| 677 // Check if platform supports built-in EC. Currently only supported on | 677 // Check if platform supports built-in EC. Currently only supported on |
| 678 // Android and in combination with Java based audio layer. | 678 // Android and in combination with Java based audio layer. |
| 679 // TODO(henrika): investigate possibility to support built-in EC also | 679 // TODO(henrika): investigate possibility to support built-in EC also |
| 680 // in combination with Open SL ES audio. | 680 // in combination with Open SL ES audio. |
| 681 const bool built_in_aec = voe_wrapper_->hw()->BuiltInAECIsAvailable(); | 681 const bool built_in_aec = voe_wrapper_->hw()->BuiltInAECIsAvailable(); |
| 682 if (built_in_aec) { | 682 if (built_in_aec) { |
| 683 // Built-in EC exists on this device and use_delay_agnostic_aec is not | 683 // Built-in EC exists on this device and use_delay_agnostic_aec is not |
| 684 // overriding it. Enable/Disable it according to the echo_cancellation | 684 // overriding it. Enable/Disable it according to the echo_cancellation |
| 685 // audio option. | 685 // audio option. |
| 686 const bool enable_built_in_aec = | 686 const bool enable_built_in_aec = |
| 687 *options.echo_cancellation && !use_delay_agnostic_aec; | 687 *options.echo_cancellation && !use_delay_agnostic_aec; |
| 688 if (voe_wrapper_->hw()->EnableBuiltInAEC(enable_built_in_aec) == 0 && | 688 if (voe_wrapper_->hw()->EnableBuiltInAEC(enable_built_in_aec) == 0 && |
| 689 enable_built_in_aec) { | 689 enable_built_in_aec) { |
| 690 // Disable internal software EC if built-in EC is enabled, | 690 // Disable internal software EC if built-in EC is enabled, |
| 691 // i.e., replace the software EC with the built-in EC. | 691 // i.e., replace the software EC with the built-in EC. |
| 692 options.echo_cancellation = rtc::Maybe<bool>(false); | 692 options.echo_cancellation = rtc::Optional<bool>(false); |
| 693 LOG(LS_INFO) << "Disabling EC since built-in EC will be used instead"; | 693 LOG(LS_INFO) << "Disabling EC since built-in EC will be used instead"; |
| 694 } | 694 } |
| 695 } | 695 } |
| 696 if (voep->SetEcStatus(*options.echo_cancellation, ec_mode) == -1) { | 696 if (voep->SetEcStatus(*options.echo_cancellation, ec_mode) == -1) { |
| 697 LOG_RTCERR2(SetEcStatus, *options.echo_cancellation, ec_mode); | 697 LOG_RTCERR2(SetEcStatus, *options.echo_cancellation, ec_mode); |
| 698 return false; | 698 return false; |
| 699 } else { | 699 } else { |
| 700 LOG(LS_INFO) << "Echo control set to " << *options.echo_cancellation | 700 LOG(LS_INFO) << "Echo control set to " << *options.echo_cancellation |
| 701 << " with mode " << ec_mode; | 701 << " with mode " << ec_mode; |
| 702 } | 702 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 717 } | 717 } |
| 718 | 718 |
| 719 if (options.auto_gain_control) { | 719 if (options.auto_gain_control) { |
| 720 const bool built_in_agc = voe_wrapper_->hw()->BuiltInAGCIsAvailable(); | 720 const bool built_in_agc = voe_wrapper_->hw()->BuiltInAGCIsAvailable(); |
| 721 if (built_in_agc) { | 721 if (built_in_agc) { |
| 722 if (voe_wrapper_->hw()->EnableBuiltInAGC(*options.auto_gain_control) == | 722 if (voe_wrapper_->hw()->EnableBuiltInAGC(*options.auto_gain_control) == |
| 723 0 && | 723 0 && |
| 724 *options.auto_gain_control) { | 724 *options.auto_gain_control) { |
| 725 // Disable internal software AGC if built-in AGC is enabled, | 725 // Disable internal software AGC if built-in AGC is enabled, |
| 726 // i.e., replace the software AGC with the built-in AGC. | 726 // i.e., replace the software AGC with the built-in AGC. |
| 727 options.auto_gain_control = rtc::Maybe<bool>(false); | 727 options.auto_gain_control = rtc::Optional<bool>(false); |
| 728 LOG(LS_INFO) << "Disabling AGC since built-in AGC will be used instead"; | 728 LOG(LS_INFO) << "Disabling AGC since built-in AGC will be used instead"; |
| 729 } | 729 } |
| 730 } | 730 } |
| 731 if (voep->SetAgcStatus(*options.auto_gain_control, agc_mode) == -1) { | 731 if (voep->SetAgcStatus(*options.auto_gain_control, agc_mode) == -1) { |
| 732 LOG_RTCERR2(SetAgcStatus, *options.auto_gain_control, agc_mode); | 732 LOG_RTCERR2(SetAgcStatus, *options.auto_gain_control, agc_mode); |
| 733 return false; | 733 return false; |
| 734 } else { | 734 } else { |
| 735 LOG(LS_INFO) << "Auto gain set to " << *options.auto_gain_control | 735 LOG(LS_INFO) << "Auto gain set to " << *options.auto_gain_control |
| 736 << " with mode " << agc_mode; | 736 << " with mode " << agc_mode; |
| 737 } | 737 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 764 } | 764 } |
| 765 | 765 |
| 766 if (options.noise_suppression) { | 766 if (options.noise_suppression) { |
| 767 const bool built_in_ns = voe_wrapper_->hw()->BuiltInNSIsAvailable(); | 767 const bool built_in_ns = voe_wrapper_->hw()->BuiltInNSIsAvailable(); |
| 768 if (built_in_ns) { | 768 if (built_in_ns) { |
| 769 if (voe_wrapper_->hw()->EnableBuiltInNS(*options.noise_suppression) == | 769 if (voe_wrapper_->hw()->EnableBuiltInNS(*options.noise_suppression) == |
| 770 0 && | 770 0 && |
| 771 *options.noise_suppression) { | 771 *options.noise_suppression) { |
| 772 // Disable internal software NS if built-in NS is enabled, | 772 // Disable internal software NS if built-in NS is enabled, |
| 773 // i.e., replace the software NS with the built-in NS. | 773 // i.e., replace the software NS with the built-in NS. |
| 774 options.noise_suppression = rtc::Maybe<bool>(false); | 774 options.noise_suppression = rtc::Optional<bool>(false); |
| 775 LOG(LS_INFO) << "Disabling NS since built-in NS will be used instead"; | 775 LOG(LS_INFO) << "Disabling NS since built-in NS will be used instead"; |
| 776 } | 776 } |
| 777 } | 777 } |
| 778 if (voep->SetNsStatus(*options.noise_suppression, ns_mode) == -1) { | 778 if (voep->SetNsStatus(*options.noise_suppression, ns_mode) == -1) { |
| 779 LOG_RTCERR2(SetNsStatus, *options.noise_suppression, ns_mode); | 779 LOG_RTCERR2(SetNsStatus, *options.noise_suppression, ns_mode); |
| 780 return false; | 780 return false; |
| 781 } else { | 781 } else { |
| 782 LOG(LS_INFO) << "Noise suppression set to " << *options.noise_suppression | 782 LOG(LS_INFO) << "Noise suppression set to " << *options.noise_suppression |
| 783 << " with mode " << ns_mode; | 783 << " with mode " << ns_mode; |
| 784 } | 784 } |
| (...skipping 2071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2856 LOG(LS_WARNING) << "Unknown codec " << ToString(codec); | 2856 LOG(LS_WARNING) << "Unknown codec " << ToString(codec); |
| 2857 return false; | 2857 return false; |
| 2858 } | 2858 } |
| 2859 } | 2859 } |
| 2860 return true; | 2860 return true; |
| 2861 } | 2861 } |
| 2862 | 2862 |
| 2863 } // namespace cricket | 2863 } // namespace cricket |
| 2864 | 2864 |
| 2865 #endif // HAVE_WEBRTC_VOICE | 2865 #endif // HAVE_WEBRTC_VOICE |
| OLD | NEW |