1d5ac70f0Sopenharmony_ci/** 2d5ac70f0Sopenharmony_ci * \file include/pcm_ioplug.h 3d5ac70f0Sopenharmony_ci * \brief External I/O-Plugin SDK 4d5ac70f0Sopenharmony_ci * \author Takashi Iwai <tiwai@suse.de> 5d5ac70f0Sopenharmony_ci * \date 2005 6d5ac70f0Sopenharmony_ci * 7d5ac70f0Sopenharmony_ci * External I/O-Plugin SDK 8d5ac70f0Sopenharmony_ci */ 9d5ac70f0Sopenharmony_ci 10d5ac70f0Sopenharmony_ci/* 11d5ac70f0Sopenharmony_ci * ALSA external PCM plugin SDK 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_IOPLUG_H 32d5ac70f0Sopenharmony_ci#define __ALSA_PCM_IOPLUG_H 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_ci/** 35d5ac70f0Sopenharmony_ci * \defgroup PCM_IOPlug External I/O 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 ioplug */ 42d5ac70f0Sopenharmony_cienum { 43d5ac70f0Sopenharmony_ci SND_PCM_IOPLUG_HW_ACCESS = 0, /**< access type */ 44d5ac70f0Sopenharmony_ci SND_PCM_IOPLUG_HW_FORMAT, /**< format */ 45d5ac70f0Sopenharmony_ci SND_PCM_IOPLUG_HW_CHANNELS, /**< channels */ 46d5ac70f0Sopenharmony_ci SND_PCM_IOPLUG_HW_RATE, /**< rate */ 47d5ac70f0Sopenharmony_ci SND_PCM_IOPLUG_HW_PERIOD_BYTES, /**< period bytes */ 48d5ac70f0Sopenharmony_ci SND_PCM_IOPLUG_HW_BUFFER_BYTES, /**< buffer bytes */ 49d5ac70f0Sopenharmony_ci SND_PCM_IOPLUG_HW_PERIODS, /**< number of periods */ 50d5ac70f0Sopenharmony_ci SND_PCM_IOPLUG_HW_PARAMS /**< max number of hw constraints */ 51d5ac70f0Sopenharmony_ci}; 52d5ac70f0Sopenharmony_ci 53d5ac70f0Sopenharmony_ci/** I/O plugin handle */ 54d5ac70f0Sopenharmony_citypedef struct snd_pcm_ioplug snd_pcm_ioplug_t; 55d5ac70f0Sopenharmony_ci/** Callback table of ioplug */ 56d5ac70f0Sopenharmony_citypedef struct snd_pcm_ioplug_callback snd_pcm_ioplug_callback_t; 57d5ac70f0Sopenharmony_ci#ifdef DOC_HIDDEN 58d5ac70f0Sopenharmony_ci/* redefine typedefs for stupid doxygen */ 59d5ac70f0Sopenharmony_citypedef snd_pcm_ioplug snd_pcm_ioplug_t; 60d5ac70f0Sopenharmony_citypedef snd_pcm_ioplug_callback snd_pcm_ioplug_callback_t; 61d5ac70f0Sopenharmony_ci#endif 62d5ac70f0Sopenharmony_ci 63d5ac70f0Sopenharmony_ci/* 64d5ac70f0Sopenharmony_ci * bit flags for additional conditions 65d5ac70f0Sopenharmony_ci */ 66d5ac70f0Sopenharmony_ci#define SND_PCM_IOPLUG_FLAG_LISTED (1<<0) /**< list up this PCM */ 67d5ac70f0Sopenharmony_ci#define SND_PCM_IOPLUG_FLAG_MONOTONIC (1<<1) /**< monotonic timestamps */ 68d5ac70f0Sopenharmony_ci/** hw pointer wrap around at boundary instead of buffer_size */ 69d5ac70f0Sopenharmony_ci#define SND_PCM_IOPLUG_FLAG_BOUNDARY_WA (1<<2) 70d5ac70f0Sopenharmony_ci 71d5ac70f0Sopenharmony_ci/* 72d5ac70f0Sopenharmony_ci * Protocol version 73d5ac70f0Sopenharmony_ci */ 74d5ac70f0Sopenharmony_ci#define SND_PCM_IOPLUG_VERSION_MAJOR 1 /**< Protocol major version */ 75d5ac70f0Sopenharmony_ci#define SND_PCM_IOPLUG_VERSION_MINOR 0 /**< Protocol minor version */ 76d5ac70f0Sopenharmony_ci#define SND_PCM_IOPLUG_VERSION_TINY 2 /**< Protocol tiny version */ 77d5ac70f0Sopenharmony_ci/** 78d5ac70f0Sopenharmony_ci * IO-plugin protocol version 79d5ac70f0Sopenharmony_ci */ 80d5ac70f0Sopenharmony_ci#define SND_PCM_IOPLUG_VERSION ((SND_PCM_IOPLUG_VERSION_MAJOR<<16) |\ 81d5ac70f0Sopenharmony_ci (SND_PCM_IOPLUG_VERSION_MINOR<<8) |\ 82d5ac70f0Sopenharmony_ci (SND_PCM_IOPLUG_VERSION_TINY)) 83d5ac70f0Sopenharmony_ci 84d5ac70f0Sopenharmony_ci/** Handle of ioplug */ 85d5ac70f0Sopenharmony_cistruct snd_pcm_ioplug { 86d5ac70f0Sopenharmony_ci /** 87d5ac70f0Sopenharmony_ci * protocol version; #SND_PCM_IOPLUG_VERSION must be filled here 88d5ac70f0Sopenharmony_ci * before calling #snd_pcm_ioplug_create() 89d5ac70f0Sopenharmony_ci */ 90d5ac70f0Sopenharmony_ci unsigned int version; 91d5ac70f0Sopenharmony_ci /** 92d5ac70f0Sopenharmony_ci * name of this plugin; must be filled before calling #snd_pcm_ioplug_create() 93d5ac70f0Sopenharmony_ci */ 94d5ac70f0Sopenharmony_ci const char *name; 95d5ac70f0Sopenharmony_ci unsigned int flags; /**< SND_PCM_IOPLUG_FLAG_XXX */ 96d5ac70f0Sopenharmony_ci int poll_fd; /**< poll file descriptor */ 97d5ac70f0Sopenharmony_ci unsigned int poll_events; /**< poll events */ 98d5ac70f0Sopenharmony_ci unsigned int mmap_rw; /**< pseudo mmap mode */ 99d5ac70f0Sopenharmony_ci /** 100d5ac70f0Sopenharmony_ci * callbacks of this plugin; must be filled before calling #snd_pcm_ioplug_create() 101d5ac70f0Sopenharmony_ci */ 102d5ac70f0Sopenharmony_ci const snd_pcm_ioplug_callback_t *callback; 103d5ac70f0Sopenharmony_ci /** 104d5ac70f0Sopenharmony_ci * private data, which can be used freely in the driver callbacks 105d5ac70f0Sopenharmony_ci */ 106d5ac70f0Sopenharmony_ci void *private_data; 107d5ac70f0Sopenharmony_ci /** 108d5ac70f0Sopenharmony_ci * PCM handle filled by #snd_pcm_ioplug_create() 109d5ac70f0Sopenharmony_ci */ 110d5ac70f0Sopenharmony_ci snd_pcm_t *pcm; 111d5ac70f0Sopenharmony_ci 112d5ac70f0Sopenharmony_ci snd_pcm_stream_t stream; /**< stream direcion; read-only */ 113d5ac70f0Sopenharmony_ci snd_pcm_state_t state; /**< current PCM state; read-only */ 114d5ac70f0Sopenharmony_ci volatile snd_pcm_uframes_t appl_ptr; /**< application pointer; read-only */ 115d5ac70f0Sopenharmony_ci volatile snd_pcm_uframes_t hw_ptr; /**< hw pointer; read-only */ 116d5ac70f0Sopenharmony_ci int nonblock; /**< non-block mode; read-only */ 117d5ac70f0Sopenharmony_ci 118d5ac70f0Sopenharmony_ci snd_pcm_access_t access; /**< access type; filled after hw_params is called */ 119d5ac70f0Sopenharmony_ci snd_pcm_format_t format; /**< PCM format; filled after hw_params is called */ 120d5ac70f0Sopenharmony_ci unsigned int channels; /**< number of channels; filled after hw_params is called */ 121d5ac70f0Sopenharmony_ci unsigned int rate; /**< rate; filled after hw_params is called */ 122d5ac70f0Sopenharmony_ci snd_pcm_uframes_t period_size; /**< period size; filled after hw_params is called */ 123d5ac70f0Sopenharmony_ci snd_pcm_uframes_t buffer_size; /**< buffer size; filled after hw_params is called */ 124d5ac70f0Sopenharmony_ci}; 125d5ac70f0Sopenharmony_ci 126d5ac70f0Sopenharmony_ci/** Callback table of ioplug */ 127d5ac70f0Sopenharmony_cistruct snd_pcm_ioplug_callback { 128d5ac70f0Sopenharmony_ci /** 129d5ac70f0Sopenharmony_ci * start the PCM; required, called inside mutex lock 130d5ac70f0Sopenharmony_ci */ 131d5ac70f0Sopenharmony_ci int (*start)(snd_pcm_ioplug_t *io); 132d5ac70f0Sopenharmony_ci /** 133d5ac70f0Sopenharmony_ci * stop the PCM; required, called inside mutex lock 134d5ac70f0Sopenharmony_ci */ 135d5ac70f0Sopenharmony_ci int (*stop)(snd_pcm_ioplug_t *io); 136d5ac70f0Sopenharmony_ci /** 137d5ac70f0Sopenharmony_ci * get the current DMA position; required, called inside mutex lock 138d5ac70f0Sopenharmony_ci * \return buffer position up to buffer_size or 139d5ac70f0Sopenharmony_ci * when #SND_PCM_IOPLUG_FLAG_BOUNDARY_WA flag is set up to boundary or 140d5ac70f0Sopenharmony_ci * a negative error code for Xrun 141d5ac70f0Sopenharmony_ci */ 142d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*pointer)(snd_pcm_ioplug_t *io); 143d5ac70f0Sopenharmony_ci /** 144d5ac70f0Sopenharmony_ci * transfer the data; optional, called inside mutex lock 145d5ac70f0Sopenharmony_ci */ 146d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*transfer)(snd_pcm_ioplug_t *io, 147d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *areas, 148d5ac70f0Sopenharmony_ci snd_pcm_uframes_t offset, 149d5ac70f0Sopenharmony_ci snd_pcm_uframes_t size); 150d5ac70f0Sopenharmony_ci /** 151d5ac70f0Sopenharmony_ci * close the PCM; optional 152d5ac70f0Sopenharmony_ci */ 153d5ac70f0Sopenharmony_ci int (*close)(snd_pcm_ioplug_t *io); 154d5ac70f0Sopenharmony_ci /** 155d5ac70f0Sopenharmony_ci * hw_params; optional 156d5ac70f0Sopenharmony_ci */ 157d5ac70f0Sopenharmony_ci int (*hw_params)(snd_pcm_ioplug_t *io, snd_pcm_hw_params_t *params); 158d5ac70f0Sopenharmony_ci /** 159d5ac70f0Sopenharmony_ci * hw_free; optional 160d5ac70f0Sopenharmony_ci */ 161d5ac70f0Sopenharmony_ci int (*hw_free)(snd_pcm_ioplug_t *io); 162d5ac70f0Sopenharmony_ci /** 163d5ac70f0Sopenharmony_ci * sw_params; optional 164d5ac70f0Sopenharmony_ci */ 165d5ac70f0Sopenharmony_ci int (*sw_params)(snd_pcm_ioplug_t *io, snd_pcm_sw_params_t *params); 166d5ac70f0Sopenharmony_ci /** 167d5ac70f0Sopenharmony_ci * prepare; optional 168d5ac70f0Sopenharmony_ci */ 169d5ac70f0Sopenharmony_ci int (*prepare)(snd_pcm_ioplug_t *io); 170d5ac70f0Sopenharmony_ci /** 171d5ac70f0Sopenharmony_ci * drain; optional 172d5ac70f0Sopenharmony_ci */ 173d5ac70f0Sopenharmony_ci int (*drain)(snd_pcm_ioplug_t *io); 174d5ac70f0Sopenharmony_ci /** 175d5ac70f0Sopenharmony_ci * toggle pause; optional, called inside mutex lock 176d5ac70f0Sopenharmony_ci */ 177d5ac70f0Sopenharmony_ci int (*pause)(snd_pcm_ioplug_t *io, int enable); 178d5ac70f0Sopenharmony_ci /** 179d5ac70f0Sopenharmony_ci * resume; optional 180d5ac70f0Sopenharmony_ci */ 181d5ac70f0Sopenharmony_ci int (*resume)(snd_pcm_ioplug_t *io); 182d5ac70f0Sopenharmony_ci /** 183d5ac70f0Sopenharmony_ci * poll descriptors count; optional 184d5ac70f0Sopenharmony_ci */ 185d5ac70f0Sopenharmony_ci int (*poll_descriptors_count)(snd_pcm_ioplug_t *io); 186d5ac70f0Sopenharmony_ci /** 187d5ac70f0Sopenharmony_ci * poll descriptors; optional 188d5ac70f0Sopenharmony_ci */ 189d5ac70f0Sopenharmony_ci int (*poll_descriptors)(snd_pcm_ioplug_t *io, struct pollfd *pfd, unsigned int space); 190d5ac70f0Sopenharmony_ci /** 191d5ac70f0Sopenharmony_ci * mangle poll events; optional 192d5ac70f0Sopenharmony_ci */ 193d5ac70f0Sopenharmony_ci int (*poll_revents)(snd_pcm_ioplug_t *io, struct pollfd *pfd, unsigned int nfds, unsigned short *revents); 194d5ac70f0Sopenharmony_ci /** 195d5ac70f0Sopenharmony_ci * dump; optional 196d5ac70f0Sopenharmony_ci */ 197d5ac70f0Sopenharmony_ci void (*dump)(snd_pcm_ioplug_t *io, snd_output_t *out); 198d5ac70f0Sopenharmony_ci /** 199d5ac70f0Sopenharmony_ci * get the delay for the running PCM; optional; since v1.0.1 200d5ac70f0Sopenharmony_ci */ 201d5ac70f0Sopenharmony_ci int (*delay)(snd_pcm_ioplug_t *io, snd_pcm_sframes_t *delayp); 202d5ac70f0Sopenharmony_ci /** 203d5ac70f0Sopenharmony_ci * query the channel maps; optional; since v1.0.2 204d5ac70f0Sopenharmony_ci */ 205d5ac70f0Sopenharmony_ci snd_pcm_chmap_query_t **(*query_chmaps)(snd_pcm_ioplug_t *io); 206d5ac70f0Sopenharmony_ci /** 207d5ac70f0Sopenharmony_ci * get the channel map; optional; since v1.0.2 208d5ac70f0Sopenharmony_ci */ 209d5ac70f0Sopenharmony_ci snd_pcm_chmap_t *(*get_chmap)(snd_pcm_ioplug_t *io); 210d5ac70f0Sopenharmony_ci /** 211d5ac70f0Sopenharmony_ci * set the channel map; optional; since v1.0.2 212d5ac70f0Sopenharmony_ci */ 213d5ac70f0Sopenharmony_ci int (*set_chmap)(snd_pcm_ioplug_t *io, const snd_pcm_chmap_t *map); 214d5ac70f0Sopenharmony_ci}; 215d5ac70f0Sopenharmony_ci 216d5ac70f0Sopenharmony_ci 217d5ac70f0Sopenharmony_ciint snd_pcm_ioplug_create(snd_pcm_ioplug_t *io, const char *name, 218d5ac70f0Sopenharmony_ci snd_pcm_stream_t stream, int mode); 219d5ac70f0Sopenharmony_ciint snd_pcm_ioplug_delete(snd_pcm_ioplug_t *io); 220d5ac70f0Sopenharmony_ci 221d5ac70f0Sopenharmony_ci/* update poll_fd and mmap_rw */ 222d5ac70f0Sopenharmony_ciint snd_pcm_ioplug_reinit_status(snd_pcm_ioplug_t *ioplug); 223d5ac70f0Sopenharmony_ci 224d5ac70f0Sopenharmony_ci/* get a mmap area (for mmap_rw only) */ 225d5ac70f0Sopenharmony_ciconst snd_pcm_channel_area_t *snd_pcm_ioplug_mmap_areas(snd_pcm_ioplug_t *ioplug); 226d5ac70f0Sopenharmony_ci 227d5ac70f0Sopenharmony_ci/* clear hw_parameter setting */ 228d5ac70f0Sopenharmony_civoid snd_pcm_ioplug_params_reset(snd_pcm_ioplug_t *io); 229d5ac70f0Sopenharmony_ci 230d5ac70f0Sopenharmony_ci/* hw_parameter setting */ 231d5ac70f0Sopenharmony_ciint snd_pcm_ioplug_set_param_minmax(snd_pcm_ioplug_t *io, int type, unsigned int min, unsigned int max); 232d5ac70f0Sopenharmony_ciint snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t *io, int type, unsigned int num_list, const unsigned int *list); 233d5ac70f0Sopenharmony_ci 234d5ac70f0Sopenharmony_ci/* change PCM status */ 235d5ac70f0Sopenharmony_ciint snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state); 236d5ac70f0Sopenharmony_ci 237d5ac70f0Sopenharmony_ci/* calucalte the available frames */ 238d5ac70f0Sopenharmony_cisnd_pcm_uframes_t snd_pcm_ioplug_avail(const snd_pcm_ioplug_t * const ioplug, 239d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t hw_ptr, 240d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t appl_ptr); 241d5ac70f0Sopenharmony_cisnd_pcm_uframes_t snd_pcm_ioplug_hw_avail(const snd_pcm_ioplug_t * const ioplug, 242d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t hw_ptr, 243d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t appl_ptr); 244d5ac70f0Sopenharmony_ci 245d5ac70f0Sopenharmony_ci/** \} */ 246d5ac70f0Sopenharmony_ci 247d5ac70f0Sopenharmony_ci#endif /* __ALSA_PCM_IOPLUG_H */ 248