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