1d5ac70f0Sopenharmony_ci/** 2d5ac70f0Sopenharmony_ci * \file include/pcm_extplug.h 3d5ac70f0Sopenharmony_ci * \brief External Filter-Plugin SDK 4d5ac70f0Sopenharmony_ci * \author Takashi Iwai <tiwai@suse.de> 5d5ac70f0Sopenharmony_ci * \date 2005 6d5ac70f0Sopenharmony_ci * 7d5ac70f0Sopenharmony_ci * External Filter-Plugin SDK 8d5ac70f0Sopenharmony_ci */ 9d5ac70f0Sopenharmony_ci 10d5ac70f0Sopenharmony_ci/* 11d5ac70f0Sopenharmony_ci * ALSA external PCM plugin SDK (draft version) 12d5ac70f0Sopenharmony_ci * 13d5ac70f0Sopenharmony_ci * Copyright (c) 2005 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_EXTPLUG_H 32d5ac70f0Sopenharmony_ci#define __ALSA_PCM_EXTPLUG_H 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_ci/** 35d5ac70f0Sopenharmony_ci * \defgroup PCM_ExtPlug External Filter plugin SDK 36d5ac70f0Sopenharmony_ci * \ingroup Plugin_SDK 37d5ac70f0Sopenharmony_ci * See the \ref pcm page for more details. 38d5ac70f0Sopenharmony_ci * \{ 39d5ac70f0Sopenharmony_ci */ 40d5ac70f0Sopenharmony_ci 41d5ac70f0Sopenharmony_ci/** hw constraints for extplug */ 42d5ac70f0Sopenharmony_cienum { 43d5ac70f0Sopenharmony_ci SND_PCM_EXTPLUG_HW_FORMAT, /**< format */ 44d5ac70f0Sopenharmony_ci SND_PCM_EXTPLUG_HW_CHANNELS, /**< channels */ 45d5ac70f0Sopenharmony_ci SND_PCM_EXTPLUG_HW_PARAMS /**< max number of hw constraints */ 46d5ac70f0Sopenharmony_ci}; 47d5ac70f0Sopenharmony_ci 48d5ac70f0Sopenharmony_ci/** Handle of external filter plugin */ 49d5ac70f0Sopenharmony_citypedef struct snd_pcm_extplug snd_pcm_extplug_t; 50d5ac70f0Sopenharmony_ci/** Callback table of extplug */ 51d5ac70f0Sopenharmony_citypedef struct snd_pcm_extplug_callback snd_pcm_extplug_callback_t; 52d5ac70f0Sopenharmony_ci#ifdef DOC_HIDDEN 53d5ac70f0Sopenharmony_ci/* redefine typedefs for stupid doxygen */ 54d5ac70f0Sopenharmony_citypedef snd_pcm_extplug snd_pcm_extplug_t; 55d5ac70f0Sopenharmony_citypedef snd_pcm_extplug_callback snd_pcm_extplug_callback_t; 56d5ac70f0Sopenharmony_ci#endif 57d5ac70f0Sopenharmony_ci 58d5ac70f0Sopenharmony_ci/* 59d5ac70f0Sopenharmony_ci * Protocol version 60d5ac70f0Sopenharmony_ci */ 61d5ac70f0Sopenharmony_ci#define SND_PCM_EXTPLUG_VERSION_MAJOR 1 /**< Protocol major version */ 62d5ac70f0Sopenharmony_ci#define SND_PCM_EXTPLUG_VERSION_MINOR 0 /**< Protocol minor version */ 63d5ac70f0Sopenharmony_ci#define SND_PCM_EXTPLUG_VERSION_TINY 2 /**< Protocol tiny version */ 64d5ac70f0Sopenharmony_ci/** 65d5ac70f0Sopenharmony_ci * Filter-plugin protocol version 66d5ac70f0Sopenharmony_ci */ 67d5ac70f0Sopenharmony_ci#define SND_PCM_EXTPLUG_VERSION ((SND_PCM_EXTPLUG_VERSION_MAJOR<<16) |\ 68d5ac70f0Sopenharmony_ci (SND_PCM_EXTPLUG_VERSION_MINOR<<8) |\ 69d5ac70f0Sopenharmony_ci (SND_PCM_EXTPLUG_VERSION_TINY)) 70d5ac70f0Sopenharmony_ci 71d5ac70f0Sopenharmony_ci/** Handle of extplug */ 72d5ac70f0Sopenharmony_cistruct snd_pcm_extplug { 73d5ac70f0Sopenharmony_ci /** 74d5ac70f0Sopenharmony_ci * protocol version; #SND_PCM_EXTPLUG_VERSION must be filled here 75d5ac70f0Sopenharmony_ci * before calling #snd_pcm_extplug_create() 76d5ac70f0Sopenharmony_ci */ 77d5ac70f0Sopenharmony_ci unsigned int version; 78d5ac70f0Sopenharmony_ci /** 79d5ac70f0Sopenharmony_ci * name of this plugin; must be filled before calling #snd_pcm_extplug_create() 80d5ac70f0Sopenharmony_ci */ 81d5ac70f0Sopenharmony_ci const char *name; 82d5ac70f0Sopenharmony_ci /** 83d5ac70f0Sopenharmony_ci * callbacks of this plugin; must be filled before calling #snd_pcm_extplug_create() 84d5ac70f0Sopenharmony_ci */ 85d5ac70f0Sopenharmony_ci const snd_pcm_extplug_callback_t *callback; 86d5ac70f0Sopenharmony_ci /** 87d5ac70f0Sopenharmony_ci * private data, which can be used freely in the driver callbacks 88d5ac70f0Sopenharmony_ci */ 89d5ac70f0Sopenharmony_ci void *private_data; 90d5ac70f0Sopenharmony_ci /** 91d5ac70f0Sopenharmony_ci * PCM handle filled by #snd_pcm_extplug_create() 92d5ac70f0Sopenharmony_ci */ 93d5ac70f0Sopenharmony_ci snd_pcm_t *pcm; 94d5ac70f0Sopenharmony_ci /** 95d5ac70f0Sopenharmony_ci * stream direction; read-only status 96d5ac70f0Sopenharmony_ci */ 97d5ac70f0Sopenharmony_ci snd_pcm_stream_t stream; 98d5ac70f0Sopenharmony_ci /** 99d5ac70f0Sopenharmony_ci * format hw parameter; filled after hw_params is caled 100d5ac70f0Sopenharmony_ci */ 101d5ac70f0Sopenharmony_ci snd_pcm_format_t format; 102d5ac70f0Sopenharmony_ci /** 103d5ac70f0Sopenharmony_ci * subformat hw parameter; filled after hw_params is caled 104d5ac70f0Sopenharmony_ci */ 105d5ac70f0Sopenharmony_ci snd_pcm_subformat_t subformat; 106d5ac70f0Sopenharmony_ci /** 107d5ac70f0Sopenharmony_ci * channels hw parameter; filled after hw_params is caled 108d5ac70f0Sopenharmony_ci */ 109d5ac70f0Sopenharmony_ci unsigned int channels; 110d5ac70f0Sopenharmony_ci /** 111d5ac70f0Sopenharmony_ci * rate hw parameter; filled after hw_params is caled 112d5ac70f0Sopenharmony_ci */ 113d5ac70f0Sopenharmony_ci unsigned int rate; 114d5ac70f0Sopenharmony_ci /** 115d5ac70f0Sopenharmony_ci * slave_format hw parameter; filled after hw_params is caled 116d5ac70f0Sopenharmony_ci */ 117d5ac70f0Sopenharmony_ci snd_pcm_format_t slave_format; 118d5ac70f0Sopenharmony_ci /** 119d5ac70f0Sopenharmony_ci * slave_subformat hw parameter; filled after hw_params is caled 120d5ac70f0Sopenharmony_ci */ 121d5ac70f0Sopenharmony_ci snd_pcm_subformat_t slave_subformat; 122d5ac70f0Sopenharmony_ci /** 123d5ac70f0Sopenharmony_ci * slave_channels hw parameter; filled after hw_params is caled 124d5ac70f0Sopenharmony_ci */ 125d5ac70f0Sopenharmony_ci unsigned int slave_channels; 126d5ac70f0Sopenharmony_ci}; 127d5ac70f0Sopenharmony_ci 128d5ac70f0Sopenharmony_ci/** Callback table of extplug */ 129d5ac70f0Sopenharmony_cistruct snd_pcm_extplug_callback { 130d5ac70f0Sopenharmony_ci /** 131d5ac70f0Sopenharmony_ci * transfer between source and destination; this is a required callback 132d5ac70f0Sopenharmony_ci */ 133d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*transfer)(snd_pcm_extplug_t *ext, 134d5ac70f0Sopenharmony_ci 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 snd_pcm_uframes_t size); 139d5ac70f0Sopenharmony_ci /** 140d5ac70f0Sopenharmony_ci * close the PCM; optional 141d5ac70f0Sopenharmony_ci */ 142d5ac70f0Sopenharmony_ci int (*close)(snd_pcm_extplug_t *ext); 143d5ac70f0Sopenharmony_ci /** 144d5ac70f0Sopenharmony_ci * hw_params; optional 145d5ac70f0Sopenharmony_ci */ 146d5ac70f0Sopenharmony_ci int (*hw_params)(snd_pcm_extplug_t *ext, snd_pcm_hw_params_t *params); 147d5ac70f0Sopenharmony_ci /** 148d5ac70f0Sopenharmony_ci * hw_free; optional 149d5ac70f0Sopenharmony_ci */ 150d5ac70f0Sopenharmony_ci int (*hw_free)(snd_pcm_extplug_t *ext); 151d5ac70f0Sopenharmony_ci /** 152d5ac70f0Sopenharmony_ci * dump; optional 153d5ac70f0Sopenharmony_ci */ 154d5ac70f0Sopenharmony_ci void (*dump)(snd_pcm_extplug_t *ext, snd_output_t *out); 155d5ac70f0Sopenharmony_ci /** 156d5ac70f0Sopenharmony_ci * init; optional initialization called at prepare or reset 157d5ac70f0Sopenharmony_ci */ 158d5ac70f0Sopenharmony_ci int (*init)(snd_pcm_extplug_t *ext); 159d5ac70f0Sopenharmony_ci /** 160d5ac70f0Sopenharmony_ci * query the channel maps; optional; since v1.0.2 161d5ac70f0Sopenharmony_ci */ 162d5ac70f0Sopenharmony_ci snd_pcm_chmap_query_t **(*query_chmaps)(snd_pcm_extplug_t *ext); 163d5ac70f0Sopenharmony_ci /** 164d5ac70f0Sopenharmony_ci * get the channel map; optional; since v1.0.2 165d5ac70f0Sopenharmony_ci */ 166d5ac70f0Sopenharmony_ci snd_pcm_chmap_t *(*get_chmap)(snd_pcm_extplug_t *ext); 167d5ac70f0Sopenharmony_ci /** 168d5ac70f0Sopenharmony_ci * set the channel map; optional; since v1.0.2 169d5ac70f0Sopenharmony_ci */ 170d5ac70f0Sopenharmony_ci int (*set_chmap)(snd_pcm_extplug_t *ext, const snd_pcm_chmap_t *map); 171d5ac70f0Sopenharmony_ci}; 172d5ac70f0Sopenharmony_ci 173d5ac70f0Sopenharmony_ci 174d5ac70f0Sopenharmony_ciint snd_pcm_extplug_create(snd_pcm_extplug_t *ext, const char *name, 175d5ac70f0Sopenharmony_ci snd_config_t *root, snd_config_t *slave_conf, 176d5ac70f0Sopenharmony_ci snd_pcm_stream_t stream, int mode); 177d5ac70f0Sopenharmony_ciint snd_pcm_extplug_delete(snd_pcm_extplug_t *ext); 178d5ac70f0Sopenharmony_ci 179d5ac70f0Sopenharmony_ci/* clear hw_parameter setting */ 180d5ac70f0Sopenharmony_civoid snd_pcm_extplug_params_reset(snd_pcm_extplug_t *ext); 181d5ac70f0Sopenharmony_ci 182d5ac70f0Sopenharmony_ci/* hw_parameter setting */ 183d5ac70f0Sopenharmony_ciint snd_pcm_extplug_set_param_list(snd_pcm_extplug_t *extplug, int type, unsigned int num_list, const unsigned int *list); 184d5ac70f0Sopenharmony_ciint snd_pcm_extplug_set_param_minmax(snd_pcm_extplug_t *extplug, int type, unsigned int min, unsigned int max); 185d5ac70f0Sopenharmony_ciint snd_pcm_extplug_set_slave_param_list(snd_pcm_extplug_t *extplug, int type, unsigned int num_list, const unsigned int *list); 186d5ac70f0Sopenharmony_ciint snd_pcm_extplug_set_slave_param_minmax(snd_pcm_extplug_t *extplug, int type, unsigned int min, unsigned int max); 187d5ac70f0Sopenharmony_ciint snd_pcm_extplug_set_param_link(snd_pcm_extplug_t *extplug, int type, 188d5ac70f0Sopenharmony_ci int keep_link); 189d5ac70f0Sopenharmony_ci 190d5ac70f0Sopenharmony_ci/** 191d5ac70f0Sopenharmony_ci * set the parameter constraint with a single value 192d5ac70f0Sopenharmony_ci */ 193d5ac70f0Sopenharmony_cistatic __inline__ int snd_pcm_extplug_set_param(snd_pcm_extplug_t *extplug, int type, unsigned int val) 194d5ac70f0Sopenharmony_ci{ 195d5ac70f0Sopenharmony_ci return snd_pcm_extplug_set_param_list(extplug, type, 1, &val); 196d5ac70f0Sopenharmony_ci} 197d5ac70f0Sopenharmony_ci 198d5ac70f0Sopenharmony_ci/** 199d5ac70f0Sopenharmony_ci * set the parameter constraint for slave PCM with a single value 200d5ac70f0Sopenharmony_ci */ 201d5ac70f0Sopenharmony_cistatic __inline__ int snd_pcm_extplug_set_slave_param(snd_pcm_extplug_t *extplug, int type, unsigned int val) 202d5ac70f0Sopenharmony_ci{ 203d5ac70f0Sopenharmony_ci return snd_pcm_extplug_set_slave_param_list(extplug, type, 1, &val); 204d5ac70f0Sopenharmony_ci} 205d5ac70f0Sopenharmony_ci 206d5ac70f0Sopenharmony_ci/** \} */ 207d5ac70f0Sopenharmony_ci 208d5ac70f0Sopenharmony_ci#endif /* __ALSA_PCM_EXTPLUG_H */ 209