1 /**
2  * \file include/pcm_plugin.h
3  * \brief Common PCM plugin code
4  * \author Abramo Bagnara <abramo@alsa-project.org>
5  * \author Jaroslav Kysela <perex@perex.cz>
6  * \date 2000-2001
7  *
8  * Application interface library for the ALSA driver.
9  * See the \ref pcm_plugins page for more details.
10  *
11  * \warning Using of contents of this header file might be dangerous
12  *	    in the sense of compatibility reasons. The contents might be
13  *	    freely changed in future.
14  */
15 /*
16  *   This library is free software; you can redistribute it and/or modify
17  *   it under the terms of the GNU Lesser General Public License as
18  *   published by the Free Software Foundation; either version 2.1 of
19  *   the License, or (at your option) any later version.
20  *
21  *   This program is distributed in the hope that it will be useful,
22  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
23  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  *   GNU Lesser General Public License for more details.
25  *
26  *   You should have received a copy of the GNU Lesser General Public
27  *   License along with this library; if not, write to the Free Software
28  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
29  *
30  */
31 
32 #ifndef __ALSA_PCM_PLUGIN_H
33 #define __ALSA_PCM_PLUGIN_H
34 
35 /**
36  * \defgroup PCM_Plugins PCM Plugins
37  * \ingroup PCM
38  * See the \ref pcm_plugins page for more details.
39  * \{
40  */
41 
42 #define SND_PCM_PLUGIN_RATE_MIN 4000	/**< minimal rate for the rate plugin */
43 #define SND_PCM_PLUGIN_RATE_MAX 768000	/**< maximal rate for the rate plugin */
44 
45 /* ROUTE_FLOAT should be set to 0 for machines without FP unit - like iPAQ */
46 #ifdef HAVE_SOFT_FLOAT
47 #define SND_PCM_PLUGIN_ROUTE_FLOAT 0	   /**< use integers for route plugin */
48 #else
49 #define SND_PCM_PLUGIN_ROUTE_FLOAT 1	   /**< use floats for route plugin */
50 #endif
51 
52 #define SND_PCM_PLUGIN_ROUTE_RESOLUTION 16 /**< integer resolution for route plugin */
53 
54 #if SND_PCM_PLUGIN_ROUTE_FLOAT
55 /** route ttable entry type */
56 typedef float snd_pcm_route_ttable_entry_t;
57 #define SND_PCM_PLUGIN_ROUTE_HALF 0.5	/**< half value */
58 #define SND_PCM_PLUGIN_ROUTE_FULL 1.0	/**< full value */
59 #else
60 /** route ttable entry type */
61 typedef int snd_pcm_route_ttable_entry_t;
62 #define SND_PCM_PLUGIN_ROUTE_HALF (SND_PCM_PLUGIN_ROUTE_RESOLUTION / 2)	/**< half value */
63 #define SND_PCM_PLUGIN_ROUTE_FULL SND_PCM_PLUGIN_ROUTE_RESOLUTION	/**< full value */
64 #endif
65 
66 /*
67  *  Hardware plugin
68  */
69 int snd_pcm_hw_open(snd_pcm_t **pcmp, const char *name,
70 		    int card, int device, int subdevice,
71 		    snd_pcm_stream_t stream, int mode,
72 		    int mmap_emulation, int sync_ptr_ioctl);
73 int _snd_pcm_hw_open(snd_pcm_t **pcmp, const char *name,
74 		     snd_config_t *root ATTRIBUTE_UNUSED, snd_config_t *conf,
75 		     snd_pcm_stream_t stream, int mode);
76 
77 /*
78  *  Copy plugin
79  */
80 int snd_pcm_copy_open(snd_pcm_t **pcmp, const char *name,
81 		      snd_pcm_t *slave, int close_slave);
82 int _snd_pcm_copy_open(snd_pcm_t **pcmp, const char *name,
83 		       snd_config_t *root, snd_config_t *conf,
84                        snd_pcm_stream_t stream, int mode);
85 
86 /*
87  *  Linear conversion plugin
88  */
89 int snd_pcm_linear_open(snd_pcm_t **pcmp, const char *name,
90 			snd_pcm_format_t sformat, snd_pcm_t *slave,
91 			int close_slave);
92 int _snd_pcm_linear_open(snd_pcm_t **pcmp, const char *name,
93 			 snd_config_t *root, snd_config_t *conf,
94 			 snd_pcm_stream_t stream, int mode);
95 
96 /*
97  *  Linear<->Float conversion plugin
98  */
99 int snd_pcm_lfloat_open(snd_pcm_t **pcmp, const char *name,
100 			snd_pcm_format_t sformat, snd_pcm_t *slave,
101 			int close_slave);
102 int _snd_pcm_lfloat_open(snd_pcm_t **pcmp, const char *name,
103 			 snd_config_t *root, snd_config_t *conf,
104 			 snd_pcm_stream_t stream, int mode);
105 
106 /*
107  *  Linear<->mu-Law conversion plugin
108  */
109 int snd_pcm_mulaw_open(snd_pcm_t **pcmp, const char *name,
110 		       snd_pcm_format_t sformat, snd_pcm_t *slave,
111 		       int close_slave);
112 int _snd_pcm_mulaw_open(snd_pcm_t **pcmp, const char *name,
113 			snd_config_t *root, snd_config_t *conf,
114                         snd_pcm_stream_t stream, int mode);
115 
116 /*
117  *  Linear<->a-Law conversion plugin
118  */
119 int snd_pcm_alaw_open(snd_pcm_t **pcmp, const char *name,
120 		      snd_pcm_format_t sformat, snd_pcm_t *slave,
121 		      int close_slave);
122 int _snd_pcm_alaw_open(snd_pcm_t **pcmp, const char *name,
123 		       snd_config_t *root, snd_config_t *conf,
124 		       snd_pcm_stream_t stream, int mode);
125 
126 /*
127  *  Linear<->Ima-ADPCM conversion plugin
128  */
129 int snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name,
130 		       snd_pcm_format_t sformat, snd_pcm_t *slave,
131 		       int close_slave);
132 int _snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name,
133 			snd_config_t *root, snd_config_t *conf,
134 			snd_pcm_stream_t stream, int mode);
135 
136 /*
137  *  IEC958 subframe conversion plugin
138  */
139 int snd_pcm_iec958_open(snd_pcm_t **pcmp, const char *name,
140 			snd_pcm_format_t sformat, snd_pcm_t *slave,
141 			int close_slave,
142 			const unsigned char *status_bits,
143 			const unsigned char *preamble_vals,
144 			int hdmi_mode);
145 int _snd_pcm_iec958_open(snd_pcm_t **pcmp, const char *name,
146 			 snd_config_t *root, snd_config_t *conf,
147 			 snd_pcm_stream_t stream, int mode);
148 
149 /*
150  *  Route plugin for linear formats
151  */
152 int snd_pcm_route_load_ttable(snd_config_t *tt, snd_pcm_route_ttable_entry_t *ttable,
153 			      unsigned int tt_csize, unsigned int tt_ssize,
154 			      unsigned int *tt_cused, unsigned int *tt_sused,
155 			      int schannels);
156 int snd_pcm_route_determine_ttable(snd_config_t *tt,
157 				   unsigned int *tt_csize,
158 				   unsigned int *tt_ssize);
159 int snd_pcm_route_open(snd_pcm_t **pcmp, const char *name,
160 		       snd_pcm_format_t sformat, int schannels,
161 		       snd_pcm_route_ttable_entry_t *ttable,
162 		       unsigned int tt_ssize,
163 		       unsigned int tt_cused, unsigned int tt_sused,
164 		       snd_pcm_t *slave, int close_slave);
165 int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name,
166 			snd_config_t *root, snd_config_t *conf,
167 			snd_pcm_stream_t stream, int mode);
168 
169 /*
170  *  Rate plugin for linear formats
171  */
172 int snd_pcm_rate_open(snd_pcm_t **pcmp, const char *name,
173 		      snd_pcm_format_t sformat, unsigned int srate,
174 		      const snd_config_t *converter,
175 		      snd_pcm_t *slave, int close_slave);
176 int _snd_pcm_rate_open(snd_pcm_t **pcmp, const char *name,
177 		       snd_config_t *root, snd_config_t *conf,
178 		       snd_pcm_stream_t stream, int mode);
179 
180 /*
181  *  Hooks plugin
182  */
183 int snd_pcm_hooks_open(snd_pcm_t **pcmp, const char *name,
184 		       snd_pcm_t *slave, int close_slave);
185 int _snd_pcm_hooks_open(snd_pcm_t **pcmp, const char *name,
186 			snd_config_t *root, snd_config_t *conf,
187 			snd_pcm_stream_t stream, int mode);
188 
189 /*
190  *  LADSPA plugin
191  */
192 int snd_pcm_ladspa_open(snd_pcm_t **pcmp, const char *name,
193 			const char *ladspa_path,
194 			unsigned int channels,
195 			snd_config_t *ladspa_pplugins,
196 			snd_config_t *ladspa_cplugins,
197 			snd_pcm_t *slave, int close_slave);
198 int _snd_pcm_ladspa_open(snd_pcm_t **pcmp, const char *name,
199 			 snd_config_t *root, snd_config_t *conf,
200 			 snd_pcm_stream_t stream, int mode);
201 
202 /*
203  *  Jack plugin
204  */
205 int snd_pcm_jack_open(snd_pcm_t **pcmp, const char *name,
206 					snd_config_t *playback_conf,
207 					snd_config_t *capture_conf,
208 		      snd_pcm_stream_t stream, int mode);
209 int _snd_pcm_jack_open(snd_pcm_t **pcmp, const char *name,
210                        snd_config_t *root, snd_config_t *conf,
211                        snd_pcm_stream_t stream, int mode);
212 
213 
214 /** \} */
215 
216 #endif /* __ALSA_PCM_PLUGIN_H */
217