1 /** 2 * \file include/pcm_ioplug.h 3 * \brief External I/O-Plugin SDK 4 * \author Takashi Iwai <tiwai (at) suse.de> 5 * \date 2005 6 * 7 * External I/O-Plugin SDK 8 */ 9 10 /* 11 * ALSA external PCM plugin SDK 12 * 13 * Copyright (c) 2005 Takashi Iwai <tiwai (at) suse.de> 14 * 15 * This library is free software; you can redistribute it and/or modify 16 * it under the terms of the GNU Lesser General Public License as 17 * published by the Free Software Foundation; either version 2.1 of 18 * the License, or (at your option) any later version. 19 * 20 * This program is distributed in the hope that it will be useful, 21 * but WITHOUT ANY WARRANTY; without even the implied warranty of 22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 * GNU Lesser General Public License for more details. 24 * 25 * You should have received a copy of the GNU Lesser General Public 26 * License along with this library; if not, write to the Free Software 27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 28 * 29 */ 30 31 #ifndef __ALSA_PCM_IOPLUG_H 32 #define __ALSA_PCM_IOPLUG_H 33 34 /** 35 * \defgroup PCM_IOPlug External I/O plugin SDK 36 * \ingroup Plugin_SDK 37 * See the \ref pcm page for more details. 38 * \{ 39 */ 40 41 /** hw constraints for ioplug */ 42 enum { 43 SND_PCM_IOPLUG_HW_ACCESS = 0, /**< access type */ 44 SND_PCM_IOPLUG_HW_FORMAT, /**< format */ 45 SND_PCM_IOPLUG_HW_CHANNELS, /**< channels */ 46 SND_PCM_IOPLUG_HW_RATE, /**< rate */ 47 SND_PCM_IOPLUG_HW_PERIOD_BYTES, /**< period bytes */ 48 SND_PCM_IOPLUG_HW_BUFFER_BYTES, /**< buffer bytes */ 49 SND_PCM_IOPLUG_HW_PERIODS, /**< number of periods */ 50 SND_PCM_IOPLUG_HW_PARAMS /**< max number of hw constraints */ 51 }; 52 53 /** I/O plugin handle */ 54 typedef struct snd_pcm_ioplug snd_pcm_ioplug_t; 55 /** Callback table of ioplug */ 56 typedef struct snd_pcm_ioplug_callback snd_pcm_ioplug_callback_t; 57 58 /** 59 * bit flags for additional conditions 60 */ 61 #define SND_PCM_IOPLUG_FLAG_LISTED (1<<0) /* list up this PCM */ 62 #define SND_PCM_IOPLUG_FLAG_MONOTONIC (1<<1) /* monotonic timestamps */ 63 64 /* 65 * Protocol version 66 */ 67 #define SND_PCM_IOPLUG_VERSION_MAJOR 1 /**< Protocol major version */ 68 #define SND_PCM_IOPLUG_VERSION_MINOR 0 /**< Protocol minor version */ 69 #define SND_PCM_IOPLUG_VERSION_TINY 1 /**< Protocol tiny version */ 70 /** 71 * IO-plugin protocol version 72 */ 73 #define SND_PCM_IOPLUG_VERSION ((SND_PCM_IOPLUG_VERSION_MAJOR<<16) |\ 74 (SND_PCM_IOPLUG_VERSION_MINOR<<8) |\ 75 (SND_PCM_IOPLUG_VERSION_TINY)) 76 77 /** Handle of ioplug */ 78 struct snd_pcm_ioplug { 79 /** 80 * protocol version; #SND_PCM_IOPLUG_VERSION must be filled here 81 * before calling #snd_pcm_ioplug_create() 82 */ 83 unsigned int version; 84 /** 85 * name of this plugin; must be filled before calling #snd_pcm_ioplug_create() 86 */ 87 const char *name; 88 unsigned int flags; /**< SND_PCM_IOPLUG_FLAG_XXX */ 89 int poll_fd; /**< poll file descriptor */ 90 unsigned int poll_events; /**< poll events */ 91 unsigned int mmap_rw; /**< pseudo mmap mode */ 92 /** 93 * callbacks of this plugin; must be filled before calling #snd_pcm_ioplug_create() 94 */ 95 const snd_pcm_ioplug_callback_t *callback; 96 /** 97 * private data, which can be used freely in the driver callbacks 98 */ 99 void *private_data; 100 /** 101 * PCM handle filled by #snd_pcm_extplug_create() 102 */ 103 snd_pcm_t *pcm; 104 105 snd_pcm_stream_t stream; /**< stream direcion; read-only */ 106 snd_pcm_state_t state; /**< current PCM state; read-only */ 107 volatile snd_pcm_uframes_t appl_ptr; /**< application pointer; read-only */ 108 volatile snd_pcm_uframes_t hw_ptr; /**< hw pointer; read-only */ 109 int nonblock; /**< non-block mode; read-only */ 110 111 snd_pcm_access_t access; /**< access type; filled after hw_params is called */ 112 snd_pcm_format_t format; /**< PCM format; filled after hw_params is called */ 113 unsigned int channels; /**< number of channels; filled after hw_params is called */ 114 unsigned int rate; /**< rate; filled after hw_params is called */ 115 snd_pcm_uframes_t period_size; /**< period size; filled after hw_params is called */ 116 snd_pcm_uframes_t buffer_size; /**< buffer size; filled after hw_params is called */ 117 }; 118 119 /** Callback table of ioplug */ 120 struct snd_pcm_ioplug_callback { 121 /** 122 * start the PCM; required 123 */ 124 int (*start)(snd_pcm_ioplug_t *io); 125 /** 126 * stop the PCM; required 127 */ 128 int (*stop)(snd_pcm_ioplug_t *io); 129 /** 130 * get the current DMA position; required 131 */ 132 snd_pcm_sframes_t (*pointer)(snd_pcm_ioplug_t *io); 133 /** 134 * transfer the data; optional 135 */ 136 snd_pcm_sframes_t (*transfer)(snd_pcm_ioplug_t *io, 137 const snd_pcm_channel_area_t *areas, 138 snd_pcm_uframes_t offset, 139 snd_pcm_uframes_t size); 140 /** 141 * close the PCM; optional 142 */ 143 int (*close)(snd_pcm_ioplug_t *io); 144 /** 145 * hw_params; optional 146 */ 147 int (*hw_params)(snd_pcm_ioplug_t *io, snd_pcm_hw_params_t *params); 148 /** 149 * hw_free; optional 150 */ 151 int (*hw_free)(snd_pcm_ioplug_t *io); 152 /** 153 * sw_params; optional 154 */ 155 int (*sw_params)(snd_pcm_ioplug_t *io, snd_pcm_sw_params_t *params); 156 /** 157 * prepare; optional 158 */ 159 int (*prepare)(snd_pcm_ioplug_t *io); 160 /** 161 * drain; optional 162 */ 163 int (*drain)(snd_pcm_ioplug_t *io); 164 /** 165 * toggle pause; optional 166 */ 167 int (*pause)(snd_pcm_ioplug_t *io, int enable); 168 /** 169 * resume; optional 170 */ 171 int (*resume)(snd_pcm_ioplug_t *io); 172 /** 173 * poll descriptors count; optional 174 */ 175 int (*poll_descriptors_count)(snd_pcm_ioplug_t *io); 176 /** 177 * poll descriptors; optional 178 */ 179 int (*poll_descriptors)(snd_pcm_ioplug_t *io, struct pollfd *pfd, unsigned int space); 180 /** 181 * mangle poll events; optional 182 */ 183 int (*poll_revents)(snd_pcm_ioplug_t *io, struct pollfd *pfd, unsigned int nfds, unsigned short *revents); 184 /** 185 * dump; optional 186 */ 187 void (*dump)(snd_pcm_ioplug_t *io, snd_output_t *out); 188 /** 189 * get the delay for the running PCM; optional 190 */ 191 int (*delay)(snd_pcm_ioplug_t *io, snd_pcm_sframes_t *delayp); 192 }; 193 194 195 int snd_pcm_ioplug_create(snd_pcm_ioplug_t *io, const char *name, 196 snd_pcm_stream_t stream, int mode); 197 int snd_pcm_ioplug_delete(snd_pcm_ioplug_t *io); 198 199 /* update poll_fd and mmap_rw */ 200 int snd_pcm_ioplug_reinit_status(snd_pcm_ioplug_t *ioplug); 201 202 /* get a mmap area (for mmap_rw only) */ 203 const snd_pcm_channel_area_t *snd_pcm_ioplug_mmap_areas(snd_pcm_ioplug_t *ioplug); 204 205 /* clear hw_parameter setting */ 206 void snd_pcm_ioplug_params_reset(snd_pcm_ioplug_t *io); 207 208 /* hw_parameter setting */ 209 int snd_pcm_ioplug_set_param_minmax(snd_pcm_ioplug_t *io, int type, unsigned int min, unsigned int max); 210 int snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t *io, int type, unsigned int num_list, const unsigned int *list); 211 212 /* change PCM status */ 213 int snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state); 214 215 /** \} */ 216 217 #endif /* __ALSA_PCM_IOPLUG_H */ 218