1 /* 2 * ALSA lib - local header file 3 * Copyright (c) 2000 by Abramo Bagnara <abramo (at) alsa-project.org> 4 * 5 * 6 * This library is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU Lesser General Public License as 8 * published by the Free Software Foundation; either version 2.1 of 9 * the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * 20 */ 21 22 #ifndef __LOCAL_H 23 #define __LOCAL_H 24 25 #include <unistd.h> 26 #include <stdio.h> 27 #include <stdlib.h> 28 #include <string.h> 29 #include <fcntl.h> 30 #include <assert.h> 31 #include <endian.h> 32 #include <stdarg.h> 33 #include <sys/poll.h> 34 #include <errno.h> 35 36 #include "config.h" 37 #ifdef SUPPORT_RESMGR 38 #include <resmgr.h> 39 #endif 40 #ifdef HAVE_LIBDL 41 #include <dlfcn.h> 42 #else 43 #define RTLD_NOW 0 44 #endif 45 46 #define _snd_config_iterator list_head 47 #define _snd_interval sndrv_interval 48 #define _snd_pcm_info sndrv_pcm_info 49 #define _snd_pcm_hw_params sndrv_pcm_hw_params 50 #define _snd_pcm_sw_params sndrv_pcm_sw_params 51 #define _snd_pcm_status sndrv_pcm_status 52 53 #define _snd_ctl_card_info sndrv_ctl_card_info 54 #define _snd_ctl_elem_id sndrv_ctl_elem_id 55 #define _snd_ctl_elem_list sndrv_ctl_elem_list 56 #define _snd_ctl_elem_info sndrv_ctl_elem_info 57 #define _snd_ctl_elem_value sndrv_ctl_elem_value 58 #define _snd_ctl_event sndrv_ctl_event 59 60 #define _snd_rawmidi_info sndrv_rawmidi_info 61 #define _snd_rawmidi_params sndrv_rawmidi_params 62 #define _snd_rawmidi_status sndrv_rawmidi_status 63 64 #define _snd_hwdep_info sndrv_hwdep_info 65 #define _snd_hwdep_dsp_status sndrv_hwdep_dsp_status 66 #define _snd_hwdep_dsp_image sndrv_hwdep_dsp_image 67 68 #define _snd_seq_queue_tempo sndrv_seq_queue_tempo 69 #define _snd_seq_client_info sndrv_seq_client_info 70 #define _snd_seq_port_info sndrv_seq_port_info 71 #define _snd_seq_system_info sndrv_seq_system_info 72 #define _snd_seq_queue_info sndrv_seq_queue_info 73 #define _snd_seq_queue_status sndrv_seq_queue_status 74 #define _snd_seq_queue_timer sndrv_seq_queue_timer 75 #define _snd_seq_port_subscribe sndrv_seq_port_subscribe 76 #define _snd_seq_query_subscribe sndrv_seq_query_subs 77 #define _snd_seq_client_pool sndrv_seq_client_pool 78 #define _snd_seq_remove_events sndrv_seq_remove_events 79 80 #define sndrv_seq_addr snd_seq_addr 81 #define sndrv_seq_tick_time_t snd_seq_tick_time_t 82 #define sndrv_seq_real_time snd_seq_real_time 83 #define sndrv_seq_timestamp snd_seq_timestamp 84 #define sndrv_seq_event snd_seq_event 85 86 #if 0 87 typedef struct sndrv_seq_addr snd_seq_addr_t; 88 #define snd_seq_tick_time_t sndrv_seq_tick_time_t 89 typedef struct sndrv_seq_real_time snd_seq_real_time_t; 90 typedef union sndrv_seq_timestamp snd_seq_timestamp_t; 91 typedef struct sndrv_seq_event snd_seq_event_t; 92 #endif 93 94 #define _snd_timer_id sndrv_timer_id 95 #define _snd_timer_ginfo sndrv_timer_ginfo 96 #define _snd_timer_gparams sndrv_timer_gparams 97 #define _snd_timer_gstatus sndrv_timer_gstatus 98 #define _snd_timer_select sndrv_timer_select 99 #define _snd_timer_info sndrv_timer_info 100 #define _snd_timer_params sndrv_timer_params 101 #define _snd_timer_status sndrv_timer_status 102 103 #define ALSA_LIBRARY_BUILD 104 105 #include <sound/asound.h> 106 #include <sound/asoundef.h> 107 #include "alsa-symbols.h" 108 #include "version.h" 109 #include "global.h" 110 #include "input.h" 111 #include "output.h" 112 #include "error.h" 113 #include "conf.h" 114 #include "pcm.h" 115 #include "pcm_plugin.h" 116 #include "rawmidi.h" 117 #include "timer.h" 118 #include "hwdep.h" 119 #include "control.h" 120 #include "mixer.h" 121 #include "seq_event.h" 122 #include "seq.h" 123 #include <sound/asequencer.h> 124 #include "seqmid.h" 125 #include "seq_midi_event.h" 126 #include "list.h" 127 128 #if __BYTE_ORDER == __LITTLE_ENDIAN 129 #define SND_LITTLE_ENDIAN 130 #endif 131 #if __BYTE_ORDER == __BIG_ENDIAN 132 #define SND_BIG_ENDIAN 133 #endif 134 135 struct _snd_async_handler { 136 enum { 137 SND_ASYNC_HANDLER_GENERIC, 138 SND_ASYNC_HANDLER_CTL, 139 SND_ASYNC_HANDLER_PCM, 140 SND_ASYNC_HANDLER_TIMER, 141 } type; 142 int fd; 143 union { 144 snd_ctl_t *ctl; 145 snd_pcm_t *pcm; 146 snd_timer_t *timer; 147 } u; 148 snd_async_callback_t callback; 149 void *private_data; 150 struct list_head glist; 151 struct list_head hlist; 152 }; 153 154 typedef enum _snd_set_mode { 155 SND_CHANGE, 156 SND_TRY, 157 SND_TEST, 158 } snd_set_mode_t; 159 160 size_t page_align(size_t size); 161 size_t page_size(void); 162 size_t page_ptr(size_t object_offset, size_t object_size, size_t *offset, size_t *mmap_offset); 163 164 int safe_strtol(const char *str, long *val); 165 166 int snd_send_fd(int sock, void *data, size_t len, int fd); 167 int snd_receive_fd(int sock, void *data, size_t len, int *fd); 168 169 /* 170 * error messages 171 */ 172 #ifndef NDEBUG 173 #define CHECK_SANITY(x) x 174 extern snd_lib_error_handler_t snd_err_msg; 175 #define SNDMSG(args...) snd_err_msg(__FILE__, __LINE__, __FUNCTION__, 0, ##args) 176 #define SYSMSG(args...) snd_err_msg(__FILE__, __LINE__, __FUNCTION__, errno, ##args) 177 #else 178 #define CHECK_SANITY(x) 0 /* not evaluated */ 179 #define SNDMSG(args...) /* nop */ 180 #define SYSMSG(args...) /* nop */ 181 #endif 182 183 /* 184 */ 185 #define HAVE_GNU_LD 186 #define HAVE_ELF 187 #define HAVE_ASM_PREVIOUS_DIRECTIVE 188 189 /* Stolen from libc-symbols.h in GNU glibc */ 190 191 /* When a reference to SYMBOL is encountered, the linker will emit a 192 warning message MSG. */ 193 194 #define ASM_NAME(name) __SYMBOL_PREFIX name 195 196 #ifdef HAVE_GNU_LD 197 # ifdef HAVE_ELF 198 199 /* We want the .gnu.warning.SYMBOL section to be unallocated. */ 200 # ifdef HAVE_ASM_PREVIOUS_DIRECTIVE 201 # define __make_section_unallocated(section_string) \ 202 asm (".section " section_string "\n\t.previous"); 203 # elif defined HAVE_ASM_POPSECTION_DIRECTIVE 204 # define __make_section_unallocated(section_string) \ 205 asm (".pushsection " section_string "\n\t.popsection"); 206 # else 207 # define __make_section_unallocated(section_string) 208 # endif 209 210 /* Tacking on "\n\t#" to the section name makes gcc put it's bogus 211 section attributes on what looks like a comment to the assembler. */ 212 # ifdef HAVE_SECTION_QUOTES 213 # define link_warning(symbol, msg) \ 214 __make_section_unallocated (".gnu.warning." ASM_NAME(#symbol)) \ 215 static const char __evoke_link_warning_##symbol[] \ 216 __attribute__ ((section (".gnu.warning." ASM_NAME(#symbol) "\"\n\t#\""))) = msg; 217 # else 218 # define link_warning(symbol, msg) \ 219 __make_section_unallocated (".gnu.warning." ASM_NAME(#symbol)) \ 220 static const char __evoke_link_warning_##symbol[] \ 221 __attribute__ ((section (".gnu.warning." ASM_NAME(#symbol) "\n\t#"))) = msg; 222 # endif 223 # else 224 # define link_warning(symbol, msg) \ 225 asm (".stabs \"" msg "\",30,0,0,0\n\t" \ 226 ".stabs \"" ASM_NAME(#symbol) "\",1,0,0,0\n"); 227 # endif 228 #else 229 /* We will never be heard; they will all die horribly. */ 230 # define link_warning(symbol, msg) 231 #endif 232 233 /* open with resmgr */ 234 #ifdef SUPPORT_RESMGR 235 static inline int snd_open_device(const char *filename, int fmode) 236 { 237 int fd = open(filename, fmode); 238 if (fd >= 0) 239 return fd; 240 if (errno == EAGAIN || errno == EBUSY) 241 return fd; 242 if (! access(filename, F_OK)) 243 return rsm_open_device(filename, fmode); 244 return -1; 245 } 246 #else 247 #define snd_open_device(filename, fmode) open(filename, fmode); 248 #endif 249 250 /* make local functions really local */ 251 #define snd_dlobj_cache_lookup \ 252 snd1_dlobj_cache_lookup 253 #define snd_dlobj_cache_add \ 254 snd1_dlobj_cache_add 255 #define snd_dlobj_cache_cleanup \ 256 snd1_dlobj_cache_cleanup 257 #define snd_config_set_hop \ 258 snd1_config_set_hop 259 #define snd_config_check_hop \ 260 snd1_config_check_hop 261 #define snd_config_search_alias_hooks \ 262 snd1_config_search_alias_hooks 263 264 /* dlobj cache */ 265 void *snd_dlobj_cache_lookup(const char *name); 266 int snd_dlobj_cache_add(const char *name, void *dlobj, void *open_func); 267 void snd_dlobj_cache_cleanup(void); 268 269 /* for recursive checks */ 270 void snd_config_set_hop(snd_config_t *conf, int hop); 271 int snd_config_check_hop(snd_config_t *conf); 272 #define SND_CONF_MAX_HOPS 64 273 274 int snd_config_search_alias_hooks(snd_config_t *config, 275 const char *base, const char *key, 276 snd_config_t **result); 277 278 #endif 279