1d5ac70f0Sopenharmony_ci/* 2d5ac70f0Sopenharmony_ci * ALSA lib - local header file 3d5ac70f0Sopenharmony_ci * Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org> 4d5ac70f0Sopenharmony_ci * 5d5ac70f0Sopenharmony_ci * 6d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 7d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 8d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 9d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 10d5ac70f0Sopenharmony_ci * 11d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 12d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 15d5ac70f0Sopenharmony_ci * 16d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 18d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19d5ac70f0Sopenharmony_ci * 20d5ac70f0Sopenharmony_ci */ 21d5ac70f0Sopenharmony_ci 22d5ac70f0Sopenharmony_ci#ifndef __LOCAL_H 23d5ac70f0Sopenharmony_ci#define __LOCAL_H 24d5ac70f0Sopenharmony_ci 25d5ac70f0Sopenharmony_ci#include "config.h" 26d5ac70f0Sopenharmony_ci 27d5ac70f0Sopenharmony_ci#include <unistd.h> 28d5ac70f0Sopenharmony_ci#include <stdio.h> 29d5ac70f0Sopenharmony_ci#include <stdlib.h> 30d5ac70f0Sopenharmony_ci#include <string.h> 31d5ac70f0Sopenharmony_ci#include <fcntl.h> 32d5ac70f0Sopenharmony_ci#include <assert.h> 33d5ac70f0Sopenharmony_ci#ifdef HAVE_ENDIAN_H 34d5ac70f0Sopenharmony_ci#include <endian.h> 35d5ac70f0Sopenharmony_ci#elif defined(HAVE_SYS_ENDIAN_H) 36d5ac70f0Sopenharmony_ci#include <sys/endian.h> 37d5ac70f0Sopenharmony_ci#else 38d5ac70f0Sopenharmony_ci#error Header defining endianness not defined 39d5ac70f0Sopenharmony_ci#endif 40d5ac70f0Sopenharmony_ci#ifndef __BYTE_ORDER 41d5ac70f0Sopenharmony_ci#define __BYTE_ORDER BYTE_ORDER 42d5ac70f0Sopenharmony_ci#endif 43d5ac70f0Sopenharmony_ci#ifndef __LITTLE_ENDIAN 44d5ac70f0Sopenharmony_ci#define __LITTLE_ENDIAN LITTLE_ENDIAN 45d5ac70f0Sopenharmony_ci#endif 46d5ac70f0Sopenharmony_ci#ifndef __BIG_ENDIAN 47d5ac70f0Sopenharmony_ci#define __BIG_ENDIAN BIG_ENDIAN 48d5ac70f0Sopenharmony_ci#endif 49d5ac70f0Sopenharmony_ci#include <stdarg.h> 50d5ac70f0Sopenharmony_ci#include <poll.h> 51d5ac70f0Sopenharmony_ci#include <sys/types.h> 52d5ac70f0Sopenharmony_ci#include <errno.h> 53d5ac70f0Sopenharmony_ci#if defined(__linux__) 54d5ac70f0Sopenharmony_ci#include <linux/types.h> 55d5ac70f0Sopenharmony_ci#include <linux/ioctl.h> 56d5ac70f0Sopenharmony_ci#else 57d5ac70f0Sopenharmony_ci#include "type_compat.h" 58d5ac70f0Sopenharmony_ci#endif 59d5ac70f0Sopenharmony_ci 60d5ac70f0Sopenharmony_ci#ifdef SUPPORT_RESMGR 61d5ac70f0Sopenharmony_ci#include <resmgr.h> 62d5ac70f0Sopenharmony_ci#endif 63d5ac70f0Sopenharmony_ci#ifdef HAVE_LIBDL 64d5ac70f0Sopenharmony_ci#include <dlfcn.h> 65d5ac70f0Sopenharmony_ci#else 66d5ac70f0Sopenharmony_ci#define RTLD_NOW 0 67d5ac70f0Sopenharmony_ci#endif 68d5ac70f0Sopenharmony_ci 69d5ac70f0Sopenharmony_ci#if __BYTE_ORDER == __LITTLE_ENDIAN 70d5ac70f0Sopenharmony_ci#define SND_LITTLE_ENDIAN 71d5ac70f0Sopenharmony_ci#define SNDRV_LITTLE_ENDIAN 72d5ac70f0Sopenharmony_ci#define SNDRV_LITTLE_ENDIAN_BITFIELD 73d5ac70f0Sopenharmony_ci#elif __BYTE_ORDER == __BIG_ENDIAN 74d5ac70f0Sopenharmony_ci#define SND_BIG_ENDIAN 75d5ac70f0Sopenharmony_ci#define SNDRV_BIG_ENDIAN 76d5ac70f0Sopenharmony_ci#define SNDRV_BIG_ENDIAN_BITFIELD 77d5ac70f0Sopenharmony_ci#else 78d5ac70f0Sopenharmony_ci#error "Unsupported endian..." 79d5ac70f0Sopenharmony_ci#endif 80d5ac70f0Sopenharmony_ci 81d5ac70f0Sopenharmony_ci#ifndef HAVE_LFS 82d5ac70f0Sopenharmony_ci#define stat64 stat 83d5ac70f0Sopenharmony_ci#define lstat64 lstat 84d5ac70f0Sopenharmony_ci#define dirent64 dirent 85d5ac70f0Sopenharmony_ci#define readdir64 readdir 86d5ac70f0Sopenharmony_ci#define scandir64 scandir 87d5ac70f0Sopenharmony_ci#define versionsort64 versionsort 88d5ac70f0Sopenharmony_ci#define alphasort64 alphasort 89d5ac70f0Sopenharmony_ci#define ino64_t ino_t 90d5ac70f0Sopenharmony_ci#define fstat64 fstat 91d5ac70f0Sopenharmony_ci#define stat64 stat 92d5ac70f0Sopenharmony_ci#endif 93d5ac70f0Sopenharmony_ci 94d5ac70f0Sopenharmony_ci#define _snd_config_iterator list_head 95d5ac70f0Sopenharmony_ci#define _snd_interval snd_interval 96d5ac70f0Sopenharmony_ci#define _snd_pcm_info snd_pcm_info 97d5ac70f0Sopenharmony_ci#define _snd_pcm_hw_params snd_pcm_hw_params 98d5ac70f0Sopenharmony_ci#define _snd_pcm_sw_params snd_pcm_sw_params 99d5ac70f0Sopenharmony_ci#define _snd_pcm_status snd_pcm_status 100d5ac70f0Sopenharmony_ci 101d5ac70f0Sopenharmony_ci#define _snd_ctl_card_info snd_ctl_card_info 102d5ac70f0Sopenharmony_ci#define _snd_ctl_elem_id snd_ctl_elem_id 103d5ac70f0Sopenharmony_ci#define _snd_ctl_elem_list snd_ctl_elem_list 104d5ac70f0Sopenharmony_ci#define _snd_ctl_elem_info snd_ctl_elem_info 105d5ac70f0Sopenharmony_ci#define _snd_ctl_elem_value snd_ctl_elem_value 106d5ac70f0Sopenharmony_ci#define _snd_ctl_event snd_ctl_event 107d5ac70f0Sopenharmony_ci 108d5ac70f0Sopenharmony_ci#define _snd_rawmidi_info snd_rawmidi_info 109d5ac70f0Sopenharmony_ci#define _snd_rawmidi_params snd_rawmidi_params 110d5ac70f0Sopenharmony_ci#define _snd_rawmidi_status snd_rawmidi_status 111d5ac70f0Sopenharmony_ci 112d5ac70f0Sopenharmony_ci#define _snd_hwdep_info snd_hwdep_info 113d5ac70f0Sopenharmony_ci#define _snd_hwdep_dsp_status snd_hwdep_dsp_status 114d5ac70f0Sopenharmony_ci#define _snd_hwdep_dsp_image snd_hwdep_dsp_image 115d5ac70f0Sopenharmony_ci 116d5ac70f0Sopenharmony_ci#define _snd_seq_queue_tempo snd_seq_queue_tempo 117d5ac70f0Sopenharmony_ci#define _snd_seq_client_info snd_seq_client_info 118d5ac70f0Sopenharmony_ci#define _snd_seq_port_info snd_seq_port_info 119d5ac70f0Sopenharmony_ci#define _snd_seq_system_info snd_seq_system_info 120d5ac70f0Sopenharmony_ci#define _snd_seq_queue_info snd_seq_queue_info 121d5ac70f0Sopenharmony_ci#define _snd_seq_queue_status snd_seq_queue_status 122d5ac70f0Sopenharmony_ci#define _snd_seq_queue_timer snd_seq_queue_timer 123d5ac70f0Sopenharmony_ci#define _snd_seq_port_subscribe snd_seq_port_subscribe 124d5ac70f0Sopenharmony_ci#define _snd_seq_query_subscribe snd_seq_query_subs 125d5ac70f0Sopenharmony_ci#define _snd_seq_client_pool snd_seq_client_pool 126d5ac70f0Sopenharmony_ci#define _snd_seq_remove_events snd_seq_remove_events 127d5ac70f0Sopenharmony_ci 128d5ac70f0Sopenharmony_ci#define _snd_timer_id snd_timer_id 129d5ac70f0Sopenharmony_ci#define _snd_timer_ginfo snd_timer_ginfo 130d5ac70f0Sopenharmony_ci#define _snd_timer_gparams snd_timer_gparams 131d5ac70f0Sopenharmony_ci#define _snd_timer_gstatus snd_timer_gstatus 132d5ac70f0Sopenharmony_ci#define _snd_timer_select snd_timer_select 133d5ac70f0Sopenharmony_ci#define _snd_timer_info snd_timer_info 134d5ac70f0Sopenharmony_ci#define _snd_timer_params snd_timer_params 135d5ac70f0Sopenharmony_ci#define _snd_timer_status snd_timer_status 136d5ac70f0Sopenharmony_ci 137d5ac70f0Sopenharmony_ci#define ALSA_LIBRARY_BUILD 138d5ac70f0Sopenharmony_ci 139d5ac70f0Sopenharmony_ci/* rename some types for avoiding conflicts with alsalib's definitions */ 140d5ac70f0Sopenharmony_ci#define snd_aes_iec958 sndrv_aes_iec958 141d5ac70f0Sopenharmony_ci#define snd_pcm_uframes_t sndrv_pcm_uframes_t 142d5ac70f0Sopenharmony_ci#define snd_pcm_sframes_t sndrv_pcm_sframes_t 143d5ac70f0Sopenharmony_ci#define snd_pcm_access_t sndrv_pcm_access_t 144d5ac70f0Sopenharmony_ci#define snd_pcm_format_t sndrv_pcm_format_t 145d5ac70f0Sopenharmony_ci#define snd_pcm_subformat_t sndrv_pcm_subformat_t 146d5ac70f0Sopenharmony_ci#define snd_pcm_state_t sndrv_pcm_state_t 147d5ac70f0Sopenharmony_ci#define snd_interval sndrv_interval 148d5ac70f0Sopenharmony_ci#define snd_mask sndrv_mask 149d5ac70f0Sopenharmony_ci#define snd_ctl_elem_type_t sndrv_ctl_elem_type_t 150d5ac70f0Sopenharmony_ci#define snd_ctl_elem_iface_t sndrv_ctl_elem_iface_t 151d5ac70f0Sopenharmony_ci#define snd_ctl_tlv sndrv_ctl_tlv 152d5ac70f0Sopenharmony_ci 153d5ac70f0Sopenharmony_ci/* kill and replace kernel-specific types */ 154d5ac70f0Sopenharmony_ci#ifndef __user 155d5ac70f0Sopenharmony_ci#define __user 156d5ac70f0Sopenharmony_ci#endif 157d5ac70f0Sopenharmony_ci#ifndef __force 158d5ac70f0Sopenharmony_ci#define __force 159d5ac70f0Sopenharmony_ci#endif 160d5ac70f0Sopenharmony_ci 161d5ac70f0Sopenharmony_ci#include <sound/asound.h> 162d5ac70f0Sopenharmony_ci 163d5ac70f0Sopenharmony_ci/* take back superfluous renames; some can be kept as is */ 164d5ac70f0Sopenharmony_ci#undef snd_aes_iec958 165d5ac70f0Sopenharmony_ci#undef snd_pcm_uframes_t 166d5ac70f0Sopenharmony_ci#undef snd_pcm_sframes_t 167d5ac70f0Sopenharmony_ci#undef snd_pcm_access_t 168d5ac70f0Sopenharmony_ci#undef snd_pcm_format_t 169d5ac70f0Sopenharmony_ci#undef snd_pcm_subformat_t 170d5ac70f0Sopenharmony_ci#undef snd_pcm_state_t 171d5ac70f0Sopenharmony_ci#undef snd_ctl_elem_type_t 172d5ac70f0Sopenharmony_ci#undef snd_ctl_elem_iface_t 173d5ac70f0Sopenharmony_ci 174d5ac70f0Sopenharmony_ci#include "asoundef.h" 175d5ac70f0Sopenharmony_ci#include "alsa-symbols.h" 176d5ac70f0Sopenharmony_ci#include "version.h" 177d5ac70f0Sopenharmony_ci#include "global.h" 178d5ac70f0Sopenharmony_ci#include "input.h" 179d5ac70f0Sopenharmony_ci#include "output.h" 180d5ac70f0Sopenharmony_ci#include "error.h" 181d5ac70f0Sopenharmony_ci#include "conf.h" 182d5ac70f0Sopenharmony_ci#include "pcm.h" 183d5ac70f0Sopenharmony_ci#include "pcm_plugin.h" 184d5ac70f0Sopenharmony_ci#include "rawmidi.h" 185d5ac70f0Sopenharmony_ci#include "ump.h" 186d5ac70f0Sopenharmony_ci#include "timer.h" 187d5ac70f0Sopenharmony_ci#include "hwdep.h" 188d5ac70f0Sopenharmony_ci#include "control.h" 189d5ac70f0Sopenharmony_ci#include "mixer.h" 190d5ac70f0Sopenharmony_ci#include "seq_event.h" 191d5ac70f0Sopenharmony_ci#include "seq.h" 192d5ac70f0Sopenharmony_ci 193d5ac70f0Sopenharmony_ci/* rename some types for avoiding conflicts with alsalib's definitions */ 194d5ac70f0Sopenharmony_ci#define snd_seq_addr sndrv_seq_addr 195d5ac70f0Sopenharmony_ci#define snd_seq_tick_time_t sndrv_seq_tick_time_t 196d5ac70f0Sopenharmony_ci#define snd_seq_real_time sndrv_seq_real_time 197d5ac70f0Sopenharmony_ci#define snd_seq_timestamp sndrv_seq_timestamp 198d5ac70f0Sopenharmony_ci#define snd_seq_event_type_t sndrv_seq_event_type_t 199d5ac70f0Sopenharmony_ci#define snd_seq_event_data sndrv_seq_event_data 200d5ac70f0Sopenharmony_ci#define snd_seq_event sndrv_seq_event 201d5ac70f0Sopenharmony_ci#define snd_seq_ump_event sndrv_seq_ump_event 202d5ac70f0Sopenharmony_ci#define snd_seq_connect sndrv_seq_connect 203d5ac70f0Sopenharmony_ci#define snd_seq_ev_note sndrv_seq_ev_note 204d5ac70f0Sopenharmony_ci#define snd_seq_ev_ctrl sndrv_seq_ev_ctrl 205d5ac70f0Sopenharmony_ci#define snd_seq_ev_raw8 sndrv_seq_ev_raw8 206d5ac70f0Sopenharmony_ci#define snd_seq_ev_raw32 sndrv_seq_ev_raw32 207d5ac70f0Sopenharmony_ci#define snd_seq_ev_ext sndrv_seq_ev_ext 208d5ac70f0Sopenharmony_ci#define snd_seq_result sndrv_seq_result 209d5ac70f0Sopenharmony_ci#define snd_seq_queue_skew sndrv_seq_queue_skew 210d5ac70f0Sopenharmony_ci#define snd_seq_ev_queue_control sndrv_seq_ev_queue_control 211d5ac70f0Sopenharmony_ci#define snd_seq_client_t sndrv_seq_client_t 212d5ac70f0Sopenharmony_ci#define snd_seq_client_type_t sndrv_seq_client_type_t 213d5ac70f0Sopenharmony_ci 214d5ac70f0Sopenharmony_ci#include <sound/asequencer.h> 215d5ac70f0Sopenharmony_ci 216d5ac70f0Sopenharmony_ci/* take back some renames */ 217d5ac70f0Sopenharmony_ci#undef snd_seq_client_t 218d5ac70f0Sopenharmony_ci#undef snd_seq_client_type_t 219d5ac70f0Sopenharmony_ci 220d5ac70f0Sopenharmony_ci#include "seqmid.h" 221d5ac70f0Sopenharmony_ci#include "seq_midi_event.h" 222d5ac70f0Sopenharmony_ci#include "list.h" 223d5ac70f0Sopenharmony_ci 224d5ac70f0Sopenharmony_cistruct _snd_async_handler { 225d5ac70f0Sopenharmony_ci enum { 226d5ac70f0Sopenharmony_ci SND_ASYNC_HANDLER_GENERIC, 227d5ac70f0Sopenharmony_ci SND_ASYNC_HANDLER_CTL, 228d5ac70f0Sopenharmony_ci SND_ASYNC_HANDLER_PCM, 229d5ac70f0Sopenharmony_ci SND_ASYNC_HANDLER_TIMER, 230d5ac70f0Sopenharmony_ci } type; 231d5ac70f0Sopenharmony_ci int fd; 232d5ac70f0Sopenharmony_ci union { 233d5ac70f0Sopenharmony_ci snd_ctl_t *ctl; 234d5ac70f0Sopenharmony_ci snd_pcm_t *pcm; 235d5ac70f0Sopenharmony_ci snd_timer_t *timer; 236d5ac70f0Sopenharmony_ci } u; 237d5ac70f0Sopenharmony_ci snd_async_callback_t callback; 238d5ac70f0Sopenharmony_ci void *private_data; 239d5ac70f0Sopenharmony_ci struct list_head glist; 240d5ac70f0Sopenharmony_ci struct list_head hlist; 241d5ac70f0Sopenharmony_ci}; 242d5ac70f0Sopenharmony_ci 243d5ac70f0Sopenharmony_citypedef enum _snd_set_mode { 244d5ac70f0Sopenharmony_ci SND_CHANGE, 245d5ac70f0Sopenharmony_ci SND_TRY, 246d5ac70f0Sopenharmony_ci SND_TEST, 247d5ac70f0Sopenharmony_ci} snd_set_mode_t; 248d5ac70f0Sopenharmony_ci 249d5ac70f0Sopenharmony_cisize_t page_align(size_t size); 250d5ac70f0Sopenharmony_cisize_t page_size(void); 251d5ac70f0Sopenharmony_cisize_t page_ptr(size_t object_offset, size_t object_size, size_t *offset, size_t *mmap_offset); 252d5ac70f0Sopenharmony_ci 253d5ac70f0Sopenharmony_ci#define safe_strtoll_base _snd_safe_strtoll_base 254d5ac70f0Sopenharmony_ciint _snd_safe_strtoll_base(const char *str, long long *val, int base); 255d5ac70f0Sopenharmony_cistatic inline int safe_strtoll(const char *str, long long *val) { return safe_strtoll_base(str, val, 0); } 256d5ac70f0Sopenharmony_ci#define safe_strtol_base _snd_safe_strtol_base 257d5ac70f0Sopenharmony_ciint _snd_safe_strtol_base(const char *str, long *val, int base); 258d5ac70f0Sopenharmony_cistatic inline int safe_strtol(const char *str, long *val) { return safe_strtol_base(str, val, 0); } 259d5ac70f0Sopenharmony_ci#define safe_strtod _snd_safe_strtod 260d5ac70f0Sopenharmony_ciint _snd_safe_strtod(const char *str, double *val); 261d5ac70f0Sopenharmony_ci 262d5ac70f0Sopenharmony_ciint snd_send_fd(int sock, void *data, size_t len, int fd); 263d5ac70f0Sopenharmony_ciint snd_receive_fd(int sock, void *data, size_t len, int *fd); 264d5ac70f0Sopenharmony_cisize_t snd_strlcpy(char *dst, const char *src, size_t size); 265d5ac70f0Sopenharmony_ci 266d5ac70f0Sopenharmony_ci/* 267d5ac70f0Sopenharmony_ci * error messages 268d5ac70f0Sopenharmony_ci */ 269d5ac70f0Sopenharmony_ci#ifndef NDEBUG 270d5ac70f0Sopenharmony_ci#define CHECK_SANITY(x) x 271d5ac70f0Sopenharmony_ciextern snd_lib_error_handler_t snd_err_msg; 272d5ac70f0Sopenharmony_ci#define SNDMSG(args...) snd_err_msg(__FILE__, __LINE__, __func__, 0, ##args) 273d5ac70f0Sopenharmony_ci#define SYSMSG(args...) snd_err_msg(__FILE__, __LINE__, __func__, errno, ##args) 274d5ac70f0Sopenharmony_ci#else 275d5ac70f0Sopenharmony_ci#define CHECK_SANITY(x) 0 /* not evaluated */ 276d5ac70f0Sopenharmony_ci#define SNDMSG(args...) /* nop */ 277d5ac70f0Sopenharmony_ci#define SYSMSG(args...) /* nop */ 278d5ac70f0Sopenharmony_ci#endif 279d5ac70f0Sopenharmony_ci 280d5ac70f0Sopenharmony_ci/* 281d5ac70f0Sopenharmony_ci */ 282d5ac70f0Sopenharmony_ci#define HAVE_GNU_LD 283d5ac70f0Sopenharmony_ci#define HAVE_ELF 284d5ac70f0Sopenharmony_ci#define HAVE_ASM_PREVIOUS_DIRECTIVE 285d5ac70f0Sopenharmony_ci 286d5ac70f0Sopenharmony_ci/* Stolen from libc-symbols.h in GNU glibc */ 287d5ac70f0Sopenharmony_ci 288d5ac70f0Sopenharmony_ci/* When a reference to SYMBOL is encountered, the linker will emit a 289d5ac70f0Sopenharmony_ci warning message MSG. */ 290d5ac70f0Sopenharmony_ci 291d5ac70f0Sopenharmony_ci#define ASM_NAME(name) __SYMBOL_PREFIX name 292d5ac70f0Sopenharmony_ci 293d5ac70f0Sopenharmony_ci#ifdef HAVE_GNU_LD 294d5ac70f0Sopenharmony_ci# ifdef HAVE_ELF 295d5ac70f0Sopenharmony_ci 296d5ac70f0Sopenharmony_ci/* We want the .gnu.warning.SYMBOL section to be unallocated. */ 297d5ac70f0Sopenharmony_ci# ifdef HAVE_ASM_PREVIOUS_DIRECTIVE 298d5ac70f0Sopenharmony_ci# define __make_section_unallocated(section_string) \ 299d5ac70f0Sopenharmony_ci asm (".section " section_string "\n\t.previous"); 300d5ac70f0Sopenharmony_ci# elif defined HAVE_ASM_POPSECTION_DIRECTIVE 301d5ac70f0Sopenharmony_ci# define __make_section_unallocated(section_string) \ 302d5ac70f0Sopenharmony_ci asm (".pushsection " section_string "\n\t.popsection"); 303d5ac70f0Sopenharmony_ci# else 304d5ac70f0Sopenharmony_ci# define __make_section_unallocated(section_string) 305d5ac70f0Sopenharmony_ci# endif 306d5ac70f0Sopenharmony_ci 307d5ac70f0Sopenharmony_ci/* Tacking on "\n\t#" to the section name makes gcc put it's bogus 308d5ac70f0Sopenharmony_ci section attributes on what looks like a comment to the assembler. */ 309d5ac70f0Sopenharmony_ci# ifdef HAVE_SECTION_QUOTES 310d5ac70f0Sopenharmony_ci# define link_warning(symbol, msg) \ 311d5ac70f0Sopenharmony_ci __make_section_unallocated (".gnu.warning." ASM_NAME(#symbol)) \ 312d5ac70f0Sopenharmony_ci static const char __evoke_link_warning_##symbol[] \ 313d5ac70f0Sopenharmony_ci __attribute__ ((section (".gnu.warning." ASM_NAME(#symbol) "\"\n\t#\""))) = msg; 314d5ac70f0Sopenharmony_ci# else 315d5ac70f0Sopenharmony_ci# define link_warning(symbol, msg) \ 316d5ac70f0Sopenharmony_ci __make_section_unallocated (".gnu.warning." ASM_NAME(#symbol)) \ 317d5ac70f0Sopenharmony_ci static const char __evoke_link_warning_##symbol[] \ 318d5ac70f0Sopenharmony_ci __attribute__ ((section (".gnu.warning." ASM_NAME(#symbol) "\n\t#"))) = msg; 319d5ac70f0Sopenharmony_ci# endif 320d5ac70f0Sopenharmony_ci# else 321d5ac70f0Sopenharmony_ci# define link_warning(symbol, msg) \ 322d5ac70f0Sopenharmony_ci asm (".stabs \"" msg "\",30,0,0,0\n\t" \ 323d5ac70f0Sopenharmony_ci ".stabs \"" ASM_NAME(#symbol) "\",1,0,0,0\n"); 324d5ac70f0Sopenharmony_ci# endif 325d5ac70f0Sopenharmony_ci#else 326d5ac70f0Sopenharmony_ci/* We will never be heard; they will all die horribly. */ 327d5ac70f0Sopenharmony_ci# define link_warning(symbol, msg) 328d5ac70f0Sopenharmony_ci#endif 329d5ac70f0Sopenharmony_ci 330d5ac70f0Sopenharmony_cistatic inline int snd_open_device(const char *filename, int fmode) 331d5ac70f0Sopenharmony_ci{ 332d5ac70f0Sopenharmony_ci int fd; 333d5ac70f0Sopenharmony_ci 334d5ac70f0Sopenharmony_ci#ifdef O_CLOEXEC 335d5ac70f0Sopenharmony_ci fmode |= O_CLOEXEC; 336d5ac70f0Sopenharmony_ci#endif 337d5ac70f0Sopenharmony_ci fd = open(filename, fmode); 338d5ac70f0Sopenharmony_ci 339d5ac70f0Sopenharmony_ci/* open with resmgr */ 340d5ac70f0Sopenharmony_ci#ifdef SUPPORT_RESMGR 341d5ac70f0Sopenharmony_ci if (fd < 0) { 342d5ac70f0Sopenharmony_ci if (errno == EAGAIN || errno == EBUSY) 343d5ac70f0Sopenharmony_ci return fd; 344d5ac70f0Sopenharmony_ci if (! access(filename, F_OK)) 345d5ac70f0Sopenharmony_ci fd = rsm_open_device(filename, fmode); 346d5ac70f0Sopenharmony_ci } 347d5ac70f0Sopenharmony_ci#endif 348d5ac70f0Sopenharmony_ci#ifndef O_CLOEXEC 349d5ac70f0Sopenharmony_ci if (fd >= 0) 350d5ac70f0Sopenharmony_ci fcntl(fd, F_SETFD, FD_CLOEXEC); 351d5ac70f0Sopenharmony_ci#endif 352d5ac70f0Sopenharmony_ci return fd; 353d5ac70f0Sopenharmony_ci} 354d5ac70f0Sopenharmony_ci 355d5ac70f0Sopenharmony_ci/* make local functions really local */ 356d5ac70f0Sopenharmony_ci#define snd_dlobj_cache_get \ 357d5ac70f0Sopenharmony_ci snd1_dlobj_cache_get 358d5ac70f0Sopenharmony_ci#define snd_dlobj_cache_get2 \ 359d5ac70f0Sopenharmony_ci snd1_dlobj_cache_get2 360d5ac70f0Sopenharmony_ci#define snd_dlobj_cache_put \ 361d5ac70f0Sopenharmony_ci snd1_dlobj_cache_put 362d5ac70f0Sopenharmony_ci#define snd_dlobj_cache_cleanup \ 363d5ac70f0Sopenharmony_ci snd1_dlobj_cache_cleanup 364d5ac70f0Sopenharmony_ci#define snd_config_set_hop \ 365d5ac70f0Sopenharmony_ci snd1_config_set_hop 366d5ac70f0Sopenharmony_ci#define snd_config_check_hop \ 367d5ac70f0Sopenharmony_ci snd1_config_check_hop 368d5ac70f0Sopenharmony_ci#define snd_config_search_alias_hooks \ 369d5ac70f0Sopenharmony_ci snd1_config_search_alias_hooks 370d5ac70f0Sopenharmony_ci 371d5ac70f0Sopenharmony_ci/* dlobj cache */ 372d5ac70f0Sopenharmony_civoid *snd_dlobj_cache_get(const char *lib, const char *name, const char *version, int verbose); 373d5ac70f0Sopenharmony_civoid *snd_dlobj_cache_get2(const char *lib, const char *name, const char *version, int verbose); 374d5ac70f0Sopenharmony_ciint snd_dlobj_cache_put(void *open_func); 375d5ac70f0Sopenharmony_civoid snd_dlobj_cache_cleanup(void); 376d5ac70f0Sopenharmony_ci 377d5ac70f0Sopenharmony_ci/* for recursive checks */ 378d5ac70f0Sopenharmony_civoid snd_config_set_hop(snd_config_t *conf, int hop); 379d5ac70f0Sopenharmony_ciint snd_config_check_hop(snd_config_t *conf); 380d5ac70f0Sopenharmony_ci#define SND_CONF_MAX_HOPS 64 381d5ac70f0Sopenharmony_ci 382d5ac70f0Sopenharmony_ciint snd_config_search_alias_hooks(snd_config_t *config, 383d5ac70f0Sopenharmony_ci const char *base, const char *key, 384d5ac70f0Sopenharmony_ci snd_config_t **result); 385d5ac70f0Sopenharmony_ci 386d5ac70f0Sopenharmony_ciint _snd_conf_generic_id(const char *id); 387d5ac70f0Sopenharmony_ci 388d5ac70f0Sopenharmony_ciint _snd_config_load_with_include(snd_config_t *config, snd_input_t *in, 389d5ac70f0Sopenharmony_ci int override, const char * const *default_include_path); 390d5ac70f0Sopenharmony_ci 391d5ac70f0Sopenharmony_ci/* convenience macros */ 392d5ac70f0Sopenharmony_ci#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) 393d5ac70f0Sopenharmony_ci 394d5ac70f0Sopenharmony_ci#define container_of(ptr, type, member) ({ \ 395d5ac70f0Sopenharmony_ci const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 396d5ac70f0Sopenharmony_ci (type *)( (char *)__mptr - offsetof(type,member) );}) 397d5ac70f0Sopenharmony_ci 398d5ac70f0Sopenharmony_ci#ifdef INTERNAL 399d5ac70f0Sopenharmony_civoid *INTERNAL(snd_dlopen)(const char *name, int mode, char *errbuf, size_t errbuflen); 400d5ac70f0Sopenharmony_ci#endif 401d5ac70f0Sopenharmony_ci 402d5ac70f0Sopenharmony_ci#ifdef BUILD_UCM 403d5ac70f0Sopenharmony_ci 404d5ac70f0Sopenharmony_ciconst char *uc_mgr_alibcfg_by_device(snd_config_t **config, const char *name); 405d5ac70f0Sopenharmony_ci 406d5ac70f0Sopenharmony_cistatic inline int _snd_is_ucm_device(const char *name) 407d5ac70f0Sopenharmony_ci{ 408d5ac70f0Sopenharmony_ci return name && name[0] == '_' && name[1] == 'u' && name[2] == 'c' && name[3] == 'm'; 409d5ac70f0Sopenharmony_ci} 410d5ac70f0Sopenharmony_ci 411d5ac70f0Sopenharmony_ci#else 412d5ac70f0Sopenharmony_ci 413d5ac70f0Sopenharmony_cistatic inline const char *uc_mgr_alibcfg_by_device(snd_config_t **config, const char *name) { return NULL; } 414d5ac70f0Sopenharmony_cistatic inline int _snd_is_ucm_device(const char *name) { return 0; } 415d5ac70f0Sopenharmony_ci 416d5ac70f0Sopenharmony_ci 417d5ac70f0Sopenharmony_ci#endif 418d5ac70f0Sopenharmony_ci 419d5ac70f0Sopenharmony_ci#endif 420