diff options
Diffstat (limited to 'cras/src/tests/alsa_io_unittest.cc')
-rw-r--r-- | cras/src/tests/alsa_io_unittest.cc | 594 |
1 files changed, 253 insertions, 341 deletions
diff --git a/cras/src/tests/alsa_io_unittest.cc b/cras/src/tests/alsa_io_unittest.cc index 021b4789..2211f343 100644 --- a/cras/src/tests/alsa_io_unittest.cc +++ b/cras/src/tests/alsa_io_unittest.cc @@ -32,7 +32,6 @@ static int cras_alsa_start_called; static uint8_t* cras_alsa_mmap_begin_buffer; static size_t cras_alsa_mmap_begin_frames; static size_t cras_alsa_fill_properties_called; -static bool cras_alsa_support_8_channels; static size_t alsa_mixer_set_dBFS_called; static int alsa_mixer_set_dBFS_value; static const struct mixer_control* alsa_mixer_set_dBFS_output; @@ -50,6 +49,8 @@ static struct mixer_control* cras_alsa_mixer_get_control_for_section_return_value; static size_t sys_get_volume_called; static size_t sys_get_volume_return_value; +static size_t sys_get_capture_gain_called; +static long sys_get_capture_gain_return_value; static size_t alsa_mixer_set_mute_called; static int alsa_mixer_set_mute_value; static size_t alsa_mixer_get_dB_range_called; @@ -76,6 +77,7 @@ static std::vector<struct mixer_control*> static std::vector<int> cras_alsa_mixer_set_output_active_state_values; static cras_audio_format* fake_format; static size_t sys_set_volume_limits_called; +static size_t sys_set_capture_gain_limits_called; static size_t cras_alsa_mixer_get_minimum_capture_gain_called; static size_t cras_alsa_mixer_get_maximum_capture_gain_called; static struct mixer_control* cras_alsa_jack_get_mixer_output_ret; @@ -94,7 +96,6 @@ static int cras_alsa_jack_list_has_hctl_jacks_return_val; static jack_state_change_callback* cras_alsa_jack_list_create_cb; static void* cras_alsa_jack_list_create_cb_data; static char test_card_name[] = "TestCard"; -static char test_pcm_name[] = "TestPCM"; static char test_dev_name[] = "TestDev"; static char test_dev_id[] = "TestDevId"; static size_t cras_iodev_add_node_called; @@ -105,6 +106,8 @@ static unsigned cras_alsa_jack_enable_ucm_called; static unsigned ucm_set_enabled_called; static size_t cras_iodev_update_dsp_called; static const char* cras_iodev_update_dsp_name; +static size_t ucm_get_dsp_name_default_called; +static const char* ucm_get_dsp_name_default_value; typedef std::map<const char*, std::string> DspNameMap; static size_t ucm_get_dsp_name_for_dev_called; static DspNameMap ucm_get_dsp_name_for_dev_values; @@ -120,6 +123,13 @@ static const char* cras_alsa_jack_get_name_ret_value = 0; static char default_jack_name[] = "Something Jack"; static int auto_unplug_input_node_ret = 0; static int auto_unplug_output_node_ret = 0; +static int ucm_get_min_software_gain_called; +static int ucm_get_min_software_gain_ret_value; +static long ucm_get_min_software_gain_value; +static int ucm_get_max_software_gain_called; +static int ucm_get_max_software_gain_ret_value; +static long ucm_get_max_software_gain_value; +static long cras_system_set_capture_gain_limits_set_value[2]; static long cras_alsa_mixer_get_minimum_capture_gain_ret_value; static long cras_alsa_mixer_get_maximum_capture_gain_ret_value; static snd_pcm_state_t snd_pcm_state_ret; @@ -137,15 +147,14 @@ static int cras_iodev_frames_queued_ret; static int cras_iodev_buffer_avail_ret; static int cras_alsa_resume_appl_ptr_called; static int cras_alsa_resume_appl_ptr_ahead; +static int ucm_get_enable_htimestamp_flag_ret; static const struct cras_volume_curve* fake_get_dBFS_volume_curve_val; static int cras_iodev_dsp_set_swap_mode_for_node_called; static std::map<std::string, long> ucm_get_default_node_gain_values; -static std::map<std::string, long> ucm_get_intrinsic_sensitivity_values; static thread_callback audio_thread_cb; static void* audio_thread_cb_data; static int hotword_send_triggered_msg_called; static struct timespec clock_gettime_retspec; -static unsigned cras_iodev_reset_rate_estimator_called; void ResetStubData() { cras_alsa_open_called = 0; @@ -154,8 +163,8 @@ void ResetStubData() { cras_alsa_get_avail_frames_avail = 0; cras_alsa_start_called = 0; cras_alsa_fill_properties_called = 0; - cras_alsa_support_8_channels = false; sys_get_volume_called = 0; + sys_get_capture_gain_called = 0; alsa_mixer_set_dBFS_called = 0; alsa_mixer_set_capture_dBFS_called = 0; sys_get_mute_called = 0; @@ -174,6 +183,8 @@ void ResetStubData() { cras_alsa_mixer_set_output_active_state_outputs.clear(); cras_alsa_mixer_set_output_active_state_values.clear(); sys_set_volume_limits_called = 0; + sys_set_capture_gain_limits_called = 0; + sys_get_capture_gain_return_value = 0; cras_alsa_mixer_get_minimum_capture_gain_called = 0; cras_alsa_mixer_get_maximum_capture_gain_called = 0; cras_alsa_mixer_get_output_volume_curve_called = 0; @@ -193,6 +204,8 @@ void ResetStubData() { ucm_set_enabled_called = 0; cras_iodev_update_dsp_called = 0; cras_iodev_update_dsp_name = 0; + ucm_get_dsp_name_default_called = 0; + ucm_get_dsp_name_default_value = NULL; ucm_get_dsp_name_for_dev_called = 0; ucm_get_dsp_name_for_dev_values.clear(); cras_iodev_free_resources_called = 0; @@ -204,8 +217,16 @@ void ResetStubData() { cras_alsa_jack_get_name_called = 0; cras_alsa_jack_get_name_ret_value = default_jack_name; cras_alsa_jack_update_monitor_fake_name = 0; + ucm_get_min_software_gain_called = 0; + ucm_get_min_software_gain_ret_value = -1; + ucm_get_min_software_gain_value = 0; + ucm_get_max_software_gain_called = 0; + ucm_get_max_software_gain_ret_value = -1; + ucm_get_max_software_gain_value = 0; cras_card_config_get_volume_curve_for_control_called = 0; cras_card_config_get_volume_curve_vals.clear(); + cras_system_set_capture_gain_limits_set_value[0] = -1; + cras_system_set_capture_gain_limits_set_value[1] = -1; cras_alsa_mixer_get_minimum_capture_gain_ret_value = 0; cras_alsa_mixer_get_maximum_capture_gain_ret_value = 0; snd_pcm_state_ret = SND_PCM_STATE_RUNNING; @@ -219,11 +240,10 @@ void ResetStubData() { cras_iodev_buffer_avail_ret = 0; cras_alsa_resume_appl_ptr_called = 0; cras_alsa_resume_appl_ptr_ahead = 0; + ucm_get_enable_htimestamp_flag_ret = 0; fake_get_dBFS_volume_curve_val = NULL; cras_iodev_dsp_set_swap_mode_for_node_called = 0; ucm_get_default_node_gain_values.clear(); - ucm_get_intrinsic_sensitivity_values.clear(); - cras_iodev_reset_rate_estimator_called = 0; } static long fake_get_dBFS(const struct cras_volume_curve* curve, @@ -244,13 +264,13 @@ static struct cras_iodev* alsa_iodev_create_with_default_parameters( struct cras_card_config* config, struct cras_use_case_mgr* ucm, enum CRAS_STREAM_DIRECTION direction) { - return alsa_iodev_create(card_index, test_card_name, 0, test_pcm_name, - test_dev_name, dev_id, card_type, is_first, mixer, - config, ucm, fake_hctl, direction, 0, 0, - (char*)"123"); + return alsa_iodev_create(card_index, test_card_name, 0, test_dev_name, dev_id, + card_type, is_first, mixer, config, ucm, fake_hctl, + direction, 0, 0, (char*)"123"); } namespace { + TEST(AlsaIoInit, InitializeInvalidDirection) { struct alsa_io* aio; @@ -272,13 +292,12 @@ TEST(AlsaIoInit, InitializePlayback) { /* Get volume curve twice for iodev, and default node. */ EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); - /* Call cras_alsa_fill_properties once on update_max_supported_channels. */ - EXPECT_EQ(1, cras_alsa_fill_properties_called); + EXPECT_EQ(0, cras_alsa_fill_properties_called); EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called); EXPECT_EQ( 0, strncmp(test_card_name, aio->base.info.name, strlen(test_card_name))); - EXPECT_EQ(1, cras_iodev_update_dsp_called); - EXPECT_EQ("", cras_iodev_update_dsp_name); + EXPECT_EQ(0, ucm_get_dsp_name_default_called); + EXPECT_EQ(NULL, cras_iodev_update_dsp_name); ASSERT_NE(reinterpret_cast<const char*>(NULL), aio->dev_name); EXPECT_EQ(0, strcmp(test_dev_name, aio->dev_name)); ASSERT_NE(reinterpret_cast<const char*>(NULL), aio->dev_id); @@ -362,11 +381,6 @@ TEST(AlsaIoInit, DefaultNodeUSBCard) { ASSERT_STREQ(DEFAULT, aio->base.active_node->name); ASSERT_EQ(1, aio->base.active_node->plugged); EXPECT_EQ(2, cras_iodev_set_node_plugged_called); - - /* No extra gain applied. */ - ASSERT_EQ(DEFAULT_CAPTURE_VOLUME_DBFS, - aio->base.active_node->intrinsic_sensitivity); - ASSERT_EQ(0, aio->base.active_node->capture_gain); alsa_iodev_destroy((struct cras_iodev*)aio); } @@ -380,8 +394,6 @@ TEST(AlsaIoInit, OpenPlayback) { 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL, CRAS_STREAM_OUTPUT); ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); - /* Call open_dev once on update_max_supported_channels. */ - EXPECT_EQ(1, cras_alsa_open_called); EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); aio = (struct alsa_io*)iodev; format.frame_rate = 48000; @@ -392,9 +404,9 @@ TEST(AlsaIoInit, OpenPlayback) { aio->free_running = 1; aio->filled_zeros_for_draining = 512; iodev->open_dev(iodev); - EXPECT_EQ(2, cras_alsa_open_called); + EXPECT_EQ(1, cras_alsa_open_called); iodev->configure_dev(iodev); - EXPECT_EQ(2, cras_alsa_open_called); + EXPECT_EQ(1, cras_alsa_open_called); EXPECT_EQ(1, sys_set_volume_limits_called); EXPECT_EQ(1, alsa_mixer_set_dBFS_called); EXPECT_EQ(0, cras_alsa_start_called); @@ -471,25 +483,120 @@ TEST(AlsaIoInit, UsbCardUseSoftwareVolume) { alsa_iodev_destroy(iodev); } -TEST(AlsaIoInit, SoftwareGainIntrinsicSensitivity) { +TEST(AlsaIoInit, UseSoftwareGain) { struct cras_iodev* iodev; struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3; - long intrinsic_sensitivity = -2700; + /* MaxSoftwareGain is specified in UCM */ + ResetStubData(); + ucm_get_min_software_gain_ret_value = 1; + ucm_get_min_software_gain_value = 1; + ucm_get_max_software_gain_ret_value = 0; + ucm_get_max_software_gain_value = 2000; + iodev = alsa_iodev_create_with_default_parameters( + 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, + CRAS_STREAM_INPUT); + ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); + EXPECT_EQ(1, iodev->active_node->software_volume_needed); + EXPECT_EQ(DEFAULT_MIN_CAPTURE_GAIN, iodev->active_node->min_software_gain); + EXPECT_EQ(2000, iodev->active_node->max_software_gain); + ASSERT_EQ(1, sys_set_capture_gain_limits_called); + /* The gain range is [DEFAULT_MIN_CAPTURE_GAIN, maximum software gain]. */ + ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[0], + DEFAULT_MIN_CAPTURE_GAIN); + ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[1], 2000); + + alsa_iodev_destroy(iodev); + + /* MaxSoftwareGain and MinSoftwareGain are specified in UCM. */ ResetStubData(); + ucm_get_min_software_gain_ret_value = 0; + ucm_get_min_software_gain_value = 1000; + ucm_get_max_software_gain_ret_value = 0; + ucm_get_max_software_gain_value = 2000; + iodev = alsa_iodev_create_with_default_parameters( + 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, + CRAS_STREAM_INPUT); + ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); + EXPECT_EQ(1, iodev->active_node->software_volume_needed); + EXPECT_EQ(1000, iodev->active_node->min_software_gain); + EXPECT_EQ(2000, iodev->active_node->max_software_gain); + ASSERT_EQ(1, sys_set_capture_gain_limits_called); + /* The gain range is [minimum software gain, maximum software gain]. */ + ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[0], 1000); + ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[1], 2000); - // Set intrinsic sensitivity to -2700 * 0.01 dBFS/Pa. - ucm_get_intrinsic_sensitivity_values[INTERNAL_MICROPHONE] = - intrinsic_sensitivity; + alsa_iodev_destroy(iodev); + + /* MinSoftwareGain is larger than MaxSoftwareGain in UCM. */ + ResetStubData(); + ucm_get_min_software_gain_ret_value = 0; + ucm_get_min_software_gain_value = 3000; + ucm_get_max_software_gain_ret_value = 0; + ucm_get_max_software_gain_value = 2000; + iodev = alsa_iodev_create_with_default_parameters( + 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, + CRAS_STREAM_INPUT); + ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); + EXPECT_EQ(1, iodev->active_node->software_volume_needed); + EXPECT_EQ(DEFAULT_MIN_CAPTURE_GAIN, iodev->active_node->min_software_gain); + EXPECT_EQ(2000, iodev->active_node->max_software_gain); + ASSERT_EQ(1, sys_set_capture_gain_limits_called); + /* The gain range is [DEFAULT_MIN_CAPTURE_GAIN, maximum software gain]. */ + ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[0], + DEFAULT_MIN_CAPTURE_GAIN); + ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[1], 2000); + + alsa_iodev_destroy(iodev); + + /* MaxSoftwareGain is not specified in UCM. */ + ResetStubData(); + ucm_get_max_software_gain_ret_value = 1; + ucm_get_max_software_gain_value = 1; + cras_alsa_mixer_get_minimum_capture_gain_ret_value = -500; + cras_alsa_mixer_get_maximum_capture_gain_ret_value = 500; + iodev = alsa_iodev_create_with_default_parameters( + 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, + CRAS_STREAM_INPUT); + ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); + EXPECT_EQ(0, iodev->active_node->software_volume_needed); + EXPECT_EQ(0, iodev->active_node->max_software_gain); + ASSERT_EQ(1, sys_set_capture_gain_limits_called); + /* The gain range is reported by controls. */ + ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[0], -500); + ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[1], 500); + + alsa_iodev_destroy(iodev); +} + +TEST(AlsaIoInit, SoftwareGainWithDefaultNodeGain) { + struct cras_iodev* iodev; + struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3; + long system_gain = 500; + long default_node_gain = -1000; + + ResetStubData(); + + // Use software gain. + ucm_get_max_software_gain_ret_value = 0; + ucm_get_max_software_gain_value = 2000; + + // Set default node gain to -1000 * 0.01 dB. + ucm_get_default_node_gain_values[INTERNAL_MICROPHONE] = default_node_gain; // Assume this is the first device so it gets internal mic node name. iodev = alsa_iodev_create_with_default_parameters( 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, CRAS_STREAM_INPUT); ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); - ASSERT_EQ(intrinsic_sensitivity, iodev->active_node->intrinsic_sensitivity); - ASSERT_EQ(DEFAULT_CAPTURE_VOLUME_DBFS - intrinsic_sensitivity, - iodev->active_node->capture_gain); + + // Gain on node is 300 * 0.01 dB. + iodev->active_node->capture_gain = default_node_gain; + + // cras_iodev will call cras_iodev_adjust_active_node_gain to get gain for + // software gain. + ASSERT_EQ(system_gain + default_node_gain, + cras_iodev_adjust_active_node_gain(iodev, system_gain)); alsa_iodev_destroy(iodev); } @@ -506,8 +613,7 @@ TEST(AlsaIoInit, RouteBasedOnJackCallback) { ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio)); EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); - /* Call cras_alsa_fill_properties once on update_max_supported_channels. */ - EXPECT_EQ(1, cras_alsa_fill_properties_called); + EXPECT_EQ(0, cras_alsa_fill_properties_called); EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called); EXPECT_EQ(1, cras_alsa_jack_list_create_called); EXPECT_EQ(1, cras_alsa_jack_list_find_jacks_by_name_matching_called); @@ -536,8 +642,7 @@ TEST(AlsaIoInit, RouteBasedOnInputJackCallback) { ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio)); EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream); - /* Call cras_alsa_fill_properties once on update_max_supported_channels. */ - EXPECT_EQ(1, cras_alsa_fill_properties_called); + EXPECT_EQ(0, cras_alsa_fill_properties_called); EXPECT_EQ(1, cras_alsa_jack_list_create_called); EXPECT_EQ(1, cras_alsa_jack_list_find_jacks_by_name_matching_called); EXPECT_EQ(0, cras_alsa_jack_list_add_jack_for_section_called); @@ -564,8 +669,7 @@ TEST(AlsaIoInit, InitializeCapture) { ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio)); EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream); - /* Call cras_alsa_fill_properties once on update_max_supported_channels. */ - EXPECT_EQ(1, cras_alsa_fill_properties_called); + EXPECT_EQ(0, cras_alsa_fill_properties_called); EXPECT_EQ(1, cras_alsa_mixer_list_inputs_called); alsa_iodev_destroy((struct cras_iodev*)aio); @@ -593,6 +697,8 @@ TEST(AlsaIoInit, OpenCapture) { EXPECT_EQ(1, cras_alsa_open_called); EXPECT_EQ(1, cras_alsa_mixer_get_minimum_capture_gain_called); EXPECT_EQ(1, cras_alsa_mixer_get_maximum_capture_gain_called); + EXPECT_EQ(1, sys_set_capture_gain_limits_called); + EXPECT_EQ(1, sys_get_capture_gain_called); EXPECT_EQ(1, alsa_mixer_set_capture_dBFS_called); EXPECT_EQ(1, sys_get_capture_mute_called); EXPECT_EQ(1, alsa_mixer_set_capture_mute_called); @@ -608,7 +714,8 @@ TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithDefaultNodeGain) { struct cras_iodev* iodev; struct cras_audio_format format; struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3; - long default_node_gain = 1000; + long system_gain = 2000; + long default_node_gain = -1000; ResetStubData(); // Set default node gain to -1000 * 0.01 dB. @@ -624,24 +731,15 @@ TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithDefaultNodeGain) { // Check the default node gain is the same as what specified in UCM. EXPECT_EQ(default_node_gain, iodev->active_node->capture_gain); - cras_alsa_mixer_get_minimum_capture_gain_ret_value = 0; - cras_alsa_mixer_get_maximum_capture_gain_ret_value = 2000; - - iodev->open_dev(iodev); - iodev->configure_dev(iodev); - iodev->close_dev(iodev); - - // Hardware gain is in the hardware gain range and set to 1000 * 0.01 dB. - EXPECT_EQ(default_node_gain, alsa_mixer_set_capture_dBFS_value); - - // Check we do respect the hardware maximum capture gain. - cras_alsa_mixer_get_maximum_capture_gain_ret_value = 500; + // System gain is set to 2000 * 0.01 dB. + sys_get_capture_gain_return_value = system_gain; iodev->open_dev(iodev); iodev->configure_dev(iodev); iodev->close_dev(iodev); - EXPECT_EQ(500, alsa_mixer_set_capture_dBFS_value); + // Hardware gain is set to (2000 - 1000) * 0.01 dB. + EXPECT_EQ(system_gain + default_node_gain, alsa_mixer_set_capture_dBFS_value); alsa_iodev_destroy(iodev); free(fake_format); @@ -654,6 +752,8 @@ TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithSoftwareGain) { /* Meet the requirements of using software gain. */ ResetStubData(); + ucm_get_max_software_gain_ret_value = 0; + ucm_get_max_software_gain_value = 2000; iodev = alsa_iodev_create_with_default_parameters( 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, @@ -664,6 +764,9 @@ TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithSoftwareGain) { format.num_channels = 1; cras_iodev_set_format(iodev, &format); + /* System gain is set to 1000 * 0.01 dB */ + sys_get_capture_gain_return_value = 1000; + iodev->open_dev(iodev); iodev->configure_dev(iodev); iodev->close_dev(iodev); @@ -673,43 +776,12 @@ TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithSoftwareGain) { /* Test the case where software gain is not needed. */ iodev->active_node->software_volume_needed = 0; - iodev->active_node->capture_gain = 1000; iodev->open_dev(iodev); iodev->configure_dev(iodev); iodev->close_dev(iodev); - /* Hardware gain is set to 1000 * 0.01 dB as got from catpure_gain.*/ - EXPECT_EQ(0, alsa_mixer_set_capture_dBFS_value); - - alsa_iodev_destroy(iodev); - free(fake_format); -} - -TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithDefaultUsbDevice) { - struct cras_iodev* iodev; - struct cras_audio_format format; - - iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB, - 0, fake_mixer, fake_config, - NULL, CRAS_STREAM_INPUT); - ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); - - format.frame_rate = 48000; - format.num_channels = 1; - cras_iodev_set_format(iodev, &format); - - iodev->active_node->intrinsic_sensitivity = DEFAULT_CAPTURE_VOLUME_DBFS; - iodev->active_node->capture_gain = 0; - - ResetStubData(); - iodev->open_dev(iodev); - iodev->configure_dev(iodev); - - EXPECT_EQ(1, sys_get_capture_mute_called); - EXPECT_EQ(1, alsa_mixer_set_capture_mute_called); - - /* Not change mixer controls for USB devices without UCM config. */ - EXPECT_EQ(0, alsa_mixer_set_capture_dBFS_called); + /* Hardware gain is set to 1000 * 0.01 dB as got from system capture gain.*/ + EXPECT_EQ(1000, alsa_mixer_set_capture_dBFS_value); alsa_iodev_destroy(iodev); free(fake_format); @@ -783,6 +855,7 @@ TEST(AlsaIoInit, DspNameDefault) { struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3; ResetStubData(); + ucm_get_dsp_name_default_value = "hello"; aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters( 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, CRAS_STREAM_OUTPUT); @@ -790,17 +863,19 @@ TEST(AlsaIoInit, DspNameDefault) { EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); EXPECT_EQ(1, ucm_get_dsp_name_for_dev_called); - EXPECT_STREQ("", cras_iodev_update_dsp_name); + EXPECT_EQ(1, ucm_get_dsp_name_default_called); + EXPECT_STREQ("hello", cras_iodev_update_dsp_name); alsa_iodev_destroy((struct cras_iodev*)aio); } -TEST(AlsaIoInit, DspName) { +TEST(AlsaIoInit, DspNameWithoutDefault) { struct alsa_io* aio; struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2; struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3; ResetStubData(); + ucm_get_dsp_name_default_value = NULL; ucm_get_dsp_name_for_dev_values[DEFAULT] = "hello"; aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters( 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, @@ -809,6 +884,7 @@ TEST(AlsaIoInit, DspName) { EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); EXPECT_EQ(1, ucm_get_dsp_name_for_dev_called); + EXPECT_EQ(1, ucm_get_dsp_name_default_called); EXPECT_STREQ("hello", cras_iodev_update_dsp_name); alsa_iodev_destroy((struct cras_iodev*)aio); @@ -822,14 +898,16 @@ TEST(AlsaIoInit, DspNameJackOverride) { static const char* jack_name = "jack"; ResetStubData(); + ucm_get_dsp_name_default_value = "default_dsp"; aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters( 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, CRAS_STREAM_OUTPUT); ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio)); EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); EXPECT_EQ(1, ucm_get_dsp_name_for_dev_called); + EXPECT_EQ(1, ucm_get_dsp_name_default_called); EXPECT_EQ(1, cras_iodev_update_dsp_called); - EXPECT_STREQ("", cras_iodev_update_dsp_name); + EXPECT_STREQ("default_dsp", cras_iodev_update_dsp_name); cras_alsa_jack_get_name_ret_value = jack_name; ucm_get_dsp_name_for_dev_values[jack_name] = "override_dsp"; @@ -837,6 +915,7 @@ TEST(AlsaIoInit, DspNameJackOverride) { cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data); EXPECT_EQ(2, cras_alsa_jack_get_name_called); EXPECT_EQ(2, ucm_get_dsp_name_for_dev_called); + EXPECT_EQ(1, ucm_get_dsp_name_default_called); // Mark the jack node as active. alsa_iodev_set_active_node(&aio->base, aio->base.nodes->next, 1); @@ -846,9 +925,10 @@ TEST(AlsaIoInit, DspNameJackOverride) { // Mark the default node as active. alsa_iodev_set_active_node(&aio->base, aio->base.nodes, 1); + EXPECT_EQ(1, ucm_get_dsp_name_default_called); EXPECT_EQ(2, ucm_get_dsp_name_for_dev_called); EXPECT_EQ(3, cras_iodev_update_dsp_called); - EXPECT_STREQ("", cras_iodev_update_dsp_name); + EXPECT_STREQ("default_dsp", cras_iodev_update_dsp_name); alsa_iodev_destroy((struct cras_iodev*)aio); } @@ -911,30 +991,6 @@ TEST(AlsaIoInit, SwapMode) { free(fake_node); } -TEST(AlsaIoInit, MaxSupportedChannels) { - struct alsa_io* aio; - struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2; - int i; - - // i = 0: cras_alsa_support_8_channels is false, support 2 channels only. - // i = 1: cras_alsa_support_8_channels is true, support up to 8 channels. - for (i = 0; i < 2; i++) { - ResetStubData(); - cras_alsa_support_8_channels = (bool)i; - - aio = (struct alsa_io*)alsa_iodev_create_with_default_parameters( - 0, test_dev_id, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, - NULL, CRAS_STREAM_OUTPUT); - ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev*)aio)); - /* Call cras_alsa_fill_properties once on update_max_supported_channels. */ - EXPECT_EQ(1, cras_alsa_fill_properties_called); - uint32_t max_channels = (cras_alsa_support_8_channels) ? 8 : 2; - EXPECT_EQ(max_channels, aio->base.info.max_supported_channels); - alsa_iodev_destroy((struct cras_iodev*)aio); - EXPECT_EQ(1, cras_iodev_free_resources_called); - } -} - // Test that system settins aren't touched if no streams active. TEST(AlsaOutputNode, SystemSettingsWhenInactive) { int rc; @@ -1039,8 +1095,8 @@ TEST(AlsaOutputNode, TwoJacksHeadphoneLineout) { EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called); // First node 'Headphone' - section = ucm_section_create(HEADPHONE, "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT, - "fake-jack", "gpio"); + section = + ucm_section_create(HEADPHONE, 0, CRAS_STREAM_OUTPUT, "fake-jack", "gpio"); ucm_section_set_mixer_name(section, HEADPHONE); cras_alsa_jack_list_add_jack_for_section_result_jack = reinterpret_cast<struct cras_alsa_jack*>(10); @@ -1050,8 +1106,8 @@ TEST(AlsaOutputNode, TwoJacksHeadphoneLineout) { ucm_section_free_list(section); // Second node 'Line Out' - section = ucm_section_create("Line Out", "hw:0.1", 0, -1, CRAS_STREAM_OUTPUT, - "fake-jack", "gpio"); + section = ucm_section_create("Line Out", 0, CRAS_STREAM_OUTPUT, "fake-jack", + "gpio"); ucm_section_set_mixer_name(section, HEADPHONE); cras_alsa_jack_list_add_jack_for_section_result_jack = reinterpret_cast<struct cras_alsa_jack*>(20); @@ -1072,43 +1128,6 @@ TEST(AlsaOutputNode, TwoJacksHeadphoneLineout) { alsa_iodev_destroy(iodev); } -TEST(AlsaOutputNode, MaxSupportedChannels) { - struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3; - struct cras_iodev* iodev; - struct ucm_section* section; - int i; - - // i = 0: cras_alsa_support_8_channels is false, support 2 channels only. - // i = 1: cras_alsa_support_8_channels is true, support up to 8 channels. - for (i = 0; i < 2; i++) { - ResetStubData(); - cras_alsa_support_8_channels = (bool)i; - - // Create the IO device. - iodev = alsa_iodev_create_with_default_parameters( - 1, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, - CRAS_STREAM_OUTPUT); - ASSERT_NE(iodev, (void*)NULL); - - // Node without controls or jacks. - section = ucm_section_create(INTERNAL_SPEAKER, "hw:0,1", 1, -1, - CRAS_STREAM_OUTPUT, NULL, NULL); - // Device index doesn't match. - EXPECT_EQ(-22, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); - section->dev_idx = 0; - ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); - ucm_section_free_list(section); - - // Complete initialization, and make first node active. - alsa_iodev_ucm_complete_init(iodev); - /* Call cras_alsa_fill_properties once on update_max_supported_channels. */ - EXPECT_EQ(1, cras_alsa_fill_properties_called); - uint32_t max_channels = (cras_alsa_support_8_channels) ? 8 : 2; - EXPECT_EQ(max_channels, iodev->info.max_supported_channels); - alsa_iodev_destroy(iodev); - } -} - TEST(AlsaOutputNode, OutputsFromUCM) { struct alsa_io* aio; struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2; @@ -1137,8 +1156,8 @@ TEST(AlsaOutputNode, OutputsFromUCM) { EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called); // First node. - section = ucm_section_create(INTERNAL_SPEAKER, "hw:0,1", 0, -1, - CRAS_STREAM_OUTPUT, NULL, NULL); + section = + ucm_section_create(INTERNAL_SPEAKER, 0, CRAS_STREAM_OUTPUT, NULL, NULL); ucm_section_set_mixer_name(section, INTERNAL_SPEAKER); cras_alsa_jack_list_add_jack_for_section_result_jack = reinterpret_cast<struct cras_alsa_jack*>(1); @@ -1148,8 +1167,8 @@ TEST(AlsaOutputNode, OutputsFromUCM) { EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); // Add a second node (will use the same iodev). - section = ucm_section_create(HEADPHONE, "hw:0,2", 0, -1, CRAS_STREAM_OUTPUT, - jack_name, "hctl"); + section = + ucm_section_create(HEADPHONE, 0, CRAS_STREAM_OUTPUT, jack_name, "hctl"); ucm_section_add_coupled(section, "HP-L", MIXER_NAME_VOLUME); ucm_section_add_coupled(section, "HP-R", MIXER_NAME_VOLUME); cras_alsa_jack_list_add_jack_for_section_result_jack = NULL; @@ -1167,16 +1186,12 @@ TEST(AlsaOutputNode, OutputsFromUCM) { EXPECT_EQ(0, cras_iodev_set_node_plugged_called); // Complete initialization, and make first node active. - cras_alsa_support_8_channels = false; // Support 2 channels only. alsa_iodev_ucm_complete_init(iodev); EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); EXPECT_EQ(2, cras_alsa_jack_list_add_jack_for_section_called); EXPECT_EQ(2, cras_alsa_mixer_get_control_for_section_called); EXPECT_EQ(1, ucm_get_dma_period_for_dev_called); EXPECT_EQ(ucm_get_dma_period_for_dev_ret, aio->dma_period_set_microsecs); - /* Call cras_alsa_fill_properties once on update_max_supported_channels. */ - EXPECT_EQ(1, cras_alsa_fill_properties_called); - EXPECT_EQ(2, iodev->info.max_supported_channels); aio->handle = (snd_pcm_t*)0x24; @@ -1197,14 +1212,10 @@ TEST(AlsaOutputNode, OutputsFromUCM) { EXPECT_EQ(1, ucm_set_enabled_called); // Simulate jack plug event. - cras_alsa_support_8_channels = true; // Support up to 8 channels. cras_alsa_jack_get_mixer_output_ret = outputs[1]; cras_alsa_jack_get_name_ret_value = jack_name; jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack*>(4), 0, aio); EXPECT_EQ(1, cras_iodev_set_node_plugged_called); - /* Headphone plug event shouldn't trigger update_max_supported_channels. */ - EXPECT_EQ(0, cras_alsa_fill_properties_called); - EXPECT_EQ(2, iodev->info.max_supported_channels); alsa_iodev_destroy(iodev); } @@ -1226,8 +1237,8 @@ TEST(AlsaOutputNode, OutputNoControlsUCM) { EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called); // Node without controls or jacks. - section = ucm_section_create(INTERNAL_SPEAKER, "hw:0,1", 1, -1, - CRAS_STREAM_OUTPUT, NULL, NULL); + section = + ucm_section_create(INTERNAL_SPEAKER, 1, CRAS_STREAM_OUTPUT, NULL, NULL); // Device index doesn't match. EXPECT_EQ(-22, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); section->dev_idx = 0; @@ -1268,8 +1279,8 @@ TEST(AlsaOutputNode, OutputFromJackUCM) { // Node without controls or jacks. cras_alsa_jack_list_add_jack_for_section_result_jack = reinterpret_cast<struct cras_alsa_jack*>(1); - section = ucm_section_create(HEADPHONE, "hw:0,1", 0, -1, CRAS_STREAM_OUTPUT, - jack_name, "hctl"); + section = + ucm_section_create(HEADPHONE, 0, CRAS_STREAM_OUTPUT, jack_name, "hctl"); ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called); @@ -1297,7 +1308,6 @@ TEST(AlsaOutputNode, InputsFromUCM) { static const char* jack_name = "TestCard - Headset Jack"; int rc; struct ucm_section* section; - long intrinsic_sensitivity = -2700; ResetStubData(); inputs[0] = reinterpret_cast<struct mixer_control*>(3); @@ -1316,8 +1326,9 @@ TEST(AlsaOutputNode, InputsFromUCM) { // First node. cras_alsa_mixer_get_control_for_section_return_value = inputs[0]; - section = ucm_section_create(INTERNAL_MICROPHONE, "hw:0,1", 0, -1, - CRAS_STREAM_INPUT, NULL, NULL); + ucm_get_max_software_gain_ret_value = -1; + section = + ucm_section_create(INTERNAL_MICROPHONE, 0, CRAS_STREAM_INPUT, NULL, NULL); ucm_section_add_coupled(section, "MIC-L", MIXER_NAME_VOLUME); ucm_section_add_coupled(section, "MIC-R", MIXER_NAME_VOLUME); ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); @@ -1325,18 +1336,17 @@ TEST(AlsaOutputNode, InputsFromUCM) { // Add a second node (will use the same iodev). cras_alsa_mixer_get_control_name_called = 0; - // Set intrinsic sensitivity to enable software gain. - ucm_get_intrinsic_sensitivity_values[MIC] = intrinsic_sensitivity; + ucm_get_max_software_gain_ret_value = 0; + ucm_get_max_software_gain_value = 2000; cras_alsa_jack_list_add_jack_for_section_result_jack = reinterpret_cast<struct cras_alsa_jack*>(1); cras_alsa_mixer_get_control_for_section_return_value = inputs[1]; - section = ucm_section_create(MIC, "hw:0,2", 0, -1, CRAS_STREAM_INPUT, - jack_name, "hctl"); + section = ucm_section_create(MIC, 0, CRAS_STREAM_INPUT, jack_name, "hctl"); ucm_section_set_mixer_name(section, MIC); ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); ucm_section_free_list(section); - // Jack plug of an unknown device should do nothing. + // Jack plug of an unkonwn device should do nothing. cras_alsa_jack_get_mixer_input_ret = NULL; cras_alsa_jack_get_name_ret_value = "Some other jack"; jack_input_plug_event(reinterpret_cast<struct cras_alsa_jack*>(4), 0, aio); @@ -1354,6 +1364,7 @@ TEST(AlsaOutputNode, InputsFromUCM) { EXPECT_EQ(2, cras_alsa_jack_list_add_jack_for_section_called); EXPECT_EQ(2, cras_alsa_mixer_get_control_for_section_called); EXPECT_EQ(1, cras_alsa_mixer_get_control_name_called); + EXPECT_EQ(1, sys_set_capture_gain_limits_called); EXPECT_EQ(2, cras_iodev_add_node_called); EXPECT_EQ(2, ucm_get_dma_period_for_dev_called); EXPECT_EQ(0, aio->dma_period_set_microsecs); @@ -1369,9 +1380,10 @@ TEST(AlsaOutputNode, InputsFromUCM) { EXPECT_EQ(1, cras_iodev_update_dsp_called); EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called); EXPECT_EQ(1, ucm_set_enabled_called); + EXPECT_EQ(1, sys_set_capture_gain_limits_called); EXPECT_EQ(1, alsa_mixer_set_capture_mute_called); - ASSERT_EQ(DEFAULT_CAPTURE_VOLUME_DBFS - intrinsic_sensitivity, - iodev->active_node->capture_gain); + EXPECT_EQ(1, iodev->active_node->software_volume_needed); + EXPECT_EQ(2000, iodev->active_node->max_software_gain); alsa_iodev_destroy(iodev); } @@ -1392,8 +1404,8 @@ TEST(AlsaOutputNode, InputNoControlsUCM) { aio = reinterpret_cast<struct alsa_io*>(iodev); // Node without controls or jacks. - section = ucm_section_create(INTERNAL_MICROPHONE, "hw:0,1", 1, -1, - CRAS_STREAM_INPUT, NULL, NULL); + section = + ucm_section_create(INTERNAL_MICROPHONE, 1, CRAS_STREAM_INPUT, NULL, NULL); // Device index doesn't match. EXPECT_EQ(-22, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); section->dev_idx = 0; @@ -1434,8 +1446,7 @@ TEST(AlsaOutputNode, InputFromJackUCM) { // Node without controls or jacks. cras_alsa_jack_list_add_jack_for_section_result_jack = reinterpret_cast<struct cras_alsa_jack*>(1); - section = ucm_section_create(MIC, "hw:0,1", 0, -1, CRAS_STREAM_INPUT, - jack_name, "hctl"); + section = ucm_section_create(MIC, 0, CRAS_STREAM_INPUT, jack_name, "hctl"); ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called); EXPECT_EQ(1, cras_iodev_add_node_called); @@ -1543,83 +1554,6 @@ TEST(AlsaOutputNode, AutoUnplugInputNode) { alsa_iodev_destroy((struct cras_iodev*)aio); } -TEST(AlsaLoopback, InitializePlayback) { - struct alsa_io* aio; - struct cras_alsa_mixer* const fake_mixer = (struct cras_alsa_mixer*)2; - struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3; - struct cras_iodev* iodev; - static const char* jack_name = "TestCard - Alsa Loopback"; - struct mixer_control* outputs[1]; - struct ucm_section* section; - - ResetStubData(); - outputs[0] = reinterpret_cast<struct mixer_control*>(3); - cras_alsa_mixer_list_outputs_outputs = outputs; - cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs); - cras_alsa_mixer_get_control_name_values[outputs[0]] = LOOPBACK_PLAYBACK; - - // Create the IO device. - iodev = alsa_iodev_create_with_default_parameters( - 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, - CRAS_STREAM_OUTPUT); - ASSERT_NE(iodev, (void*)NULL); - aio = reinterpret_cast<struct alsa_io*>(iodev); - - // Add node. - section = ucm_section_create(LOOPBACK_PLAYBACK, "hw:0,1", 0, -1, - CRAS_STREAM_OUTPUT, jack_name, NULL); - ucm_section_set_mixer_name(section, LOOPBACK_PLAYBACK); - cras_alsa_jack_list_add_jack_for_section_result_jack = NULL; - cras_alsa_mixer_get_control_for_section_return_value = outputs[0]; - ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); - ucm_section_free_list(section); - - // Complete initialization, and check the loopback playback node is plugged as - // the active node. - alsa_iodev_ucm_complete_init(iodev); - EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); - ASSERT_NE(aio->base.active_node, (void*)NULL); - EXPECT_STREQ(LOOPBACK_PLAYBACK, aio->base.active_node->name); - EXPECT_EQ(1, aio->base.active_node->plugged); - - alsa_iodev_destroy(iodev); -} - -TEST(AlsaLoopback, InitializeCapture) { - struct alsa_io* aio; - struct cras_use_case_mgr* const fake_ucm = (struct cras_use_case_mgr*)3; - struct cras_iodev* iodev; - static const char* jack_name = "TestCard - Alsa Loopback"; - struct ucm_section* section; - - ResetStubData(); - - // Create the IO device. - iodev = alsa_iodev_create_with_default_parameters( - 1, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, - CRAS_STREAM_INPUT); - ASSERT_NE(iodev, (void*)NULL); - aio = reinterpret_cast<struct alsa_io*>(iodev); - - // Node without controls or jacks. - cras_alsa_jack_list_add_jack_for_section_result_jack = - reinterpret_cast<struct cras_alsa_jack*>(1); - section = ucm_section_create(LOOPBACK_CAPTURE, "hw:0,1", 0, -1, - CRAS_STREAM_INPUT, jack_name, NULL); - ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); - ucm_section_free_list(section); - - // Complete initialization, and check the loopback capture node is plugged as - // the active node. - alsa_iodev_ucm_complete_init(iodev); - EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream); - ASSERT_NE(aio->base.active_node, (void*)NULL); - EXPECT_STREQ(LOOPBACK_CAPTURE, aio->base.active_node->name); - EXPECT_EQ(1, aio->base.active_node->plugged); - - alsa_iodev_destroy(iodev); -} - TEST(AlsaInitNode, SetNodeInitialState) { struct cras_ionode node; struct cras_iodev dev; @@ -1933,6 +1867,11 @@ TEST_F(AlsaVolumeMuteSuite, GetVolumeCurveFromNode) { .get_dBFS = fake_get_dBFS, }; + fmt = (struct cras_audio_format*)malloc(sizeof(*fmt)); + memcpy(fmt, &fmt_, sizeof(fmt_)); + aio_output_->base.format = fmt; + aio_output_->handle = (snd_pcm_t*)0x24; + // Headphone jack plugged and has its own volume curve. cras_alsa_jack_get_mixer_output_ret = NULL; cras_alsa_jack_get_name_ret_value = HEADPHONE; @@ -1941,16 +1880,6 @@ TEST_F(AlsaVolumeMuteSuite, GetVolumeCurveFromNode) { EXPECT_EQ(1, cras_alsa_jack_update_node_type_called); EXPECT_EQ(3, cras_card_config_get_volume_curve_for_control_called); - // These settings should be placed after plugging jacks to make it safer. - // If is HDMI jack, plug event will trigger update_max_supported_channels() - // and do open_dev() and close_dev() once. close_dev() will perform alsa_io - // cleanup. - // Headphone jack won't trigger, but we still place here due to coherence. - fmt = (struct cras_audio_format*)malloc(sizeof(*fmt)); - memcpy(fmt, &fmt_, sizeof(fmt_)); - aio_output_->base.format = fmt; - aio_output_->handle = (snd_pcm_t*)0x24; - // Switch to node 'Headphone'. node = aio_output_->base.nodes->next; aio_output_->base.active_node = node; @@ -1975,6 +1904,7 @@ TEST_F(AlsaVolumeMuteSuite, SetVolume) { aio_output_->base.format = fmt; aio_output_->handle = (snd_pcm_t*)0x24; + aio_output_->num_underruns = 3; // Something non-zero. sys_get_volume_return_value = fake_system_volume; rc = aio_output_->base.configure_dev(&aio_output_->base); ASSERT_EQ(0, rc); @@ -2055,7 +1985,6 @@ class AlsaFreeRunTestSuite : public testing::Test { fmt_.frame_rate = 48000; fmt_.num_channels = 2; aio.base.frames_queued = frames_queued; - aio.base.output_underrun = alsa_output_underrun; aio.base.direction = CRAS_STREAM_OUTPUT; aio.base.format = &fmt_; aio.base.buffer_size = BUFFER_SIZE; @@ -2207,7 +2136,6 @@ TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunNotInFreeRunMoreRemain) { EXPECT_EQ(0, cras_iodev_fill_odev_zeros_frames); EXPECT_EQ(0, aio.free_running); EXPECT_EQ(0, aio.filled_zeros_for_draining); - EXPECT_EQ(1, cras_iodev_reset_rate_estimator_called); } TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunNotInFreeRunLessRemain) { @@ -2232,7 +2160,6 @@ TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunNotInFreeRunLessRemain) { EXPECT_EQ(96, cras_iodev_fill_odev_zeros_frames); EXPECT_EQ(0, aio.free_running); EXPECT_EQ(0, aio.filled_zeros_for_draining); - EXPECT_EQ(1, cras_iodev_reset_rate_estimator_called); } TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunInFreeRun) { @@ -2250,7 +2177,6 @@ TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunInFreeRun) { cras_alsa_resume_appl_ptr_ahead); EXPECT_EQ(0, aio.free_running); EXPECT_EQ(0, aio.filled_zeros_for_draining); - EXPECT_EQ(1, cras_iodev_reset_rate_estimator_called); } // Reuse AlsaFreeRunTestSuite for output underrun handling because they are @@ -2260,9 +2186,12 @@ TEST_F(AlsaFreeRunTestSuite, OutputUnderrun) { int16_t* zeros; snd_pcm_uframes_t offset; + aio.num_underruns = 0; + // Ask alsa_io to handle output underrun. rc = alsa_output_underrun(&aio.base); EXPECT_EQ(0, rc); + EXPECT_EQ(1, aio.num_underruns); // mmap buffer should be filled with zeros. zeros = (int16_t*)calloc(BUFFER_SIZE * 2, sizeof(*zeros)); @@ -2306,7 +2235,7 @@ TEST(AlsaHotwordNode, HotwordTriggeredSendMessage) { ASSERT_EQ(0, rc); ASSERT_NE(reinterpret_cast<thread_callback>(NULL), audio_thread_cb); - audio_thread_cb(audio_thread_cb_data, POLLIN); + audio_thread_cb(audio_thread_cb_data); EXPECT_EQ(1, hotword_send_triggered_msg_called); alsa_iodev_destroy(iodev); } @@ -2442,21 +2371,9 @@ int cras_alsa_fill_properties(snd_pcm_t* handle, (*rates)[0] = 44100; (*rates)[1] = 48000; (*rates)[2] = 0; - - if (cras_alsa_support_8_channels) { // Support up to 8 channels. - *channel_counts = (size_t*)malloc(sizeof(**channel_counts) * 6); - (*channel_counts)[0] = 6; - (*channel_counts)[1] = 4; - (*channel_counts)[2] = 2; - (*channel_counts)[3] = 1; - (*channel_counts)[4] = 8; - (*channel_counts)[5] = 0; - } else { // Support 2 channels only. - *channel_counts = (size_t*)malloc(sizeof(**channel_counts) * 2); - (*channel_counts)[0] = 2; - (*channel_counts)[1] = 0; - } - + *channel_counts = (size_t*)malloc(sizeof(**channel_counts) * 2); + (*channel_counts)[0] = 2; + (*channel_counts)[1] = 0; *formats = (snd_pcm_format_t*)malloc(sizeof(**formats) * 2); (*formats)[0] = SND_PCM_FORMAT_S16_LE; (*formats)[1] = (snd_pcm_format_t)0; @@ -2471,7 +2388,7 @@ int cras_alsa_set_hwparams(snd_pcm_t* handle, unsigned int dma_period_time) { return 0; } -int cras_alsa_set_swparams(snd_pcm_t* handle) { +int cras_alsa_set_swparams(snd_pcm_t* handle, int* enable_htimestamp) { return 0; } int cras_alsa_get_avail_frames(snd_pcm_t* handle, @@ -2545,6 +2462,11 @@ size_t cras_system_get_volume() { return sys_get_volume_return_value; } +long cras_system_get_capture_gain() { + sys_get_capture_gain_called++; + return sys_get_capture_gain_return_value; +} + int cras_system_get_mute() { sys_get_mute_called++; return sys_get_mute_return_value; @@ -2559,8 +2481,10 @@ void cras_system_set_volume_limits(long min, long max) { sys_set_volume_limits_called++; } -bool cras_system_get_noise_cancellation_enabled() { - return false; +void cras_system_set_capture_gain_limits(long min, long max) { + cras_system_set_capture_gain_limits_set_value[0] = min; + cras_system_set_capture_gain_limits_set_value[1] = max; + sys_set_capture_gain_limits_called++; } // From cras_alsa_mixer. @@ -2711,6 +2635,15 @@ const char* cras_alsa_jack_get_name(const struct cras_alsa_jack* jack) { return cras_alsa_jack_get_name_ret_value; } +const char* ucm_get_dsp_name_default(struct cras_use_case_mgr* mgr, + int direction) { + ucm_get_dsp_name_default_called++; + if (ucm_get_dsp_name_default_value) + return strdup(ucm_get_dsp_name_default_value); + else + return NULL; +} + const char* ucm_get_dsp_name_for_dev(struct cras_use_case_mgr* mgr, const char* dev) { DspNameMap::iterator it; @@ -2753,6 +2686,10 @@ char* ucm_get_flag(struct cras_use_case_mgr* mgr, const char* flag_name) { return NULL; } +char* ucm_get_mic_positions(struct cras_use_case_mgr* mgr) { + return NULL; +} + int ucm_swap_mode_exists(struct cras_use_case_mgr* mgr) { return ucm_swap_mode_exists_ret_value; } @@ -2770,10 +2707,30 @@ int ucm_get_min_buffer_level(struct cras_use_case_mgr* mgr, return 0; } +unsigned int ucm_get_enable_htimestamp_flag(struct cras_use_case_mgr* mgr) { + return ucm_get_enable_htimestamp_flag_ret; +} + unsigned int ucm_get_disable_software_volume(struct cras_use_case_mgr* mgr) { return 0; } +int ucm_get_min_software_gain(struct cras_use_case_mgr* mgr, + const char* dev, + long* gain) { + ucm_get_min_software_gain_called++; + *gain = ucm_get_min_software_gain_value; + return ucm_get_min_software_gain_ret_value; +} + +int ucm_get_max_software_gain(struct cras_use_case_mgr* mgr, + const char* dev, + long* gain) { + ucm_get_max_software_gain_called++; + *gain = ucm_get_max_software_gain_value; + return ucm_get_max_software_gain_ret_value; +} + char* ucm_get_hotword_models(struct cras_use_case_mgr* mgr) { return NULL; } @@ -2804,24 +2761,6 @@ int ucm_get_preempt_hotword(struct cras_use_case_mgr* mgr, const char* dev) { return 0; } -int ucm_get_channels_for_dev(struct cras_use_case_mgr* mgr, - const char* dev, - enum CRAS_STREAM_DIRECTION direction, - size_t* channels) { - return -EINVAL; -} - -int ucm_node_noise_cancellation_exists(struct cras_use_case_mgr* mgr, - const char* node_name) { - return 0; -} - -int ucm_enable_node_noise_cancellation(struct cras_use_case_mgr* mgr, - const char* node_name, - int enable) { - return 0; -} - struct cras_volume_curve* cras_volume_curve_create_default() { return &default_curve; } @@ -2858,7 +2797,7 @@ void audio_thread_destroy(audio_thread* thread) {} void cras_iodev_update_dsp(struct cras_iodev* iodev) { cras_iodev_update_dsp_called++; - cras_iodev_update_dsp_name = iodev->dsp_name ?: ""; + cras_iodev_update_dsp_name = iodev->dsp_name; } void cras_iodev_set_node_plugged(struct cras_ionode* ionode, int plugged) { @@ -2903,12 +2842,6 @@ const char* cras_alsa_jack_get_ucm_device(const struct cras_alsa_jack* jack) { return NULL; } -void ucm_disable_all_hotword_models(struct cras_use_case_mgr* mgr) {} - -int ucm_enable_hotword_model(struct cras_use_case_mgr* mgr) { - return 0; -} - int ucm_get_default_node_gain(struct cras_use_case_mgr* mgr, const char* dev, long* gain) { @@ -2920,23 +2853,11 @@ int ucm_get_default_node_gain(struct cras_use_case_mgr* mgr, return 0; } -int ucm_get_intrinsic_sensitivity(struct cras_use_case_mgr* mgr, - const char* dev, - long* vol) { - if (ucm_get_intrinsic_sensitivity_values.find(dev) == - ucm_get_intrinsic_sensitivity_values.end()) - return 1; - - *vol = ucm_get_intrinsic_sensitivity_values[dev]; - return 0; -} - void cras_iodev_init_audio_area(struct cras_iodev* iodev, int num_channels) {} void cras_iodev_free_audio_area(struct cras_iodev* iodev) {} int cras_iodev_reset_rate_estimator(const struct cras_iodev* iodev) { - cras_iodev_reset_rate_estimator_called++; return 0; } @@ -2960,10 +2881,7 @@ void cras_audio_area_config_buf_pointers(struct cras_audio_area* area, const struct cras_audio_format* fmt, uint8_t* base_buffer) {} -void audio_thread_add_events_callback(int fd, - thread_callback cb, - void* data, - int events) { +void audio_thread_add_callback(int fd, thread_callback cb, void* data) { audio_thread_cb = cb; audio_thread_cb_data = data; } @@ -3014,12 +2932,6 @@ int cras_iodev_default_no_stream_playback(struct cras_iodev* odev, int enable) { return 0; } -int cras_iodev_output_underrun(struct cras_iodev* odev, - unsigned int hw_level, - unsigned int frames_written) { - return odev->output_underrun(odev); -} - enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev* iodev) { return iodev->state; } |