1d5ac70f0Sopenharmony_ci/*
2d5ac70f0Sopenharmony_ci *  PCM - Common plugin code
3d5ac70f0Sopenharmony_ci *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org>
4d5ac70f0Sopenharmony_ci *
5d5ac70f0Sopenharmony_ci *
6d5ac70f0Sopenharmony_ci *   This library is free software; you can redistribute it and/or modify
7d5ac70f0Sopenharmony_ci *   it under the terms of the GNU Lesser General Public License as
8d5ac70f0Sopenharmony_ci *   published by the Free Software Foundation; either version 2.1 of
9d5ac70f0Sopenharmony_ci *   the License, or (at your option) any later version.
10d5ac70f0Sopenharmony_ci *
11d5ac70f0Sopenharmony_ci *   This program is distributed in the hope that it will be useful,
12d5ac70f0Sopenharmony_ci *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13d5ac70f0Sopenharmony_ci *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14d5ac70f0Sopenharmony_ci *   GNU Lesser General Public License for more details.
15d5ac70f0Sopenharmony_ci *
16d5ac70f0Sopenharmony_ci *   You should have received a copy of the GNU Lesser General Public
17d5ac70f0Sopenharmony_ci *   License along with this library; if not, write to the Free Software
18d5ac70f0Sopenharmony_ci *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19d5ac70f0Sopenharmony_ci *
20d5ac70f0Sopenharmony_ci */
21d5ac70f0Sopenharmony_ci
22d5ac70f0Sopenharmony_ci#include "pcm_generic.h"
23d5ac70f0Sopenharmony_ci
24d5ac70f0Sopenharmony_citypedef snd_pcm_uframes_t (*snd_pcm_slave_xfer_areas_func_t)
25d5ac70f0Sopenharmony_ci     (snd_pcm_t *pcm,
26d5ac70f0Sopenharmony_ci      const snd_pcm_channel_area_t *areas,
27d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t offset,
28d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t size,
29d5ac70f0Sopenharmony_ci      const snd_pcm_channel_area_t *slave_areas,
30d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t slave_offset,
31d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t *slave_sizep);
32d5ac70f0Sopenharmony_ci
33d5ac70f0Sopenharmony_citypedef snd_pcm_sframes_t (*snd_pcm_slave_xfer_areas_undo_func_t)
34d5ac70f0Sopenharmony_ci     (snd_pcm_t *pcm,
35d5ac70f0Sopenharmony_ci      const snd_pcm_channel_area_t *res_areas,	/* result areas */
36d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t res_offset,		/* offset of result areas */
37d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t res_size,		/* size of result areas */
38d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t slave_undo_size);
39d5ac70f0Sopenharmony_ci
40d5ac70f0Sopenharmony_citypedef struct {
41d5ac70f0Sopenharmony_ci	snd_pcm_generic_t gen;
42d5ac70f0Sopenharmony_ci	snd_pcm_slave_xfer_areas_func_t read;
43d5ac70f0Sopenharmony_ci	snd_pcm_slave_xfer_areas_func_t write;
44d5ac70f0Sopenharmony_ci	snd_pcm_slave_xfer_areas_undo_func_t undo_read;
45d5ac70f0Sopenharmony_ci	snd_pcm_slave_xfer_areas_undo_func_t undo_write;
46d5ac70f0Sopenharmony_ci	int (*init)(snd_pcm_t *pcm);
47d5ac70f0Sopenharmony_ci	snd_pcm_uframes_t appl_ptr, hw_ptr;
48d5ac70f0Sopenharmony_ci} snd_pcm_plugin_t;
49d5ac70f0Sopenharmony_ci
50d5ac70f0Sopenharmony_ci/* make local functions really local */
51d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_init \
52d5ac70f0Sopenharmony_ci	snd1_pcm_plugin_init
53d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_may_wait_for_avail_min_conv \
54d5ac70f0Sopenharmony_ci	snd1_pcm_plugin_may_wait_for_avail_min_conv
55d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_may_wait_for_avail_min \
56d5ac70f0Sopenharmony_ci	snd1_pcm_plugin_may_wait_for_avail_min
57d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_fast_ops \
58d5ac70f0Sopenharmony_ci	snd1_pcm_plugin_fast_ops
59d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_undo_read_generic \
60d5ac70f0Sopenharmony_ci	snd1_pcm_plugin_undo_read_generic
61d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_undo_write_generic \
62d5ac70f0Sopenharmony_ci	snd1_pcm_plugin_undo_write_generic
63d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_rewind \
64d5ac70f0Sopenharmony_ci	snd1_pcm_plugin_rewind
65d5ac70f0Sopenharmony_ci#define snd_pcm_plugin_forward \
66d5ac70f0Sopenharmony_ci	snd1_pcm_plugin_forward
67d5ac70f0Sopenharmony_ci
68d5ac70f0Sopenharmony_civoid snd_pcm_plugin_init(snd_pcm_plugin_t *plugin);
69d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_plugin_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
70d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_plugin_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
71d5ac70f0Sopenharmony_ciint snd_pcm_plugin_may_wait_for_avail_min_conv(snd_pcm_t *pcm, snd_pcm_uframes_t avail,
72d5ac70f0Sopenharmony_ci					       snd_pcm_uframes_t (*conv)(snd_pcm_t *, snd_pcm_uframes_t));
73d5ac70f0Sopenharmony_ciint snd_pcm_plugin_may_wait_for_avail_min(snd_pcm_t *pcm, snd_pcm_uframes_t avail);
74d5ac70f0Sopenharmony_ci
75d5ac70f0Sopenharmony_ciextern const snd_pcm_fast_ops_t snd_pcm_plugin_fast_ops;
76d5ac70f0Sopenharmony_ci
77d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_plugin_undo_read_generic
78d5ac70f0Sopenharmony_ci     (snd_pcm_t *pcm,
79d5ac70f0Sopenharmony_ci      const snd_pcm_channel_area_t *res_areas,	/* result areas */
80d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t res_offset,		/* offset of result areas */
81d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t res_size,		/* size of result areas */
82d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t slave_undo_size);
83d5ac70f0Sopenharmony_ci
84d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_plugin_undo_write_generic
85d5ac70f0Sopenharmony_ci     (snd_pcm_t *pcm,
86d5ac70f0Sopenharmony_ci      const snd_pcm_channel_area_t *res_areas,	/* result areas */
87d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t res_offset,		/* offset of result areas */
88d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t res_size,		/* size of result areas */
89d5ac70f0Sopenharmony_ci      snd_pcm_uframes_t slave_undo_size);
90d5ac70f0Sopenharmony_ci
91d5ac70f0Sopenharmony_ci/* make local functions really local */
92d5ac70f0Sopenharmony_ci#define snd_pcm_linear_get_index	snd1_pcm_linear_get_index
93d5ac70f0Sopenharmony_ci#define snd_pcm_linear_put_index	snd1_pcm_linear_put_index
94d5ac70f0Sopenharmony_ci#define snd_pcm_linear_convert_index	snd1_pcm_linear_convert_index
95d5ac70f0Sopenharmony_ci#define snd_pcm_linear_convert	snd1_pcm_linear_convert
96d5ac70f0Sopenharmony_ci#define snd_pcm_linear_getput	snd1_pcm_linear_getput
97d5ac70f0Sopenharmony_ci#define snd_pcm_alaw_decode	snd1_pcm_alaw_decode
98d5ac70f0Sopenharmony_ci#define snd_pcm_alaw_encode	snd1_pcm_alaw_encode
99d5ac70f0Sopenharmony_ci#define snd_pcm_mulaw_decode	snd1_pcm_mulaw_decode
100d5ac70f0Sopenharmony_ci#define snd_pcm_mulaw_encode	snd1_pcm_mulaw_encode
101d5ac70f0Sopenharmony_ci#define snd_pcm_adpcm_decode	snd1_pcm_adpcm_decode
102d5ac70f0Sopenharmony_ci#define snd_pcm_adpcm_encode	snd1_pcm_adpcm_encode
103d5ac70f0Sopenharmony_ci
104d5ac70f0Sopenharmony_ciint snd_pcm_linear_get_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format);
105d5ac70f0Sopenharmony_ciint snd_pcm_linear_put_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format);
106d5ac70f0Sopenharmony_ciint snd_pcm_linear_convert_index(snd_pcm_format_t src_format, snd_pcm_format_t dst_format);
107d5ac70f0Sopenharmony_ci
108d5ac70f0Sopenharmony_civoid snd_pcm_linear_convert(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset,
109d5ac70f0Sopenharmony_ci			    const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset,
110d5ac70f0Sopenharmony_ci			    unsigned int channels, snd_pcm_uframes_t frames,
111d5ac70f0Sopenharmony_ci			    unsigned int convidx);
112d5ac70f0Sopenharmony_civoid snd_pcm_linear_getput(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset,
113d5ac70f0Sopenharmony_ci			   const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset,
114d5ac70f0Sopenharmony_ci			   unsigned int channels, snd_pcm_uframes_t frames,
115d5ac70f0Sopenharmony_ci			   unsigned int get_idx, unsigned int put_idx);
116d5ac70f0Sopenharmony_civoid snd_pcm_alaw_decode(const snd_pcm_channel_area_t *dst_areas,
117d5ac70f0Sopenharmony_ci			 snd_pcm_uframes_t dst_offset,
118d5ac70f0Sopenharmony_ci			 const snd_pcm_channel_area_t *src_areas,
119d5ac70f0Sopenharmony_ci			 snd_pcm_uframes_t src_offset,
120d5ac70f0Sopenharmony_ci			 unsigned int channels, snd_pcm_uframes_t frames,
121d5ac70f0Sopenharmony_ci			 unsigned int putidx);
122d5ac70f0Sopenharmony_civoid snd_pcm_alaw_encode(const snd_pcm_channel_area_t *dst_areas,
123d5ac70f0Sopenharmony_ci			 snd_pcm_uframes_t dst_offset,
124d5ac70f0Sopenharmony_ci			 const snd_pcm_channel_area_t *src_areas,
125d5ac70f0Sopenharmony_ci			 snd_pcm_uframes_t src_offset,
126d5ac70f0Sopenharmony_ci			 unsigned int channels, snd_pcm_uframes_t frames,
127d5ac70f0Sopenharmony_ci			 unsigned int getidx);
128d5ac70f0Sopenharmony_civoid snd_pcm_mulaw_decode(const snd_pcm_channel_area_t *dst_areas,
129d5ac70f0Sopenharmony_ci			  snd_pcm_uframes_t dst_offset,
130d5ac70f0Sopenharmony_ci			  const snd_pcm_channel_area_t *src_areas,
131d5ac70f0Sopenharmony_ci			  snd_pcm_uframes_t src_offset,
132d5ac70f0Sopenharmony_ci			  unsigned int channels, snd_pcm_uframes_t frames,
133d5ac70f0Sopenharmony_ci			  unsigned int putidx);
134d5ac70f0Sopenharmony_civoid snd_pcm_mulaw_encode(const snd_pcm_channel_area_t *dst_areas,
135d5ac70f0Sopenharmony_ci			  snd_pcm_uframes_t dst_offset,
136d5ac70f0Sopenharmony_ci			  const snd_pcm_channel_area_t *src_areas,
137d5ac70f0Sopenharmony_ci			  snd_pcm_uframes_t src_offset,
138d5ac70f0Sopenharmony_ci			  unsigned int channels, snd_pcm_uframes_t frames,
139d5ac70f0Sopenharmony_ci			  unsigned int getidx);
140d5ac70f0Sopenharmony_ci
141d5ac70f0Sopenharmony_citypedef struct _snd_pcm_adpcm_state {
142d5ac70f0Sopenharmony_ci	int pred_val;		/* Calculated predicted value */
143d5ac70f0Sopenharmony_ci	int step_idx;		/* Previous StepSize lookup index */
144d5ac70f0Sopenharmony_ci} snd_pcm_adpcm_state_t;
145d5ac70f0Sopenharmony_ci
146d5ac70f0Sopenharmony_civoid snd_pcm_adpcm_decode(const snd_pcm_channel_area_t *dst_areas,
147d5ac70f0Sopenharmony_ci			  snd_pcm_uframes_t dst_offset,
148d5ac70f0Sopenharmony_ci			  const snd_pcm_channel_area_t *src_areas,
149d5ac70f0Sopenharmony_ci			  snd_pcm_uframes_t src_offset,
150d5ac70f0Sopenharmony_ci			  unsigned int channels, snd_pcm_uframes_t frames,
151d5ac70f0Sopenharmony_ci			  unsigned int putidx,
152d5ac70f0Sopenharmony_ci			  snd_pcm_adpcm_state_t *states);
153d5ac70f0Sopenharmony_civoid snd_pcm_adpcm_encode(const snd_pcm_channel_area_t *dst_areas,
154d5ac70f0Sopenharmony_ci			  snd_pcm_uframes_t dst_offset,
155d5ac70f0Sopenharmony_ci			  const snd_pcm_channel_area_t *src_areas,
156d5ac70f0Sopenharmony_ci			  snd_pcm_uframes_t src_offset,
157d5ac70f0Sopenharmony_ci			  unsigned int channels, snd_pcm_uframes_t frames,
158d5ac70f0Sopenharmony_ci			  unsigned int getidx,
159d5ac70f0Sopenharmony_ci			  snd_pcm_adpcm_state_t *states);
160