1d5ac70f0Sopenharmony_ci/**
2d5ac70f0Sopenharmony_ci * \file include/pcm_rate.h
3d5ac70f0Sopenharmony_ci * \brief External Rate-Converter-Plugin SDK
4d5ac70f0Sopenharmony_ci * \author Takashi Iwai <tiwai@suse.de>
5d5ac70f0Sopenharmony_ci * \date 2006
6d5ac70f0Sopenharmony_ci *
7d5ac70f0Sopenharmony_ci * External Rate-Converter-Plugin SDK
8d5ac70f0Sopenharmony_ci */
9d5ac70f0Sopenharmony_ci
10d5ac70f0Sopenharmony_ci/*
11d5ac70f0Sopenharmony_ci * ALSA external PCM rate-converter plugin SDK (draft version)
12d5ac70f0Sopenharmony_ci *
13d5ac70f0Sopenharmony_ci * Copyright (c) 2006 Takashi Iwai <tiwai@suse.de>
14d5ac70f0Sopenharmony_ci *
15d5ac70f0Sopenharmony_ci *   This library is free software; you can redistribute it and/or modify
16d5ac70f0Sopenharmony_ci *   it under the terms of the GNU Lesser General Public License as
17d5ac70f0Sopenharmony_ci *   published by the Free Software Foundation; either version 2.1 of
18d5ac70f0Sopenharmony_ci *   the License, or (at your option) any later version.
19d5ac70f0Sopenharmony_ci *
20d5ac70f0Sopenharmony_ci *   This program is distributed in the hope that it will be useful,
21d5ac70f0Sopenharmony_ci *   but WITHOUT ANY WARRANTY; without even the implied warranty of
22d5ac70f0Sopenharmony_ci *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23d5ac70f0Sopenharmony_ci *   GNU Lesser General Public License for more details.
24d5ac70f0Sopenharmony_ci *
25d5ac70f0Sopenharmony_ci *   You should have received a copy of the GNU Lesser General Public
26d5ac70f0Sopenharmony_ci *   License along with this library; if not, write to the Free Software
27d5ac70f0Sopenharmony_ci *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
28d5ac70f0Sopenharmony_ci *
29d5ac70f0Sopenharmony_ci */
30d5ac70f0Sopenharmony_ci
31d5ac70f0Sopenharmony_ci#ifndef __ALSA_PCM_RATE_H
32d5ac70f0Sopenharmony_ci#define __ALSA_PCM_RATE_H
33d5ac70f0Sopenharmony_ci
34d5ac70f0Sopenharmony_ci#ifdef __cplusplus
35d5ac70f0Sopenharmony_ciextern "C" {
36d5ac70f0Sopenharmony_ci#endif
37d5ac70f0Sopenharmony_ci
38d5ac70f0Sopenharmony_ci/**
39d5ac70f0Sopenharmony_ci * Protocol version
40d5ac70f0Sopenharmony_ci */
41d5ac70f0Sopenharmony_ci#define SND_PCM_RATE_PLUGIN_VERSION	0x010003
42d5ac70f0Sopenharmony_ci
43d5ac70f0Sopenharmony_ci/** hw_params information for a single side */
44d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_side_info {
45d5ac70f0Sopenharmony_ci	snd_pcm_format_t format;
46d5ac70f0Sopenharmony_ci	unsigned int rate;
47d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t buffer_size;
48d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t period_size;
49d5ac70f0Sopenharmony_ci} snd_pcm_rate_side_info_t;
50d5ac70f0Sopenharmony_ci
51d5ac70f0Sopenharmony_ci/** hw_params information */
52d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_info {
53d5ac70f0Sopenharmony_ci	struct snd_pcm_rate_side_info in;
54d5ac70f0Sopenharmony_ci	struct snd_pcm_rate_side_info out;
55d5ac70f0Sopenharmony_ci	unsigned int channels;
56d5ac70f0Sopenharmony_ci} snd_pcm_rate_info_t;
57d5ac70f0Sopenharmony_ci
58d5ac70f0Sopenharmony_cienum {
59d5ac70f0Sopenharmony_ci	SND_PCM_RATE_FLAG_INTERLEAVED = (1U << 0),	/** only interleaved format */
60d5ac70f0Sopenharmony_ci	SND_PCM_RATE_FLAG_SYNC_FORMATS = (1U << 1),	/** both input and output formats have to be identical */
61d5ac70f0Sopenharmony_ci};
62d5ac70f0Sopenharmony_ci
63d5ac70f0Sopenharmony_ci/** Callback table of rate-converter */
64d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_ops {
65d5ac70f0Sopenharmony_ci	/**
66d5ac70f0Sopenharmony_ci	 * close the converter; optional
67d5ac70f0Sopenharmony_ci	 */
68d5ac70f0Sopenharmony_ci	void (*close)(void *obj);
69d5ac70f0Sopenharmony_ci	/**
70d5ac70f0Sopenharmony_ci	 * initialize the converter, called at hw_params
71d5ac70f0Sopenharmony_ci	 */
72d5ac70f0Sopenharmony_ci	int (*init)(void *obj, snd_pcm_rate_info_t *info);
73d5ac70f0Sopenharmony_ci	/**
74d5ac70f0Sopenharmony_ci	 * free the converter; optional
75d5ac70f0Sopenharmony_ci	 */
76d5ac70f0Sopenharmony_ci	void (*free)(void *obj);
77d5ac70f0Sopenharmony_ci	/**
78d5ac70f0Sopenharmony_ci	 * reset the converter, called at prepare; optional
79d5ac70f0Sopenharmony_ci	 */
80d5ac70f0Sopenharmony_ci	void (*reset)(void *obj);
81d5ac70f0Sopenharmony_ci	/**
82d5ac70f0Sopenharmony_ci	 * adjust the pitch, called at sw_params; optional
83d5ac70f0Sopenharmony_ci	 */
84d5ac70f0Sopenharmony_ci	int (*adjust_pitch)(void *obj, snd_pcm_rate_info_t *info);
85d5ac70f0Sopenharmony_ci	/**
86d5ac70f0Sopenharmony_ci	 * convert the data
87d5ac70f0Sopenharmony_ci	 */
88d5ac70f0Sopenharmony_ci	void (*convert)(void *obj,
89d5ac70f0Sopenharmony_ci			const snd_pcm_channel_area_t *dst_areas,
90d5ac70f0Sopenharmony_ci			snd_pcm_uframes_t dst_offset, unsigned int dst_frames,
91d5ac70f0Sopenharmony_ci			const snd_pcm_channel_area_t *src_areas,
92d5ac70f0Sopenharmony_ci			snd_pcm_uframes_t src_offset, unsigned int src_frames);
93d5ac70f0Sopenharmony_ci	/**
94d5ac70f0Sopenharmony_ci	 * convert an s16 interleaved-data array; exclusive with convert
95d5ac70f0Sopenharmony_ci	 */
96d5ac70f0Sopenharmony_ci	void (*convert_s16)(void *obj, int16_t *dst, unsigned int dst_frames,
97d5ac70f0Sopenharmony_ci			    const int16_t *src, unsigned int src_frames);
98d5ac70f0Sopenharmony_ci	/**
99d5ac70f0Sopenharmony_ci	 * compute the frame size for input
100d5ac70f0Sopenharmony_ci	 */
101d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t (*input_frames)(void *obj, snd_pcm_uframes_t frames);
102d5ac70f0Sopenharmony_ci	/**
103d5ac70f0Sopenharmony_ci	 * compute the frame size for output
104d5ac70f0Sopenharmony_ci	 */
105d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t (*output_frames)(void *obj, snd_pcm_uframes_t frames);
106d5ac70f0Sopenharmony_ci	/**
107d5ac70f0Sopenharmony_ci	 * the protocol version the plugin supports;
108d5ac70f0Sopenharmony_ci	 * new field since version 0x010002
109d5ac70f0Sopenharmony_ci	 */
110d5ac70f0Sopenharmony_ci	unsigned int version;
111d5ac70f0Sopenharmony_ci	/**
112d5ac70f0Sopenharmony_ci	 * return the supported min / max sample rates;
113d5ac70f0Sopenharmony_ci	 * new ops since version 0x010002
114d5ac70f0Sopenharmony_ci	 */
115d5ac70f0Sopenharmony_ci	int (*get_supported_rates)(void *obj, unsigned int *rate_min,
116d5ac70f0Sopenharmony_ci				   unsigned int *rate_max);
117d5ac70f0Sopenharmony_ci	/**
118d5ac70f0Sopenharmony_ci	 * show some status messages for verbose mode;
119d5ac70f0Sopenharmony_ci	 * new ops since version 0x010002
120d5ac70f0Sopenharmony_ci	 */
121d5ac70f0Sopenharmony_ci	void (*dump)(void *obj, snd_output_t *out);
122d5ac70f0Sopenharmony_ci	/**
123d5ac70f0Sopenharmony_ci	 * get the supported input and output formats (optional);
124d5ac70f0Sopenharmony_ci	 * new ops since version 0x010003
125d5ac70f0Sopenharmony_ci	 */
126d5ac70f0Sopenharmony_ci	int (*get_supported_formats)(void *obj, uint64_t *in_formats,
127d5ac70f0Sopenharmony_ci				     uint64_t *out_formats,
128d5ac70f0Sopenharmony_ci				     unsigned int *flags);
129d5ac70f0Sopenharmony_ci} snd_pcm_rate_ops_t;
130d5ac70f0Sopenharmony_ci
131d5ac70f0Sopenharmony_ci/** open function type */
132d5ac70f0Sopenharmony_citypedef int (*snd_pcm_rate_open_func_t)(unsigned int version, void **objp,
133d5ac70f0Sopenharmony_ci					snd_pcm_rate_ops_t *opsp);
134d5ac70f0Sopenharmony_ci
135d5ac70f0Sopenharmony_citypedef int (*snd_pcm_rate_open_conf_func_t)(unsigned int version, void **objp,
136d5ac70f0Sopenharmony_ci					snd_pcm_rate_ops_t *opsp, const snd_config_t *conf);
137d5ac70f0Sopenharmony_ci
138d5ac70f0Sopenharmony_ci/**
139d5ac70f0Sopenharmony_ci * Define the object entry for external PCM rate-converter plugins
140d5ac70f0Sopenharmony_ci */
141d5ac70f0Sopenharmony_ci#define SND_PCM_RATE_PLUGIN_ENTRY(name) _snd_pcm_rate_##name##_open
142d5ac70f0Sopenharmony_ci#define SND_PCM_RATE_PLUGIN_CONF_ENTRY(name) _snd_pcm_rate_##name##_open_conf
143d5ac70f0Sopenharmony_ci
144d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN
145d5ac70f0Sopenharmony_ci/* old rate_ops for protocol version 0x010001 */
146d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_old_ops {
147d5ac70f0Sopenharmony_ci	void (*close)(void *obj);
148d5ac70f0Sopenharmony_ci	int (*init)(void *obj, snd_pcm_rate_info_t *info);
149d5ac70f0Sopenharmony_ci	void (*free)(void *obj);
150d5ac70f0Sopenharmony_ci	void (*reset)(void *obj);
151d5ac70f0Sopenharmony_ci	int (*adjust_pitch)(void *obj, snd_pcm_rate_info_t *info);
152d5ac70f0Sopenharmony_ci	void (*convert)(void *obj,
153d5ac70f0Sopenharmony_ci			const snd_pcm_channel_area_t *dst_areas,
154d5ac70f0Sopenharmony_ci			snd_pcm_uframes_t dst_offset, unsigned int dst_frames,
155d5ac70f0Sopenharmony_ci			const snd_pcm_channel_area_t *src_areas,
156d5ac70f0Sopenharmony_ci			snd_pcm_uframes_t src_offset, unsigned int src_frames);
157d5ac70f0Sopenharmony_ci	void (*convert_s16)(void *obj, int16_t *dst, unsigned int dst_frames,
158d5ac70f0Sopenharmony_ci			    const int16_t *src, unsigned int src_frames);
159d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t (*input_frames)(void *obj, snd_pcm_uframes_t frames);
160d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t (*output_frames)(void *obj, snd_pcm_uframes_t frames);
161d5ac70f0Sopenharmony_ci} snd_pcm_rate_old_ops_t;
162d5ac70f0Sopenharmony_ci
163d5ac70f0Sopenharmony_ci/* old rate_ops for protocol version 0x010002 */
164d5ac70f0Sopenharmony_citypedef struct snd_pcm_rate_v2_ops {
165d5ac70f0Sopenharmony_ci	void (*close)(void *obj);
166d5ac70f0Sopenharmony_ci	int (*init)(void *obj, snd_pcm_rate_info_t *info);
167d5ac70f0Sopenharmony_ci	void (*free)(void *obj);
168d5ac70f0Sopenharmony_ci	void (*reset)(void *obj);
169d5ac70f0Sopenharmony_ci	int (*adjust_pitch)(void *obj, snd_pcm_rate_info_t *info);
170d5ac70f0Sopenharmony_ci	void (*convert)(void *obj,
171d5ac70f0Sopenharmony_ci			const snd_pcm_channel_area_t *dst_areas,
172d5ac70f0Sopenharmony_ci			snd_pcm_uframes_t dst_offset, unsigned int dst_frames,
173d5ac70f0Sopenharmony_ci			const snd_pcm_channel_area_t *src_areas,
174d5ac70f0Sopenharmony_ci			snd_pcm_uframes_t src_offset, unsigned int src_frames);
175d5ac70f0Sopenharmony_ci	void (*convert_s16)(void *obj, int16_t *dst, unsigned int dst_frames,
176d5ac70f0Sopenharmony_ci			    const int16_t *src, unsigned int src_frames);
177d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t (*input_frames)(void *obj, snd_pcm_uframes_t frames);
178d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t (*output_frames)(void *obj, snd_pcm_uframes_t frames);
179d5ac70f0Sopenharmony_ci	unsigned int version;
180d5ac70f0Sopenharmony_ci	int (*get_supported_rates)(void *obj, unsigned int *rate_min,
181d5ac70f0Sopenharmony_ci				   unsigned int *rate_max);
182d5ac70f0Sopenharmony_ci	void (*dump)(void *obj, snd_output_t *out);
183d5ac70f0Sopenharmony_ci} snd_pcm_rate_v2_ops_t;
184d5ac70f0Sopenharmony_ci#endif
185d5ac70f0Sopenharmony_ci
186d5ac70f0Sopenharmony_ci#ifdef __cplusplus
187d5ac70f0Sopenharmony_ci}
188d5ac70f0Sopenharmony_ci#endif
189d5ac70f0Sopenharmony_ci
190d5ac70f0Sopenharmony_ci#endif /* __ALSA_PCM_RATE_H */
191