Home | History | Annotate | Download | only in server

Lines Matching defs:aio

156 static void init_device_settings(struct alsa_io *aio);
254 struct alsa_io *aio = (struct alsa_io *)iodev;
258 rc = cras_alsa_get_avail_frames(aio->handle,
259 aio->base.buffer_size,
260 aio->severe_underrun_frames,
263 &aio->num_underruns);
266 aio->num_severe_underruns++;
269 if (!aio->enable_htimestamp)
280 struct alsa_io *aio = (struct alsa_io *)iodev;
284 rc = cras_alsa_get_delay_frames(aio->handle,
295 struct alsa_io *aio = (struct alsa_io *)iodev;
298 if (aio->poll_fd >= 0)
301 aio->poll_fd);
302 if (!aio->handle)
304 cras_alsa_pcm_close(aio->handle);
305 aio->handle = NULL;
306 aio->is_free_running = 0;
307 aio->filled_zeros_for_draining = 0;
308 cras_iodev_free_format(&aio->base);
309 cras_iodev_free_audio_area(&aio->base);
316 struct alsa_io *aio = (struct alsa_io *)arg;
317 audio_thread_rm_callback(aio->poll_fd);
318 aio->poll_fd = -1;
324 struct alsa_io *aio = (struct alsa_io *)iodev;
334 aio->num_underruns = 0;
335 aio->is_free_running = 0;
336 aio->filled_zeros_for_draining = 0;
337 aio->severe_underrun_frames =
343 aio->dev, iodev->format->frame_rate,
346 rc = cras_alsa_pcm_open(&handle, aio->dev, aio->alsa_stream);
355 aio->dma_period_set_microsecs);
370 rc = cras_alsa_set_swparams(handle, &aio->enable_htimestamp);
377 aio->handle = handle;
378 init_device_settings(aio);
380 aio->poll_fd = -1;
406 aio->poll_fd = ufds[i].fd;
412 if (aio->poll_fd >= 0)
413 audio_thread_add_callback(aio->poll_fd,
415 aio);
419 if (aio->alsa_stream == SND_PCM_STREAM_CAPTURE)
420 cras_alsa_pcm_start(aio->handle);
434 static int has_handle(const struct alsa_io *aio)
436 return !!aio->handle;
441 struct alsa_io *aio = (struct alsa_io *)iodev;
442 snd_pcm_t *handle = aio->handle;
470 struct alsa_io *aio = (struct alsa_io *)iodev;
476 aio->mmap_offset = 0;
479 rc = cras_alsa_mmap_begin(aio->handle,
482 &aio->mmap_offset,
484 &aio->num_underruns);
497 struct alsa_io *aio = (struct alsa_io *)iodev;
499 return cras_alsa_mmap_commit(aio->handle,
500 aio->mmap_offset,
502 &aio->num_underruns);
507 struct alsa_io *aio = (struct alsa_io *)iodev;
511 nframes = snd_pcm_forwardable(aio->handle);
512 return snd_pcm_forward(aio->handle, nframes);
554 struct alsa_io *aio = (struct alsa_io *)iodev;
561 if (aio->ucm && (iodev->direction == CRAS_STREAM_INPUT)) {
573 err = cras_alsa_pcm_open(&handle, aio->dev, aio->alsa_stream);
582 aio->dma_period_set_microsecs);
596 struct alsa_io *aio = (struct alsa_io *)iodev;
597 if (!aio->ucm)
600 return ucm_set_hotword_model(aio->ucm, model_name);
605 struct alsa_io *aio
606 if (!aio->ucm)
609 return ucm_get_hotword_models(aio->ucm);
616 static struct alsa_output_node *get_active_output(const struct alsa_io *aio)
618 return (struct alsa_output_node *)aio->base.active_node;
621 static struct alsa_input_node *get_active_input(const struct alsa_io *aio)
623 return (struct alsa_input_node *)aio->base.active_node;
631 const struct alsa_io *aio,
636 return aio->default_volume_curve;
643 const struct alsa_io *aio)
645 struct alsa_output_node *node = get_active_output(aio);
646 return get_curve_for_output_node(aio, node);
652 static void set_alsa_volume_limits(struct alsa_io *aio)
657 if (!has_handle(aio))
660 curve = get_curve_for_active_output(aio);
669 static void set_alsa_mute_control(const struct alsa_io *aio, int muted)
673 if (!has_handle(aio))
676 aout = get_active_output(aio);
678 aio->mixer,
690 const struct alsa_io *aio = (const struct alsa_io *)iodev;
695 assert(aio);
696 if (aio->mixer == NULL)
700 if (!has_handle(aio))
704 curve = get_curve_for_active_output(aio);
707 aout = get_active_output(aio);
717 aio->mixer,
725 const struct alsa_io *aio = (const struct alsa_io *)iodev;
726 set_alsa_mute_control(aio, cras_system_get_mute());
736 const struct alsa_io *aio = (const struct alsa_io *)iodev;
740 assert(aio);
741 if (aio->mixer == NULL)
745 if (!has_handle(aio))
754 ain = get_active_input(aio);
757 aio->mixer,
760 cras_alsa_mixer_set_capture_mute(aio->mixer,
771 const struct alsa_io *aio = (const struct alsa_io *)iodev;
772 assert(aio);
773 return ucm_enable_swap_mode(aio->ucm, node->name, enable);
781 static void init_device_settings(struct alsa_io *aio)
785 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
786 set_alsa_volume_limits(aio);
787 set_alsa_volume(&aio->base);
788 set_alsa_mute(&aio->base);
791 struct alsa_input_node *ain = get_active_input(aio);
797 if (cras_iodev_software_volume_needed(&aio->base)) {
800 &aio->base);
804 aio->mixer, mixer_input);
807 aio->mixer, mixer_input);
811 set_alsa_capture_gain(&aio->base);
824 static void free_alsa_iodev_resources(struct alsa_io *aio)
829 free(aio->base.supported_rates);
830 free(aio->base.supported_channel_counts);
831 free(aio->base.supported_formats);
833 DL_FOREACH(aio->base.nodes, node) {
834 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
838 cras_iodev_rm_node(&aio->base, node);
843 free((void *)aio->dsp_name_default);
844 cras_iodev_free_resources(&aio->base);
845 free(aio->dev);
846 if (aio->dev_id)
847 free(aio->dev_id);
848 if (aio->dev_name)
849 free(aio->dev_name);
855 static int first_internal_device(struct alsa_io *aio)
857 return aio->is_first && aio->card_type == ALSA_CARD_TYPE_INTERNAL;
863 static int has_node(struct alsa_io *aio, const char *name)
867 DL_FOREACH(aio->base.nodes, node)
956 static int get_ucm_flag_integer(struct alsa_io *aio,
963 if (!aio->ucm)
966 value = ucm_get_flag(aio->ucm, flag_name);
976 static int auto_unplug_input_node(struct alsa_io *aio)
979 if (get_ucm_flag_integer(aio, "AutoUnplugInputNode", &result))
984 static int auto_unplug_output_node(struct alsa_io *aio)
987 if (get_ucm_flag_integer(aio, "AutoUnplugOutputNode", &result))
992 static int no_create_default_input_node(struct alsa_io *aio)
995 if (get_ucm_flag_integer(aio, "NoCreateDefaultInputNode", &result))
1000 static int no_create_default_output_node(struct alsa_io *aio)
1003 if (get_ucm_flag_integer(aio, "NoCreateDefaultOutputNode", &result))
1009 struct alsa_output_node *output, struct alsa_io *aio)
1012 struct cras_alsa_mixer *mixer = aio->mixer;
1015 if (aio->ucm && ucm_get_disable_software_volume(aio->ucm)) {
1044 struct alsa_input_node *input, struct alsa_io *aio)
1053 if (!aio->ucm)
1056 rc = ucm_get_max_software_gain(aio->ucm, input->base.name,
1069 struct alsa_io *aio)
1074 if (!aio->ucm)
1077 rc = ucm_get_default_node_gain(aio->ucm, input->base.name,
1085 static void check_auto_unplug_output_node(struct alsa_io *aio,
1091 if (!auto_unplug_output_node(aio))
1096 DL_FOREACH(aio->base.nodes, tmp)
1102 DL_FOREACH(aio->base.nodes, tmp) {
1116 static struct alsa_output_node *new_output(struct alsa_io *aio,
1122 if (aio == NULL) {
1123 syslog(LOG_ERR, "Invalid aio when listing outputs.");
1131 output->base.dev = &aio->base;
1132 output->base.idx = aio->next_ionode_index++;
1135 aio->base.info.stable_id);
1138 aio->base.info.stable_id_new
1144 aio->config,
1149 set_node_initial_state(&output->base, aio->card_type);
1150 set_output_node_software_volume_needed(output, aio);
1152 cras_iodev_add_node(&aio->base, &output->base);
1154 check_auto_unplug_output_node(aio, &output->base, output->base.plugged);
1161 struct alsa_io *aio = (struct alsa_io *)callback_arg;
1169 if (aio->card_type == ALSA_CARD_TYPE_USB) {
1171 aio->base.info.name, ctl_name);
1172 new_output(aio, cras_output, node_name);
1174 new_output(aio, cras_output, ctl_name);
1178 static void check_auto_unplug_input_node(struct alsa_io *aio,
1183 if (!auto_unplug_input_node(aio))
1189 DL_FOREACH(aio->base.nodes, tmp)
1195 DL_FOREACH(aio->base.nodes, tmp)
1203 static struct alsa_input_node *new_input(struct alsa_io *aio,
1215 input->base.dev = &aio->base;
1216 input->base.idx = aio->next_ionode_index++;
1219 aio->base.info.stable_id);
1222 aio->base.info.stable_id_new);
1225 aio->card_type);
1226 set_input_node_software_volume_needed(input, aio);
1227 set_input_default_node_gain(input, aio);
1229 if (aio->ucm) {
1233 mic_positions = ucm_get_mic_positions(aio->ucm);
1245 err = ucm_get_capture_chmap_for_dev(aio->ucm, name,
1253 cras_iodev_add_node(&aio->base, &input->base);
1254 check_auto_unplug_input_node(aio, &input->base,
1262 struct alsa_io *aio = (struct alsa_io *)callback_arg;
1266 if (aio->card_type == ALSA_CARD_TYPE_USB) {
1268 aio->base.info.name, ctl_name);
1269 new_input(aio, cras_input, node_name);
1271 new_input(aio, cras_input, ctl_name);
1279 struct alsa_io *aio, const struct cras_alsa_jack *jack)
1286 DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, aout,
1296 DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, aout,
1302 struct alsa_io *aio, const struct cras_alsa_jack *jack)
1310 DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, ain,
1315 DL_SEARCH_SCALAR_WITH_CAST(aio->base.nodes, node, ain,
1325 static const char *get_active_dsp_name(struct alsa_io *aio)
1327 struct cras_ionode *node = aio->base.active_node;
1333 if (aio->base.direction == CRAS_STREAM_OUTPUT)
1338 return cras_alsa_jack_get_dsp_name(jack) ? : aio->dsp_name_default;
1373 struct alsa_io *aio;
1380 aio = (struct alsa_io *)arg;
1381 node = get_output_node_from_jack(aio, jack);
1388 if (aio->fully_specified) {
1394 node = new_output(aio, NULL, jack_name);
1402 if (aio->fully_specified)
1412 aio->config, jack);
1426 check_auto_unplug_output_node(aio, &node->base, plugged);
1436 struct alsa_io *aio;
1443 aio = (struct alsa_io *)arg;
1444 node = get_input_node_from_jack(aio, jack);
1449 if (aio->fully_specified) {
1456 node = new_input(aio, cras_input, jack_name);
1466 if (aio->fully_specified)
1476 check_auto_unplug_input_node(aio, &node->base, plugged);
1537 static int get_fixed_rate(struct alsa_io *aio)
1541 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
1542 struct alsa_output_node *active = get_active_output(aio);
1547 struct alsa_input_node *active = get_active_input(aio);
1553 return ucm_get_sample_rate_for_dev(aio->ucm, name, aio->base.direction);
1561 struct alsa_io *aio = (struct alsa_io *)iodev;
1572 err = cras_alsa_fill_properties(aio->dev, aio->alsa_stream,
1579 if (aio->ucm) {
1581 fixed_rate = get_fixed_rate(aio);
1596 static void build_softvol_scalers(struct alsa_io *aio)
1600 DL_FOREACH(aio->base.nodes, ionode) {
1605 curve = get_curve_for_output_node(aio, aout);
1611 static void enable_active_ucm(struct alsa_io *aio, int plugged)
1616 if (aio->base.direction == CRAS_STREAM_OUTPUT) {
1617 struct alsa_output_node *active = get_active_output(aio);
1623 struct alsa_input_node *active = get_active_input(aio);
1632 else if (aio->ucm)
1633 ucm_set_enabled(aio->ucm, name, plugged);
1638 struct alsa_io *aio = (struct alsa_io *)iodev;
1645 aio->handle, &dst, &aio->num_underruns);
1661 struct alsa_io *aio = (struct alsa_io *)odev;
1667 aio->handle,
1685 struct alsa_io *aio = (struct alsa_io *)odev;
1691 if (aio->is_free_running)
1701 if (hw_level < aio->filled_zeros_for_draining || hw_level == 0) {
1705 aio->is_free_running = 1;
1717 aio->filled_zeros_for_draining += fr_to_write;
1725 struct alsa_io *aio = (struct alsa_io *)odev;
1728 if (!aio->is_free_running)
1737 aio->is_free_running = 0;
1738 aio->filled_zeros_for_draining = 0;
1759 struct alsa_io *aio = (struct alsa_io *)odev;
1760 if (aio->is_free_running)
1771 const struct alsa_io *aio = (const struct alsa_io *)iodev;
1772 return aio->num_underruns;
1777 const struct alsa_io *aio = (const struct alsa_io *)iodev;
1778 return aio->num_severe_underruns;
1815 struct alsa_io *aio;
1821 aio = (struct alsa_io *)calloc(1, sizeof(*aio));
1822 if (!aio)
1824 iodev = &aio->base;
1827 aio->device_index = device_index;
1828 aio->card_type = card_type;
1829 aio->is_first = is_first;
1830 aio->handle = NULL;
1831 aio->num_severe_underruns = 0;
1833 aio->dev_name = strdup(dev_name);
1834 if (!aio->dev_name)
1838 aio->dev_id = strdup(dev_id);
1839 if (!aio->dev_id)
1842 aio->is_free_running = 0;
1843 aio->filled_zeros_for_draining = 0;
1844 aio->dev = (char *)malloc(MAX_ALSA_DEV_NAME_LENGTH);
1845 if (aio->dev == NULL)
1847 snprintf(aio->dev,
1854 aio->alsa_stream = SND_PCM_STREAM_CAPTURE;
1855 aio->base.set_capture_gain = set_alsa_capture_gain;
1856 aio->base.set_capture_mute = set_alsa_capture_gain;
1858 aio->alsa_stream = SND_PCM_STREAM_PLAYBACK;
1859 aio->base.set_volume = set_alsa_volume;
1860 aio->base.set_mute = set_alsa_mute;
1861 aio->base.output_underrun = alsa_output_underrun;
1889 aio->mixer = mixer;
1890 aio->config = config;
1892 aio->default_volume_curve =
1895 if (aio->default_volume_curve == NULL)
1896 aio->default_volume_curve =
1899 aio->ucm = ucm;
1903 aio->dsp_name_default = ucm_get_dsp_name_default(ucm,
1908 aio->base.set_swap_mode_for_node =
1915 aio->enable_htimestamp =
1922 aio->jack_list =
1935 aio);
1936 if (!aio->jack_list)
1946 cras_iodev_list_add_output(&aio->base);
1948 cras_iodev_list_add_input(&aio->base);
1949 return &aio->base;
1952 free_alsa_iodev_resources(aio);
1953 free(aio);
1959 struct alsa_io *aio = (struct alsa_io *)iodev;
1967 if (!aio)
1970 dev_name = aio->dev_name;
1971 dev_id = aio->dev_id;
1972 is_first = aio->is_first;
1973 mixer = aio->mixer;
1979 new_output_by_mixer_control, aio);
1982 new_input_by_mixer_control, aio);
1984 err = cras_alsa_jack_list_find_jacks_by_name_matching(aio->jack_list);
1991 cras_alsa_jack_list_report(aio->jack_list);
1999 !no_create_default_output_node(aio)) {
2000 if (first_internal_device(aio) &&
2001 !has_node(aio, INTERNAL_SPEAKER) &&
2002 !has_node(aio, HDMI)) {
2003 if (strstr(aio->base.info.name, HDMI))
2004 new_output(aio, NULL, HDMI);
2006 new_output(aio, NULL, INTERNAL_SPEAKER);
2007 } else if (!aio->base.nodes) {
2008 new_output(aio, NULL, DEFAULT);
2011 !no_create_default_input_node(aio)) {
2012 if (first_internal_device(aio) &&
2013 !has_node(aio, INTERNAL_MICROPHONE))
2014 new_input(aio, NULL, INTERNAL_MICROPHONE);
2016 new_input(aio, NULL, KEYBOARD_MIC);
2018 new_input(aio, NULL, HOTWORD_DEV);
2019 else if (!aio->base.nodes)
2020 new_input(aio, NULL, DEFAULT);
2025 build_softvol_scalers(aio);
2028 alsa_iodev_set_active_node(&aio->base,
2029 first_plugged_node(&aio->base),
2033 if (aio->card_type == ALSA_CARD_TYPE_USB && is_first)
2045 struct alsa_io *aio = (struct alsa_io *)iodev;
2052 if (!aio || !section)
2054 if ((uint32_t)section->dev_idx != aio->device_index)
2058 aio->fully_specified = 1;
2062 if (!aio->dma_period_set_microsecs)
2063 aio->dma_period_set_microsecs =
2064 ucm_get_dma_period_for_dev(aio->ucm, section->name);
2068 control = cras_alsa_mixer_get_control_for_section(aio->mixer, section);
2070 output_node = new_output(aio, control, section->name);
2074 input_node = new_input(aio, control, section->name);
2081 aio->jack_list, section, &jack);
2092 aio->config, jack);
2102 struct alsa_io *aio = (struct alsa_io *)iodev;
2108 cras_alsa_jack_list_report(aio->jack_list);
2112 build_softvol_scalers(aio);
2115 alsa_iodev_set_active_node(&aio->base,
2116 first_plugged_node(&aio->base),
2120 if (aio->card_type == ALSA_CARD_TYPE_USB && aio->is_first)
2129 struct alsa_io *aio = (struct alsa_io *)iodev;
2132 cras_alsa_jack_list_destroy(aio->jack_list);
2144 free_alsa_iodev_resources(aio);
2145 cras_volume_curve_destroy(aio->default_volume_curve);
2151 struct alsa_io *aio = (struct alsa_io *)iodev;
2152 return aio->device_index;
2157 struct alsa_io *aio = (struct alsa_io *)iodev;
2158 return cras_alsa_jack_list_has_hctl_jacks(aio->jack_list);
2161 static void alsa_iodev_unmute_node(struct alsa_io *aio,
2173 set_alsa_mute_control(aio, 1);
2175 DL_FOREACH(aio->base.nodes, node) {
2188 struct alsa_io *aio = (struct alsa_io *)iodev;
2191 enable_active_ucm(aio, dev_enabled);
2192 init_device_settings(aio);
2197 enable_active_ucm(aio, 0);
2199 alsa_iodev_unmute_node(aio, ionode);
2202 aio->base.dsp_name = get_active_dsp_name(aio);
2204 enable_active_ucm(aio, dev_enabled);
2206 init_device_settings(aio);