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