1c72fcc34Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 2c72fcc34Sopenharmony_ci// 3c72fcc34Sopenharmony_ci// xfer-libasound.h - a header for receiver/transmitter of frames by alsa-lib. 4c72fcc34Sopenharmony_ci// 5c72fcc34Sopenharmony_ci// Copyright (c) 2018 Takashi Sakamoto <o-takashi@sakamocchi.jp> 6c72fcc34Sopenharmony_ci// 7c72fcc34Sopenharmony_ci// Licensed under the terms of the GNU General Public License, version 2. 8c72fcc34Sopenharmony_ci 9c72fcc34Sopenharmony_ci#ifndef __ALSA_UTILS_AXFER_XFER_LIBASOUND__H_ 10c72fcc34Sopenharmony_ci#define __ALSA_UTILS_AXFER_XFER_LIBASOUND__H_ 11c72fcc34Sopenharmony_ci 12c72fcc34Sopenharmony_ci#include "xfer.h" 13c72fcc34Sopenharmony_ci#include "waiter.h" 14c72fcc34Sopenharmony_ci 15c72fcc34Sopenharmony_ci#define logging(state, ...) \ 16c72fcc34Sopenharmony_ci snd_output_printf(state->log, __VA_ARGS__) 17c72fcc34Sopenharmony_ci 18c72fcc34Sopenharmony_cienum sched_model { 19c72fcc34Sopenharmony_ci SCHED_MODEL_IRQ = 0, 20c72fcc34Sopenharmony_ci SCHED_MODEL_TIMER, 21c72fcc34Sopenharmony_ci SCHED_MODEL_COUNT, 22c72fcc34Sopenharmony_ci}; 23c72fcc34Sopenharmony_ci 24c72fcc34Sopenharmony_cistruct xfer_libasound_ops; 25c72fcc34Sopenharmony_ci 26c72fcc34Sopenharmony_cistruct libasound_state { 27c72fcc34Sopenharmony_ci snd_pcm_t *handle; 28c72fcc34Sopenharmony_ci 29c72fcc34Sopenharmony_ci snd_output_t *log; 30c72fcc34Sopenharmony_ci snd_pcm_hw_params_t *hw_params; 31c72fcc34Sopenharmony_ci snd_pcm_sw_params_t *sw_params; 32c72fcc34Sopenharmony_ci 33c72fcc34Sopenharmony_ci const struct xfer_libasound_ops *ops; 34c72fcc34Sopenharmony_ci void *private_data; 35c72fcc34Sopenharmony_ci 36c72fcc34Sopenharmony_ci bool verbose; 37c72fcc34Sopenharmony_ci 38c72fcc34Sopenharmony_ci char *node_literal; 39c72fcc34Sopenharmony_ci char *waiter_type_literal; 40c72fcc34Sopenharmony_ci char *sched_model_literal; 41c72fcc34Sopenharmony_ci 42c72fcc34Sopenharmony_ci unsigned int msec_per_period; 43c72fcc34Sopenharmony_ci unsigned int msec_per_buffer; 44c72fcc34Sopenharmony_ci unsigned int frames_per_period; 45c72fcc34Sopenharmony_ci unsigned int frames_per_buffer; 46c72fcc34Sopenharmony_ci 47c72fcc34Sopenharmony_ci unsigned int msec_for_avail_min; 48c72fcc34Sopenharmony_ci unsigned int msec_for_start_threshold; 49c72fcc34Sopenharmony_ci unsigned int msec_for_stop_threshold; 50c72fcc34Sopenharmony_ci 51c72fcc34Sopenharmony_ci bool finish_at_xrun:1; 52c72fcc34Sopenharmony_ci bool nonblock:1; 53c72fcc34Sopenharmony_ci bool mmap:1; 54c72fcc34Sopenharmony_ci bool test_nowait:1; 55c72fcc34Sopenharmony_ci bool no_auto_resample:1; 56c72fcc34Sopenharmony_ci bool no_auto_channels:1; 57c72fcc34Sopenharmony_ci bool no_auto_format:1; 58c72fcc34Sopenharmony_ci bool no_softvol:1; 59c72fcc34Sopenharmony_ci 60c72fcc34Sopenharmony_ci bool use_waiter:1; 61c72fcc34Sopenharmony_ci 62c72fcc34Sopenharmony_ci enum waiter_type waiter_type; 63c72fcc34Sopenharmony_ci struct waiter_context *waiter; 64c72fcc34Sopenharmony_ci 65c72fcc34Sopenharmony_ci // For scheduling type. 66c72fcc34Sopenharmony_ci enum sched_model sched_model; 67c72fcc34Sopenharmony_ci}; 68c72fcc34Sopenharmony_ci 69c72fcc34Sopenharmony_ci// For internal use in 'libasound' module. 70c72fcc34Sopenharmony_ci 71c72fcc34Sopenharmony_cistruct xfer_libasound_ops { 72c72fcc34Sopenharmony_ci int (*pre_process)(struct libasound_state *state); 73c72fcc34Sopenharmony_ci int (*process_frames)(struct libasound_state *state, 74c72fcc34Sopenharmony_ci unsigned int *frame_count, 75c72fcc34Sopenharmony_ci struct mapper_context *mapper, 76c72fcc34Sopenharmony_ci struct container_context *cntrs); 77c72fcc34Sopenharmony_ci void (*post_process)(struct libasound_state *state); 78c72fcc34Sopenharmony_ci unsigned int private_size; 79c72fcc34Sopenharmony_ci}; 80c72fcc34Sopenharmony_ci 81c72fcc34Sopenharmony_ciint xfer_libasound_wait_event(struct libasound_state *state, int timeout_msec, 82c72fcc34Sopenharmony_ci unsigned short *revents); 83c72fcc34Sopenharmony_ci 84c72fcc34Sopenharmony_ciextern const struct xfer_libasound_ops xfer_libasound_irq_rw_ops; 85c72fcc34Sopenharmony_ci 86c72fcc34Sopenharmony_ciextern const struct xfer_libasound_ops xfer_libasound_irq_mmap_r_ops; 87c72fcc34Sopenharmony_ciextern const struct xfer_libasound_ops xfer_libasound_irq_mmap_w_ops; 88c72fcc34Sopenharmony_ci 89c72fcc34Sopenharmony_ciextern const struct xfer_libasound_ops xfer_libasound_timer_mmap_w_ops; 90c72fcc34Sopenharmony_ciextern const struct xfer_libasound_ops xfer_libasound_timer_mmap_r_ops; 91c72fcc34Sopenharmony_ci 92c72fcc34Sopenharmony_ci#endif 93