1 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <gtest/gtest.h> 6 #include <map> 7 #include <stdio.h> 8 #include <syslog.h> 9 #include <vector> 10 11 extern "C" { 12 13 #include "cras_iodev.h" 14 #include "cras_shm.h" 15 #include "cras_system_state.h" 16 #include "cras_types.h" 17 #include "cras_alsa_mixer.h" 18 19 // Include C file to test static functions. 20 #include "cras_alsa_io.c" 21 } 22 23 #define BUFFER_SIZE 8192 24 25 // Data for simulating functions stubbed below. 26 static int cras_alsa_open_called; 27 static int cras_iodev_append_stream_ret; 28 static int cras_alsa_get_avail_frames_ret; 29 static int cras_alsa_get_avail_frames_avail; 30 static int cras_alsa_start_called; 31 static uint8_t *cras_alsa_mmap_begin_buffer; 32 static size_t cras_alsa_mmap_begin_frames; 33 static size_t cras_alsa_fill_properties_called; 34 static size_t alsa_mixer_set_dBFS_called; 35 static int alsa_mixer_set_dBFS_value; 36 static const struct mixer_control *alsa_mixer_set_dBFS_output; 37 static size_t alsa_mixer_set_capture_dBFS_called; 38 static int alsa_mixer_set_capture_dBFS_value; 39 static const struct mixer_control *alsa_mixer_set_capture_dBFS_input; 40 static const struct mixer_control 41 *cras_alsa_mixer_get_minimum_capture_gain_mixer_input; 42 static const struct mixer_control 43 *cras_alsa_mixer_get_maximum_capture_gain_mixer_input; 44 static size_t cras_alsa_mixer_list_outputs_called; 45 static size_t cras_alsa_mixer_list_inputs_called; 46 static size_t cras_alsa_mixer_get_control_for_section_called; 47 static struct mixer_control * 48 cras_alsa_mixer_get_control_for_section_return_value; 49 static size_t sys_get_volume_called; 50 static size_t sys_get_volume_return_value; 51 static size_t sys_get_capture_gain_called; 52 static long sys_get_capture_gain_return_value; 53 static size_t alsa_mixer_set_mute_called; 54 static int alsa_mixer_set_mute_value; 55 static size_t alsa_mixer_get_dB_range_called; 56 static long alsa_mixer_get_dB_range_value; 57 static size_t alsa_mixer_get_output_dB_range_called; 58 static long alsa_mixer_get_output_dB_range_value; 59 static const struct mixer_control *alsa_mixer_set_mute_output; 60 static size_t alsa_mixer_set_capture_mute_called; 61 static int alsa_mixer_set_capture_mute_value; 62 static const struct mixer_control *alsa_mixer_set_capture_mute_input; 63 static size_t sys_get_mute_called; 64 static int sys_get_mute_return_value; 65 static size_t sys_get_capture_mute_called; 66 static int sys_get_capture_mute_return_value; 67 static struct cras_alsa_mixer *fake_mixer = (struct cras_alsa_mixer *)1; 68 static struct cras_card_config *fake_config = (struct cras_card_config *)2; 69 static struct mixer_control **cras_alsa_mixer_list_outputs_outputs; 70 static size_t cras_alsa_mixer_list_outputs_outputs_length; 71 static struct mixer_control **cras_alsa_mixer_list_inputs_outputs; 72 static size_t cras_alsa_mixer_list_inputs_outputs_length; 73 static size_t cras_alsa_mixer_set_output_active_state_called; 74 static std::vector<struct mixer_control *> 75 cras_alsa_mixer_set_output_active_state_outputs; 76 static std::vector<int> cras_alsa_mixer_set_output_active_state_values; 77 static cras_audio_format *fake_format; 78 static size_t sys_set_volume_limits_called; 79 static size_t sys_set_capture_gain_limits_called; 80 static size_t cras_alsa_mixer_get_minimum_capture_gain_called; 81 static size_t cras_alsa_mixer_get_maximum_capture_gain_called; 82 static struct mixer_control *cras_alsa_jack_get_mixer_output_ret; 83 static struct mixer_control *cras_alsa_jack_get_mixer_input_ret; 84 static size_t cras_alsa_mixer_get_output_volume_curve_called; 85 typedef std::map<const struct mixer_control*, std::string> ControlNameMap; 86 static ControlNameMap cras_alsa_mixer_get_control_name_values; 87 static size_t cras_alsa_mixer_get_control_name_called; 88 static size_t cras_alsa_jack_list_create_called; 89 static size_t cras_alsa_jack_list_find_jacks_by_name_matching_called; 90 static size_t cras_alsa_jack_list_add_jack_for_section_called; 91 static struct cras_alsa_jack * 92 cras_alsa_jack_list_add_jack_for_section_result_jack; 93 static size_t cras_alsa_jack_list_destroy_called; 94 static int cras_alsa_jack_list_has_hctl_jacks_return_val; 95 static jack_state_change_callback *cras_alsa_jack_list_create_cb; 96 static void *cras_alsa_jack_list_create_cb_data; 97 static char test_card_name[] = "TestCard"; 98 static char test_dev_name[] = "TestDev"; 99 static char test_dev_id[] = "TestDevId"; 100 static size_t cras_iodev_add_node_called; 101 static struct cras_ionode *cras_iodev_set_node_attr_ionode; 102 static size_t cras_iodev_set_node_attr_called; 103 static enum ionode_attr cras_iodev_set_node_attr_attr; 104 static int cras_iodev_set_node_attr_value; 105 static unsigned cras_alsa_jack_enable_ucm_called; 106 static unsigned ucm_set_enabled_called; 107 static size_t cras_iodev_update_dsp_called; 108 static const char *cras_iodev_update_dsp_name; 109 static size_t ucm_get_dsp_name_default_called; 110 static const char *ucm_get_dsp_name_default_value; 111 static size_t cras_alsa_jack_get_dsp_name_called; 112 static const char *cras_alsa_jack_get_dsp_name_value; 113 static size_t cras_iodev_free_resources_called; 114 static size_t cras_alsa_jack_update_node_type_called; 115 static int ucm_swap_mode_exists_ret_value; 116 static int ucm_enable_swap_mode_ret_value; 117 static size_t ucm_enable_swap_mode_called; 118 static int is_utf8_string_ret_value; 119 static char *cras_alsa_jack_update_monitor_fake_name = 0; 120 static int cras_alsa_jack_get_name_called; 121 static const char *cras_alsa_jack_get_name_ret_value = 0; 122 static char default_jack_name[] = "Something Jack"; 123 static int auto_unplug_input_node_ret = 0; 124 static int auto_unplug_output_node_ret = 0; 125 static int ucm_get_max_software_gain_called; 126 static int ucm_get_max_software_gain_ret_value; 127 static long ucm_get_max_software_gain_value; 128 static long cras_system_set_capture_gain_limits_set_value[2]; 129 static long cras_alsa_mixer_get_minimum_capture_gain_ret_value; 130 static long cras_alsa_mixer_get_maximum_capture_gain_ret_value; 131 static snd_pcm_state_t snd_pcm_state_ret; 132 static int cras_alsa_attempt_resume_called; 133 static snd_hctl_t *fake_hctl = (snd_hctl_t *)2; 134 static size_t ucm_get_dma_period_for_dev_called; 135 static unsigned int ucm_get_dma_period_for_dev_ret; 136 static int cras_card_config_get_volume_curve_for_control_called; 137 typedef std::map<std::string, struct cras_volume_curve *> VolCurveMap; 138 static VolCurveMap cras_card_config_get_volume_curve_vals; 139 static int cras_alsa_mmap_get_whole_buffer_called; 140 static int cras_iodev_fill_odev_zeros_called; 141 static unsigned int cras_iodev_fill_odev_zeros_frames; 142 static int cras_iodev_frames_queued_ret; 143 static int cras_iodev_buffer_avail_ret; 144 static int cras_alsa_resume_appl_ptr_called; 145 static int cras_alsa_resume_appl_ptr_ahead; 146 static int ucm_get_enable_htimestamp_flag_ret; 147 static const struct cras_volume_curve *fake_get_dBFS_volume_curve_val; 148 static int cras_iodev_dsp_set_swap_mode_for_node_called; 149 static std::map<std::string, long> ucm_get_default_node_gain_values; 150 151 void ResetStubData() { 152 cras_alsa_open_called = 0; 153 cras_iodev_append_stream_ret = 0; 154 cras_alsa_get_avail_frames_ret = 0; 155 cras_alsa_get_avail_frames_avail = 0; 156 cras_alsa_start_called = 0; 157 cras_alsa_fill_properties_called = 0; 158 sys_get_volume_called = 0; 159 sys_get_capture_gain_called = 0; 160 alsa_mixer_set_dBFS_called = 0; 161 alsa_mixer_set_capture_dBFS_called = 0; 162 sys_get_mute_called = 0; 163 sys_get_capture_mute_called = 0; 164 alsa_mixer_set_mute_called = 0; 165 alsa_mixer_get_dB_range_called = 0; 166 alsa_mixer_get_output_dB_range_called = 0; 167 alsa_mixer_set_capture_mute_called = 0; 168 cras_alsa_mixer_get_control_for_section_called = 0; 169 cras_alsa_mixer_get_control_for_section_return_value = NULL; 170 cras_alsa_mixer_list_outputs_called = 0; 171 cras_alsa_mixer_list_outputs_outputs_length = 0; 172 cras_alsa_mixer_list_inputs_called = 0; 173 cras_alsa_mixer_list_inputs_outputs_length = 0; 174 cras_alsa_mixer_set_output_active_state_called = 0; 175 cras_alsa_mixer_set_output_active_state_outputs.clear(); 176 cras_alsa_mixer_set_output_active_state_values.clear(); 177 sys_set_volume_limits_called = 0; 178 sys_set_capture_gain_limits_called = 0; 179 sys_get_capture_gain_return_value = 0; 180 cras_alsa_mixer_get_minimum_capture_gain_called = 0; 181 cras_alsa_mixer_get_maximum_capture_gain_called = 0; 182 cras_alsa_mixer_get_output_volume_curve_called = 0; 183 cras_alsa_jack_get_mixer_output_ret = NULL; 184 cras_alsa_jack_get_mixer_input_ret = NULL; 185 cras_alsa_mixer_get_control_name_values.clear(); 186 cras_alsa_mixer_get_control_name_called = 0; 187 cras_alsa_jack_list_create_called = 0; 188 cras_alsa_jack_list_find_jacks_by_name_matching_called = 0; 189 cras_alsa_jack_list_add_jack_for_section_called = 0; 190 cras_alsa_jack_list_add_jack_for_section_result_jack = NULL; 191 cras_alsa_jack_list_destroy_called = 0; 192 cras_alsa_jack_list_has_hctl_jacks_return_val = 1; 193 cras_iodev_add_node_called = 0; 194 cras_iodev_set_node_attr_called = 0; 195 cras_alsa_jack_enable_ucm_called = 0; 196 ucm_set_enabled_called = 0; 197 cras_iodev_update_dsp_called = 0; 198 cras_iodev_update_dsp_name = 0; 199 ucm_get_dsp_name_default_called = 0; 200 ucm_get_dsp_name_default_value = NULL; 201 cras_alsa_jack_get_dsp_name_called = 0; 202 cras_alsa_jack_get_dsp_name_value = NULL; 203 cras_iodev_free_resources_called = 0; 204 cras_alsa_jack_update_node_type_called = 0; 205 ucm_swap_mode_exists_ret_value = 0; 206 ucm_enable_swap_mode_ret_value = 0; 207 ucm_enable_swap_mode_called = 0; 208 is_utf8_string_ret_value = 1; 209 cras_alsa_jack_get_name_called = 0; 210 cras_alsa_jack_get_name_ret_value = default_jack_name; 211 cras_alsa_jack_update_monitor_fake_name = 0; 212 ucm_get_max_software_gain_called = 0; 213 ucm_get_max_software_gain_ret_value = -1; 214 ucm_get_max_software_gain_value = 0; 215 cras_card_config_get_volume_curve_for_control_called = 0; 216 cras_card_config_get_volume_curve_vals.clear(); 217 cras_system_set_capture_gain_limits_set_value[0] = -1; 218 cras_system_set_capture_gain_limits_set_value[1] = -1; 219 cras_alsa_mixer_get_minimum_capture_gain_ret_value = 0; 220 cras_alsa_mixer_get_maximum_capture_gain_ret_value = 0; 221 snd_pcm_state_ret = SND_PCM_STATE_RUNNING; 222 cras_alsa_attempt_resume_called = 0; 223 ucm_get_dma_period_for_dev_called = 0; 224 ucm_get_dma_period_for_dev_ret = 0; 225 cras_alsa_mmap_get_whole_buffer_called = 0; 226 cras_iodev_fill_odev_zeros_called = 0; 227 cras_iodev_fill_odev_zeros_frames = 0; 228 cras_iodev_frames_queued_ret = 0; 229 cras_iodev_buffer_avail_ret = 0; 230 cras_alsa_resume_appl_ptr_called = 0; 231 cras_alsa_resume_appl_ptr_ahead = 0; 232 ucm_get_enable_htimestamp_flag_ret = 0; 233 fake_get_dBFS_volume_curve_val = NULL; 234 cras_iodev_dsp_set_swap_mode_for_node_called = 0; 235 ucm_get_default_node_gain_values.clear(); 236 } 237 238 static long fake_get_dBFS(const struct cras_volume_curve *curve, size_t volume) 239 { 240 fake_get_dBFS_volume_curve_val = curve; 241 return (volume - 100) * 100; 242 } 243 static cras_volume_curve default_curve = { 244 .get_dBFS = fake_get_dBFS, 245 }; 246 247 static struct cras_iodev *alsa_iodev_create_with_default_parameters( 248 size_t card_index, 249 const char *dev_id, 250 enum CRAS_ALSA_CARD_TYPE card_type, 251 int is_first, 252 struct cras_alsa_mixer *mixer, 253 struct cras_card_config *config, 254 struct cras_use_case_mgr *ucm, 255 enum CRAS_STREAM_DIRECTION direction) { 256 return alsa_iodev_create(card_index, test_card_name, 0, test_dev_name, 257 dev_id, card_type, is_first, 258 mixer, config, ucm, fake_hctl, 259 direction, 0, 0, (char *)"123"); 260 } 261 262 namespace { 263 264 TEST(AlsaIoInit, InitializeInvalidDirection) { 265 struct alsa_io *aio; 266 267 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 268 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL, 269 CRAS_NUM_DIRECTIONS); 270 ASSERT_EQ(aio, (void *)NULL); 271 } 272 273 TEST(AlsaIoInit, InitializePlayback) { 274 struct alsa_io *aio; 275 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 276 277 ResetStubData(); 278 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 279 0, test_dev_id, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL, 280 CRAS_STREAM_OUTPUT); 281 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 282 /* Get volume curve twice for iodev, and default node. */ 283 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 284 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 285 EXPECT_EQ(0, cras_alsa_fill_properties_called); 286 EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called); 287 EXPECT_EQ(0, strncmp(test_card_name, 288 aio->base.info.name, 289 strlen(test_card_name))); 290 EXPECT_EQ(0, ucm_get_dsp_name_default_called); 291 EXPECT_EQ(NULL, cras_iodev_update_dsp_name); 292 ASSERT_NE(reinterpret_cast<const char *>(NULL), aio->dev_name); 293 EXPECT_EQ(0, strcmp(test_dev_name, aio->dev_name)); 294 ASSERT_NE(reinterpret_cast<const char *>(NULL), aio->dev_id); 295 EXPECT_EQ(0, strcmp(test_dev_id, aio->dev_id)); 296 297 alsa_iodev_destroy((struct cras_iodev *)aio); 298 EXPECT_EQ(1, cras_iodev_free_resources_called); 299 } 300 301 TEST(AlsaIoInit, DefaultNodeInternalCard) { 302 struct alsa_io *aio; 303 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 304 305 ResetStubData(); 306 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 307 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL, 308 CRAS_STREAM_OUTPUT); 309 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 310 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 311 ASSERT_STREQ("(default)", aio->base.active_node->name); 312 ASSERT_EQ(1, aio->base.active_node->plugged); 313 ASSERT_EQ((void *)no_stream, (void *)aio->base.no_stream); 314 ASSERT_EQ((void *)output_should_wake, (void *)aio->base.output_should_wake); 315 alsa_iodev_destroy((struct cras_iodev *)aio); 316 317 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 318 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL, 319 CRAS_STREAM_OUTPUT); 320 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 321 EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); 322 ASSERT_STREQ("Speaker", aio->base.active_node->name); 323 ASSERT_EQ(1, aio->base.active_node->plugged); 324 ASSERT_EQ((void *)no_stream, (void *)aio->base.no_stream); 325 ASSERT_EQ((void *)output_should_wake, (void *)aio->base.output_should_wake); 326 alsa_iodev_destroy((struct cras_iodev *)aio); 327 328 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 329 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL, 330 CRAS_STREAM_INPUT); 331 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 332 /* No more call to get volume curve for input device. */ 333 EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); 334 ASSERT_STREQ("(default)", aio->base.active_node->name); 335 ASSERT_EQ(1, aio->base.active_node->plugged); 336 ASSERT_EQ((void *)no_stream, (void *)aio->base.no_stream); 337 ASSERT_EQ((void *)output_should_wake, (void *)aio->base.output_should_wake); 338 alsa_iodev_destroy((struct cras_iodev *)aio); 339 340 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 341 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL, 342 CRAS_STREAM_INPUT); 343 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 344 EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); 345 ASSERT_STREQ("Internal Mic", aio->base.active_node->name); 346 ASSERT_EQ(1, aio->base.active_node->plugged); 347 ASSERT_EQ((void *)no_stream, (void *)aio->base.no_stream); 348 ASSERT_EQ((void *)output_should_wake, (void *)aio->base.output_should_wake); 349 alsa_iodev_destroy((struct cras_iodev *)aio); 350 } 351 352 TEST(AlsaIoInit, DefaultNodeUSBCard) { 353 struct alsa_io *aio; 354 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 355 356 ResetStubData(); 357 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 358 0, NULL, ALSA_CARD_TYPE_USB, 1, fake_mixer, fake_config, NULL, 359 CRAS_STREAM_OUTPUT); 360 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 361 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 362 ASSERT_STREQ("(default)", aio->base.active_node->name); 363 ASSERT_EQ(1, aio->base.active_node->plugged); 364 EXPECT_EQ(1, cras_iodev_set_node_attr_called); 365 EXPECT_EQ(IONODE_ATTR_PLUGGED, cras_iodev_set_node_attr_attr); 366 EXPECT_EQ(1, cras_iodev_set_node_attr_value); 367 alsa_iodev_destroy((struct cras_iodev *)aio); 368 369 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 370 0, NULL, ALSA_CARD_TYPE_USB, 1, fake_mixer, fake_config, NULL, 371 CRAS_STREAM_INPUT); 372 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 373 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 374 ASSERT_STREQ("(default)", aio->base.active_node->name); 375 ASSERT_EQ(1, aio->base.active_node->plugged); 376 EXPECT_EQ(2, cras_iodev_set_node_attr_called); 377 EXPECT_EQ(IONODE_ATTR_PLUGGED, cras_iodev_set_node_attr_attr); 378 EXPECT_EQ(1, cras_iodev_set_node_attr_value); 379 alsa_iodev_destroy((struct cras_iodev *)aio); 380 } 381 382 TEST(AlsaIoInit, OpenPlayback) { 383 struct cras_iodev *iodev; 384 struct cras_audio_format format; 385 struct alsa_io *aio; 386 387 ResetStubData(); 388 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 389 ALSA_CARD_TYPE_INTERNAL, 0, 390 fake_mixer, fake_config, 391 NULL, CRAS_STREAM_OUTPUT); 392 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 393 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 394 aio = (struct alsa_io *)iodev; 395 format.frame_rate = 48000; 396 cras_iodev_set_format(iodev, &format); 397 398 // Test that these flags are cleared after open_dev. 399 aio->is_free_running = 1; 400 aio->filled_zeros_for_draining = 512; 401 iodev->open_dev(iodev); 402 EXPECT_EQ(1, cras_alsa_open_called); 403 EXPECT_EQ(1, sys_set_volume_limits_called); 404 EXPECT_EQ(1, alsa_mixer_set_dBFS_called); 405 EXPECT_EQ(0, cras_alsa_start_called); 406 EXPECT_EQ(0, cras_iodev_set_node_attr_called); 407 EXPECT_EQ(0, aio->is_free_running); 408 EXPECT_EQ(0, aio->filled_zeros_for_draining); 409 EXPECT_EQ(SEVERE_UNDERRUN_MS * format.frame_rate / 1000, 410 aio->severe_underrun_frames); 411 412 alsa_iodev_destroy(iodev); 413 free(fake_format); 414 } 415 416 TEST(AlsaIoInit, UsbCardAutoPlug) { 417 struct cras_iodev *iodev; 418 419 ResetStubData(); 420 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 421 ALSA_CARD_TYPE_INTERNAL, 1, 422 fake_mixer, fake_config, 423 NULL, CRAS_STREAM_OUTPUT); 424 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 425 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 426 EXPECT_EQ(0, cras_iodev_set_node_attr_called); 427 alsa_iodev_destroy(iodev); 428 429 ResetStubData(); 430 iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB, 431 0, fake_mixer, fake_config, 432 NULL, CRAS_STREAM_OUTPUT); 433 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 434 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 435 EXPECT_EQ(0, cras_iodev_set_node_attr_called); 436 alsa_iodev_destroy(iodev); 437 438 ResetStubData(); 439 iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB, 440 1, fake_mixer, fake_config, 441 NULL, CRAS_STREAM_OUTPUT); 442 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 443 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 444 // Should assume USB devs are plugged when they appear. 445 EXPECT_EQ(1, cras_iodev_set_node_attr_called); 446 EXPECT_EQ(IONODE_ATTR_PLUGGED, cras_iodev_set_node_attr_attr); 447 EXPECT_EQ(1, cras_iodev_set_node_attr_value); 448 alsa_iodev_destroy(iodev); 449 } 450 451 TEST(AlsaIoInit, UsbCardUseSoftwareVolume) { 452 struct cras_iodev *iodev; 453 454 alsa_mixer_get_dB_range_value = 1000; 455 alsa_mixer_get_output_dB_range_value = 1000; 456 ResetStubData(); 457 iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB, 458 1, fake_mixer, fake_config, 459 NULL, CRAS_STREAM_OUTPUT); 460 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 461 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 462 EXPECT_EQ(1, alsa_mixer_get_dB_range_called); 463 EXPECT_EQ(1, alsa_mixer_get_output_dB_range_called); 464 EXPECT_EQ(1, iodev->active_node->software_volume_needed); 465 alsa_iodev_destroy(iodev); 466 467 alsa_mixer_get_dB_range_value = 3000; 468 alsa_mixer_get_output_dB_range_value = 2000; 469 ResetStubData(); 470 iodev = alsa_iodev_create_with_default_parameters(0, NULL, ALSA_CARD_TYPE_USB, 471 1, fake_mixer, fake_config, 472 NULL, CRAS_STREAM_OUTPUT); 473 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 474 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 475 EXPECT_EQ(1, alsa_mixer_get_dB_range_called); 476 EXPECT_EQ(1, alsa_mixer_get_output_dB_range_called); 477 EXPECT_EQ(0, iodev->active_node->software_volume_needed); 478 alsa_iodev_destroy(iodev); 479 } 480 481 TEST(AlsaIoInit, UseSoftwareGain) { 482 struct cras_iodev *iodev; 483 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 484 485 /* Meet the requirements of using software gain. */ 486 ResetStubData(); 487 ucm_get_max_software_gain_ret_value = 0; 488 ucm_get_max_software_gain_value = 2000; 489 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 490 ALSA_CARD_TYPE_INTERNAL, 1, 491 fake_mixer, fake_config, 492 fake_ucm, 493 CRAS_STREAM_INPUT); 494 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 495 EXPECT_EQ(1, iodev->active_node->software_volume_needed); 496 EXPECT_EQ(2000, iodev->active_node->max_software_gain); 497 ASSERT_EQ(1, sys_set_capture_gain_limits_called); 498 /* The gain range is [DEFAULT_MIN_CAPTURE_GAIN, maximum softare gain]. */ 499 ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[0], 500 DEFAULT_MIN_CAPTURE_GAIN); 501 ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[1], 2000); 502 503 /* MaxSoftwareGain is not specified in UCM */ 504 ResetStubData(); 505 ucm_get_max_software_gain_ret_value = 1; 506 ucm_get_max_software_gain_value = 1; 507 cras_alsa_mixer_get_minimum_capture_gain_ret_value = -500; 508 cras_alsa_mixer_get_maximum_capture_gain_ret_value = 500; 509 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 510 ALSA_CARD_TYPE_INTERNAL, 1, 511 fake_mixer, fake_config, 512 fake_ucm, 513 CRAS_STREAM_INPUT); 514 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 515 EXPECT_EQ(0, iodev->active_node->software_volume_needed); 516 EXPECT_EQ(0, iodev->active_node->max_software_gain); 517 ASSERT_EQ(1, sys_set_capture_gain_limits_called); 518 /* The gain range is reported by controls. */ 519 ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[0], -500); 520 ASSERT_EQ(cras_system_set_capture_gain_limits_set_value[1], 500); 521 522 alsa_iodev_destroy(iodev); 523 } 524 525 TEST(AlsaIoInit, SoftwareGainWithDefaultNodeGain) { 526 struct cras_iodev *iodev; 527 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 528 long system_gain = 500; 529 long default_node_gain = -1000; 530 531 ResetStubData(); 532 533 // Use software gain. 534 ucm_get_max_software_gain_ret_value = 0; 535 ucm_get_max_software_gain_value = 2000; 536 537 // Set default node gain to -1000 dBm. 538 ucm_get_default_node_gain_values["Internal Mic"] = default_node_gain; 539 540 // Assume this is the first device so it gets internal mic node name. 541 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 542 ALSA_CARD_TYPE_INTERNAL, 1, 543 fake_mixer, fake_config, 544 fake_ucm, 545 CRAS_STREAM_INPUT); 546 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 547 548 // Gain on node is 300 dBm. 549 iodev->active_node->capture_gain = default_node_gain; 550 551 // cras_iodev will call cras_iodev_adjust_active_node_gain to get gain for 552 // software gain. 553 ASSERT_EQ(system_gain + default_node_gain, 554 cras_iodev_adjust_active_node_gain(iodev, system_gain)); 555 556 alsa_iodev_destroy(iodev); 557 } 558 559 TEST(AlsaIoInit, RouteBasedOnJackCallback) { 560 struct alsa_io *aio; 561 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 562 563 ResetStubData(); 564 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 565 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL, 566 CRAS_STREAM_OUTPUT); 567 ASSERT_NE(aio, (void *)NULL); 568 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 569 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 570 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 571 EXPECT_EQ(0, cras_alsa_fill_properties_called); 572 EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called); 573 EXPECT_EQ(1, cras_alsa_jack_list_create_called); 574 EXPECT_EQ(1, cras_alsa_jack_list_find_jacks_by_name_matching_called); 575 EXPECT_EQ(0, cras_alsa_jack_list_add_jack_for_section_called); 576 577 cras_alsa_jack_list_create_cb(NULL, 1, cras_alsa_jack_list_create_cb_data); 578 EXPECT_EQ(1, cras_iodev_set_node_attr_called); 579 EXPECT_EQ(IONODE_ATTR_PLUGGED, cras_iodev_set_node_attr_attr); 580 EXPECT_EQ(1, cras_iodev_set_node_attr_value); 581 cras_alsa_jack_list_create_cb(NULL, 0, cras_alsa_jack_list_create_cb_data); 582 EXPECT_EQ(2, cras_iodev_set_node_attr_called); 583 EXPECT_EQ(IONODE_ATTR_PLUGGED, cras_iodev_set_node_attr_attr); 584 EXPECT_EQ(0, cras_iodev_set_node_attr_value); 585 586 alsa_iodev_destroy((struct cras_iodev *)aio); 587 EXPECT_EQ(1, cras_alsa_jack_list_destroy_called); 588 } 589 590 TEST(AlsaIoInit, RouteBasedOnInputJackCallback) { 591 struct alsa_io *aio; 592 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 593 594 ResetStubData(); 595 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 596 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, NULL, 597 CRAS_STREAM_INPUT); 598 ASSERT_NE(aio, (void *)NULL); 599 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 600 601 EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream); 602 EXPECT_EQ(0, cras_alsa_fill_properties_called); 603 EXPECT_EQ(1, cras_alsa_jack_list_create_called); 604 EXPECT_EQ(1, cras_alsa_jack_list_find_jacks_by_name_matching_called); 605 EXPECT_EQ(0, cras_alsa_jack_list_add_jack_for_section_called); 606 607 cras_alsa_jack_list_create_cb(NULL, 1, cras_alsa_jack_list_create_cb_data); 608 EXPECT_EQ(1, cras_iodev_set_node_attr_called); 609 EXPECT_EQ(IONODE_ATTR_PLUGGED, cras_iodev_set_node_attr_attr); 610 EXPECT_EQ(1, cras_iodev_set_node_attr_value); 611 cras_alsa_jack_list_create_cb(NULL, 0, cras_alsa_jack_list_create_cb_data); 612 EXPECT_EQ(2, cras_iodev_set_node_attr_called); 613 EXPECT_EQ(IONODE_ATTR_PLUGGED, cras_iodev_set_node_attr_attr); 614 EXPECT_EQ(0, cras_iodev_set_node_attr_value); 615 616 alsa_iodev_destroy((struct cras_iodev *)aio); 617 EXPECT_EQ(1, cras_alsa_jack_list_destroy_called); 618 } 619 620 TEST(AlsaIoInit, InitializeCapture) { 621 struct alsa_io *aio; 622 623 ResetStubData(); 624 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 625 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL, 626 CRAS_STREAM_INPUT); 627 ASSERT_NE(aio, (void *)NULL); 628 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 629 630 EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream); 631 EXPECT_EQ(0, cras_alsa_fill_properties_called); 632 EXPECT_EQ(1, cras_alsa_mixer_list_inputs_called); 633 634 alsa_iodev_destroy((struct cras_iodev *)aio); 635 } 636 637 TEST(AlsaIoInit, OpenCapture) { 638 struct cras_iodev *iodev; 639 struct cras_audio_format format; 640 struct alsa_io *aio; 641 642 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 643 ALSA_CARD_TYPE_INTERNAL, 0, 644 fake_mixer, fake_config, 645 NULL, CRAS_STREAM_INPUT); 646 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 647 648 aio = (struct alsa_io *)iodev; 649 format.frame_rate = 48000; 650 cras_iodev_set_format(iodev, &format); 651 652 ResetStubData(); 653 iodev->open_dev(iodev); 654 EXPECT_EQ(1, cras_alsa_open_called); 655 EXPECT_EQ(1, cras_alsa_mixer_get_minimum_capture_gain_called); 656 EXPECT_EQ(1, cras_alsa_mixer_get_maximum_capture_gain_called); 657 EXPECT_EQ(1, sys_set_capture_gain_limits_called); 658 EXPECT_EQ(1, sys_get_capture_gain_called); 659 EXPECT_EQ(1, alsa_mixer_set_capture_dBFS_called); 660 EXPECT_EQ(1, sys_get_capture_mute_called); 661 EXPECT_EQ(1, alsa_mixer_set_capture_mute_called); 662 EXPECT_EQ(1, cras_alsa_start_called); 663 EXPECT_EQ(SEVERE_UNDERRUN_MS * format.frame_rate / 1000, 664 aio->severe_underrun_frames); 665 666 alsa_iodev_destroy(iodev); 667 free(fake_format); 668 } 669 670 TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithDefaultNodeGain) { 671 struct cras_iodev *iodev; 672 struct cras_audio_format format; 673 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 674 long system_gain = 2000; 675 long default_node_gain = -1000; 676 677 ResetStubData(); 678 // Set default node gain to -1000 dBm. 679 ucm_get_default_node_gain_values["Internal Mic"] = default_node_gain; 680 681 // Assume this is the first device so it gets internal mic node name. 682 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 683 ALSA_CARD_TYPE_INTERNAL, 1, 684 fake_mixer, fake_config, 685 fake_ucm, 686 CRAS_STREAM_INPUT); 687 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 688 689 cras_iodev_set_format(iodev, &format); 690 691 // Check the default node gain is the same as what specified in UCM. 692 EXPECT_EQ(default_node_gain, iodev->active_node->capture_gain); 693 // System gain is set to 2000 dBm. 694 sys_get_capture_gain_return_value = system_gain; 695 696 iodev->open_dev(iodev); 697 iodev->close_dev(iodev); 698 699 // Hardware gain is set to 2000 - 1000 dBm. 700 EXPECT_EQ(system_gain + default_node_gain, alsa_mixer_set_capture_dBFS_value); 701 702 alsa_iodev_destroy(iodev); 703 free(fake_format); 704 } 705 706 TEST(AlsaIoInit, OpenCaptureSetCaptureGainWithSoftwareGain) { 707 struct cras_iodev *iodev; 708 struct cras_audio_format format; 709 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 710 711 /* Meet the requirements of using software gain. */ 712 ResetStubData(); 713 ucm_get_max_software_gain_ret_value = 0; 714 ucm_get_max_software_gain_value = 2000; 715 716 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 717 ALSA_CARD_TYPE_INTERNAL, 0, 718 fake_mixer, fake_config, 719 fake_ucm, 720 CRAS_STREAM_INPUT); 721 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 722 723 cras_iodev_set_format(iodev, &format); 724 725 /* System gain is set to 1000dBm */ 726 sys_get_capture_gain_return_value = 1000; 727 728 iodev->open_dev(iodev); 729 iodev->close_dev(iodev); 730 731 /* Hardware gain is set to 0dB when software gain is used. */ 732 EXPECT_EQ(0, alsa_mixer_set_capture_dBFS_value); 733 734 /* Test the case where software gain is not needed. */ 735 iodev->active_node->software_volume_needed = 0; 736 iodev->open_dev(iodev); 737 iodev->close_dev(iodev); 738 739 /* Hardware gain is set to 1000dBm as got from system capture gain.*/ 740 EXPECT_EQ(1000, alsa_mixer_set_capture_dBFS_value); 741 742 alsa_iodev_destroy(iodev); 743 free(fake_format); 744 } 745 746 TEST(AlsaIoInit, UpdateActiveNode) { 747 struct cras_iodev *iodev; 748 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 749 750 ResetStubData(); 751 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 752 ALSA_CARD_TYPE_INTERNAL, 0, 753 fake_mixer, fake_config, 754 NULL, 755 CRAS_STREAM_OUTPUT); 756 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 757 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 758 759 iodev->update_active_node(iodev, 0, 1); 760 761 alsa_iodev_destroy(iodev); 762 } 763 764 TEST(AlsaIoInit, StartDevice) { 765 struct cras_iodev *iodev; 766 int rc; 767 768 ResetStubData(); 769 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 770 ALSA_CARD_TYPE_INTERNAL, 0, 771 NULL, fake_config, NULL, 772 CRAS_STREAM_OUTPUT); 773 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 774 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 775 776 // Return right away if it is already running. 777 snd_pcm_state_ret = SND_PCM_STATE_RUNNING; 778 rc = iodev->start(iodev); 779 EXPECT_EQ(0, rc); 780 EXPECT_EQ(0, cras_alsa_start_called); 781 782 // Otherwise, start the device. 783 snd_pcm_state_ret = SND_PCM_STATE_SETUP; 784 rc = iodev->start(iodev); 785 EXPECT_EQ(0, rc); 786 EXPECT_EQ(1, cras_alsa_start_called); 787 788 alsa_iodev_destroy(iodev); 789 } 790 791 TEST(AlsaIoInit, ResumeDevice) { 792 struct cras_iodev *iodev; 793 int rc; 794 795 ResetStubData(); 796 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 797 ALSA_CARD_TYPE_INTERNAL, 0, 798 NULL, fake_config, NULL, 799 CRAS_STREAM_OUTPUT); 800 ASSERT_EQ(0, alsa_iodev_legacy_complete_init(iodev)); 801 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 802 803 // Attempt to resume if the device is suspended. 804 snd_pcm_state_ret = SND_PCM_STATE_SUSPENDED; 805 rc = iodev->start(iodev); 806 EXPECT_EQ(0, rc); 807 EXPECT_EQ(1, cras_alsa_attempt_resume_called); 808 809 alsa_iodev_destroy(iodev); 810 } 811 812 TEST(AlsaIoInit, DspNameDefault) { 813 struct alsa_io *aio; 814 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 815 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 816 817 ResetStubData(); 818 ucm_get_dsp_name_default_value = "hello"; 819 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 820 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, 821 CRAS_STREAM_OUTPUT); 822 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 823 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 824 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 825 EXPECT_EQ(1, ucm_get_dsp_name_default_called); 826 EXPECT_EQ(1, cras_alsa_jack_get_dsp_name_called); 827 EXPECT_STREQ("hello", cras_iodev_update_dsp_name); 828 829 alsa_iodev_destroy((struct cras_iodev *)aio); 830 } 831 832 TEST(AlsaIoInit, DspNameJackOverride) { 833 struct alsa_io *aio; 834 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 835 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 836 const struct cras_alsa_jack *jack = (struct cras_alsa_jack*)4; 837 838 ResetStubData(); 839 ucm_get_dsp_name_default_value = "default_dsp"; 840 cras_alsa_jack_get_dsp_name_value = "override_dsp"; 841 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 842 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, 843 CRAS_STREAM_OUTPUT); 844 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 845 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 846 EXPECT_EQ(1, ucm_get_dsp_name_default_called); 847 EXPECT_EQ(1, cras_alsa_jack_get_dsp_name_called); 848 EXPECT_EQ(1, cras_iodev_update_dsp_called); 849 EXPECT_STREQ("default_dsp", cras_iodev_update_dsp_name); 850 851 // Add the jack node. 852 cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data); 853 EXPECT_EQ(1, ucm_get_dsp_name_default_called); 854 855 // Mark the jack node as active. 856 alsa_iodev_set_active_node(&aio->base, aio->base.nodes->next, 1); 857 EXPECT_EQ(2, cras_alsa_jack_get_dsp_name_called); 858 EXPECT_EQ(2, cras_iodev_update_dsp_called); 859 EXPECT_STREQ("override_dsp", cras_iodev_update_dsp_name); 860 861 // Mark the default node as active. 862 alsa_iodev_set_active_node(&aio->base, aio->base.nodes, 1); 863 EXPECT_EQ(1, ucm_get_dsp_name_default_called); 864 EXPECT_EQ(3, cras_alsa_jack_get_dsp_name_called); 865 EXPECT_EQ(3, cras_iodev_update_dsp_called); 866 EXPECT_STREQ("default_dsp", cras_iodev_update_dsp_name); 867 868 alsa_iodev_destroy((struct cras_iodev *)aio); 869 } 870 871 TEST(AlsaIoInit, NodeTypeOverride) { 872 struct alsa_io *aio; 873 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 874 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 875 const struct cras_alsa_jack *jack = (struct cras_alsa_jack*)4; 876 877 ResetStubData(); 878 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 879 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, 880 CRAS_STREAM_OUTPUT); 881 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 882 // Add the jack node. 883 cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data); 884 // Verify that cras_alsa_jack_update_node_type is called when an output device 885 // is created. 886 EXPECT_EQ(1, cras_alsa_jack_update_node_type_called); 887 888 alsa_iodev_destroy((struct cras_iodev *)aio); 889 } 890 891 TEST(AlsaIoInit, SwapMode) { 892 struct alsa_io *aio; 893 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 894 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 895 struct cras_ionode * const fake_node = (cras_ionode *)4; 896 ResetStubData(); 897 // Stub replies that swap mode does not exist. 898 ucm_swap_mode_exists_ret_value = 0; 899 900 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 901 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, 902 CRAS_STREAM_OUTPUT); 903 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 904 905 aio->base.set_swap_mode_for_node((cras_iodev*)aio, fake_node, 1); 906 /* Swap mode is implemented by dsp. */ 907 EXPECT_EQ(1, cras_iodev_dsp_set_swap_mode_for_node_called); 908 909 // Stub replies that swap mode exists. 910 ucm_swap_mode_exists_ret_value = 1; 911 912 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 913 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, 914 CRAS_STREAM_OUTPUT); 915 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 916 // Enable swap mode. 917 aio->base.set_swap_mode_for_node((cras_iodev*)aio, fake_node, 1); 918 919 // Verify that ucm_enable_swap_mode is called when callback to enable 920 // swap mode is called. 921 EXPECT_EQ(1, ucm_enable_swap_mode_called); 922 923 alsa_iodev_destroy((struct cras_iodev *)aio); 924 } 925 926 // Test that system settins aren't touched if no streams active. 927 TEST(AlsaOutputNode, SystemSettingsWhenInactive) { 928 int rc; 929 struct alsa_io *aio; 930 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 931 struct mixer_control *outputs[2]; 932 933 ResetStubData(); 934 outputs[0] = reinterpret_cast<struct mixer_control *>(3); 935 outputs[1] = reinterpret_cast<struct mixer_control *>(4); 936 cras_alsa_mixer_list_outputs_outputs = outputs; 937 cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs); 938 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 939 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL, 940 CRAS_STREAM_OUTPUT); 941 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 942 /* Two mixer controls calls get volume curve. */ 943 EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); 944 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 945 EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called); 946 947 ResetStubData(); 948 rc = alsa_iodev_set_active_node((struct cras_iodev *)aio, 949 aio->base.nodes->next, 1); 950 EXPECT_EQ(0, rc); 951 EXPECT_EQ(0, alsa_mixer_set_mute_called); 952 EXPECT_EQ(0, alsa_mixer_set_dBFS_called); 953 ASSERT_EQ(2, cras_alsa_mixer_set_output_active_state_called); 954 EXPECT_EQ(outputs[0], cras_alsa_mixer_set_output_active_state_outputs[0]); 955 EXPECT_EQ(0, cras_alsa_mixer_set_output_active_state_values[0]); 956 EXPECT_EQ(outputs[1], cras_alsa_mixer_set_output_active_state_outputs[1]); 957 EXPECT_EQ(1, cras_alsa_mixer_set_output_active_state_values[1]); 958 EXPECT_EQ(1, cras_iodev_update_dsp_called); 959 // No jack is defined, and UCM is not used. 960 EXPECT_EQ(0, cras_alsa_jack_enable_ucm_called); 961 EXPECT_EQ(0, ucm_set_enabled_called); 962 963 alsa_iodev_destroy((struct cras_iodev *)aio); 964 } 965 966 // Test handling of different amounts of outputs. 967 TEST(AlsaOutputNode, TwoOutputs) { 968 int rc; 969 struct alsa_io *aio; 970 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 971 struct mixer_control *outputs[2]; 972 973 ResetStubData(); 974 outputs[0] = reinterpret_cast<struct mixer_control *>(3); 975 outputs[1] = reinterpret_cast<struct mixer_control *>(4); 976 cras_alsa_mixer_list_outputs_outputs = outputs; 977 cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs); 978 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 979 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, NULL, 980 CRAS_STREAM_OUTPUT); 981 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 982 EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); 983 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 984 EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called); 985 986 aio->handle = (snd_pcm_t *)0x24; 987 988 ResetStubData(); 989 rc = alsa_iodev_set_active_node((struct cras_iodev *)aio, 990 aio->base.nodes->next, 1); 991 EXPECT_EQ(0, rc); 992 EXPECT_EQ(2, alsa_mixer_set_mute_called); 993 EXPECT_EQ(outputs[1], alsa_mixer_set_mute_output); 994 EXPECT_EQ(1, alsa_mixer_set_dBFS_called); 995 EXPECT_EQ(outputs[1], alsa_mixer_set_dBFS_output); 996 ASSERT_EQ(2, cras_alsa_mixer_set_output_active_state_called); 997 EXPECT_EQ(outputs[0], cras_alsa_mixer_set_output_active_state_outputs[0]); 998 EXPECT_EQ(0, cras_alsa_mixer_set_output_active_state_values[0]); 999 EXPECT_EQ(outputs[1], cras_alsa_mixer_set_output_active_state_outputs[1]); 1000 EXPECT_EQ(1, cras_alsa_mixer_set_output_active_state_values[1]); 1001 EXPECT_EQ(1, cras_iodev_update_dsp_called); 1002 // No jacks defined, and UCM is not used. 1003 EXPECT_EQ(0, cras_alsa_jack_enable_ucm_called); 1004 EXPECT_EQ(0, ucm_set_enabled_called); 1005 1006 alsa_iodev_destroy((struct cras_iodev *)aio); 1007 } 1008 1009 TEST(AlsaOutputNode, TwoJacksHeadphoneLineout) { 1010 struct alsa_io *aio; 1011 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer *)2; 1012 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr *)3; 1013 struct cras_iodev *iodev; 1014 struct mixer_control *output; 1015 struct ucm_section *section; 1016 1017 ResetStubData(); 1018 output = reinterpret_cast<struct mixer_control *>(3); 1019 cras_alsa_mixer_get_control_name_values[output] = "Headphone"; 1020 1021 // Create the iodev 1022 iodev = alsa_iodev_create_with_default_parameters( 1023 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, 1024 CRAS_STREAM_OUTPUT); 1025 ASSERT_NE(iodev, (void *)NULL); 1026 aio = reinterpret_cast<struct alsa_io *>(iodev); 1027 EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called); 1028 1029 // First node 'Headphone' 1030 section = ucm_section_create("Headphone", 0, CRAS_STREAM_OUTPUT, 1031 "fake-jack", "gpio"); 1032 ucm_section_set_mixer_name(section, "Headphone"); 1033 cras_alsa_jack_list_add_jack_for_section_result_jack = 1034 reinterpret_cast<struct cras_alsa_jack *>(10); 1035 cras_alsa_mixer_get_control_for_section_return_value = output; 1036 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1037 EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); 1038 ucm_section_free_list(section); 1039 1040 // Second node 'Line Out' 1041 section = ucm_section_create("Line Out", 0, CRAS_STREAM_OUTPUT, 1042 "fake-jack", "gpio"); 1043 ucm_section_set_mixer_name(section, "Headphone"); 1044 cras_alsa_jack_list_add_jack_for_section_result_jack = 1045 reinterpret_cast<struct cras_alsa_jack *>(20); 1046 cras_alsa_mixer_get_control_for_section_return_value = output; 1047 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1048 EXPECT_EQ(7, cras_card_config_get_volume_curve_for_control_called); 1049 ucm_section_free_list(section); 1050 1051 // Both nodes are associated with the same mixer output. Different jack plug 1052 // report should trigger different node attribute change. 1053 cras_alsa_jack_get_mixer_output_ret = output; 1054 jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack *>(10), 0, aio); 1055 EXPECT_STREQ(cras_iodev_set_node_attr_ionode->name, "Headphone"); 1056 1057 jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack *>(20), 0, aio); 1058 EXPECT_STREQ(cras_iodev_set_node_attr_ionode->name, "Line Out"); 1059 1060 alsa_iodev_destroy(iodev); 1061 } 1062 1063 TEST(AlsaOutputNode, OutputsFromUCM) { 1064 struct alsa_io *aio; 1065 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 1066 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1067 struct cras_iodev *iodev; 1068 static const char *jack_name = "TestCard - Headset Jack"; 1069 struct mixer_control *outputs[2]; 1070 int rc; 1071 struct ucm_section *section; 1072 1073 ResetStubData(); 1074 outputs[0] = reinterpret_cast<struct mixer_control *>(3); 1075 outputs[1] = reinterpret_cast<struct mixer_control *>(4); 1076 cras_alsa_mixer_list_outputs_outputs = outputs; 1077 cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs); 1078 cras_alsa_mixer_get_control_name_values[outputs[0]] = INTERNAL_SPEAKER; 1079 cras_alsa_mixer_get_control_name_values[outputs[1]] = "Headphone"; 1080 ucm_get_dma_period_for_dev_ret = 1000; 1081 1082 // Create the IO device. 1083 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 1084 ALSA_CARD_TYPE_INTERNAL, 1, 1085 fake_mixer, fake_config, 1086 fake_ucm, 1087 CRAS_STREAM_OUTPUT); 1088 ASSERT_NE(iodev, (void *)NULL); 1089 aio = reinterpret_cast<struct alsa_io *>(iodev); 1090 EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called); 1091 1092 // First node. 1093 section = ucm_section_create(INTERNAL_SPEAKER, 0, CRAS_STREAM_OUTPUT, 1094 NULL, NULL); 1095 ucm_section_set_mixer_name(section, INTERNAL_SPEAKER); 1096 cras_alsa_jack_list_add_jack_for_section_result_jack = 1097 reinterpret_cast<struct cras_alsa_jack *>(1); 1098 cras_alsa_mixer_get_control_for_section_return_value = outputs[0]; 1099 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1100 ucm_section_free_list(section); 1101 EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); 1102 1103 // Add a second node (will use the same iodev). 1104 section = ucm_section_create("Headphone", 0, CRAS_STREAM_OUTPUT, 1105 jack_name, "hctl"); 1106 ucm_section_add_coupled(section, "HP-L", MIXER_NAME_VOLUME); 1107 ucm_section_add_coupled(section, "HP-R", MIXER_NAME_VOLUME); 1108 cras_alsa_jack_list_add_jack_for_section_result_jack = NULL; 1109 cras_alsa_mixer_get_control_for_section_return_value = outputs[1]; 1110 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1111 ucm_section_free_list(section); 1112 /* New nodes creation calls get volume curve once, NULL jack doesn't make 1113 * more calls. */ 1114 EXPECT_EQ(5, cras_card_config_get_volume_curve_for_control_called); 1115 1116 // Jack plug of an unkonwn device should do nothing. 1117 cras_alsa_jack_get_mixer_output_ret = NULL; 1118 cras_alsa_jack_get_name_ret_value = "Some other jack"; 1119 jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack *>(4), 0, aio); 1120 EXPECT_EQ(0, cras_iodev_set_node_attr_called); 1121 1122 // Complete initialization, and make first node active. 1123 alsa_iodev_ucm_complete_init(iodev); 1124 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 1125 EXPECT_EQ(2, cras_alsa_jack_list_add_jack_for_section_called); 1126 EXPECT_EQ(2, cras_alsa_mixer_get_control_for_section_called); 1127 EXPECT_EQ(1, ucm_get_dma_period_for_dev_called); 1128 EXPECT_EQ(ucm_get_dma_period_for_dev_ret, aio->dma_period_set_microsecs); 1129 1130 aio->handle = (snd_pcm_t *)0x24; 1131 1132 ResetStubData(); 1133 rc = alsa_iodev_set_active_node(iodev, aio->base.nodes->next, 1); 1134 EXPECT_EQ(0, rc); 1135 EXPECT_EQ(2, alsa_mixer_set_mute_called); 1136 EXPECT_EQ(outputs[1], alsa_mixer_set_mute_output); 1137 EXPECT_EQ(1, alsa_mixer_set_dBFS_called); 1138 EXPECT_EQ(outputs[1], alsa_mixer_set_dBFS_output); 1139 ASSERT_EQ(2, cras_alsa_mixer_set_output_active_state_called); 1140 EXPECT_EQ(outputs[0], cras_alsa_mixer_set_output_active_state_outputs[0]); 1141 EXPECT_EQ(0, cras_alsa_mixer_set_output_active_state_values[0]); 1142 EXPECT_EQ(outputs[1], cras_alsa_mixer_set_output_active_state_outputs[1]); 1143 EXPECT_EQ(1, cras_alsa_mixer_set_output_active_state_values[1]); 1144 EXPECT_EQ(1, cras_iodev_update_dsp_called); 1145 EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called); 1146 EXPECT_EQ(1, ucm_set_enabled_called); 1147 1148 // Simulate jack plug event. 1149 cras_alsa_jack_get_mixer_output_ret = outputs[1]; 1150 cras_alsa_jack_get_name_ret_value = jack_name; 1151 jack_output_plug_event(reinterpret_cast<struct cras_alsa_jack *>(4), 0, aio); 1152 EXPECT_EQ(1, cras_iodev_set_node_attr_called); 1153 1154 alsa_iodev_destroy(iodev); 1155 } 1156 1157 TEST(AlsaOutputNode, OutputNoControlsUCM) { 1158 struct alsa_io *aio; 1159 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1160 struct cras_iodev *iodev; 1161 struct ucm_section *section; 1162 1163 ResetStubData(); 1164 1165 // Create the IO device. 1166 iodev = alsa_iodev_create_with_default_parameters(1, NULL, 1167 ALSA_CARD_TYPE_INTERNAL, 1, 1168 fake_mixer, fake_config, 1169 fake_ucm, 1170 CRAS_STREAM_OUTPUT); 1171 ASSERT_NE(iodev, (void *)NULL); 1172 aio = reinterpret_cast<struct alsa_io *>(iodev); 1173 EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called); 1174 1175 // Node without controls or jacks. 1176 section = ucm_section_create(INTERNAL_SPEAKER, 1, CRAS_STREAM_OUTPUT, 1177 NULL, NULL); 1178 // Device index doesn't match. 1179 EXPECT_EQ(-22, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1180 section->dev_idx = 0; 1181 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1182 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 1183 EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called); 1184 EXPECT_EQ(1, cras_iodev_add_node_called); 1185 ucm_section_free_list(section); 1186 1187 // Complete initialization, and make first node active. 1188 alsa_iodev_ucm_complete_init(iodev); 1189 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 1190 EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called); 1191 EXPECT_EQ(1, cras_iodev_update_dsp_called); 1192 EXPECT_EQ(0, cras_alsa_jack_enable_ucm_called); 1193 EXPECT_EQ(1, ucm_set_enabled_called); 1194 1195 alsa_iodev_destroy(iodev); 1196 } 1197 1198 TEST(AlsaOutputNode, OutputFromJackUCM) { 1199 struct alsa_io *aio; 1200 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1201 struct cras_iodev *iodev; 1202 static const char *jack_name = "TestCard - Headset Jack"; 1203 struct ucm_section *section; 1204 1205 ResetStubData(); 1206 1207 // Create the IO device. 1208 iodev = alsa_iodev_create_with_default_parameters(1, NULL, 1209 ALSA_CARD_TYPE_INTERNAL, 1, 1210 fake_mixer, fake_config, 1211 fake_ucm, 1212 CRAS_STREAM_OUTPUT); 1213 ASSERT_NE(iodev, (void *)NULL); 1214 aio = reinterpret_cast<struct alsa_io *>(iodev); 1215 EXPECT_EQ(1, cras_card_config_get_volume_curve_for_control_called); 1216 1217 // Node without controls or jacks. 1218 cras_alsa_jack_list_add_jack_for_section_result_jack = 1219 reinterpret_cast<struct cras_alsa_jack *>(1); 1220 section = ucm_section_create("Headphone", 0, CRAS_STREAM_OUTPUT, 1221 jack_name, "hctl"); 1222 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1223 EXPECT_EQ(4, cras_card_config_get_volume_curve_for_control_called); 1224 EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called); 1225 EXPECT_EQ(1, cras_iodev_add_node_called); 1226 EXPECT_EQ(1, cras_alsa_jack_list_add_jack_for_section_called); 1227 ucm_section_free_list(section); 1228 1229 // Complete initialization, and make first node active. 1230 alsa_iodev_ucm_complete_init(iodev); 1231 EXPECT_EQ(SND_PCM_STREAM_PLAYBACK, aio->alsa_stream); 1232 EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called); 1233 EXPECT_EQ(1, cras_iodev_update_dsp_called); 1234 EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called); 1235 EXPECT_EQ(0, ucm_set_enabled_called); 1236 1237 alsa_iodev_destroy(iodev); 1238 } 1239 1240 TEST(AlsaOutputNode, InputsFromUCM) { 1241 struct alsa_io *aio; 1242 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 1243 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1244 struct mixer_control *inputs[2]; 1245 struct cras_iodev *iodev; 1246 static const char *jack_name = "TestCard - Headset Jack"; 1247 int rc; 1248 struct ucm_section *section; 1249 1250 ResetStubData(); 1251 inputs[0] = reinterpret_cast<struct mixer_control *>(3); 1252 inputs[1] = reinterpret_cast<struct mixer_control *>(4); 1253 cras_alsa_mixer_list_inputs_outputs = inputs; 1254 cras_alsa_mixer_list_inputs_outputs_length = ARRAY_SIZE(inputs); 1255 cras_alsa_mixer_get_control_name_values[inputs[0]] = "Internal Mic"; 1256 cras_alsa_mixer_get_control_name_values[inputs[1]] = "Mic"; 1257 1258 // Create the IO device. 1259 iodev = alsa_iodev_create_with_default_parameters(0, NULL, 1260 ALSA_CARD_TYPE_INTERNAL, 1, 1261 fake_mixer, fake_config, 1262 fake_ucm, 1263 CRAS_STREAM_INPUT); 1264 ASSERT_NE(iodev, (void *)NULL); 1265 aio = reinterpret_cast<struct alsa_io *>(iodev); 1266 1267 // First node. 1268 cras_alsa_mixer_get_control_for_section_return_value = inputs[0]; 1269 ucm_get_max_software_gain_ret_value = -1; 1270 section = ucm_section_create(INTERNAL_MICROPHONE, 0, CRAS_STREAM_INPUT, 1271 NULL, NULL); 1272 ucm_section_add_coupled(section, "MIC-L", MIXER_NAME_VOLUME); 1273 ucm_section_add_coupled(section, "MIC-R", MIXER_NAME_VOLUME); 1274 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1275 ucm_section_free_list(section); 1276 1277 // Add a second node (will use the same iodev). 1278 cras_alsa_mixer_get_control_name_called = 0; 1279 ucm_get_max_software_gain_ret_value = 0; 1280 ucm_get_max_software_gain_value = 2000; 1281 cras_alsa_jack_list_add_jack_for_section_result_jack = 1282 reinterpret_cast<struct cras_alsa_jack *>(1); 1283 cras_alsa_mixer_get_control_for_section_return_value = inputs[1]; 1284 section = ucm_section_create("Mic", 0, CRAS_STREAM_INPUT, jack_name, "hctl"); 1285 ucm_section_set_mixer_name(section, "Mic"); 1286 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1287 ucm_section_free_list(section); 1288 1289 // Jack plug of an unkonwn device should do nothing. 1290 cras_alsa_jack_get_mixer_input_ret = NULL; 1291 cras_alsa_jack_get_name_ret_value = "Some other jack"; 1292 jack_input_plug_event(reinterpret_cast<struct cras_alsa_jack *>(4), 0, aio); 1293 EXPECT_EQ(0, cras_iodev_set_node_attr_called); 1294 1295 // Simulate jack plug event. 1296 cras_alsa_jack_get_mixer_input_ret = inputs[1]; 1297 cras_alsa_jack_get_name_ret_value = jack_name; 1298 jack_input_plug_event(reinterpret_cast<struct cras_alsa_jack *>(4), 0, aio); 1299 EXPECT_EQ(1, cras_iodev_set_node_attr_called); 1300 1301 // Complete initialization, and make first node active. 1302 alsa_iodev_ucm_complete_init(iodev); 1303 EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream); 1304 EXPECT_EQ(2, cras_alsa_jack_list_add_jack_for_section_called); 1305 EXPECT_EQ(2, cras_alsa_mixer_get_control_for_section_called); 1306 EXPECT_EQ(1, cras_alsa_mixer_get_control_name_called); 1307 EXPECT_EQ(1, sys_set_capture_gain_limits_called); 1308 EXPECT_EQ(2, cras_iodev_add_node_called); 1309 EXPECT_EQ(2, ucm_get_dma_period_for_dev_called); 1310 EXPECT_EQ(0, aio->dma_period_set_microsecs); 1311 1312 aio->handle = (snd_pcm_t *)0x24; 1313 1314 ResetStubData(); 1315 rc = alsa_iodev_set_active_node(iodev, aio->base.nodes->next, 1); 1316 EXPECT_EQ(0, rc); 1317 EXPECT_EQ(1, alsa_mixer_set_capture_dBFS_called); 1318 EXPECT_EQ(inputs[1], alsa_mixer_set_capture_dBFS_input); 1319 EXPECT_EQ(0, alsa_mixer_set_capture_dBFS_value); 1320 EXPECT_EQ(1, cras_iodev_update_dsp_called); 1321 EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called); 1322 EXPECT_EQ(1, ucm_set_enabled_called); 1323 EXPECT_EQ(1, sys_set_capture_gain_limits_called); 1324 EXPECT_EQ(1, alsa_mixer_set_capture_mute_called); 1325 EXPECT_EQ(1, iodev->active_node->software_volume_needed); 1326 EXPECT_EQ(2000, iodev->active_node->max_software_gain); 1327 1328 alsa_iodev_destroy(iodev); 1329 } 1330 1331 TEST(AlsaOutputNode, InputNoControlsUCM) { 1332 struct alsa_io *aio; 1333 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1334 struct cras_iodev *iodev; 1335 struct ucm_section *section; 1336 1337 ResetStubData(); 1338 1339 // Create the IO device. 1340 iodev = alsa_iodev_create_with_default_parameters(1, NULL, 1341 ALSA_CARD_TYPE_INTERNAL, 1, 1342 fake_mixer, fake_config, 1343 fake_ucm, 1344 CRAS_STREAM_INPUT); 1345 ASSERT_NE(iodev, (void *)NULL); 1346 aio = reinterpret_cast<struct alsa_io *>(iodev); 1347 1348 // Node without controls or jacks. 1349 section = ucm_section_create(INTERNAL_MICROPHONE, 1, CRAS_STREAM_INPUT, 1350 NULL, NULL); 1351 // Device index doesn't match. 1352 EXPECT_EQ(-22, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1353 section->dev_idx = 0; 1354 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1355 EXPECT_EQ(1, cras_alsa_jack_list_add_jack_for_section_called); 1356 EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called); 1357 EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called); 1358 EXPECT_EQ(1, cras_iodev_add_node_called); 1359 ucm_section_free_list(section); 1360 1361 // Complete initialization, and make first node active. 1362 alsa_iodev_ucm_complete_init(iodev); 1363 EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream); 1364 EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called); 1365 EXPECT_EQ(1, cras_iodev_update_dsp_called); 1366 EXPECT_EQ(0, cras_alsa_jack_enable_ucm_called); 1367 EXPECT_EQ(1, ucm_set_enabled_called); 1368 1369 alsa_iodev_destroy(iodev); 1370 } 1371 1372 TEST(AlsaOutputNode, InputFromJackUCM) { 1373 struct alsa_io *aio; 1374 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1375 struct cras_iodev *iodev; 1376 static const char *jack_name = "TestCard - Headset Jack"; 1377 struct ucm_section *section; 1378 1379 ResetStubData(); 1380 1381 // Create the IO device. 1382 iodev = alsa_iodev_create_with_default_parameters(1, NULL, 1383 ALSA_CARD_TYPE_INTERNAL, 1, 1384 fake_mixer, fake_config, 1385 fake_ucm, 1386 CRAS_STREAM_INPUT); 1387 ASSERT_NE(iodev, (void *)NULL); 1388 aio = reinterpret_cast<struct alsa_io *>(iodev); 1389 1390 // Node without controls or jacks. 1391 cras_alsa_jack_list_add_jack_for_section_result_jack = 1392 reinterpret_cast<struct cras_alsa_jack *>(1); 1393 section = ucm_section_create("Mic", 0, CRAS_STREAM_INPUT, jack_name, "hctl"); 1394 ASSERT_EQ(0, alsa_iodev_ucm_add_nodes_and_jacks(iodev, section)); 1395 EXPECT_EQ(1, cras_alsa_mixer_get_control_for_section_called); 1396 EXPECT_EQ(1, cras_iodev_add_node_called); 1397 EXPECT_EQ(1, cras_alsa_jack_list_add_jack_for_section_called); 1398 ucm_section_free_list(section); 1399 1400 // Complete initialization, and make first node active. 1401 alsa_iodev_ucm_complete_init(iodev); 1402 EXPECT_EQ(SND_PCM_STREAM_CAPTURE, aio->alsa_stream); 1403 EXPECT_EQ(0, cras_alsa_mixer_get_control_name_called); 1404 EXPECT_EQ(1, cras_iodev_update_dsp_called); 1405 EXPECT_EQ(1, cras_alsa_jack_enable_ucm_called); 1406 EXPECT_EQ(0, ucm_set_enabled_called); 1407 1408 alsa_iodev_destroy(iodev); 1409 } 1410 1411 TEST(AlsaOutputNode, AutoUnplugOutputNode) { 1412 struct alsa_io *aio; 1413 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 1414 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1415 struct mixer_control *outputs[2]; 1416 const struct cras_alsa_jack *jack = (struct cras_alsa_jack*)4; 1417 1418 ResetStubData(); 1419 outputs[0] = reinterpret_cast<struct mixer_control *>(5); 1420 outputs[1] = reinterpret_cast<struct mixer_control *>(6); 1421 1422 cras_alsa_mixer_list_outputs_outputs = outputs; 1423 cras_alsa_mixer_list_outputs_outputs_length = ARRAY_SIZE(outputs); 1424 1425 cras_alsa_mixer_get_control_name_values[outputs[0]] = INTERNAL_SPEAKER; 1426 cras_alsa_mixer_get_control_name_values[outputs[1]] = "Headphone"; 1427 auto_unplug_output_node_ret = 1; 1428 1429 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 1430 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, 1431 CRAS_STREAM_OUTPUT); 1432 1433 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 1434 EXPECT_EQ(3, cras_card_config_get_volume_curve_for_control_called); 1435 EXPECT_EQ(1, cras_alsa_mixer_list_outputs_called); 1436 EXPECT_EQ(2, cras_alsa_mixer_get_control_name_called); 1437 1438 // Assert that the the internal speaker is plugged and other nodes aren't. 1439 ASSERT_NE(aio->base.nodes, (void *)NULL); 1440 EXPECT_EQ(aio->base.nodes->plugged, 1); 1441 ASSERT_NE(aio->base.nodes->next, (void *)NULL); 1442 EXPECT_EQ(aio->base.nodes->next->plugged, 0); 1443 1444 // Plug headphone jack 1445 cras_alsa_jack_get_name_ret_value = "Headphone Jack"; 1446 is_utf8_string_ret_value = 1; 1447 cras_alsa_jack_get_mixer_output_ret = outputs[1]; 1448 cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data); 1449 1450 // Assert internal speaker is auto unplugged 1451 EXPECT_EQ(aio->base.nodes->plugged, 0); 1452 EXPECT_EQ(aio->base.nodes->next->plugged, 1); 1453 1454 alsa_iodev_destroy((struct cras_iodev *)aio); 1455 } 1456 1457 TEST(AlsaOutputNode, AutoUnplugInputNode) { 1458 struct alsa_io *aio; 1459 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 1460 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1461 struct mixer_control *inputs[2]; 1462 const struct cras_alsa_jack *jack = (struct cras_alsa_jack*)4; 1463 1464 ResetStubData(); 1465 inputs[0] = reinterpret_cast<struct mixer_control *>(5); 1466 inputs[1] = reinterpret_cast<struct mixer_control *>(6); 1467 1468 cras_alsa_mixer_list_inputs_outputs = inputs; 1469 cras_alsa_mixer_list_inputs_outputs_length = ARRAY_SIZE(inputs); 1470 1471 cras_alsa_mixer_get_control_name_values[inputs[0]] = INTERNAL_MICROPHONE; 1472 cras_alsa_mixer_get_control_name_values[inputs[1]] = "Mic"; 1473 auto_unplug_input_node_ret = 1; 1474 1475 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 1476 0, NULL, ALSA_CARD_TYPE_INTERNAL, 1, fake_mixer, fake_config, fake_ucm, 1477 CRAS_STREAM_INPUT); 1478 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 1479 EXPECT_EQ(1, cras_alsa_mixer_list_inputs_called); 1480 EXPECT_EQ(2, cras_alsa_mixer_get_control_name_called); 1481 1482 // Assert that the the internal speaker is plugged and other nodes aren't. 1483 ASSERT_NE(aio->base.nodes, (void *)NULL); 1484 EXPECT_EQ(aio->base.nodes->plugged, 1); 1485 ASSERT_NE(aio->base.nodes->next, (void *)NULL); 1486 EXPECT_EQ(aio->base.nodes->next->plugged, 0); 1487 1488 // Plug headphone jack 1489 cras_alsa_jack_get_name_ret_value = "Mic Jack"; 1490 is_utf8_string_ret_value = 1; 1491 cras_alsa_jack_get_mixer_input_ret = inputs[1]; 1492 cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data); 1493 1494 // Assert internal speaker is auto unplugged 1495 EXPECT_EQ(aio->base.nodes->plugged, 0); 1496 EXPECT_EQ(aio->base.nodes->next->plugged, 1); 1497 1498 alsa_iodev_destroy((struct cras_iodev *)aio); 1499 } 1500 1501 TEST(AlsaInitNode, SetNodeInitialState) { 1502 struct cras_ionode node; 1503 struct cras_iodev dev; 1504 1505 memset(&dev, 0, sizeof(dev)); 1506 memset(&node, 0, sizeof(node)); 1507 node.dev = &dev; 1508 strcpy(node.name, "Unknown"); 1509 dev.direction = CRAS_STREAM_OUTPUT; 1510 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1511 ASSERT_EQ(0, node.plugged); 1512 ASSERT_EQ(0, node.plugged_time.tv_sec); 1513 ASSERT_EQ(CRAS_NODE_TYPE_UNKNOWN, node.type); 1514 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1515 1516 memset(&node, 0, sizeof(node)); 1517 node.dev = &dev; 1518 strcpy(node.name, "Speaker"); 1519 dev.direction = CRAS_STREAM_OUTPUT; 1520 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1521 ASSERT_EQ(1, node.plugged); 1522 ASSERT_GT(node.plugged_time.tv_sec, 0); 1523 ASSERT_EQ(CRAS_NODE_TYPE_INTERNAL_SPEAKER, node.type); 1524 ASSERT_EQ(NODE_POSITION_INTERNAL, node.position); 1525 1526 memset(&node, 0, sizeof(node)); 1527 node.dev = &dev; 1528 strcpy(node.name, "Internal Mic"); 1529 dev.direction = CRAS_STREAM_INPUT; 1530 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1531 ASSERT_EQ(1, node.plugged); 1532 ASSERT_GT(node.plugged_time.tv_sec, 0); 1533 ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type); 1534 ASSERT_EQ(NODE_POSITION_INTERNAL, node.position); 1535 1536 memset(&node, 0, sizeof(node)); 1537 node.dev = &dev; 1538 strcpy(node.name, "HDMI"); 1539 dev.direction = CRAS_STREAM_OUTPUT; 1540 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1541 ASSERT_EQ(0, node.plugged); 1542 ASSERT_EQ(0, node.plugged_time.tv_sec); 1543 ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type); 1544 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1545 1546 memset(&node, 0, sizeof(node)); 1547 node.dev = &dev; 1548 strcpy(node.name, "IEC958"); 1549 dev.direction = CRAS_STREAM_OUTPUT; 1550 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1551 ASSERT_EQ(0, node.plugged); 1552 ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type); 1553 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1554 1555 memset(&node, 0, sizeof(node)); 1556 node.dev = &dev; 1557 strcpy(node.name, "HDMI Jack"); 1558 dev.direction = CRAS_STREAM_OUTPUT; 1559 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1560 ASSERT_EQ(0, node.plugged); 1561 ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type); 1562 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1563 1564 memset(&node, 0, sizeof(node)); 1565 node.dev = &dev; 1566 strcpy(node.name, "Something HDMI Jack"); 1567 dev.direction = CRAS_STREAM_OUTPUT; 1568 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1569 ASSERT_EQ(0, node.plugged); 1570 ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type); 1571 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1572 1573 memset(&node, 0, sizeof(node)); 1574 node.dev = &dev; 1575 strcpy(node.name, "Headphone"); 1576 dev.direction = CRAS_STREAM_OUTPUT; 1577 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1578 ASSERT_EQ(0, node.plugged); 1579 ASSERT_EQ(CRAS_NODE_TYPE_HEADPHONE, node.type); 1580 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1581 1582 memset(&node, 0, sizeof(node)); 1583 node.dev = &dev; 1584 strcpy(node.name, "Headphone Jack"); 1585 dev.direction = CRAS_STREAM_OUTPUT; 1586 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1587 ASSERT_EQ(0, node.plugged); 1588 ASSERT_EQ(CRAS_NODE_TYPE_HEADPHONE, node.type); 1589 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1590 1591 memset(&node, 0, sizeof(node)); 1592 node.dev = &dev; 1593 strcpy(node.name, "Mic"); 1594 dev.direction = CRAS_STREAM_INPUT; 1595 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1596 ASSERT_EQ(0, node.plugged); 1597 ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type); 1598 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1599 1600 memset(&node, 0, sizeof(node)); 1601 node.dev = &dev; 1602 strcpy(node.name, "Front Mic"); 1603 dev.direction = CRAS_STREAM_INPUT; 1604 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1605 ASSERT_EQ(1, node.plugged); 1606 ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type); 1607 ASSERT_EQ(NODE_POSITION_FRONT, node.position); 1608 1609 memset(&node, 0, sizeof(node)); 1610 node.dev = &dev; 1611 strcpy(node.name, "Rear Mic"); 1612 dev.direction = CRAS_STREAM_INPUT; 1613 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1614 ASSERT_EQ(1, node.plugged); 1615 ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type); 1616 ASSERT_EQ(NODE_POSITION_REAR, node.position); 1617 1618 memset(&node, 0, sizeof(node)); 1619 node.dev = &dev; 1620 strcpy(node.name, "Mic Jack"); 1621 dev.direction = CRAS_STREAM_INPUT; 1622 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1623 ASSERT_EQ(0, node.plugged); 1624 ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type); 1625 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1626 1627 memset(&node, 0, sizeof(node)); 1628 node.dev = &dev; 1629 strcpy(node.name, "Unknown"); 1630 dev.direction = CRAS_STREAM_OUTPUT; 1631 set_node_initial_state(&node, ALSA_CARD_TYPE_USB); 1632 ASSERT_EQ(0, node.plugged); 1633 ASSERT_EQ(CRAS_NODE_TYPE_USB, node.type); 1634 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1635 1636 memset(&node, 0, sizeof(node)); 1637 node.dev = &dev; 1638 dev.direction = CRAS_STREAM_INPUT; 1639 strcpy(node.name, "DAISY-I2S Mic Jack"); 1640 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1641 ASSERT_EQ(0, node.plugged); 1642 ASSERT_EQ(CRAS_NODE_TYPE_MIC, node.type); 1643 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1644 1645 memset(&node, 0, sizeof(node)); 1646 node.dev = &dev; 1647 strcpy(node.name, "Speaker"); 1648 dev.direction = CRAS_STREAM_OUTPUT; 1649 set_node_initial_state(&node, ALSA_CARD_TYPE_USB); 1650 ASSERT_EQ(1, node.plugged); 1651 ASSERT_GT(node.plugged_time.tv_sec, 0); 1652 ASSERT_EQ(CRAS_NODE_TYPE_USB, node.type); 1653 ASSERT_EQ(NODE_POSITION_EXTERNAL, node.position); 1654 1655 memset(&node, 0, sizeof(node)); 1656 node.dev = &dev; 1657 strcpy(node.name, "Haptic"); 1658 dev.direction = CRAS_STREAM_OUTPUT; 1659 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1660 ASSERT_EQ(1, node.plugged); 1661 ASSERT_GT(node.plugged_time.tv_sec, 0); 1662 ASSERT_EQ(CRAS_NODE_TYPE_HAPTIC, node.type); 1663 ASSERT_EQ(NODE_POSITION_INTERNAL, node.position); 1664 1665 memset(&node, 0, sizeof(node)); 1666 node.dev = &dev; 1667 strcpy(node.name, "Rumbler"); 1668 dev.direction = CRAS_STREAM_OUTPUT; 1669 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1670 ASSERT_EQ(1, node.plugged); 1671 ASSERT_GT(node.plugged_time.tv_sec, 0); 1672 ASSERT_EQ(CRAS_NODE_TYPE_HAPTIC, node.type); 1673 ASSERT_EQ(NODE_POSITION_INTERNAL, node.position); 1674 } 1675 1676 TEST(AlsaInitNode, SetNodeInitialStateDropInvalidUTF8NodeName) { 1677 struct cras_ionode node; 1678 struct cras_iodev dev; 1679 1680 memset(&dev, 0, sizeof(dev)); 1681 memset(&node, 0, sizeof(node)); 1682 node.dev = &dev; 1683 1684 memset(&node, 0, sizeof(node)); 1685 node.dev = &dev; 1686 strcpy(node.name, "Something USB"); 1687 //0xfe can not appear in a valid UTF-8 string. 1688 node.name[0] = 0xfe; 1689 is_utf8_string_ret_value = 0; 1690 dev.direction = CRAS_STREAM_OUTPUT; 1691 set_node_initial_state(&node, ALSA_CARD_TYPE_USB); 1692 ASSERT_EQ(CRAS_NODE_TYPE_USB, node.type); 1693 ASSERT_STREQ("USB", node.name); 1694 1695 memset(&node, 0, sizeof(node)); 1696 node.dev = &dev; 1697 strcpy(node.name, "Something HDMI Jack"); 1698 //0xfe can not appear in a valid UTF-8 string. 1699 node.name[0] = 0xfe; 1700 is_utf8_string_ret_value = 0; 1701 dev.direction = CRAS_STREAM_OUTPUT; 1702 set_node_initial_state(&node, ALSA_CARD_TYPE_INTERNAL); 1703 ASSERT_EQ(CRAS_NODE_TYPE_HDMI, node.type); 1704 ASSERT_STREQ("HDMI", node.name); 1705 } 1706 1707 TEST(AlsaIoInit, HDMIJackUpdateInvalidUTF8MonitorName) { 1708 struct alsa_io *aio; 1709 struct cras_alsa_mixer * const fake_mixer = (struct cras_alsa_mixer*)2; 1710 struct cras_use_case_mgr * const fake_ucm = (struct cras_use_case_mgr*)3; 1711 const struct cras_alsa_jack *jack = (struct cras_alsa_jack*)4; 1712 1713 ResetStubData(); 1714 aio = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 1715 0, NULL, ALSA_CARD_TYPE_INTERNAL, 0, fake_mixer, fake_config, fake_ucm, 1716 CRAS_STREAM_OUTPUT); 1717 ASSERT_EQ(0, alsa_iodev_legacy_complete_init((struct cras_iodev *)aio)); 1718 1719 // Prepare the stub data such that the jack will be identified as an 1720 // HDMI jack, and thus the callback creates an HDMI node. 1721 cras_alsa_jack_get_name_ret_value = "HDMI Jack"; 1722 // Set the jack name updated from monitor to be an invalid UTF8 string. 1723 cras_alsa_jack_update_monitor_fake_name = strdup("Something"); 1724 cras_alsa_jack_update_monitor_fake_name[0] = 0xfe; 1725 is_utf8_string_ret_value = 0; 1726 1727 // Add the jack node. 1728 cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data); 1729 1730 EXPECT_EQ(2, cras_alsa_jack_get_name_called); 1731 ASSERT_EQ(CRAS_NODE_TYPE_HDMI, aio->base.nodes->next->type); 1732 // The node name should be "HDMI". 1733 ASSERT_STREQ("HDMI", aio->base.nodes->next->name); 1734 1735 alsa_iodev_destroy((struct cras_iodev *)aio); 1736 } 1737 1738 // Test thread add/rm stream, open_alsa, and iodev config. 1739 class AlsaVolumeMuteSuite : public testing::Test { 1740 protected: 1741 virtual void SetUp() { 1742 ResetStubData(); 1743 output_control_ = reinterpret_cast<struct mixer_control *>(10); 1744 cras_alsa_mixer_list_outputs_outputs = &output_control_; 1745 cras_alsa_mixer_list_outputs_outputs_length = 1; 1746 cras_alsa_mixer_get_control_name_values[output_control_] = "Speaker"; 1747 cras_alsa_mixer_list_outputs_outputs_length = 1; 1748 aio_output_ = (struct alsa_io *)alsa_iodev_create_with_default_parameters( 1749 0, NULL, 1750 ALSA_CARD_TYPE_INTERNAL, 1, 1751 fake_mixer, fake_config, NULL, 1752 CRAS_STREAM_OUTPUT); 1753 alsa_iodev_legacy_complete_init((struct cras_iodev *)aio_output_); 1754 EXPECT_EQ(2, cras_card_config_get_volume_curve_for_control_called); 1755 1756 struct cras_ionode *node; 1757 int count = 0; 1758 DL_FOREACH(aio_output_->base.nodes, node) { 1759 printf("node %d \n", count); 1760 } 1761 aio_output_->base.direction = CRAS_STREAM_OUTPUT; 1762 fmt_.frame_rate = 44100; 1763 fmt_.num_channels = 2; 1764 fmt_.format = SND_PCM_FORMAT_S16_LE; 1765 aio_output_->base.format = &fmt_; 1766 cras_alsa_get_avail_frames_ret = -1; 1767 } 1768 1769 virtual void TearDown() { 1770 alsa_iodev_destroy((struct cras_iodev *)aio_output_); 1771 cras_alsa_get_avail_frames_ret = 0; 1772 } 1773 1774 struct mixer_control *output_control_; 1775 struct alsa_io *aio_output_; 1776 struct cras_audio_format fmt_; 1777 }; 1778 1779 TEST_F(AlsaVolumeMuteSuite, GetDefaultVolumeCurve) { 1780 int rc; 1781 struct cras_audio_format *fmt; 1782 1783 fmt = (struct cras_audio_format *)malloc(sizeof(*fmt)); 1784 memcpy(fmt, &fmt_, sizeof(fmt_)); 1785 aio_output_->base.format = fmt; 1786 aio_output_->handle = (snd_pcm_t *)0x24; 1787 1788 rc = aio_output_->base.open_dev(&aio_output_->base); 1789 ASSERT_EQ(0, rc); 1790 EXPECT_EQ(&default_curve, fake_get_dBFS_volume_curve_val); 1791 1792 aio_output_->base.set_volume(&aio_output_->base); 1793 EXPECT_EQ(&default_curve, fake_get_dBFS_volume_curve_val); 1794 } 1795 1796 TEST_F(AlsaVolumeMuteSuite, GetVolumeCurveFromNode) 1797 { 1798 int rc; 1799 struct cras_audio_format *fmt; 1800 struct cras_alsa_jack *jack = (struct cras_alsa_jack*)4; 1801 struct cras_ionode *node; 1802 struct cras_volume_curve hp_curve = { 1803 .get_dBFS = fake_get_dBFS, 1804 }; 1805 1806 fmt = (struct cras_audio_format *)malloc(sizeof(*fmt)); 1807 memcpy(fmt, &fmt_, sizeof(fmt_)); 1808 aio_output_->base.format = fmt; 1809 aio_output_->handle = (snd_pcm_t *)0x24; 1810 1811 // Headphone jack plugged and has its own volume curve. 1812 cras_alsa_jack_get_mixer_output_ret = NULL; 1813 cras_alsa_jack_get_name_ret_value = "Headphone"; 1814 cras_card_config_get_volume_curve_vals["Headphone"] = &hp_curve; 1815 cras_alsa_jack_list_create_cb(jack, 1, cras_alsa_jack_list_create_cb_data); 1816 EXPECT_EQ(1, cras_alsa_jack_update_node_type_called); 1817 EXPECT_EQ(3, cras_card_config_get_volume_curve_for_control_called); 1818 1819 // Switch to node 'Headphone'. 1820 node = aio_output_->base.nodes->next; 1821 aio_output_->base.active_node = node; 1822 1823 rc = aio_output_->base.open_dev(&aio_output_->base); 1824 ASSERT_EQ(0, rc); 1825 EXPECT_EQ(&hp_curve, fake_get_dBFS_volume_curve_val); 1826 1827 aio_output_->base.set_volume(&aio_output_->base); 1828 EXPECT_EQ(&hp_curve, fake_get_dBFS_volume_curve_val); 1829 } 1830 1831 TEST_F(AlsaVolumeMuteSuite, SetVolume) { 1832 int rc; 1833 struct cras_audio_format *fmt; 1834 const size_t fake_system_volume = 55; 1835 const size_t fake_system_volume_dB = (fake_system_volume - 100) * 100; 1836 1837 fmt = (struct cras_audio_format *)malloc(sizeof(*fmt)); 1838 memcpy(fmt, &fmt_, sizeof(fmt_)); 1839 aio_output_->base.format = fmt; 1840 aio_output_->handle = (snd_pcm_t *)0x24; 1841 1842 aio_output_->num_underruns = 3; // Something non-zero. 1843 sys_get_volume_return_value = fake_system_volume; 1844 rc = aio_output_->base.open_dev(&aio_output_->base); 1845 ASSERT_EQ(0, rc); 1846 EXPECT_EQ(1, alsa_mixer_set_dBFS_called); 1847 EXPECT_EQ(fake_system_volume_dB, alsa_mixer_set_dBFS_value); 1848 1849 alsa_mixer_set_dBFS_called = 0; 1850 alsa_mixer_set_dBFS_value = 0; 1851 sys_get_volume_return_value = 50; 1852 sys_get_volume_called = 0; 1853 aio_output_->base.set_volume(&aio_output_->base); 1854 EXPECT_EQ(1, sys_get_volume_called); 1855 EXPECT_EQ(1, alsa_mixer_set_dBFS_called); 1856 EXPECT_EQ(-5000, alsa_mixer_set_dBFS_value); 1857 EXPECT_EQ(output_control_, alsa_mixer_set_dBFS_output); 1858 1859 alsa_mixer_set_dBFS_called = 0; 1860 alsa_mixer_set_dBFS_value = 0; 1861 sys_get_volume_return_value = 0; 1862 sys_get_volume_called = 0; 1863 aio_output_->base.set_volume(&aio_output_->base); 1864 EXPECT_EQ(1, sys_get_volume_called); 1865 EXPECT_EQ(1, alsa_mixer_set_dBFS_called); 1866 EXPECT_EQ(-10000, alsa_mixer_set_dBFS_value); 1867 1868 sys_get_volume_return_value = 80; 1869 aio_output_->base.active_node->volume = 90; 1870 aio_output_->base.set_volume(&aio_output_->base); 1871 EXPECT_EQ(-3000, alsa_mixer_set_dBFS_value); 1872 1873 // close the dev. 1874 rc = aio_output_->base.close_dev(&aio_output_->base); 1875 EXPECT_EQ(0, rc); 1876 EXPECT_EQ((void *)NULL, aio_output_->handle); 1877 1878 free(fmt); 1879 } 1880 1881 TEST_F(AlsaVolumeMuteSuite, SetMute) { 1882 int muted; 1883 1884 aio_output_->handle = (snd_pcm_t *)0x24; 1885 1886 // Test mute. 1887 ResetStubData(); 1888 muted = 1; 1889 1890 sys_get_mute_return_value = muted; 1891 1892 aio_output_->base.set_mute(&aio_output_->base); 1893 1894 EXPECT_EQ(1, sys_get_mute_called); 1895 EXPECT_EQ(1, alsa_mixer_set_mute_called); 1896 EXPECT_EQ(muted, alsa_mixer_set_mute_value); 1897 EXPECT_EQ(output_control_, alsa_mixer_set_mute_output); 1898 1899 // Test unmute. 1900 ResetStubData(); 1901 muted = 0; 1902 1903 sys_get_mute_return_value = muted; 1904 1905 aio_output_->base.set_mute(&aio_output_->base); 1906 1907 EXPECT_EQ(1, sys_get_mute_called); 1908 EXPECT_EQ(1, alsa_mixer_set_mute_called); 1909 EXPECT_EQ(muted, alsa_mixer_set_mute_value); 1910 EXPECT_EQ(output_control_, alsa_mixer_set_mute_output); 1911 } 1912 1913 // Test free run. 1914 class AlsaFreeRunTestSuite: public testing::Test { 1915 protected: 1916 virtual void SetUp() { 1917 ResetStubData(); 1918 memset(&aio, 0, sizeof(aio)); 1919 fmt_.format = SND_PCM_FORMAT_S16_LE; 1920 fmt_.frame_rate = 48000; 1921 fmt_.num_channels = 2; 1922 aio.base.format = &fmt_; 1923 aio.base.buffer_size = BUFFER_SIZE; 1924 aio.base.min_cb_level = 240; 1925 } 1926 1927 virtual void TearDown() { 1928 } 1929 1930 struct alsa_io aio; 1931 struct cras_audio_format fmt_; 1932 }; 1933 1934 TEST_F(AlsaFreeRunTestSuite, FillWholeBufferWithZeros) { 1935 int rc; 1936 int16_t *zeros; 1937 1938 cras_alsa_mmap_begin_buffer = (uint8_t *)calloc( 1939 BUFFER_SIZE * 2 * 2, 1940 sizeof(*cras_alsa_mmap_begin_buffer)); 1941 memset(cras_alsa_mmap_begin_buffer, 0xff, 1942 sizeof(*cras_alsa_mmap_begin_buffer)); 1943 1944 rc = fill_whole_buffer_with_zeros(&aio.base); 1945 1946 EXPECT_EQ(0, rc); 1947 zeros = (int16_t *)calloc(BUFFER_SIZE * 2, sizeof(*zeros)); 1948 EXPECT_EQ(0, memcmp(zeros, cras_alsa_mmap_begin_buffer, BUFFER_SIZE * 2 * 2)); 1949 1950 free(zeros); 1951 free(cras_alsa_mmap_begin_buffer); 1952 } 1953 1954 TEST_F(AlsaFreeRunTestSuite, EnterFreeRunAlreadyFreeRunning) { 1955 int rc; 1956 1957 // Device is in free run state, no need to fill zeros or fill whole buffer. 1958 aio.is_free_running = 1; 1959 1960 rc = no_stream(&aio.base, 1); 1961 1962 EXPECT_EQ(0, rc); 1963 EXPECT_EQ(0, cras_alsa_mmap_get_whole_buffer_called); 1964 EXPECT_EQ(0, cras_iodev_fill_odev_zeros_called); 1965 EXPECT_EQ(0, cras_iodev_fill_odev_zeros_frames); 1966 } 1967 1968 TEST_F(AlsaFreeRunTestSuite, EnterFreeRunNotDrainedYetNeedToFillZeros) { 1969 int rc; 1970 1971 // Device is not in free run state. There are still valid samples to play. 1972 // The number of valid samples is less than min_cb_level * 2. 1973 // Need to fill zeros targeting min_cb_level * 2 = 480. 1974 // The number of zeros to be filled is 480 - 200 = 280. 1975 cras_iodev_frames_queued_ret = 200; 1976 cras_iodev_buffer_avail_ret = BUFFER_SIZE - cras_iodev_frames_queued_ret; 1977 1978 rc = no_stream(&aio.base, 1); 1979 1980 EXPECT_EQ(0, rc); 1981 EXPECT_EQ(0, cras_alsa_mmap_get_whole_buffer_called); 1982 EXPECT_EQ(1, cras_iodev_fill_odev_zeros_called); 1983 EXPECT_EQ(280, cras_iodev_fill_odev_zeros_frames); 1984 EXPECT_EQ(280, aio.filled_zeros_for_draining); 1985 EXPECT_EQ(0, aio.is_free_running); 1986 } 1987 1988 TEST_F(AlsaFreeRunTestSuite, EnterFreeRunNotDrainedYetNoNeedToFillZeros) { 1989 int rc; 1990 1991 // Device is not in free run state. There are still valid samples to play. 1992 // The number of valid samples is more than min_cb_level * 2. 1993 // No need to fill zeros. 1994 cras_iodev_frames_queued_ret = 500; 1995 cras_iodev_buffer_avail_ret = BUFFER_SIZE - cras_iodev_frames_queued_ret; 1996 1997 rc = no_stream(&aio.base, 1); 1998 1999 EXPECT_EQ(0, rc); 2000 EXPECT_EQ(0, cras_alsa_mmap_get_whole_buffer_called); 2001 EXPECT_EQ(0, cras_iodev_fill_odev_zeros_called); 2002 EXPECT_EQ(0, aio.is_free_running); 2003 } 2004 2005 TEST_F(AlsaFreeRunTestSuite, EnterFreeRunDrained) { 2006 int rc; 2007 2008 // Device is not in free run state. There are still valid samples to play. 2009 // The number of valid samples is less than filled zeros. 2010 // Should enter free run state and fill whole buffer with zeros. 2011 cras_iodev_frames_queued_ret = 40; 2012 cras_iodev_buffer_avail_ret = BUFFER_SIZE - cras_iodev_frames_queued_ret; 2013 aio.filled_zeros_for_draining = 100; 2014 2015 rc = no_stream(&aio.base, 1); 2016 2017 EXPECT_EQ(0, rc); 2018 EXPECT_EQ(1, cras_alsa_mmap_get_whole_buffer_called); 2019 EXPECT_EQ(0, cras_iodev_fill_odev_zeros_called); 2020 EXPECT_EQ(1, aio.is_free_running); 2021 } 2022 2023 TEST_F(AlsaFreeRunTestSuite, EnterFreeRunNoSamples) { 2024 int rc; 2025 2026 // Device is not in free run state. There is no sample to play. 2027 // Should enter free run state and fill whole buffer with zeros. 2028 cras_iodev_frames_queued_ret = 0; 2029 cras_iodev_buffer_avail_ret = BUFFER_SIZE - cras_iodev_frames_queued_ret; 2030 2031 rc = no_stream(&aio.base, 1); 2032 2033 EXPECT_EQ(0, rc); 2034 EXPECT_EQ(1, cras_alsa_mmap_get_whole_buffer_called); 2035 EXPECT_EQ(0, cras_iodev_fill_odev_zeros_called); 2036 EXPECT_EQ(1, aio.is_free_running); 2037 } 2038 2039 TEST_F(AlsaFreeRunTestSuite, OutputShouldWake) { 2040 2041 aio.is_free_running = 1; 2042 2043 EXPECT_EQ(0, output_should_wake(&aio.base)); 2044 2045 aio.is_free_running = 0; 2046 aio.base.state = CRAS_IODEV_STATE_NO_STREAM_RUN; 2047 EXPECT_EQ(1, output_should_wake(&aio.base)); 2048 2049 aio.base.state = CRAS_IODEV_STATE_NORMAL_RUN; 2050 EXPECT_EQ(1, output_should_wake(&aio.base)); 2051 2052 aio.base.state = CRAS_IODEV_STATE_OPEN; 2053 EXPECT_EQ(0, output_should_wake(&aio.base)); 2054 } 2055 2056 TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunNotInFreeRun) { 2057 int rc; 2058 2059 rc = no_stream(&aio.base, 0); 2060 2061 EXPECT_EQ(0, rc); 2062 EXPECT_EQ(0, cras_alsa_resume_appl_ptr_called); 2063 } 2064 2065 TEST_F(AlsaFreeRunTestSuite, LeaveFreeRunInFreeRun) { 2066 int rc; 2067 2068 aio.is_free_running = 1; 2069 aio.filled_zeros_for_draining = 100; 2070 aio.base.min_buffer_level = 512; 2071 2072 rc = no_stream(&aio.base, 0); 2073 2074 EXPECT_EQ(0, rc); 2075 EXPECT_EQ(1, cras_alsa_resume_appl_ptr_called); 2076 EXPECT_EQ(aio.base.min_buffer_level + aio.base.min_cb_level, 2077 cras_alsa_resume_appl_ptr_ahead); 2078 EXPECT_EQ(0, aio.is_free_running); 2079 EXPECT_EQ(0, aio.filled_zeros_for_draining); 2080 } 2081 2082 // Reuse AlsaFreeRunTestSuite for output underrun handling because they are 2083 // similar. 2084 TEST_F(AlsaFreeRunTestSuite, OutputUnderrun) { 2085 int rc; 2086 int16_t *zeros; 2087 2088 cras_alsa_mmap_begin_buffer = (uint8_t *)calloc( 2089 BUFFER_SIZE * 2 * 2, 2090 sizeof(*cras_alsa_mmap_begin_buffer)); 2091 memset(cras_alsa_mmap_begin_buffer, 0xff, 2092 sizeof(*cras_alsa_mmap_begin_buffer)); 2093 2094 // Ask alsa_io to handle output underrun. 2095 rc = alsa_output_underrun(&aio.base); 2096 EXPECT_EQ(0, rc); 2097 2098 // mmap buffer should be filled with zeros. 2099 zeros = (int16_t *)calloc(BUFFER_SIZE * 2, sizeof(*zeros)); 2100 EXPECT_EQ(0, memcmp(zeros, cras_alsa_mmap_begin_buffer, BUFFER_SIZE * 2 * 2)); 2101 2102 // appl_ptr should be moved to min_buffer_level + min_cb_level ahead of 2103 // hw_ptr. 2104 EXPECT_EQ(1, cras_alsa_resume_appl_ptr_called); 2105 EXPECT_EQ(aio.base.min_buffer_level + aio.base.min_cb_level, 2106 cras_alsa_resume_appl_ptr_ahead); 2107 2108 free(zeros); 2109 free(cras_alsa_mmap_begin_buffer); 2110 } 2111 2112 2113 } // namespace 2114 2115 int main(int argc, char **argv) { 2116 ::testing::InitGoogleTest(&argc, argv); 2117 openlog(NULL, LOG_PERROR, LOG_USER); 2118 return RUN_ALL_TESTS(); 2119 } 2120 2121 // Stubs 2122 2123 extern "C" { 2124 2125 // From iodev. 2126 int cras_iodev_list_add_output(struct cras_iodev *output) 2127 { 2128 return 0; 2129 } 2130 int cras_iodev_list_rm_output(struct cras_iodev *dev) 2131 { 2132 return 0; 2133 } 2134 2135 int cras_iodev_list_add_input(struct cras_iodev *input) 2136 { 2137 return 0; 2138 } 2139 int cras_iodev_list_rm_input(struct cras_iodev *dev) 2140 { 2141 return 0; 2142 } 2143 2144 char *cras_iodev_list_get_hotword_models(cras_node_id_t node_id) 2145 { 2146 return NULL; 2147 } 2148 2149 int cras_iodev_list_set_hotword_model(cras_node_id_t node_id, 2150 const char *model_name) 2151 { 2152 return 0; 2153 } 2154 2155 struct audio_thread *cras_iodev_list_get_audio_thread() 2156 { 2157 return NULL; 2158 } 2159 2160 // From alsa helper. 2161 int cras_alsa_set_channel_map(snd_pcm_t *handle, 2162 struct cras_audio_format *fmt) 2163 { 2164 return 0; 2165 } 2166 int cras_alsa_get_channel_map(snd_pcm_t *handle, 2167 struct cras_audio_format *fmt) 2168 { 2169 return 0; 2170 } 2171 int cras_alsa_pcm_open(snd_pcm_t **handle, const char *dev, 2172 snd_pcm_stream_t stream) 2173 { 2174 *handle = (snd_pcm_t *)0x24; 2175 cras_alsa_open_called++; 2176 return 0; 2177 } 2178 int cras_alsa_pcm_close(snd_pcm_t *handle) 2179 { 2180 return 0; 2181 } 2182 int cras_alsa_pcm_start(snd_pcm_t *handle) 2183 { 2184 cras_alsa_start_called++; 2185 return 0; 2186 } 2187 int cras_alsa_pcm_drain(snd_pcm_t *handle) 2188 { 2189 return 0; 2190 } 2191 int cras_alsa_fill_properties(const char *dev, 2192 snd_pcm_stream_t stream, 2193 size_t **rates, 2194 size_t **channel_counts, 2195 snd_pcm_format_t **formats) 2196 { 2197 *rates = (size_t *)malloc(sizeof(**rates) * 3); 2198 (*rates)[0] = 44100; 2199 (*rates)[1] = 48000; 2200 (*rates)[2] = 0; 2201 *channel_counts = (size_t *)malloc(sizeof(**channel_counts) * 2); 2202 (*channel_counts)[0] = 2; 2203 (*channel_counts)[1] = 0; 2204 *formats = (snd_pcm_format_t *)malloc(sizeof(**formats) * 2); 2205 (*formats)[0] = SND_PCM_FORMAT_S16_LE; 2206 (*formats)[1] = (snd_pcm_format_t)0; 2207 2208 cras_alsa_fill_properties_called++; 2209 return 0; 2210 } 2211 int cras_alsa_set_hwparams(snd_pcm_t *handle, struct cras_audio_format *format, 2212 snd_pcm_uframes_t *buffer_size, int period_wakeup, 2213 unsigned int dma_period_time) 2214 { 2215 return 0; 2216 } 2217 int cras_alsa_set_swparams(snd_pcm_t *handle, int *enable_htimestamp) 2218 { 2219 return 0; 2220 } 2221 int cras_alsa_get_avail_frames(snd_pcm_t *handle, snd_pcm_uframes_t buf_size, 2222 snd_pcm_uframes_t severe_underrun_frames, 2223 const char* dev_name, 2224 snd_pcm_uframes_t *used, 2225 struct timespec *tstamp, 2226 unsigned int *num_underruns) 2227 { 2228 *used = cras_alsa_get_avail_frames_avail; 2229 clock_gettime(CLOCK_MONOTONIC_RAW, tstamp); 2230 return cras_alsa_get_avail_frames_ret; 2231 } 2232 int cras_alsa_get_delay_frames(snd_pcm_t *handle, snd_pcm_uframes_t buf_size, 2233 snd_pcm_sframes_t *delay) 2234 { 2235 *delay = 0; 2236 return 0; 2237 } 2238 int cras_alsa_mmap_begin(snd_pcm_t *handle, unsigned int format_bytes, 2239 uint8_t **dst, snd_pcm_uframes_t *offset, 2240 snd_pcm_uframes_t *frames, unsigned int *underruns) 2241 { 2242 *dst = cras_alsa_mmap_begin_buffer; 2243 *frames = cras_alsa_mmap_begin_frames; 2244 return 0; 2245 } 2246 int cras_alsa_mmap_commit(snd_pcm_t *handle, snd_pcm_uframes_t offset, 2247 snd_pcm_uframes_t frames, unsigned int *underruns) 2248 { 2249 return 0; 2250 } 2251 int cras_alsa_attempt_resume(snd_pcm_t *handle) 2252 { 2253 cras_alsa_attempt_resume_called++; 2254 return 0; 2255 } 2256 2257 // ALSA stubs. 2258 int snd_pcm_format_physical_width(snd_pcm_format_t format) 2259 { 2260 return 16; 2261 } 2262 2263 snd_pcm_state_t snd_pcm_state(snd_pcm_t *handle) 2264 { 2265 return snd_pcm_state_ret; 2266 } 2267 2268 const char *snd_strerror(int errnum) 2269 { 2270 return "Alsa Error in UT"; 2271 } 2272 2273 struct mixer_control *cras_alsa_mixer_get_control_for_section( 2274 struct cras_alsa_mixer *cras_mixer, 2275 const struct ucm_section *section) 2276 { 2277 cras_alsa_mixer_get_control_for_section_called++; 2278 return cras_alsa_mixer_get_control_for_section_return_value; 2279 } 2280 2281 const char *cras_alsa_mixer_get_control_name( 2282 const struct mixer_control *control) 2283 { 2284 ControlNameMap::iterator it; 2285 cras_alsa_mixer_get_control_name_called++; 2286 it = cras_alsa_mixer_get_control_name_values.find(control); 2287 if (it == cras_alsa_mixer_get_control_name_values.end()) 2288 return ""; 2289 return it->second.c_str(); 2290 } 2291 2292 // From system_state. 2293 size_t cras_system_get_volume() 2294 { 2295 sys_get_volume_called++; 2296 return sys_get_volume_return_value; 2297 } 2298 2299 long cras_system_get_capture_gain() 2300 { 2301 sys_get_capture_gain_called++; 2302 return sys_get_capture_gain_return_value; 2303 } 2304 2305 int cras_system_get_mute() 2306 { 2307 sys_get_mute_called++; 2308 return sys_get_mute_return_value; 2309 } 2310 2311 int cras_system_get_capture_mute() 2312 { 2313 sys_get_capture_mute_called++; 2314 return sys_get_capture_mute_return_value; 2315 } 2316 2317 void cras_system_set_volume_limits(long min, long max) 2318 { 2319 sys_set_volume_limits_called++; 2320 } 2321 2322 void cras_system_set_capture_gain_limits(long min, long max) 2323 { 2324 cras_system_set_capture_gain_limits_set_value[0] = min; 2325 cras_system_set_capture_gain_limits_set_value[1] = max; 2326 sys_set_capture_gain_limits_called++; 2327 } 2328 2329 // From cras_alsa_mixer. 2330 void cras_alsa_mixer_set_dBFS(struct cras_alsa_mixer *m, 2331 long dB_level, 2332 struct mixer_control *output) 2333 { 2334 alsa_mixer_set_dBFS_called++; 2335 alsa_mixer_set_dBFS_value = dB_level; 2336 alsa_mixer_set_dBFS_output = output; 2337 } 2338 2339 void cras_alsa_mixer_set_mute(struct cras_alsa_mixer *cras_mixer, 2340 int muted, 2341 struct mixer_control *mixer_output) 2342 { 2343 alsa_mixer_set_mute_called++; 2344 alsa_mixer_set_mute_value = muted; 2345 alsa_mixer_set_mute_output = mixer_output; 2346 } 2347 2348 long cras_alsa_mixer_get_dB_range(struct cras_alsa_mixer *cras_mixer) 2349 { 2350 alsa_mixer_get_dB_range_called++; 2351 return alsa_mixer_get_dB_range_value; 2352 } 2353 2354 long cras_alsa_mixer_get_output_dB_range( 2355 struct mixer_control *mixer_output) 2356 { 2357 alsa_mixer_get_output_dB_range_called++; 2358 return alsa_mixer_get_output_dB_range_value; 2359 } 2360 2361 void cras_alsa_mixer_set_capture_dBFS(struct cras_alsa_mixer *m, long dB_level, 2362 struct mixer_control *mixer_input) 2363 { 2364 alsa_mixer_set_capture_dBFS_called++; 2365 alsa_mixer_set_capture_dBFS_value = dB_level; 2366 alsa_mixer_set_capture_dBFS_input = mixer_input; 2367 } 2368 2369 void cras_alsa_mixer_set_capture_mute(struct cras_alsa_mixer *m, int mute, 2370 struct mixer_control *mixer_input) 2371 { 2372 alsa_mixer_set_capture_mute_called++; 2373 alsa_mixer_set_capture_mute_value = mute; 2374 alsa_mixer_set_capture_mute_input = mixer_input; 2375 } 2376 2377 void cras_alsa_mixer_list_outputs(struct cras_alsa_mixer *cras_mixer, 2378 cras_alsa_mixer_control_callback cb, 2379 void *callback_arg) 2380 { 2381 cras_alsa_mixer_list_outputs_called++; 2382 for (size_t i = 0; i < cras_alsa_mixer_list_outputs_outputs_length; i++) { 2383 cb(cras_alsa_mixer_list_outputs_outputs[i], callback_arg); 2384 } 2385 } 2386 2387 void cras_alsa_mixer_list_inputs(struct cras_alsa_mixer *cras_mixer, 2388 cras_alsa_mixer_control_callback cb, 2389 void *callback_arg) 2390 { 2391 cras_alsa_mixer_list_inputs_called++; 2392 for (size_t i = 0; i < cras_alsa_mixer_list_inputs_outputs_length; i++) { 2393 cb(cras_alsa_mixer_list_inputs_outputs[i], callback_arg); 2394 } 2395 } 2396 2397 int cras_alsa_mixer_set_output_active_state( 2398 struct mixer_control *output, 2399 int active) 2400 { 2401 cras_alsa_mixer_set_output_active_state_called++; 2402 cras_alsa_mixer_set_output_active_state_outputs.push_back(output); 2403 cras_alsa_mixer_set_output_active_state_values.push_back(active); 2404 return 0; 2405 } 2406 2407 void cras_volume_curve_destroy(struct cras_volume_curve *curve) 2408 { 2409 } 2410 2411 long cras_alsa_mixer_get_minimum_capture_gain(struct cras_alsa_mixer *cmix, 2412 struct mixer_control *mixer_input) 2413 { 2414 cras_alsa_mixer_get_minimum_capture_gain_called++; 2415 cras_alsa_mixer_get_minimum_capture_gain_mixer_input = mixer_input; 2416 return cras_alsa_mixer_get_minimum_capture_gain_ret_value; 2417 } 2418 2419 long cras_alsa_mixer_get_maximum_capture_gain(struct cras_alsa_mixer *cmix, 2420 struct mixer_control *mixer_input) 2421 { 2422 cras_alsa_mixer_get_maximum_capture_gain_called++; 2423 cras_alsa_mixer_get_maximum_capture_gain_mixer_input = mixer_input; 2424 return cras_alsa_mixer_get_maximum_capture_gain_ret_value; 2425 } 2426 2427 int cras_alsa_mixer_has_main_volume(const struct cras_alsa_mixer *cras_mixer) 2428 { 2429 return 1; 2430 } 2431 2432 int cras_alsa_mixer_has_volume(const struct mixer_control *mixer_control) 2433 { 2434 return 1; 2435 } 2436 2437 // From cras_alsa_jack 2438 struct cras_alsa_jack_list *cras_alsa_jack_list_create( 2439 unsigned int card_index, 2440 const char *card_name, 2441 unsigned int device_index, 2442 int check_gpio_jack, 2443 struct cras_alsa_mixer *mixer, 2444 struct cras_use_case_mgr *ucm, 2445 snd_hctl_t *hctl, 2446 enum CRAS_STREAM_DIRECTION direction, 2447 jack_state_change_callback *cb, 2448 void *cb_data) 2449 { 2450 cras_alsa_jack_list_create_called++; 2451 cras_alsa_jack_list_create_cb = cb; 2452 cras_alsa_jack_list_create_cb_data = cb_data; 2453 return (struct cras_alsa_jack_list *)0xfee; 2454 } 2455 2456 int cras_alsa_jack_list_find_jacks_by_name_matching( 2457 struct cras_alsa_jack_list *jack_list) 2458 { 2459 cras_alsa_jack_list_find_jacks_by_name_matching_called++; 2460 return 0; 2461 } 2462 2463 int cras_alsa_jack_list_add_jack_for_section( 2464 struct cras_alsa_jack_list *jack_list, 2465 struct ucm_section *ucm_section, 2466 struct cras_alsa_jack **result_jack) 2467 { 2468 cras_alsa_jack_list_add_jack_for_section_called++; 2469 if (result_jack) 2470 *result_jack = cras_alsa_jack_list_add_jack_for_section_result_jack; 2471 return 0; 2472 } 2473 2474 void cras_alsa_jack_list_destroy(struct cras_alsa_jack_list *jack_list) 2475 { 2476 cras_alsa_jack_list_destroy_called++; 2477 } 2478 2479 int cras_alsa_jack_list_has_hctl_jacks(struct cras_alsa_jack_list *jack_list) 2480 { 2481 return cras_alsa_jack_list_has_hctl_jacks_return_val; 2482 } 2483 2484 void cras_alsa_jack_list_report(const struct cras_alsa_jack_list *jack_list) 2485 { 2486 } 2487 2488 void cras_alsa_jack_enable_ucm(const struct cras_alsa_jack *jack, int enable) { 2489 cras_alsa_jack_enable_ucm_called++; 2490 } 2491 2492 const char *cras_alsa_jack_get_name(const struct cras_alsa_jack *jack) 2493 { 2494 cras_alsa_jack_get_name_called++; 2495 return cras_alsa_jack_get_name_ret_value; 2496 } 2497 2498 const char *cras_alsa_jack_get_dsp_name(const struct cras_alsa_jack *jack) 2499 { 2500 cras_alsa_jack_get_dsp_name_called++; 2501 return jack ? cras_alsa_jack_get_dsp_name_value : NULL; 2502 } 2503 2504 const char *ucm_get_dsp_name_default(struct cras_use_case_mgr *mgr, 2505 int direction) 2506 { 2507 ucm_get_dsp_name_default_called++; 2508 if (ucm_get_dsp_name_default_value) 2509 return strdup(ucm_get_dsp_name_default_value); 2510 else 2511 return NULL; 2512 } 2513 2514 struct mixer_control *cras_alsa_jack_get_mixer_output( 2515 const struct cras_alsa_jack *jack) 2516 { 2517 return cras_alsa_jack_get_mixer_output_ret; 2518 } 2519 2520 struct mixer_control *cras_alsa_jack_get_mixer_input( 2521 const struct cras_alsa_jack *jack) 2522 { 2523 return cras_alsa_jack_get_mixer_input_ret; 2524 } 2525 2526 int ucm_set_enabled( 2527 struct cras_use_case_mgr *mgr, const char *dev, int enabled) { 2528 ucm_set_enabled_called++; 2529 return 0; 2530 } 2531 2532 char *ucm_get_flag(struct cras_use_case_mgr *mgr, const char *flag_name) { 2533 char *ret = (char *)malloc(8); 2534 if ((!strcmp(flag_name, "AutoUnplugInputNode") && 2535 auto_unplug_input_node_ret) || 2536 (!strcmp(flag_name, "AutoUnplugOutputNode") && 2537 auto_unplug_output_node_ret)) { 2538 snprintf(ret, 8, "%s", "1"); 2539 return ret; 2540 } 2541 2542 return NULL; 2543 } 2544 2545 char *ucm_get_mic_positions(struct cras_use_case_mgr *mgr) { 2546 return NULL; 2547 } 2548 2549 int ucm_swap_mode_exists(struct cras_use_case_mgr *mgr) 2550 { 2551 return ucm_swap_mode_exists_ret_value; 2552 } 2553 2554 int ucm_enable_swap_mode(struct cras_use_case_mgr *mgr, const char *node_name, 2555 int enable) 2556 { 2557 ucm_enable_swap_mode_called++; 2558 return ucm_enable_swap_mode_ret_value; 2559 } 2560 2561 unsigned int ucm_get_min_buffer_level(struct cras_use_case_mgr *mgr) 2562 { 2563 return 0; 2564 } 2565 2566 unsigned int ucm_get_enable_htimestamp_flag(struct cras_use_case_mgr *mgr) 2567 { 2568 return ucm_get_enable_htimestamp_flag_ret; 2569 } 2570 2571 unsigned int ucm_get_disable_software_volume(struct cras_use_case_mgr *mgr) 2572 { 2573 return 0; 2574 } 2575 2576 int ucm_get_max_software_gain(struct cras_use_case_mgr *mgr, const char *dev, 2577 long *gain) 2578 { 2579 ucm_get_max_software_gain_called++; 2580 *gain = ucm_get_max_software_gain_value; 2581 return ucm_get_max_software_gain_ret_value; 2582 } 2583 2584 char *ucm_get_hotword_models(struct cras_use_case_mgr *mgr) 2585 { 2586 return NULL; 2587 } 2588 2589 int ucm_set_hotword_model(struct cras_use_case_mgr *mgr, const char *model) 2590 { 2591 return 0; 2592 } 2593 2594 unsigned int ucm_get_dma_period_for_dev(struct cras_use_case_mgr *mgr, 2595 const char *dev) 2596 { 2597 ucm_get_dma_period_for_dev_called++; 2598 return ucm_get_dma_period_for_dev_ret; 2599 } 2600 2601 int ucm_get_sample_rate_for_dev(struct cras_use_case_mgr *mgr, const char *dev, 2602 enum CRAS_STREAM_DIRECTION direction) 2603 { 2604 return -EINVAL; 2605 } 2606 2607 int ucm_get_capture_chmap_for_dev(struct cras_use_case_mgr *mgr, 2608 const char *dev, 2609 int8_t *channel_layout) 2610 { 2611 return -EINVAL; 2612 } 2613 2614 struct cras_volume_curve *cras_volume_curve_create_default() 2615 { 2616 return &default_curve; 2617 } 2618 2619 struct cras_volume_curve *cras_card_config_get_volume_curve_for_control( 2620 const struct cras_card_config *card_config, 2621 const char *control_name) 2622 { 2623 VolCurveMap::iterator it; 2624 cras_card_config_get_volume_curve_for_control_called++; 2625 if (!control_name) 2626 return NULL; 2627 it = cras_card_config_get_volume_curve_vals.find(control_name); 2628 if (it == cras_card_config_get_volume_curve_vals.end()) 2629 return NULL; 2630 return it->second; 2631 } 2632 2633 void cras_iodev_free_format(struct cras_iodev *iodev) 2634 { 2635 } 2636 2637 int cras_iodev_set_format(struct cras_iodev *iodev, 2638 const struct cras_audio_format *fmt) 2639 { 2640 fake_format = (struct cras_audio_format *)calloc(1, sizeof(*fake_format)); 2641 // Copy the content of format from fmt into format of iodev. 2642 memcpy(fake_format, fmt, sizeof(*fake_format)); 2643 iodev->format = fake_format; 2644 return 0; 2645 } 2646 2647 struct audio_thread *audio_thread_create() { 2648 return reinterpret_cast<audio_thread*>(0x323); 2649 } 2650 2651 void audio_thread_destroy(audio_thread* thread) { 2652 } 2653 2654 2655 2656 void cras_iodev_update_dsp(struct cras_iodev *iodev) 2657 { 2658 cras_iodev_update_dsp_called++; 2659 cras_iodev_update_dsp_name = iodev->dsp_name; 2660 } 2661 2662 int cras_iodev_set_node_attr(struct cras_ionode *ionode, 2663 enum ionode_attr attr, int value) 2664 { 2665 cras_iodev_set_node_attr_called++; 2666 cras_iodev_set_node_attr_ionode = ionode; 2667 cras_iodev_set_node_attr_attr = attr; 2668 cras_iodev_set_node_attr_value = value; 2669 if (ionode && (attr == IONODE_ATTR_PLUGGED)) 2670 ionode->plugged = value; 2671 return 0; 2672 } 2673 2674 void cras_iodev_add_node(struct cras_iodev *iodev, struct cras_ionode *node) 2675 { 2676 cras_iodev_add_node_called++; 2677 DL_APPEND(iodev->nodes, node); 2678 } 2679 2680 void cras_iodev_rm_node(struct cras_iodev *iodev, struct cras_ionode *node) 2681 { 2682 DL_DELETE(iodev->nodes, node); 2683 } 2684 2685 void cras_iodev_set_active_node(struct cras_iodev *iodev, 2686 struct cras_ionode *node) 2687 { 2688 iodev->active_node = node; 2689 } 2690 2691 void cras_iodev_free_resources(struct cras_iodev *iodev) 2692 { 2693 cras_iodev_free_resources_called++; 2694 } 2695 2696 void cras_alsa_jack_update_monitor_name(const struct cras_alsa_jack *jack, 2697 char *name_buf, 2698 unsigned int buf_size) 2699 { 2700 if (cras_alsa_jack_update_monitor_fake_name) 2701 strcpy(name_buf, cras_alsa_jack_update_monitor_fake_name); 2702 } 2703 2704 void cras_alsa_jack_update_node_type(const struct cras_alsa_jack *jack, 2705 enum CRAS_NODE_TYPE *type) 2706 { 2707 cras_alsa_jack_update_node_type_called++; 2708 } 2709 2710 const char *cras_alsa_jack_get_ucm_device(const struct cras_alsa_jack *jack) 2711 { 2712 return NULL; 2713 } 2714 2715 int ucm_get_default_node_gain(struct cras_use_case_mgr *mgr, const char *dev, 2716 long *gain) 2717 { 2718 if (ucm_get_default_node_gain_values.find(dev) == 2719 ucm_get_default_node_gain_values.end()) 2720 return 1; 2721 2722 *gain = ucm_get_default_node_gain_values[dev]; 2723 return 0; 2724 } 2725 2726 void cras_iodev_init_audio_area(struct cras_iodev *iodev, 2727 int num_channels) { 2728 } 2729 2730 void cras_iodev_free_audio_area(struct cras_iodev *iodev) { 2731 } 2732 2733 int cras_iodev_reset_rate_estimator(const struct cras_iodev *iodev) 2734 { 2735 return 0; 2736 } 2737 2738 int cras_iodev_frames_queued(struct cras_iodev *iodev, struct timespec *tstamp) 2739 { 2740 clock_gettime(CLOCK_MONOTONIC_RAW, tstamp); 2741 return cras_iodev_frames_queued_ret; 2742 } 2743 2744 int cras_iodev_buffer_avail(struct cras_iodev *iodev, unsigned hw_level) 2745 { 2746 return cras_iodev_buffer_avail_ret; 2747 } 2748 2749 int cras_iodev_fill_odev_zeros(struct cras_iodev *odev, unsigned int frames) 2750 { 2751 cras_iodev_fill_odev_zeros_called++; 2752 cras_iodev_fill_odev_zeros_frames = frames; 2753 return 0; 2754 } 2755 2756 void cras_audio_area_config_buf_pointers(struct cras_audio_area *area, 2757 const struct cras_audio_format *fmt, 2758 uint8_t *base_buffer) 2759 { 2760 } 2761 2762 void audio_thread_add_callback(int fd, thread_callback cb, void *data) 2763 { 2764 } 2765 2766 void audio_thread_rm_callback(int fd) 2767 { 2768 } 2769 2770 int audio_thread_rm_callback_sync(struct audio_thread *thread, int fd) { 2771 return 0; 2772 } 2773 2774 int is_utf8_string(const char* string) 2775 { 2776 return is_utf8_string_ret_value; 2777 } 2778 2779 int cras_alsa_mmap_get_whole_buffer(snd_pcm_t *handle, uint8_t **dst, 2780 unsigned int *underruns) 2781 { 2782 snd_pcm_uframes_t offset, frames; 2783 2784 cras_alsa_mmap_get_whole_buffer_called++; 2785 return cras_alsa_mmap_begin(handle, 0, dst, &offset, &frames, underruns); 2786 } 2787 2788 int cras_alsa_resume_appl_ptr(snd_pcm_t *handle, snd_pcm_uframes_t ahead) 2789 { 2790 cras_alsa_resume_appl_ptr_called++; 2791 cras_alsa_resume_appl_ptr_ahead = ahead; 2792 return 0; 2793 } 2794 2795 int cras_iodev_default_no_stream_playback(struct cras_iodev *odev, int enable) 2796 { 2797 return 0; 2798 } 2799 2800 enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev *iodev) 2801 { 2802 return iodev->state; 2803 } 2804 2805 int cras_iodev_dsp_set_swap_mode_for_node(struct cras_iodev *iodev, 2806 struct cras_ionode *node, 2807 int enable) 2808 { 2809 cras_iodev_dsp_set_swap_mode_for_node_called++; 2810 return 0; 2811 } 2812 2813 struct cras_ramp* cras_ramp_create() { 2814 return (struct cras_ramp*)0x1; 2815 } 2816 2817 } 2818