• Home
  • Raw
  • Download

Lines Matching refs:iodev

67 static void cras_iodev_alloc_dsp(struct cras_iodev *iodev);
105 static int cras_iodev_start(struct cras_iodev *iodev) in cras_iodev_start() argument
108 if (!cras_iodev_is_open(iodev)) in cras_iodev_start()
110 if (!iodev->start) { in cras_iodev_start()
113 iodev->info.name); in cras_iodev_start()
116 rc = iodev->start(iodev); in cras_iodev_start()
119 iodev->state = CRAS_IODEV_STATE_NORMAL_RUN; in cras_iodev_start()
301 static size_t get_best_rate(struct cras_iodev *iodev, size_t rrate) in get_best_rate() argument
306 if (iodev->supported_rates[0] == 0) /* No rates supported */ in get_best_rate()
309 for (i = 0, best = 0; iodev->supported_rates[i] != 0; i++) { in get_best_rate()
310 if (rrate == iodev->supported_rates[i] && rrate >= 44100) in get_best_rate()
312 if (best == 0 && (rrate % iodev->supported_rates[i] == 0 || in get_best_rate()
313 iodev->supported_rates[i] % rrate == 0)) in get_best_rate()
314 best = iodev->supported_rates[i]; in get_best_rate()
319 return iodev->supported_rates[0]; in get_best_rate()
328 static size_t get_best_channel_count(struct cras_iodev *iodev, size_t count) in get_best_channel_count() argument
333 assert(iodev->supported_channel_counts[0] != 0); in get_best_channel_count()
335 for (i = 0; iodev->supported_channel_counts[i] != 0; i++) { in get_best_channel_count()
336 if (iodev->supported_channel_counts[i] == count) in get_best_channel_count()
343 for (i = 0; iodev->supported_channel_counts[i] != 0; i++) { in get_best_channel_count()
344 if (iodev->supported_channel_counts[i] == in get_best_channel_count()
349 return iodev->supported_channel_counts[0]; in get_best_channel_count()
354 static snd_pcm_format_t get_best_pcm_format(struct cras_iodev *iodev, in get_best_pcm_format() argument
359 for (i = 0; iodev->supported_formats[i] != 0; i++) { in get_best_pcm_format()
360 if (fmt == iodev->supported_formats[i]) in get_best_pcm_format()
364 return iodev->supported_formats[0]; in get_best_pcm_format()
368 static int apply_dsp(struct cras_iodev *iodev, uint8_t *buf, size_t frames) in apply_dsp() argument
374 ctx = iodev->dsp_context; in apply_dsp()
382 rc = cras_dsp_pipeline_apply(pipeline, buf, iodev->format->format, in apply_dsp()
389 static void cras_iodev_free_dsp(struct cras_iodev *iodev) in cras_iodev_free_dsp() argument
391 if (iodev->dsp_context) { in cras_iodev_free_dsp()
392 cras_dsp_context_free(iodev->dsp_context); in cras_iodev_free_dsp()
393 iodev->dsp_context = NULL; in cras_iodev_free_dsp()
399 static inline void adjust_dev_channel_for_dsp(const struct cras_iodev *iodev) in adjust_dev_channel_for_dsp() argument
401 struct cras_dsp_context *ctx = iodev->dsp_context; in adjust_dev_channel_for_dsp()
406 if (iodev->direction == CRAS_STREAM_OUTPUT) in adjust_dev_channel_for_dsp()
407 iodev->format->num_channels = cras_dsp_num_output_channels(ctx); in adjust_dev_channel_for_dsp()
409 iodev->format->num_channels = cras_dsp_num_input_channels(ctx); in adjust_dev_channel_for_dsp()
418 static void update_channel_layout(struct cras_iodev *iodev) in update_channel_layout() argument
422 if (iodev->update_channel_layout == NULL) in update_channel_layout()
425 rc = iodev->update_channel_layout(iodev); in update_channel_layout()
427 cras_audio_format_set_default_channel_layout(iodev->format); in update_channel_layout()
443 int cras_iodev_set_format(struct cras_iodev *iodev, in cras_iodev_set_format() argument
452 if (iodev->format == NULL) { in cras_iodev_set_format()
453 iodev->format = malloc(sizeof(struct cras_audio_format)); in cras_iodev_set_format()
454 if (!iodev->format) in cras_iodev_set_format()
456 *iodev->format = *fmt; in cras_iodev_set_format()
458 if (iodev->update_supported_formats) { in cras_iodev_set_format()
459 rc = iodev->update_supported_formats(iodev); in cras_iodev_set_format()
469 actual_rate = get_best_rate(iodev, fmt->frame_rate); in cras_iodev_set_format()
470 iodev->format->frame_rate = actual_rate; in cras_iodev_set_format()
472 cras_iodev_alloc_dsp(iodev); in cras_iodev_set_format()
473 cras_iodev_update_dsp(iodev); in cras_iodev_set_format()
474 if (iodev->dsp_context) in cras_iodev_set_format()
475 adjust_dev_channel_for_dsp(iodev); in cras_iodev_set_format()
478 iodev, iodev->format->num_channels); in cras_iodev_set_format()
479 actual_format = get_best_pcm_format(iodev, fmt->format); in cras_iodev_set_format()
486 iodev->format->format = actual_format; in cras_iodev_set_format()
487 if (iodev->format->num_channels != actual_num_channels) { in cras_iodev_set_format()
489 iodev->format->num_channels = actual_num_channels; in cras_iodev_set_format()
490 trim_channel_layout(iodev->format); in cras_iodev_set_format()
491 cras_iodev_free_dsp(iodev); in cras_iodev_set_format()
494 update_channel_layout(iodev); in cras_iodev_set_format()
496 if (!iodev->rate_est) in cras_iodev_set_format()
497 iodev->rate_est = rate_estimator_create( in cras_iodev_set_format()
501 rate_estimator_reset_rate(iodev->rate_est, actual_rate); in cras_iodev_set_format()
507 free(iodev->format); in cras_iodev_set_format()
508 iodev->format = NULL; in cras_iodev_set_format()
515 static void add_ext_dsp_module_to_pipeline(struct cras_iodev *iodev) in add_ext_dsp_module_to_pipeline() argument
519 pipeline = iodev->dsp_context ? in add_ext_dsp_module_to_pipeline()
520 cras_dsp_get_pipeline(iodev->dsp_context) : in add_ext_dsp_module_to_pipeline()
524 cras_iodev_alloc_dsp(iodev); in add_ext_dsp_module_to_pipeline()
525 cras_dsp_load_dummy_pipeline(iodev->dsp_context, in add_ext_dsp_module_to_pipeline()
526 iodev->format->num_channels); in add_ext_dsp_module_to_pipeline()
527 pipeline = cras_dsp_get_pipeline(iodev->dsp_context); in add_ext_dsp_module_to_pipeline()
532 if (iodev->ext_dsp_module) in add_ext_dsp_module_to_pipeline()
533 iodev->ext_dsp_module->configure(iodev->ext_dsp_module, in add_ext_dsp_module_to_pipeline()
534 iodev->buffer_size, in add_ext_dsp_module_to_pipeline()
535 iodev->format->num_channels, in add_ext_dsp_module_to_pipeline()
536 iodev->format->frame_rate); in add_ext_dsp_module_to_pipeline()
538 cras_dsp_pipeline_set_sink_ext_module(pipeline, iodev->ext_dsp_module); in add_ext_dsp_module_to_pipeline()
541 cras_dsp_put_pipeline(iodev->dsp_context); in add_ext_dsp_module_to_pipeline()
547 static void release_ext_dsp_module_from_pipeline(struct cras_iodev *iodev) in release_ext_dsp_module_from_pipeline() argument
551 if (iodev->dsp_context == NULL) in release_ext_dsp_module_from_pipeline()
554 pipeline = cras_dsp_get_pipeline(iodev->dsp_context); in release_ext_dsp_module_from_pipeline()
562 cras_dsp_put_pipeline(iodev->dsp_context); in release_ext_dsp_module_from_pipeline()
565 void cras_iodev_set_ext_dsp_module(struct cras_iodev *iodev, in cras_iodev_set_ext_dsp_module() argument
568 iodev->ext_dsp_module = ext; in cras_iodev_set_ext_dsp_module()
570 if (!cras_iodev_is_open(iodev)) in cras_iodev_set_ext_dsp_module()
573 if (iodev->ext_dsp_module) in cras_iodev_set_ext_dsp_module()
574 add_ext_dsp_module_to_pipeline(iodev); in cras_iodev_set_ext_dsp_module()
576 release_ext_dsp_module_from_pipeline(iodev); in cras_iodev_set_ext_dsp_module()
579 void cras_iodev_update_dsp(struct cras_iodev *iodev) in cras_iodev_update_dsp() argument
583 if (!iodev->dsp_context) in cras_iodev_update_dsp()
586 cras_dsp_set_variable_string(iodev->dsp_context, "dsp_name", in cras_iodev_update_dsp()
587 iodev->dsp_name ?: ""); in cras_iodev_update_dsp()
589 if (iodev->active_node && iodev->active_node->left_right_swapped) in cras_iodev_update_dsp()
592 cras_dsp_set_variable_boolean(iodev->dsp_context, "swap_lr_disabled", in cras_iodev_update_dsp()
595 cras_dsp_load_pipeline(iodev->dsp_context); in cras_iodev_update_dsp()
598 int cras_iodev_dsp_set_swap_mode_for_node(struct cras_iodev *iodev, in cras_iodev_dsp_set_swap_mode_for_node() argument
611 if (iodev->active_node == node) in cras_iodev_dsp_set_swap_mode_for_node()
612 cras_iodev_update_dsp(iodev); in cras_iodev_dsp_set_swap_mode_for_node()
616 void cras_iodev_free_format(struct cras_iodev *iodev) in cras_iodev_free_format() argument
618 free(iodev->format); in cras_iodev_free_format()
619 iodev->format = NULL; in cras_iodev_free_format()
622 void cras_iodev_init_audio_area(struct cras_iodev *iodev, int num_channels) in cras_iodev_init_audio_area() argument
624 if (iodev->area) in cras_iodev_init_audio_area()
625 cras_iodev_free_audio_area(iodev); in cras_iodev_init_audio_area()
627 iodev->area = cras_audio_area_create(num_channels); in cras_iodev_init_audio_area()
628 cras_audio_area_config_channels(iodev->area, iodev->format); in cras_iodev_init_audio_area()
631 void cras_iodev_free_audio_area(struct cras_iodev *iodev) in cras_iodev_free_audio_area() argument
633 if (!iodev->area) in cras_iodev_free_audio_area()
636 cras_audio_area_destroy(iodev->area); in cras_iodev_free_audio_area()
637 iodev->area = NULL; in cras_iodev_free_audio_area()
640 void cras_iodev_free_resources(struct cras_iodev *iodev) in cras_iodev_free_resources() argument
642 cras_iodev_free_dsp(iodev); in cras_iodev_free_resources()
643 rate_estimator_destroy(iodev->rate_est); in cras_iodev_free_resources()
644 if (iodev->ramp) in cras_iodev_free_resources()
645 cras_ramp_destroy(iodev->ramp); in cras_iodev_free_resources()
648 static void cras_iodev_alloc_dsp(struct cras_iodev *iodev) in cras_iodev_alloc_dsp() argument
652 if (iodev->direction == CRAS_STREAM_OUTPUT) in cras_iodev_alloc_dsp()
657 cras_iodev_free_dsp(iodev); in cras_iodev_alloc_dsp()
658 iodev->dsp_context = in cras_iodev_alloc_dsp()
659 cras_dsp_context_new(iodev->format->frame_rate, purpose); in cras_iodev_alloc_dsp()
692 void cras_iodev_add_node(struct cras_iodev *iodev, struct cras_ionode *node) in cras_iodev_add_node() argument
694 DL_APPEND(iodev->nodes, node); in cras_iodev_add_node()
698 void cras_iodev_rm_node(struct cras_iodev *iodev, struct cras_ionode *node) in cras_iodev_rm_node() argument
700 DL_DELETE(iodev->nodes, node); in cras_iodev_rm_node()
704 void cras_iodev_set_active_node(struct cras_iodev *iodev, in cras_iodev_set_active_node() argument
707 iodev->active_node = node; in cras_iodev_set_active_node()
708 cras_iodev_list_notify_active_node_changed(iodev->direction); in cras_iodev_set_active_node()
711 float cras_iodev_get_software_volume_scaler(struct cras_iodev *iodev) in cras_iodev_get_software_volume_scaler() argument
715 volume = cras_iodev_adjust_active_node_volume(iodev, in cras_iodev_get_software_volume_scaler()
718 if (iodev->active_node && iodev->active_node->softvol_scalers) in cras_iodev_get_software_volume_scaler()
719 return iodev->active_node->softvol_scalers[volume]; in cras_iodev_get_software_volume_scaler()
723 float cras_iodev_get_software_gain_scaler(const struct cras_iodev *iodev) in cras_iodev_get_software_gain_scaler() argument
726 if (cras_iodev_software_volume_needed(iodev)) { in cras_iodev_get_software_gain_scaler()
728 iodev, cras_system_get_capture_gain()); in cras_iodev_get_software_gain_scaler()
756 int cras_iodev_add_stream(struct cras_iodev *iodev, struct dev_stream *stream) in cras_iodev_add_stream() argument
763 DL_APPEND(iodev->streams, stream); in cras_iodev_add_stream()
764 if (!iodev->buf_state) in cras_iodev_add_stream()
765 iodev->buf_state = buffer_share_create(iodev->buffer_size); in cras_iodev_add_stream()
767 cras_iodev_start_stream(iodev, stream); in cras_iodev_add_stream()
771 void cras_iodev_start_stream(struct cras_iodev *iodev, in cras_iodev_start_stream() argument
783 buffer_share_add_id(iodev->buf_state, stream->stream->stream_id, in cras_iodev_start_stream()
785 iodev->min_cb_level = MIN(iodev->min_cb_level, cb_threshold); in cras_iodev_start_stream()
786 iodev->max_cb_level = MAX(iodev->max_cb_level, cb_threshold); in cras_iodev_start_stream()
787 iodev->largest_cb_level = MAX(iodev->largest_cb_level, cb_threshold); in cras_iodev_start_stream()
791 struct dev_stream *cras_iodev_rm_stream(struct cras_iodev *iodev, in cras_iodev_rm_stream() argument
800 iodev->min_cb_level = iodev->buffer_size / 2; in cras_iodev_rm_stream()
801 iodev->max_cb_level = 0; in cras_iodev_rm_stream()
802 DL_FOREACH (iodev->streams, out) { in cras_iodev_rm_stream()
804 buffer_share_rm_id(iodev->buf_state, in cras_iodev_rm_stream()
807 DL_DELETE(iodev->streams, out); in cras_iodev_rm_stream()
813 iodev->min_cb_level = MIN(iodev->min_cb_level, cb_threshold); in cras_iodev_rm_stream()
814 iodev->max_cb_level = MAX(iodev->max_cb_level, cb_threshold); in cras_iodev_rm_stream()
824 if (!iodev->streams) { in cras_iodev_rm_stream()
825 buffer_share_destroy(iodev->buf_state); in cras_iodev_rm_stream()
826 iodev->buf_state = NULL; in cras_iodev_rm_stream()
827 iodev->min_cb_level = iodev->buffer_size / 2; in cras_iodev_rm_stream()
831 if ((iodev->direction == CRAS_STREAM_OUTPUT) && in cras_iodev_rm_stream()
832 (iodev->state == CRAS_IODEV_STATE_NORMAL_RUN)) in cras_iodev_rm_stream()
833 cras_iodev_no_stream_playback_transition(iodev, 1); in cras_iodev_rm_stream()
839 DL_FOREACH (iodev->streams, out) { in cras_iodev_rm_stream()
847 unsigned int cras_iodev_stream_offset(struct cras_iodev *iodev, in cras_iodev_stream_offset() argument
850 return buffer_share_id_offset(iodev->buf_state, in cras_iodev_stream_offset()
854 void cras_iodev_stream_written(struct cras_iodev *iodev, in cras_iodev_stream_written() argument
857 buffer_share_offset_update(iodev->buf_state, stream->stream->stream_id, in cras_iodev_stream_written()
861 unsigned int cras_iodev_all_streams_written(struct cras_iodev *iodev) in cras_iodev_all_streams_written() argument
863 if (!iodev->buf_state) in cras_iodev_all_streams_written()
865 return buffer_share_get_new_write_point(iodev->buf_state); in cras_iodev_all_streams_written()
868 unsigned int cras_iodev_max_stream_offset(const struct cras_iodev *iodev) in cras_iodev_max_stream_offset() argument
873 DL_FOREACH (iodev->streams, curr) { in cras_iodev_max_stream_offset()
878 max = MAX(max, buffer_share_id_offset(iodev->buf_state, in cras_iodev_max_stream_offset()
885 int cras_iodev_open(struct cras_iodev *iodev, unsigned int cb_level, in cras_iodev_open() argument
891 if (iodev->pre_open_iodev_hook) in cras_iodev_open()
892 iodev->pre_open_iodev_hook(); in cras_iodev_open()
894 DL_FOREACH (iodev->loopbacks, loopback) { in cras_iodev_open()
899 if (iodev->open_dev) { in cras_iodev_open()
900 rc = iodev->open_dev(iodev); in cras_iodev_open()
905 if (iodev->format == NULL) { in cras_iodev_open()
906 rc = cras_iodev_set_format(iodev, fmt); in cras_iodev_open()
908 iodev->close_dev(iodev); in cras_iodev_open()
913 rc = iodev->configure_dev(iodev); in cras_iodev_open()
915 iodev->close_dev(iodev); in cras_iodev_open()
923 iodev->format->frame_rate); in cras_iodev_open()
925 iodev->min_cb_level = MIN(iodev->buffer_size / 2, cb_level); in cras_iodev_open()
926 iodev->max_cb_level = 0; in cras_iodev_open()
927 iodev->largest_cb_level = 0; in cras_iodev_open()
929 iodev->reset_request_pending = 0; in cras_iodev_open()
930 iodev->state = CRAS_IODEV_STATE_OPEN; in cras_iodev_open()
931 iodev->highest_hw_level = 0; in cras_iodev_open()
932 iodev->input_dsp_offset = 0; in cras_iodev_open()
934 if (iodev->direction == CRAS_STREAM_OUTPUT) { in cras_iodev_open()
937 if (iodev->start) in cras_iodev_open()
938 iodev->state = CRAS_IODEV_STATE_OPEN; in cras_iodev_open()
940 iodev->state = CRAS_IODEV_STATE_NO_STREAM_RUN; in cras_iodev_open()
942 iodev->input_data = input_data_create(iodev); in cras_iodev_open()
946 if (iodev->ext_dsp_module == NULL) in cras_iodev_open()
947 iodev->ext_dsp_module = &iodev->input_data->ext; in cras_iodev_open()
952 iodev->state = CRAS_IODEV_STATE_NORMAL_RUN; in cras_iodev_open()
954 iodev->input_streaming = 0; in cras_iodev_open()
962 iodev->software_gain_scaler = in cras_iodev_open()
963 cras_iodev_get_software_gain_scaler(iodev); in cras_iodev_open()
966 add_ext_dsp_module_to_pipeline(iodev); in cras_iodev_open()
967 clock_gettime(CLOCK_MONOTONIC_RAW, &iodev->open_ts); in cras_iodev_open()
972 enum CRAS_IODEV_STATE cras_iodev_state(const struct cras_iodev *iodev) in cras_iodev_state() argument
974 return iodev->state; in cras_iodev_state()
977 int cras_iodev_close(struct cras_iodev *iodev) in cras_iodev_close() argument
982 if (!cras_iodev_is_open(iodev)) in cras_iodev_close()
985 cras_server_metrics_device_runtime(iodev); in cras_iodev_close()
987 if (iodev->input_data) { in cras_iodev_close()
988 if (iodev->ext_dsp_module == &iodev->input_data->ext) in cras_iodev_close()
989 iodev->ext_dsp_module = NULL; in cras_iodev_close()
990 input_data_destroy(&iodev->input_data); in cras_iodev_close()
993 rc = iodev->close_dev(iodev); in cras_iodev_close()
996 iodev->state = CRAS_IODEV_STATE_CLOSE; in cras_iodev_close()
997 if (iodev->ramp) in cras_iodev_close()
998 cras_ramp_reset(iodev->ramp); in cras_iodev_close()
1000 if (iodev->post_close_iodev_hook) in cras_iodev_close()
1001 iodev->post_close_iodev_hook(); in cras_iodev_close()
1003 DL_FOREACH (iodev->loopbacks, loopback) { in cras_iodev_close()
1011 int cras_iodev_put_input_buffer(struct cras_iodev *iodev) in cras_iodev_put_input_buffer() argument
1015 struct input_data *data = iodev->input_data; in cras_iodev_put_input_buffer()
1018 if (iodev->streams) in cras_iodev_put_input_buffer()
1019 min_frames = buffer_share_get_new_write_point(iodev->buf_state); in cras_iodev_put_input_buffer()
1024 dsp_frames = MAX(iodev->input_frames_read, iodev->input_dsp_offset); in cras_iodev_put_input_buffer()
1025 iodev->input_dsp_offset = dsp_frames - min_frames; in cras_iodev_put_input_buffer()
1028 rate_estimator_add_frames(iodev->rate_est, -min_frames); in cras_iodev_put_input_buffer()
1029 rc = iodev->put_buffer(iodev, min_frames); in cras_iodev_put_input_buffer()
1035 int cras_iodev_put_output_buffer(struct cras_iodev *iodev, uint8_t *frames, in cras_iodev_put_output_buffer() argument
1039 const struct cras_audio_format *fmt = iodev->format; in cras_iodev_put_output_buffer()
1047 int software_volume_needed = cras_iodev_software_volume_needed(iodev); in cras_iodev_put_output_buffer()
1062 DL_FOREACH (iodev->loopbacks, loopback) { in cras_iodev_put_output_buffer()
1064 loopback->hook_data(frames, nframes, iodev->format, in cras_iodev_put_output_buffer()
1068 rc = apply_dsp(iodev, frames, nframes); in cras_iodev_put_output_buffer()
1072 DL_FOREACH (iodev->loopbacks, loopback) { in cras_iodev_put_output_buffer()
1074 loopback->hook_data(frames, nframes, iodev->format, in cras_iodev_put_output_buffer()
1078 if (iodev->ramp) { in cras_iodev_put_output_buffer()
1079 ramp_action = cras_ramp_get_current_action(iodev->ramp); in cras_iodev_put_output_buffer()
1084 if (output_should_mute(iodev) && in cras_iodev_put_output_buffer()
1093 cras_iodev_get_software_volume_scaler(iodev); in cras_iodev_put_output_buffer()
1112 cras_ramp_update_ramped_frames(iodev->ramp, nframes); in cras_iodev_put_output_buffer()
1113 } else if (!output_should_mute(iodev) && software_volume_needed) { in cras_iodev_put_output_buffer()
1122 cras_channel_remix_convert(remix_converter, iodev->format, in cras_iodev_put_output_buffer()
1124 if (iodev->rate_est) in cras_iodev_put_output_buffer()
1125 rate_estimator_add_frames(iodev->rate_est, nframes); in cras_iodev_put_output_buffer()
1127 return iodev->put_buffer(iodev, nframes); in cras_iodev_put_output_buffer()
1130 int cras_iodev_get_input_buffer(struct cras_iodev *iodev, unsigned int *frames) in cras_iodev_get_input_buffer() argument
1132 const unsigned int frame_bytes = cras_get_format_bytes(iodev->format); in cras_iodev_get_input_buffer()
1133 struct input_data *data = iodev->input_data; in cras_iodev_get_input_buffer()
1138 rc = iodev->get_buffer(iodev, &data->area, frames); in cras_iodev_get_input_buffer()
1150 iodev->input_frames_read = *frames; in cras_iodev_get_input_buffer()
1164 if (*frames > iodev->input_dsp_offset) { in cras_iodev_get_input_buffer()
1165 rc = apply_dsp(iodev, in cras_iodev_get_input_buffer()
1167 iodev->input_dsp_offset * frame_bytes, in cras_iodev_get_input_buffer()
1168 *frames - iodev->input_dsp_offset); in cras_iodev_get_input_buffer()
1179 int cras_iodev_get_output_buffer(struct cras_iodev *iodev, in cras_iodev_get_output_buffer() argument
1186 rc = iodev->get_buffer(iodev, area, frames); in cras_iodev_get_output_buffer()
1197 int cras_iodev_update_rate(struct cras_iodev *iodev, unsigned int level, in cras_iodev_update_rate() argument
1201 if ((iodev->direction == CRAS_STREAM_OUTPUT) && !level) in cras_iodev_update_rate()
1202 rate_estimator_reset_rate(iodev->rate_est, in cras_iodev_update_rate()
1203 iodev->format->frame_rate); in cras_iodev_update_rate()
1205 return rate_estimator_check(iodev->rate_est, level, level_tstamp); in cras_iodev_update_rate()
1208 int cras_iodev_reset_rate_estimator(const struct cras_iodev *iodev) in cras_iodev_reset_rate_estimator() argument
1210 rate_estimator_reset_rate(iodev->rate_est, iodev->format->frame_rate); in cras_iodev_reset_rate_estimator()
1214 double cras_iodev_get_est_rate_ratio(const struct cras_iodev *iodev) in cras_iodev_get_est_rate_ratio() argument
1216 return rate_estimator_get_rate(iodev->rate_est) / in cras_iodev_get_est_rate_ratio()
1217 iodev->format->frame_rate; in cras_iodev_get_est_rate_ratio()
1220 int cras_iodev_get_dsp_delay(const struct cras_iodev *iodev) in cras_iodev_get_dsp_delay() argument
1226 ctx = iodev->dsp_context; in cras_iodev_get_dsp_delay()
1240 int cras_iodev_frames_queued(struct cras_iodev *iodev, in cras_iodev_frames_queued() argument
1245 rc = iodev->frames_queued(iodev, hw_tstamp); in cras_iodev_frames_queued()
1252 if (iodev->direction == CRAS_STREAM_INPUT) { in cras_iodev_frames_queued()
1254 iodev->input_streaming = 1; in cras_iodev_frames_queued()
1258 if (rc < iodev->min_buffer_level) in cras_iodev_frames_queued()
1261 return rc - iodev->min_buffer_level; in cras_iodev_frames_queued()
1264 int cras_iodev_buffer_avail(struct cras_iodev *iodev, unsigned hw_level) in cras_iodev_buffer_avail() argument
1266 if (iodev->direction == CRAS_STREAM_INPUT) in cras_iodev_buffer_avail()
1269 if (hw_level + iodev->min_buffer_level > iodev->buffer_size) in cras_iodev_buffer_avail()
1272 return iodev->buffer_size - iodev->min_buffer_level - hw_level; in cras_iodev_buffer_avail()
1404 unsigned int cras_iodev_get_num_underruns(const struct cras_iodev *iodev) in cras_iodev_get_num_underruns() argument
1406 if (iodev->get_num_underruns) in cras_iodev_get_num_underruns()
1407 return iodev->get_num_underruns(iodev); in cras_iodev_get_num_underruns()
1411 unsigned int cras_iodev_get_num_severe_underruns(const struct cras_iodev *iodev) in cras_iodev_get_num_severe_underruns() argument
1413 if (iodev->get_num_severe_underruns) in cras_iodev_get_num_severe_underruns()
1414 return iodev->get_num_severe_underruns(iodev); in cras_iodev_get_num_severe_underruns()
1418 int cras_iodev_reset_request(struct cras_iodev *iodev) in cras_iodev_reset_request() argument
1430 if (iodev->reset_request_pending) in cras_iodev_reset_request()
1432 iodev->reset_request_pending = 1; in cras_iodev_reset_request()
1433 return cras_device_monitor_reset_device(iodev->info.idx); in cras_iodev_reset_request()
1531 int cras_iodev_set_mute(struct cras_iodev *iodev) in cras_iodev_set_mute() argument
1533 if (!cras_iodev_is_open(iodev)) in cras_iodev_set_mute()
1536 if (iodev->set_mute) in cras_iodev_set_mute()
1537 iodev->set_mute(iodev); in cras_iodev_set_mute()
1541 void cras_iodev_update_highest_hw_level(struct cras_iodev *iodev, in cras_iodev_update_highest_hw_level() argument
1544 iodev->highest_hw_level = MAX(iodev->highest_hw_level, hw_level); in cras_iodev_update_highest_hw_level()
1555 static int cras_iodev_drop_frames(struct cras_iodev *iodev, unsigned int frames) in cras_iodev_drop_frames() argument
1560 if (iodev->direction != CRAS_STREAM_INPUT) in cras_iodev_drop_frames()
1563 rc = cras_iodev_frames_queued(iodev, &hw_tstamp); in cras_iodev_drop_frames()
1569 rc = iodev->get_buffer(iodev, &iodev->input_data->area, &frames); in cras_iodev_drop_frames()
1573 rc = iodev->put_buffer(iodev, frames); in cras_iodev_drop_frames()
1581 rate_estimator_add_frames(iodev->rate_est, -frames); in cras_iodev_drop_frames()
1583 ATLOG(atlog, AUDIO_THREAD_DEV_DROP_FRAMES, iodev->info.idx, frames, 0); in cras_iodev_drop_frames()
1588 int cras_iodev_drop_frames_by_time(struct cras_iodev *iodev, struct timespec ts) in cras_iodev_drop_frames_by_time() argument
1594 est_rate = iodev->format->frame_rate * in cras_iodev_drop_frames_by_time()
1595 cras_iodev_get_est_rate_ratio(iodev); in cras_iodev_drop_frames_by_time()
1598 rc = cras_iodev_drop_frames(iodev, frames_to_set); in cras_iodev_drop_frames_by_time()