OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/media_stream_constraints_util_audio.h" | 5 #include "content/renderer/media/media_stream_constraints_util_audio.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 blink::BooleanConstraint blink::WebMediaTrackConstraintSet::*> | 335 blink::BooleanConstraint blink::WebMediaTrackConstraintSet::*> |
336 kMainBoolConstraints = { | 336 kMainBoolConstraints = { |
337 &blink::WebMediaTrackConstraintSet::hotword_enabled, | 337 &blink::WebMediaTrackConstraintSet::hotword_enabled, |
338 &blink::WebMediaTrackConstraintSet::disable_local_echo, | 338 &blink::WebMediaTrackConstraintSet::disable_local_echo, |
339 &blink::WebMediaTrackConstraintSet::render_to_associated_sink}; | 339 &blink::WebMediaTrackConstraintSet::render_to_associated_sink}; |
340 | 340 |
341 ASSERT_EQ(kMainSettings.size(), kMainBoolConstraints.size()); | 341 ASSERT_EQ(kMainSettings.size(), kMainBoolConstraints.size()); |
342 for (auto set_function : kBoolSetFunctions) { | 342 for (auto set_function : kBoolSetFunctions) { |
343 for (auto accessor : kFactoryAccessors) { | 343 for (auto accessor : kFactoryAccessors) { |
344 // Ideal advanced is ignored by the SelectSettings algorithm. | 344 // Ideal advanced is ignored by the SelectSettings algorithm. |
345 if (set_function == &blink::BooleanConstraint::SetIdeal && | 345 // Using array elements instead of pointer values due to the comparison |
346 accessor == &MockConstraintFactory::AddAdvanced) { | 346 // failing on some build configurations. |
| 347 if (set_function == kBoolSetFunctions[1] && |
| 348 accessor == kFactoryAccessors[1]) { |
347 continue; | 349 continue; |
348 } | 350 } |
349 for (size_t i = 0; i < kMainSettings.size(); ++i) { | 351 for (size_t i = 0; i < kMainSettings.size(); ++i) { |
350 for (bool value : kBoolValues) { | 352 for (bool value : kBoolValues) { |
351 ResetFactory(); | 353 ResetFactory(); |
352 (((constraint_factory_.*accessor)().*kMainBoolConstraints[i]).* | 354 (((constraint_factory_.*accessor)().*kMainBoolConstraints[i]).* |
353 set_function)(value); | 355 set_function)(value); |
354 auto result = SelectSettings(); | 356 auto result = SelectSettings(); |
355 EXPECT_TRUE(result.HasValue()); | 357 EXPECT_TRUE(result.HasValue()); |
356 EXPECT_EQ(value, (result.*kMainSettings[i])()); | 358 EXPECT_EQ(value, (result.*kMainSettings[i])()); |
(...skipping 30 matching lines...) Expand all Loading... |
387 &blink::WebMediaTrackConstraintSet::goog_highpass_filter, | 389 &blink::WebMediaTrackConstraintSet::goog_highpass_filter, |
388 &blink::WebMediaTrackConstraintSet:: | 390 &blink::WebMediaTrackConstraintSet:: |
389 goog_experimental_auto_gain_control, | 391 goog_experimental_auto_gain_control, |
390 }; | 392 }; |
391 | 393 |
392 ASSERT_EQ(kAudioProcessingProperties.size(), | 394 ASSERT_EQ(kAudioProcessingProperties.size(), |
393 kAudioProcessingConstraints.size()); | 395 kAudioProcessingConstraints.size()); |
394 for (auto set_function : kBoolSetFunctions) { | 396 for (auto set_function : kBoolSetFunctions) { |
395 for (auto accessor : kFactoryAccessors) { | 397 for (auto accessor : kFactoryAccessors) { |
396 // Ideal advanced is ignored by the SelectSettings algorithm. | 398 // Ideal advanced is ignored by the SelectSettings algorithm. |
397 if (set_function == &blink::BooleanConstraint::SetIdeal && | 399 // Using array elements instead of pointer values due to the comparison |
398 accessor == &MockConstraintFactory::AddAdvanced) { | 400 // failing on some build configurations. |
| 401 if (set_function == kBoolSetFunctions[1] && |
| 402 accessor == kFactoryAccessors[1]) { |
399 continue; | 403 continue; |
400 } | 404 } |
401 for (size_t i = 0; i < kAudioProcessingProperties.size(); ++i) { | 405 for (size_t i = 0; i < kAudioProcessingProperties.size(); ++i) { |
402 for (bool value : kBoolValues) { | 406 for (bool value : kBoolValues) { |
403 ResetFactory(); | 407 ResetFactory(); |
404 (((constraint_factory_.*accessor)().*kAudioProcessingConstraints[i]).* | 408 (((constraint_factory_.*accessor)().*kAudioProcessingConstraints[i]).* |
405 set_function)(value); | 409 set_function)(value); |
406 auto result = SelectSettings(); | 410 auto result = SelectSettings(); |
407 EXPECT_TRUE(result.HasValue()); | 411 EXPECT_TRUE(result.HasValue()); |
408 EXPECT_EQ(value, result.audio_processing_properties().* | 412 EXPECT_EQ(value, result.audio_processing_properties().* |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 } | 482 } |
479 } | 483 } |
480 } | 484 } |
481 | 485 |
482 // Tests the echoCancellation constraint with a device without hardware echo | 486 // Tests the echoCancellation constraint with a device without hardware echo |
483 // cancellation. | 487 // cancellation. |
484 TEST_P(MediaStreamConstraintsUtilAudioTest, EchoCancellationWithSw) { | 488 TEST_P(MediaStreamConstraintsUtilAudioTest, EchoCancellationWithSw) { |
485 for (auto set_function : kBoolSetFunctions) { | 489 for (auto set_function : kBoolSetFunctions) { |
486 for (auto accessor : kFactoryAccessors) { | 490 for (auto accessor : kFactoryAccessors) { |
487 // Ideal advanced is ignored by the SelectSettings algorithm. | 491 // Ideal advanced is ignored by the SelectSettings algorithm. |
488 if (set_function == &blink::BooleanConstraint::SetIdeal && | 492 // Using array elements instead of pointer values due to the comparison |
489 accessor == &MockConstraintFactory::AddAdvanced) { | 493 // failing on some build configurations. |
| 494 if (set_function == kBoolSetFunctions[1] && |
| 495 accessor == kFactoryAccessors[1]) { |
490 continue; | 496 continue; |
491 } | 497 } |
492 for (bool value : kBoolValues) { | 498 for (bool value : kBoolValues) { |
493 ResetFactory(); | 499 ResetFactory(); |
494 ((constraint_factory_.*accessor)().echo_cancellation.* | 500 ((constraint_factory_.*accessor)().echo_cancellation.* |
495 set_function)(value); | 501 set_function)(value); |
496 auto result = SelectSettings(); | 502 auto result = SelectSettings(); |
497 EXPECT_TRUE(result.HasValue()); | 503 EXPECT_TRUE(result.HasValue()); |
498 const AudioProcessingProperties& properties = | 504 const AudioProcessingProperties& properties = |
499 result.audio_processing_properties(); | 505 result.audio_processing_properties(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 // cancellation. | 546 // cancellation. |
541 TEST_P(MediaStreamConstraintsUtilAudioTest, EchoCancellationWithHw) { | 547 TEST_P(MediaStreamConstraintsUtilAudioTest, EchoCancellationWithHw) { |
542 // With content capture, there is no hardware echo cancellation, so | 548 // With content capture, there is no hardware echo cancellation, so |
543 // nothing to test. | 549 // nothing to test. |
544 if (!IsDeviceCapture()) | 550 if (!IsDeviceCapture()) |
545 return; | 551 return; |
546 | 552 |
547 for (auto set_function : kBoolSetFunctions) { | 553 for (auto set_function : kBoolSetFunctions) { |
548 for (auto accessor : kFactoryAccessors) { | 554 for (auto accessor : kFactoryAccessors) { |
549 // Ideal advanced is ignored by the SelectSettings algorithm. | 555 // Ideal advanced is ignored by the SelectSettings algorithm. |
550 if (set_function == &blink::BooleanConstraint::SetIdeal && | 556 // Using array elements instead of pointer values due to the comparison |
551 accessor == &MockConstraintFactory::AddAdvanced) { | 557 // failing on some build configurations. |
| 558 if (set_function == kBoolSetFunctions[1] && |
| 559 accessor == kFactoryAccessors[1]) { |
552 continue; | 560 continue; |
553 } | 561 } |
554 for (bool value : kBoolValues) { | 562 for (bool value : kBoolValues) { |
555 ResetFactory(); | 563 ResetFactory(); |
556 constraint_factory_.basic().device_id.SetExact( | 564 constraint_factory_.basic().device_id.SetExact( |
557 blink::WebString::FromASCII(hw_echo_canceller_device_->device_id)); | 565 blink::WebString::FromASCII(hw_echo_canceller_device_->device_id)); |
558 ((constraint_factory_.*accessor)().echo_cancellation.* | 566 ((constraint_factory_.*accessor)().echo_cancellation.* |
559 set_function)(value); | 567 set_function)(value); |
560 auto result = SelectSettings(); | 568 auto result = SelectSettings(); |
561 EXPECT_TRUE(result.HasValue()); | 569 EXPECT_TRUE(result.HasValue()); |
(...skipping 25 matching lines...) Expand all Loading... |
587 } | 595 } |
588 } | 596 } |
589 } | 597 } |
590 | 598 |
591 // Tests the googEchoCancellation constraint with a device without hardware echo | 599 // Tests the googEchoCancellation constraint with a device without hardware echo |
592 // cancellation. | 600 // cancellation. |
593 TEST_P(MediaStreamConstraintsUtilAudioTest, GoogEchoCancellationWithSw) { | 601 TEST_P(MediaStreamConstraintsUtilAudioTest, GoogEchoCancellationWithSw) { |
594 for (auto set_function : kBoolSetFunctions) { | 602 for (auto set_function : kBoolSetFunctions) { |
595 for (auto accessor : kFactoryAccessors) { | 603 for (auto accessor : kFactoryAccessors) { |
596 // Ideal advanced is ignored by the SelectSettings algorithm. | 604 // Ideal advanced is ignored by the SelectSettings algorithm. |
597 if (set_function == &blink::BooleanConstraint::SetIdeal && | 605 // Using array elements instead of pointers due to the comparison failing |
598 accessor == &MockConstraintFactory::AddAdvanced) { | 606 // on compilers. |
| 607 if (set_function == kBoolSetFunctions[1] && |
| 608 accessor == kFactoryAccessors[1]) { |
599 continue; | 609 continue; |
600 } | 610 } |
601 for (bool value : kBoolValues) { | 611 for (bool value : kBoolValues) { |
602 ResetFactory(); | 612 ResetFactory(); |
603 ((constraint_factory_.*accessor)().goog_echo_cancellation.* | 613 ((constraint_factory_.*accessor)().goog_echo_cancellation.* |
604 set_function)(value); | 614 set_function)(value); |
605 auto result = SelectSettings(); | 615 auto result = SelectSettings(); |
606 EXPECT_TRUE(result.HasValue()); | 616 EXPECT_TRUE(result.HasValue()); |
607 const AudioProcessingProperties& properties = | 617 const AudioProcessingProperties& properties = |
608 result.audio_processing_properties(); | 618 result.audio_processing_properties(); |
(...skipping 23 matching lines...) Expand all Loading... |
632 // cancellation. | 642 // cancellation. |
633 TEST_P(MediaStreamConstraintsUtilAudioTest, GoogEchoCancellationWithHw) { | 643 TEST_P(MediaStreamConstraintsUtilAudioTest, GoogEchoCancellationWithHw) { |
634 // With content capture, there is no hardware echo cancellation, so | 644 // With content capture, there is no hardware echo cancellation, so |
635 // nothing to test. | 645 // nothing to test. |
636 if (!IsDeviceCapture()) | 646 if (!IsDeviceCapture()) |
637 return; | 647 return; |
638 | 648 |
639 for (auto set_function : kBoolSetFunctions) { | 649 for (auto set_function : kBoolSetFunctions) { |
640 for (auto accessor : kFactoryAccessors) { | 650 for (auto accessor : kFactoryAccessors) { |
641 // Ideal advanced is ignored by the SelectSettings algorithm. | 651 // Ideal advanced is ignored by the SelectSettings algorithm. |
642 if (set_function == &blink::BooleanConstraint::SetIdeal && | 652 // Using array elements instead of pointer values due to the comparison |
643 accessor == &MockConstraintFactory::AddAdvanced) { | 653 // failing on some build configurations. |
| 654 if (set_function == kBoolSetFunctions[1] && |
| 655 accessor == kFactoryAccessors[1]) { |
644 continue; | 656 continue; |
645 } | 657 } |
646 for (bool value : kBoolValues) { | 658 for (bool value : kBoolValues) { |
647 ResetFactory(); | 659 ResetFactory(); |
648 constraint_factory_.basic().device_id.SetExact( | 660 constraint_factory_.basic().device_id.SetExact( |
649 blink::WebString::FromASCII(hw_echo_canceller_device_->device_id)); | 661 blink::WebString::FromASCII(hw_echo_canceller_device_->device_id)); |
650 ((constraint_factory_.*accessor)().goog_echo_cancellation.* | 662 ((constraint_factory_.*accessor)().goog_echo_cancellation.* |
651 set_function)(value); | 663 set_function)(value); |
652 auto result = SelectSettings(); | 664 auto result = SelectSettings(); |
653 EXPECT_TRUE(result.HasValue()); | 665 EXPECT_TRUE(result.HasValue()); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 &blink::WebMediaTrackConstraintSet::goog_highpass_filter, | 726 &blink::WebMediaTrackConstraintSet::goog_highpass_filter, |
715 &blink::WebMediaTrackConstraintSet:: | 727 &blink::WebMediaTrackConstraintSet:: |
716 goog_experimental_auto_gain_control, | 728 goog_experimental_auto_gain_control, |
717 }; | 729 }; |
718 | 730 |
719 ASSERT_EQ(kAudioProcessingProperties.size(), | 731 ASSERT_EQ(kAudioProcessingProperties.size(), |
720 kAudioProcessingConstraints.size()); | 732 kAudioProcessingConstraints.size()); |
721 for (auto set_function : kBoolSetFunctions) { | 733 for (auto set_function : kBoolSetFunctions) { |
722 for (auto accessor : kFactoryAccessors) { | 734 for (auto accessor : kFactoryAccessors) { |
723 // Ideal advanced is ignored by the SelectSettings algorithm. | 735 // Ideal advanced is ignored by the SelectSettings algorithm. |
724 if (set_function == &blink::BooleanConstraint::SetIdeal && | 736 // Using array elements instead of pointer values due to the comparison |
725 accessor == &MockConstraintFactory::AddAdvanced) { | 737 // failing on some build configurations. |
| 738 if (set_function == kBoolSetFunctions[1] && |
| 739 accessor == kFactoryAccessors[1]) { |
726 continue; | 740 continue; |
727 } | 741 } |
728 for (size_t i = 0; i < kAudioProcessingProperties.size(); ++i) { | 742 for (size_t i = 0; i < kAudioProcessingProperties.size(); ++i) { |
729 ResetFactory(); | 743 ResetFactory(); |
730 ((constraint_factory_.*accessor)().echo_cancellation.* | 744 ((constraint_factory_.*accessor)().echo_cancellation.* |
731 set_function)(false); | 745 set_function)(false); |
732 (((constraint_factory_.*accessor)().*kAudioProcessingConstraints[i]).* | 746 (((constraint_factory_.*accessor)().*kAudioProcessingConstraints[i]).* |
733 set_function)(true); | 747 set_function)(true); |
734 auto result = SelectSettings(); | 748 auto result = SelectSettings(); |
735 EXPECT_TRUE(result.HasValue()); | 749 EXPECT_TRUE(result.HasValue()); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 | 825 |
812 // Test that a valid geometry is interpreted correctly in all the ways it can | 826 // Test that a valid geometry is interpreted correctly in all the ways it can |
813 // be set. | 827 // be set. |
814 TEST_P(MediaStreamConstraintsUtilAudioTest, ValidGeometry) { | 828 TEST_P(MediaStreamConstraintsUtilAudioTest, ValidGeometry) { |
815 const blink::WebString kGeometry = | 829 const blink::WebString kGeometry = |
816 blink::WebString::FromASCII("-0.02 0 0 0.02 0 1.01"); | 830 blink::WebString::FromASCII("-0.02 0 0 0.02 0 1.01"); |
817 | 831 |
818 for (auto set_function : kStringSetFunctions) { | 832 for (auto set_function : kStringSetFunctions) { |
819 for (auto accessor : kFactoryAccessors) { | 833 for (auto accessor : kFactoryAccessors) { |
820 // Ideal advanced is ignored by the SelectSettings algorithm. | 834 // Ideal advanced is ignored by the SelectSettings algorithm. |
821 // Using kStringSetFunctions[1] instead of | 835 // Using array elements instead of pointer values due to the comparison |
822 // static_cast<StringSetFunction>(&blink::StringConstraint::SetIdeal) | 836 // failing on some build configurations. |
823 // because the equality comparison provides the wrong result in the | |
824 // Windows Debug build, making the test fail. | |
825 if (set_function == kStringSetFunctions[1] && | 837 if (set_function == kStringSetFunctions[1] && |
826 accessor == &MockConstraintFactory::AddAdvanced) { | 838 accessor == kFactoryAccessors[1]) { |
827 continue; | 839 continue; |
828 } | 840 } |
829 ResetFactory(); | 841 ResetFactory(); |
830 ((constraint_factory_.*accessor)().goog_array_geometry.* | 842 ((constraint_factory_.*accessor)().goog_array_geometry.* |
831 set_function)(kGeometry); | 843 set_function)(kGeometry); |
832 auto result = SelectSettings(); | 844 auto result = SelectSettings(); |
833 EXPECT_TRUE(result.HasValue()); | 845 EXPECT_TRUE(result.HasValue()); |
834 CheckDeviceDefaults(result); | 846 CheckDeviceDefaults(result); |
835 CheckBoolDefaults(AudioSettingsBoolMembers(), | 847 CheckBoolDefaults(AudioSettingsBoolMembers(), |
836 AudioPropertiesBoolMembers(), result); | 848 AudioPropertiesBoolMembers(), result); |
837 const std::vector<media::Point>& geometry = | 849 const std::vector<media::Point>& geometry = |
838 result.audio_processing_properties().goog_array_geometry; | 850 result.audio_processing_properties().goog_array_geometry; |
839 EXPECT_EQ(2u, geometry.size()); | 851 EXPECT_EQ(2u, geometry.size()); |
840 EXPECT_EQ(media::Point(-0.02, 0, 0), geometry[0]); | 852 EXPECT_EQ(media::Point(-0.02, 0, 0), geometry[0]); |
841 EXPECT_EQ(media::Point(0.02, 0, 1.01), geometry[1]); | 853 EXPECT_EQ(media::Point(0.02, 0, 1.01), geometry[1]); |
842 } | 854 } |
843 } | 855 } |
844 } | 856 } |
845 | 857 |
846 // Test that an invalid geometry is interpreted as empty in all the ways it can | 858 // Test that an invalid geometry is interpreted as empty in all the ways it can |
847 // be set. | 859 // be set. |
848 TEST_P(MediaStreamConstraintsUtilAudioTest, InvalidGeometry) { | 860 TEST_P(MediaStreamConstraintsUtilAudioTest, InvalidGeometry) { |
849 const blink::WebString kGeometry = | 861 const blink::WebString kGeometry = |
850 blink::WebString::FromASCII("1 1 1 invalid"); | 862 blink::WebString::FromASCII("1 1 1 invalid"); |
851 | 863 |
852 for (auto set_function : kStringSetFunctions) { | 864 for (auto set_function : kStringSetFunctions) { |
853 for (auto accessor : kFactoryAccessors) { | 865 for (auto accessor : kFactoryAccessors) { |
854 // Ideal advanced is ignored by the SelectSettings algorithm. | 866 // Ideal advanced is ignored by the SelectSettings algorithm. |
855 if (set_function == static_cast<StringSetFunction>( | 867 // Using array elements instead of pointer values due to the comparison |
856 &blink::StringConstraint::SetIdeal) && | 868 // failing on some build configurations. |
857 accessor == &MockConstraintFactory::AddAdvanced) { | 869 if (set_function == kStringSetFunctions[1] && |
| 870 accessor == kFactoryAccessors[1]) { |
858 continue; | 871 continue; |
859 } | 872 } |
860 ResetFactory(); | 873 ResetFactory(); |
861 ((constraint_factory_.*accessor)().goog_array_geometry.* | 874 ((constraint_factory_.*accessor)().goog_array_geometry.* |
862 set_function)(kGeometry); | 875 set_function)(kGeometry); |
863 auto result = SelectSettings(); | 876 auto result = SelectSettings(); |
864 EXPECT_TRUE(result.HasValue()); | 877 EXPECT_TRUE(result.HasValue()); |
865 CheckDeviceDefaults(result); | 878 CheckDeviceDefaults(result); |
866 CheckBoolDefaults(AudioSettingsBoolMembers(), | 879 CheckBoolDefaults(AudioSettingsBoolMembers(), |
867 AudioPropertiesBoolMembers(), result); | 880 AudioPropertiesBoolMembers(), result); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 } | 966 } |
954 | 967 |
955 INSTANTIATE_TEST_CASE_P(, | 968 INSTANTIATE_TEST_CASE_P(, |
956 MediaStreamConstraintsUtilAudioTest, | 969 MediaStreamConstraintsUtilAudioTest, |
957 testing::Values("", | 970 testing::Values("", |
958 kMediaStreamSourceTab, | 971 kMediaStreamSourceTab, |
959 kMediaStreamSourceSystem, | 972 kMediaStreamSourceSystem, |
960 kMediaStreamSourceDesktop)); | 973 kMediaStreamSourceDesktop)); |
961 | 974 |
962 } // namespace content | 975 } // namespace content |
OLD | NEW |