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