summaryrefslogtreecommitdiff
path: root/cras/src/tests/alsa_io_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cras/src/tests/alsa_io_unittest.cc')
-rw-r--r--cras/src/tests/alsa_io_unittest.cc594
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;
}