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 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 if (!ApplyOptions(options)) { | 608 if (!ApplyOptions(options)) { |
609 return false; | 609 return false; |
610 } | 610 } |
611 option_overrides_ = AudioOptions(); | 611 option_overrides_ = AudioOptions(); |
612 return true; | 612 return true; |
613 } | 613 } |
614 | 614 |
615 // AudioOptions defaults are set in InitInternal (for options with corresponding | 615 // AudioOptions defaults are set in InitInternal (for options with corresponding |
616 // MediaEngineInterface flags) and in SetOptions(int) for flagless options. | 616 // MediaEngineInterface flags) and in SetOptions(int) for flagless options. |
617 bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { | 617 bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { |
| 618 LOG(LS_INFO) << "ApplyOptions: " << options_in.ToString(); |
618 AudioOptions options = options_in; // The options are modified below. | 619 AudioOptions options = options_in; // The options are modified below. |
619 // kEcConference is AEC with high suppression. | 620 // kEcConference is AEC with high suppression. |
620 webrtc::EcModes ec_mode = webrtc::kEcConference; | 621 webrtc::EcModes ec_mode = webrtc::kEcConference; |
621 webrtc::AecmModes aecm_mode = webrtc::kAecmSpeakerphone; | 622 webrtc::AecmModes aecm_mode = webrtc::kAecmSpeakerphone; |
622 webrtc::AgcModes agc_mode = webrtc::kAgcAdaptiveAnalog; | 623 webrtc::AgcModes agc_mode = webrtc::kAgcAdaptiveAnalog; |
623 webrtc::NsModes ns_mode = webrtc::kNsHighSuppression; | 624 webrtc::NsModes ns_mode = webrtc::kNsHighSuppression; |
624 bool aecm_comfort_noise = false; | 625 bool aecm_comfort_noise = false; |
625 if (options.aecm_generate_comfort_noise.Get(&aecm_comfort_noise)) { | 626 if (options.aecm_generate_comfort_noise.Get(&aecm_comfort_noise)) { |
626 LOG(LS_VERBOSE) << "Comfort noise explicitly set to " | 627 LOG(LS_VERBOSE) << "Comfort noise explicitly set to " |
627 << aecm_comfort_noise << " (default is false)."; | 628 << aecm_comfort_noise << " (default is false)."; |
(...skipping 24 matching lines...) Expand all Loading... |
652 #if !defined(IOS) | 653 #if !defined(IOS) |
653 if (options.delay_agnostic_aec.Get(&use_delay_agnostic_aec)) { | 654 if (options.delay_agnostic_aec.Get(&use_delay_agnostic_aec)) { |
654 if (use_delay_agnostic_aec) { | 655 if (use_delay_agnostic_aec) { |
655 options.echo_cancellation.Set(true); | 656 options.echo_cancellation.Set(true); |
656 options.extended_filter_aec.Set(true); | 657 options.extended_filter_aec.Set(true); |
657 ec_mode = webrtc::kEcConference; | 658 ec_mode = webrtc::kEcConference; |
658 } | 659 } |
659 } | 660 } |
660 #endif | 661 #endif |
661 | 662 |
662 LOG(LS_INFO) << "Applying audio options: " << options.ToString(); | |
663 | |
664 webrtc::VoEAudioProcessing* voep = voe_wrapper_->processing(); | 663 webrtc::VoEAudioProcessing* voep = voe_wrapper_->processing(); |
665 | 664 |
666 bool echo_cancellation = false; | 665 bool echo_cancellation = false; |
667 if (options.echo_cancellation.Get(&echo_cancellation)) { | 666 if (options.echo_cancellation.Get(&echo_cancellation)) { |
668 // Check if platform supports built-in EC. Currently only supported on | 667 // Check if platform supports built-in EC. Currently only supported on |
669 // Android and in combination with Java based audio layer. | 668 // Android and in combination with Java based audio layer. |
670 // TODO(henrika): investigate possibility to support built-in EC also | 669 // TODO(henrika): investigate possibility to support built-in EC also |
671 // in combination with Open SL ES audio. | 670 // in combination with Open SL ES audio. |
672 const bool built_in_aec = voe_wrapper_->hw()->BuiltInAECIsAvailable(); | 671 const bool built_in_aec = voe_wrapper_->hw()->BuiltInAECIsAvailable(); |
673 if (built_in_aec) { | 672 if (built_in_aec) { |
(...skipping 26 matching lines...) Expand all Loading... |
700 } | 699 } |
701 #endif | 700 #endif |
702 if (ec_mode == webrtc::kEcAecm) { | 701 if (ec_mode == webrtc::kEcAecm) { |
703 if (voep->SetAecmMode(aecm_mode, aecm_comfort_noise) != 0) { | 702 if (voep->SetAecmMode(aecm_mode, aecm_comfort_noise) != 0) { |
704 LOG_RTCERR2(SetAecmMode, aecm_mode, aecm_comfort_noise); | 703 LOG_RTCERR2(SetAecmMode, aecm_mode, aecm_comfort_noise); |
705 return false; | 704 return false; |
706 } | 705 } |
707 } | 706 } |
708 } | 707 } |
709 | 708 |
710 bool auto_gain_control; | 709 bool auto_gain_control = false; |
711 if (options.auto_gain_control.Get(&auto_gain_control)) { | 710 if (options.auto_gain_control.Get(&auto_gain_control)) { |
| 711 const bool built_in_agc = voe_wrapper_->hw()->BuiltInAGCIsAvailable(); |
| 712 if (built_in_agc) { |
| 713 if (voe_wrapper_->hw()->EnableBuiltInAGC(auto_gain_control) == 0 && |
| 714 auto_gain_control) { |
| 715 // Disable internal software AGC if built-in AGC is enabled, |
| 716 // i.e., replace the software AGC with the built-in AGC. |
| 717 options.auto_gain_control.Set(false); |
| 718 auto_gain_control = false; |
| 719 LOG(LS_INFO) << "Disabling AGC since built-in AGC will be used instead"; |
| 720 } |
| 721 } |
712 if (voep->SetAgcStatus(auto_gain_control, agc_mode) == -1) { | 722 if (voep->SetAgcStatus(auto_gain_control, agc_mode) == -1) { |
713 LOG_RTCERR2(SetAgcStatus, auto_gain_control, agc_mode); | 723 LOG_RTCERR2(SetAgcStatus, auto_gain_control, agc_mode); |
714 return false; | 724 return false; |
715 } else { | 725 } else { |
716 LOG(LS_INFO) << "Auto gain set to " << auto_gain_control << " with mode " | 726 LOG(LS_INFO) << "Auto gain set to " << auto_gain_control << " with mode " |
717 << agc_mode; | 727 << agc_mode; |
718 } | 728 } |
719 } | 729 } |
720 | 730 |
721 if (options.tx_agc_target_dbov.IsSet() || | 731 if (options.tx_agc_target_dbov.IsSet() || |
(...skipping 18 matching lines...) Expand all Loading... |
740 default_agc_config_.limiterEnable); | 750 default_agc_config_.limiterEnable); |
741 if (voe_wrapper_->processing()->SetAgcConfig(default_agc_config_) == -1) { | 751 if (voe_wrapper_->processing()->SetAgcConfig(default_agc_config_) == -1) { |
742 LOG_RTCERR3(SetAgcConfig, | 752 LOG_RTCERR3(SetAgcConfig, |
743 default_agc_config_.targetLeveldBOv, | 753 default_agc_config_.targetLeveldBOv, |
744 default_agc_config_.digitalCompressionGaindB, | 754 default_agc_config_.digitalCompressionGaindB, |
745 default_agc_config_.limiterEnable); | 755 default_agc_config_.limiterEnable); |
746 return false; | 756 return false; |
747 } | 757 } |
748 } | 758 } |
749 | 759 |
750 bool noise_suppression; | 760 bool noise_suppression = false; |
751 if (options.noise_suppression.Get(&noise_suppression)) { | 761 if (options.noise_suppression.Get(&noise_suppression)) { |
| 762 const bool built_in_ns = voe_wrapper_->hw()->BuiltInNSIsAvailable(); |
| 763 if (built_in_ns) { |
| 764 if (voe_wrapper_->hw()->EnableBuiltInNS(noise_suppression) == 0 && |
| 765 noise_suppression) { |
| 766 // Disable internal software NS if built-in NS is enabled, |
| 767 // i.e., replace the software NS with the built-in NS. |
| 768 options.noise_suppression.Set(false); |
| 769 noise_suppression = false; |
| 770 LOG(LS_INFO) << "Disabling NS since built-in NS will be used instead"; |
| 771 } |
| 772 } |
752 if (voep->SetNsStatus(noise_suppression, ns_mode) == -1) { | 773 if (voep->SetNsStatus(noise_suppression, ns_mode) == -1) { |
753 LOG_RTCERR2(SetNsStatus, noise_suppression, ns_mode); | 774 LOG_RTCERR2(SetNsStatus, noise_suppression, ns_mode); |
754 return false; | 775 return false; |
755 } else { | 776 } else { |
756 LOG(LS_VERBOSE) << "Noise suppression set to " << noise_suppression | 777 LOG(LS_INFO) << "Noise suppression set to " << noise_suppression |
757 << " with mode " << ns_mode; | 778 << " with mode " << ns_mode; |
758 } | 779 } |
759 } | 780 } |
760 | 781 |
761 bool highpass_filter; | 782 bool highpass_filter; |
762 if (options.highpass_filter.Get(&highpass_filter)) { | 783 if (options.highpass_filter.Get(&highpass_filter)) { |
763 LOG(LS_INFO) << "High pass filter enabled? " << highpass_filter; | 784 LOG(LS_INFO) << "High pass filter enabled? " << highpass_filter; |
764 if (voep->EnableHighPassFilter(highpass_filter) == -1) { | 785 if (voep->EnableHighPassFilter(highpass_filter) == -1) { |
765 LOG_RTCERR1(SetHighpassFilterStatus, highpass_filter); | 786 LOG_RTCERR1(SetHighpassFilterStatus, highpass_filter); |
766 return false; | 787 return false; |
767 } | 788 } |
(...skipping 2510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3278 LOG(LS_WARNING) << "Unknown codec " << ToString(codec); | 3299 LOG(LS_WARNING) << "Unknown codec " << ToString(codec); |
3279 return false; | 3300 return false; |
3280 } | 3301 } |
3281 } | 3302 } |
3282 return true; | 3303 return true; |
3283 } | 3304 } |
3284 | 3305 |
3285 } // namespace cricket | 3306 } // namespace cricket |
3286 | 3307 |
3287 #endif // HAVE_WEBRTC_VOICE | 3308 #endif // HAVE_WEBRTC_VOICE |
OLD | NEW |