1d5ac70f0Sopenharmony_ci/* 2d5ac70f0Sopenharmony_ci * PCM Interface - local header file 3d5ac70f0Sopenharmony_ci * Copyright (c) 2000 by Jaroslav Kysela <perex@perex.cz> 4d5ac70f0Sopenharmony_ci * Abramo Bagnara <abramo@alsa-project.org> 5d5ac70f0Sopenharmony_ci * 6d5ac70f0Sopenharmony_ci * 7d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 8d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 9d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 10d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 11d5ac70f0Sopenharmony_ci * 12d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 13d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 16d5ac70f0Sopenharmony_ci * 17d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 19d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20d5ac70f0Sopenharmony_ci * 21d5ac70f0Sopenharmony_ci */ 22d5ac70f0Sopenharmony_ci 23d5ac70f0Sopenharmony_ci#ifndef __PCM_LOCAL_H 24d5ac70f0Sopenharmony_ci#define __PCM_LOCAL_H 25d5ac70f0Sopenharmony_ci 26d5ac70f0Sopenharmony_ci#include "config.h" 27d5ac70f0Sopenharmony_ci 28d5ac70f0Sopenharmony_ci#include <stdio.h> 29d5ac70f0Sopenharmony_ci#include <stdlib.h> 30d5ac70f0Sopenharmony_ci#include <limits.h> 31d5ac70f0Sopenharmony_ci#include <sys/uio.h> 32d5ac70f0Sopenharmony_ci#include <time.h> 33d5ac70f0Sopenharmony_ci#include <sys/time.h> 34d5ac70f0Sopenharmony_ci 35d5ac70f0Sopenharmony_ci#define _snd_mask sndrv_mask 36d5ac70f0Sopenharmony_ci#define _snd_pcm_access_mask _snd_mask 37d5ac70f0Sopenharmony_ci#define _snd_pcm_format_mask _snd_mask 38d5ac70f0Sopenharmony_ci#define _snd_pcm_subformat_mask _snd_mask 39d5ac70f0Sopenharmony_ci 40d5ac70f0Sopenharmony_ci#include "local.h" 41d5ac70f0Sopenharmony_ci 42d5ac70f0Sopenharmony_ci#ifdef THREAD_SAFE_API 43d5ac70f0Sopenharmony_ci#define __USE_UNIX98 1 /* for old glibc */ 44d5ac70f0Sopenharmony_ci#include <pthread.h> 45d5ac70f0Sopenharmony_ci#endif 46d5ac70f0Sopenharmony_ci 47d5ac70f0Sopenharmony_ci#define SND_INTERVAL_INLINE 48d5ac70f0Sopenharmony_ci#include "interval.h" 49d5ac70f0Sopenharmony_ci 50d5ac70f0Sopenharmony_ci#define SND_MASK_INLINE 51d5ac70f0Sopenharmony_ci#include "mask.h" 52d5ac70f0Sopenharmony_ci 53d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_ACCESS SNDRV_PCM_HW_PARAM_ACCESS 54d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_FORMAT SNDRV_PCM_HW_PARAM_FORMAT 55d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_SUBFORMAT SNDRV_PCM_HW_PARAM_SUBFORMAT 56d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_SAMPLE_BITS SNDRV_PCM_HW_PARAM_SAMPLE_BITS 57d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_FRAME_BITS SNDRV_PCM_HW_PARAM_FRAME_BITS 58d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_CHANNELS SNDRV_PCM_HW_PARAM_CHANNELS 59d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_RATE SNDRV_PCM_HW_PARAM_RATE 60d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_PERIOD_TIME SNDRV_PCM_HW_PARAM_PERIOD_TIME 61d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_PERIOD_SIZE SNDRV_PCM_HW_PARAM_PERIOD_SIZE 62d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_PERIOD_BYTES SNDRV_PCM_HW_PARAM_PERIOD_BYTES 63d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_PERIODS SNDRV_PCM_HW_PARAM_PERIODS 64d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_BUFFER_TIME SNDRV_PCM_HW_PARAM_BUFFER_TIME 65d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_BUFFER_SIZE SNDRV_PCM_HW_PARAM_BUFFER_SIZE 66d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_BUFFER_BYTES SNDRV_PCM_HW_PARAM_BUFFER_BYTES 67d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_TICK_TIME SNDRV_PCM_HW_PARAM_TICK_TIME 68d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_LAST_MASK SNDRV_PCM_HW_PARAM_LAST_MASK 69d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_FIRST_MASK SNDRV_PCM_HW_PARAM_FIRST_MASK 70d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_LAST_INTERVAL SNDRV_PCM_HW_PARAM_LAST_INTERVAL 71d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAM_FIRST_INTERVAL SNDRV_PCM_HW_PARAM_FIRST_INTERVAL 72d5ac70f0Sopenharmony_ci 73d5ac70f0Sopenharmony_ci/** device accepts mmaped access */ 74d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_MMAP SNDRV_PCM_INFO_MMAP 75d5ac70f0Sopenharmony_ci/** device accepts mmaped access with sample resolution */ 76d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_MMAP_VALID SNDRV_PCM_INFO_MMAP_VALID 77d5ac70f0Sopenharmony_ci/** device is doing double buffering */ 78d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_DOUBLE SNDRV_PCM_INFO_DOUBLE 79d5ac70f0Sopenharmony_ci/** device transfers samples in batch */ 80d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_BATCH SNDRV_PCM_INFO_BATCH 81d5ac70f0Sopenharmony_ci/** device does perfect drain (silencing not required) */ 82d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_PERFECT_DRAIN SNDRV_PCM_INFO_PERFECT_DRAIN 83d5ac70f0Sopenharmony_ci/** device accepts interleaved samples */ 84d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_INTERLEAVED SNDRV_PCM_INFO_INTERLEAVED 85d5ac70f0Sopenharmony_ci/** device accepts non-interleaved samples */ 86d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_NONINTERLEAVED SNDRV_PCM_INFO_NONINTERLEAVED 87d5ac70f0Sopenharmony_ci/** device accepts complex sample organization */ 88d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_COMPLEX SNDRV_PCM_INFO_COMPLEX 89d5ac70f0Sopenharmony_ci/** device is capable block transfers */ 90d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_BLOCK_TRANSFER SNDRV_PCM_INFO_BLOCK_TRANSFER 91d5ac70f0Sopenharmony_ci/** device can detect DAC/ADC overrange */ 92d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_OVERRANGE SNDRV_PCM_INFO_OVERRANGE 93d5ac70f0Sopenharmony_ci/** device supports resume */ 94d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_RESUME SNDRV_PCM_INFO_RESUME 95d5ac70f0Sopenharmony_ci/** device is capable to pause */ 96d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_PAUSE SNDRV_PCM_INFO_PAUSE 97d5ac70f0Sopenharmony_ci/** device can do only half duplex */ 98d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_HALF_DUPLEX SNDRV_PCM_INFO_HALF_DUPLEX 99d5ac70f0Sopenharmony_ci/** device can do only joint duplex (same parameters) */ 100d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_JOINT_DUPLEX SNDRV_PCM_INFO_JOINT_DUPLEX 101d5ac70f0Sopenharmony_ci/** device can do a kind of synchronized start */ 102d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_SYNC_START SNDRV_PCM_INFO_SYNC_START 103d5ac70f0Sopenharmony_ci/** device can disable period wakeups */ 104d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_NO_PERIOD_WAKEUP SNDRV_PCM_INFO_NO_PERIOD_WAKEUP 105d5ac70f0Sopenharmony_ci 106d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAMS_NORESAMPLE SNDRV_PCM_HW_PARAMS_NORESAMPLE 107d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAMS_EXPORT_BUFFER SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER 108d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAMS_NO_PERIOD_WAKEUP SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP 109d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARAMS_NO_DRAIN_SILENCE SNDRV_PCM_HW_PARAMS_NO_DRAIN_SILENCE 110d5ac70f0Sopenharmony_ci 111d5ac70f0Sopenharmony_ci#define SND_PCM_INFO_MONOTONIC 0x80000000 112d5ac70f0Sopenharmony_ci 113d5ac70f0Sopenharmony_citypedef struct _snd_pcm_rbptr { 114d5ac70f0Sopenharmony_ci snd_pcm_t *master; 115d5ac70f0Sopenharmony_ci volatile snd_pcm_uframes_t *ptr; 116d5ac70f0Sopenharmony_ci int fd; 117d5ac70f0Sopenharmony_ci off_t offset; 118d5ac70f0Sopenharmony_ci int link_dst_count; 119d5ac70f0Sopenharmony_ci snd_pcm_t **link_dst; 120d5ac70f0Sopenharmony_ci void *private_data; 121d5ac70f0Sopenharmony_ci void (*changed)(snd_pcm_t *pcm, snd_pcm_t *src); 122d5ac70f0Sopenharmony_ci} snd_pcm_rbptr_t; 123d5ac70f0Sopenharmony_ci 124d5ac70f0Sopenharmony_citypedef struct _snd_pcm_channel_info { 125d5ac70f0Sopenharmony_ci unsigned int channel; 126d5ac70f0Sopenharmony_ci void *addr; /* base address of channel samples */ 127d5ac70f0Sopenharmony_ci unsigned int first; /* offset to first sample in bits */ 128d5ac70f0Sopenharmony_ci unsigned int step; /* samples distance in bits */ 129d5ac70f0Sopenharmony_ci enum { SND_PCM_AREA_SHM, SND_PCM_AREA_MMAP, SND_PCM_AREA_LOCAL } type; 130d5ac70f0Sopenharmony_ci union { 131d5ac70f0Sopenharmony_ci struct { 132d5ac70f0Sopenharmony_ci struct snd_shm_area *area; 133d5ac70f0Sopenharmony_ci int shmid; 134d5ac70f0Sopenharmony_ci } shm; 135d5ac70f0Sopenharmony_ci struct { 136d5ac70f0Sopenharmony_ci int fd; 137d5ac70f0Sopenharmony_ci off_t offset; 138d5ac70f0Sopenharmony_ci } mmap; 139d5ac70f0Sopenharmony_ci } u; 140d5ac70f0Sopenharmony_ci char reserved[64]; 141d5ac70f0Sopenharmony_ci} snd_pcm_channel_info_t; 142d5ac70f0Sopenharmony_ci 143d5ac70f0Sopenharmony_citypedef struct { 144d5ac70f0Sopenharmony_ci int (*close)(snd_pcm_t *pcm); 145d5ac70f0Sopenharmony_ci int (*nonblock)(snd_pcm_t *pcm, int nonblock); /* always locked */ 146d5ac70f0Sopenharmony_ci int (*async)(snd_pcm_t *pcm, int sig, pid_t pid); 147d5ac70f0Sopenharmony_ci int (*info)(snd_pcm_t *pcm, snd_pcm_info_t *info); 148d5ac70f0Sopenharmony_ci int (*hw_refine)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); 149d5ac70f0Sopenharmony_ci int (*hw_params)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); 150d5ac70f0Sopenharmony_ci int (*hw_free)(snd_pcm_t *pcm); 151d5ac70f0Sopenharmony_ci int (*sw_params)(snd_pcm_t *pcm, snd_pcm_sw_params_t *params); /* always locked */ 152d5ac70f0Sopenharmony_ci int (*channel_info)(snd_pcm_t *pcm, snd_pcm_channel_info_t *info); 153d5ac70f0Sopenharmony_ci void (*dump)(snd_pcm_t *pcm, snd_output_t *out); 154d5ac70f0Sopenharmony_ci int (*mmap)(snd_pcm_t *pcm); 155d5ac70f0Sopenharmony_ci int (*munmap)(snd_pcm_t *pcm); 156d5ac70f0Sopenharmony_ci snd_pcm_chmap_query_t **(*query_chmaps)(snd_pcm_t *pcm); 157d5ac70f0Sopenharmony_ci snd_pcm_chmap_t *(*get_chmap)(snd_pcm_t *pcm); 158d5ac70f0Sopenharmony_ci int (*set_chmap)(snd_pcm_t *pcm, const snd_pcm_chmap_t *map); 159d5ac70f0Sopenharmony_ci} snd_pcm_ops_t; 160d5ac70f0Sopenharmony_ci 161d5ac70f0Sopenharmony_citypedef struct { 162d5ac70f0Sopenharmony_ci int (*status)(snd_pcm_t *pcm, snd_pcm_status_t *status); /* locked */ 163d5ac70f0Sopenharmony_ci int (*prepare)(snd_pcm_t *pcm); /* locked */ 164d5ac70f0Sopenharmony_ci int (*reset)(snd_pcm_t *pcm); /* locked */ 165d5ac70f0Sopenharmony_ci int (*start)(snd_pcm_t *pcm); /* locked */ 166d5ac70f0Sopenharmony_ci int (*drop)(snd_pcm_t *pcm); /* locked */ 167d5ac70f0Sopenharmony_ci int (*drain)(snd_pcm_t *pcm); /* need own locking */ 168d5ac70f0Sopenharmony_ci int (*pause)(snd_pcm_t *pcm, int enable); /* locked */ 169d5ac70f0Sopenharmony_ci snd_pcm_state_t (*state)(snd_pcm_t *pcm); /* locked */ 170d5ac70f0Sopenharmony_ci int (*hwsync)(snd_pcm_t *pcm); /* locked */ 171d5ac70f0Sopenharmony_ci int (*delay)(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp); /* locked */ 172d5ac70f0Sopenharmony_ci int (*resume)(snd_pcm_t *pcm); /* need own locking */ 173d5ac70f0Sopenharmony_ci int (*link)(snd_pcm_t *pcm1, snd_pcm_t *pcm2); 174d5ac70f0Sopenharmony_ci int (*link_slaves)(snd_pcm_t *pcm, snd_pcm_t *master); 175d5ac70f0Sopenharmony_ci int (*unlink)(snd_pcm_t *pcm); 176d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*rewindable)(snd_pcm_t *pcm); /* locked */ 177d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*rewind)(snd_pcm_t *pcm, snd_pcm_uframes_t frames); /* locked */ 178d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*forwardable)(snd_pcm_t *pcm); /* locked */ 179d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*forward)(snd_pcm_t *pcm, snd_pcm_uframes_t frames); /* locked */ 180d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*writei)(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size); /* need own locking */ 181d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*writen)(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size); /* need own locking */ 182d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*readi)(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size); /* need own locking */ 183d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*readn)(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size); /* need own locking */ 184d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*avail_update)(snd_pcm_t *pcm); /* locked */ 185d5ac70f0Sopenharmony_ci snd_pcm_sframes_t (*mmap_commit)(snd_pcm_t *pcm, snd_pcm_uframes_t offset, snd_pcm_uframes_t size); /* locked */ 186d5ac70f0Sopenharmony_ci int (*htimestamp)(snd_pcm_t *pcm, snd_pcm_uframes_t *avail, snd_htimestamp_t *tstamp); /* locked */ 187d5ac70f0Sopenharmony_ci int (*poll_descriptors_count)(snd_pcm_t *pcm); /* locked */ 188d5ac70f0Sopenharmony_ci int (*poll_descriptors)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space); /* locked */ 189d5ac70f0Sopenharmony_ci int (*poll_revents)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents); /* locked */ 190d5ac70f0Sopenharmony_ci int (*may_wait_for_avail_min)(snd_pcm_t *pcm, snd_pcm_uframes_t avail); 191d5ac70f0Sopenharmony_ci int (*mmap_begin)(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames); /* locked */ 192d5ac70f0Sopenharmony_ci} snd_pcm_fast_ops_t; 193d5ac70f0Sopenharmony_ci 194d5ac70f0Sopenharmony_cistruct _snd_pcm { 195d5ac70f0Sopenharmony_ci void *open_func; 196d5ac70f0Sopenharmony_ci char *name; 197d5ac70f0Sopenharmony_ci snd_pcm_type_t type; 198d5ac70f0Sopenharmony_ci snd_pcm_stream_t stream; 199d5ac70f0Sopenharmony_ci int mode; 200d5ac70f0Sopenharmony_ci long minperiodtime; /* in us */ 201d5ac70f0Sopenharmony_ci int poll_fd_count; 202d5ac70f0Sopenharmony_ci int poll_fd; 203d5ac70f0Sopenharmony_ci unsigned short poll_events; 204d5ac70f0Sopenharmony_ci int setup: 1, 205d5ac70f0Sopenharmony_ci compat: 1; 206d5ac70f0Sopenharmony_ci snd_pcm_access_t access; /* access mode */ 207d5ac70f0Sopenharmony_ci snd_pcm_format_t format; /* SND_PCM_FORMAT_* */ 208d5ac70f0Sopenharmony_ci snd_pcm_subformat_t subformat; /* subformat */ 209d5ac70f0Sopenharmony_ci unsigned int channels; /* channels */ 210d5ac70f0Sopenharmony_ci unsigned int rate; /* rate in Hz */ 211d5ac70f0Sopenharmony_ci snd_pcm_uframes_t period_size; 212d5ac70f0Sopenharmony_ci unsigned int period_time; /* period duration */ 213d5ac70f0Sopenharmony_ci snd_interval_t periods; 214d5ac70f0Sopenharmony_ci snd_pcm_tstamp_t tstamp_mode; /* timestamp mode */ 215d5ac70f0Sopenharmony_ci snd_pcm_tstamp_type_t tstamp_type; /* timestamp type */ 216d5ac70f0Sopenharmony_ci unsigned int period_step; 217d5ac70f0Sopenharmony_ci snd_pcm_uframes_t avail_min; /* min avail frames for wakeup */ 218d5ac70f0Sopenharmony_ci int period_event; 219d5ac70f0Sopenharmony_ci snd_pcm_uframes_t start_threshold; 220d5ac70f0Sopenharmony_ci snd_pcm_uframes_t stop_threshold; 221d5ac70f0Sopenharmony_ci snd_pcm_uframes_t silence_threshold; /* Silence filling happens when 222d5ac70f0Sopenharmony_ci noise is nearest than this */ 223d5ac70f0Sopenharmony_ci snd_pcm_uframes_t silence_size; /* Silence filling size */ 224d5ac70f0Sopenharmony_ci snd_pcm_uframes_t boundary; /* pointers wrap point */ 225d5ac70f0Sopenharmony_ci unsigned int info; /* Info for returned setup */ 226d5ac70f0Sopenharmony_ci unsigned int msbits; /* used most significant bits */ 227d5ac70f0Sopenharmony_ci unsigned int rate_num; /* rate numerator */ 228d5ac70f0Sopenharmony_ci unsigned int rate_den; /* rate denominator */ 229d5ac70f0Sopenharmony_ci unsigned int hw_flags; /* actual hardware flags */ 230d5ac70f0Sopenharmony_ci snd_pcm_uframes_t fifo_size; /* chip FIFO size in frames */ 231d5ac70f0Sopenharmony_ci snd_pcm_uframes_t buffer_size; 232d5ac70f0Sopenharmony_ci snd_interval_t buffer_time; 233d5ac70f0Sopenharmony_ci unsigned int sample_bits; 234d5ac70f0Sopenharmony_ci unsigned int frame_bits; 235d5ac70f0Sopenharmony_ci snd_pcm_rbptr_t appl; 236d5ac70f0Sopenharmony_ci snd_pcm_rbptr_t hw; 237d5ac70f0Sopenharmony_ci snd_pcm_uframes_t min_align; 238d5ac70f0Sopenharmony_ci unsigned int mmap_rw: 1; /* use always mmapped buffer */ 239d5ac70f0Sopenharmony_ci unsigned int mmap_shadow: 1; /* don't call actual mmap, 240d5ac70f0Sopenharmony_ci * use the mmaped buffer of the slave 241d5ac70f0Sopenharmony_ci */ 242d5ac70f0Sopenharmony_ci unsigned int donot_close: 1; /* don't close this PCM */ 243d5ac70f0Sopenharmony_ci unsigned int own_state_check:1; /* plugin has own PCM state check */ 244d5ac70f0Sopenharmony_ci snd_pcm_channel_info_t *mmap_channels; 245d5ac70f0Sopenharmony_ci snd_pcm_channel_area_t *running_areas; 246d5ac70f0Sopenharmony_ci snd_pcm_channel_area_t *stopped_areas; 247d5ac70f0Sopenharmony_ci const snd_pcm_ops_t *ops; 248d5ac70f0Sopenharmony_ci const snd_pcm_fast_ops_t *fast_ops; 249d5ac70f0Sopenharmony_ci snd_pcm_t *op_arg; 250d5ac70f0Sopenharmony_ci snd_pcm_t *fast_op_arg; 251d5ac70f0Sopenharmony_ci void *private_data; 252d5ac70f0Sopenharmony_ci struct list_head async_handlers; 253d5ac70f0Sopenharmony_ci#ifdef THREAD_SAFE_API 254d5ac70f0Sopenharmony_ci int need_lock; /* true = this PCM (plugin) is thread-unsafe, 255d5ac70f0Sopenharmony_ci * thus it needs a lock. 256d5ac70f0Sopenharmony_ci */ 257d5ac70f0Sopenharmony_ci int lock_enabled; /* thread-safety lock is enabled on the system; 258d5ac70f0Sopenharmony_ci * it's set depending on $LIBASOUND_THREAD_SAFE. 259d5ac70f0Sopenharmony_ci */ 260d5ac70f0Sopenharmony_ci pthread_mutex_t lock; 261d5ac70f0Sopenharmony_ci#endif 262d5ac70f0Sopenharmony_ci}; 263d5ac70f0Sopenharmony_ci 264d5ac70f0Sopenharmony_ci/* make local functions really local */ 265d5ac70f0Sopenharmony_ci/* Grrr, these cannot be local - a bad aserver uses them! 266d5ac70f0Sopenharmony_ci#define snd_pcm_async \ 267d5ac70f0Sopenharmony_ci snd1_pcm_async 268d5ac70f0Sopenharmony_ci#define snd_pcm_mmap \ 269d5ac70f0Sopenharmony_ci snd1_pcm_mmap 270d5ac70f0Sopenharmony_ci#define snd_pcm_munmap \ 271d5ac70f0Sopenharmony_ci snd1_pcm_munmap 272d5ac70f0Sopenharmony_ci#define snd_pcm_hw_refine \ 273d5ac70f0Sopenharmony_ci snd1_pcm_hw_refine 274d5ac70f0Sopenharmony_ci*/ 275d5ac70f0Sopenharmony_ci#define snd_pcm_new \ 276d5ac70f0Sopenharmony_ci snd1_pcm_new 277d5ac70f0Sopenharmony_ci#define snd_pcm_free \ 278d5ac70f0Sopenharmony_ci snd1_pcm_free 279d5ac70f0Sopenharmony_ci#define snd_pcm_areas_from_buf \ 280d5ac70f0Sopenharmony_ci snd1_pcm_areas_from_buf 281d5ac70f0Sopenharmony_ci#define snd_pcm_areas_from_bufs \ 282d5ac70f0Sopenharmony_ci snd1_pcm_areas_from_bufs 283d5ac70f0Sopenharmony_ci#define snd_pcm_open_named_slave \ 284d5ac70f0Sopenharmony_ci snd1_pcm_open_named_slave 285d5ac70f0Sopenharmony_ci#define snd_pcm_hw_open_fd \ 286d5ac70f0Sopenharmony_ci snd1_pcm_hw_open_fd 287d5ac70f0Sopenharmony_ci#define snd_pcm_wait_nocheck \ 288d5ac70f0Sopenharmony_ci snd1_pcm_wait_nocheck 289d5ac70f0Sopenharmony_ci#define snd_pcm_rate_get_default_converter \ 290d5ac70f0Sopenharmony_ci snd1_pcm_rate_get_default_converter 291d5ac70f0Sopenharmony_ci#define snd_pcm_set_hw_ptr \ 292d5ac70f0Sopenharmony_ci snd1_pcm_set_hw_ptr 293d5ac70f0Sopenharmony_ci#define snd_pcm_set_appl_ptr \ 294d5ac70f0Sopenharmony_ci snd1_pcm_set_appl_ptr 295d5ac70f0Sopenharmony_ci#define snd_pcm_link_hw_ptr \ 296d5ac70f0Sopenharmony_ci snd1_pcm_link_hw_ptr 297d5ac70f0Sopenharmony_ci#define snd_pcm_link_appl_ptr \ 298d5ac70f0Sopenharmony_ci snd1_pcm_link_appl_ptr 299d5ac70f0Sopenharmony_ci#define snd_pcm_unlink_hw_ptr \ 300d5ac70f0Sopenharmony_ci snd1_pcm_unlink_hw_ptr 301d5ac70f0Sopenharmony_ci#define snd_pcm_unlink_appl_ptr \ 302d5ac70f0Sopenharmony_ci snd1_pcm_unlink_appl_ptr 303d5ac70f0Sopenharmony_ci#define snd_pcm_mmap_appl_ptr \ 304d5ac70f0Sopenharmony_ci snd1_pcm_mmap_appl_ptr 305d5ac70f0Sopenharmony_ci#define snd_pcm_mmap_appl_backward \ 306d5ac70f0Sopenharmony_ci snd1_pcm_mmap_appl_backward 307d5ac70f0Sopenharmony_ci#define snd_pcm_mmap_appl_forward \ 308d5ac70f0Sopenharmony_ci snd1_pcm_mmap_appl_forward 309d5ac70f0Sopenharmony_ci#define snd_pcm_mmap_hw_backward \ 310d5ac70f0Sopenharmony_ci snd1_pcm_mmap_hw_backward 311d5ac70f0Sopenharmony_ci#define snd_pcm_mmap_hw_forward \ 312d5ac70f0Sopenharmony_ci snd1_pcm_mmap_hw_forward 313d5ac70f0Sopenharmony_ci#define snd_pcm_read_areas \ 314d5ac70f0Sopenharmony_ci snd1_pcm_read_areas 315d5ac70f0Sopenharmony_ci#define snd_pcm_write_areas \ 316d5ac70f0Sopenharmony_ci snd1_pcm_write_areas 317d5ac70f0Sopenharmony_ci#define snd_pcm_read_mmap \ 318d5ac70f0Sopenharmony_ci snd1_pcm_read_mmap 319d5ac70f0Sopenharmony_ci#define snd_pcm_write_mmap \ 320d5ac70f0Sopenharmony_ci snd1_pcm_write_mmap 321d5ac70f0Sopenharmony_ci#define snd_pcm_channel_info_shm \ 322d5ac70f0Sopenharmony_ci snd1_pcm_channel_info_shm 323d5ac70f0Sopenharmony_ci#define snd_pcm_hw_refine_soft \ 324d5ac70f0Sopenharmony_ci snd1_pcm_hw_refine_soft 325d5ac70f0Sopenharmony_ci#define snd_pcm_hw_refine_slave \ 326d5ac70f0Sopenharmony_ci snd1_pcm_hw_refine_slave 327d5ac70f0Sopenharmony_ci#define snd_pcm_hw_params_slave \ 328d5ac70f0Sopenharmony_ci snd1_pcm_hw_params_slave 329d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_refine_near \ 330d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_refine_near 331d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_refine_multiple \ 332d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_refine_multiple 333d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_empty \ 334d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_empty 335d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_always_eq \ 336d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_always_eq 337d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_never_eq \ 338d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_never_eq 339d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_get_mask \ 340d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_get_mask 341d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_get_interval \ 342d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_get_interval 343d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_any \ 344d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_any 345d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set_integer \ 346d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set_integer 347d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set_first \ 348d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set_first 349d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set_last \ 350d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set_last 351d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set_near \ 352d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set_near 353d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set_min \ 354d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set_min 355d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set_max \ 356d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set_max 357d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set_minmax \ 358d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set_minmax 359d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set \ 360d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set 361d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_set_mask \ 362d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_set_mask 363d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_get \ 364d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_get 365d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_get_min \ 366d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_get_min 367d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_get_max \ 368d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_get_max 369d5ac70f0Sopenharmony_ci#define snd_pcm_hw_param_name \ 370d5ac70f0Sopenharmony_ci snd1_pcm_hw_param_name 371d5ac70f0Sopenharmony_ci#define snd_pcm_sw_params_current_no_lock \ 372d5ac70f0Sopenharmony_ci snd1_pcm_sw_params_current_no_lock 373d5ac70f0Sopenharmony_ci 374d5ac70f0Sopenharmony_ciint snd_pcm_new(snd_pcm_t **pcmp, snd_pcm_type_t type, const char *name, 375d5ac70f0Sopenharmony_ci snd_pcm_stream_t stream, int mode); 376d5ac70f0Sopenharmony_ciint snd_pcm_free(snd_pcm_t *pcm); 377d5ac70f0Sopenharmony_ci 378d5ac70f0Sopenharmony_civoid snd_pcm_areas_from_buf(snd_pcm_t *pcm, snd_pcm_channel_area_t *areas, void *buf); 379d5ac70f0Sopenharmony_civoid snd_pcm_areas_from_bufs(snd_pcm_t *pcm, snd_pcm_channel_area_t *areas, void **bufs); 380d5ac70f0Sopenharmony_ci 381d5ac70f0Sopenharmony_ciint snd_pcm_async(snd_pcm_t *pcm, int sig, pid_t pid); 382d5ac70f0Sopenharmony_ciint snd_pcm_mmap(snd_pcm_t *pcm); 383d5ac70f0Sopenharmony_ciint snd_pcm_munmap(snd_pcm_t *pcm); 384d5ac70f0Sopenharmony_ciint snd_pcm_mmap_ready(snd_pcm_t *pcm); 385d5ac70f0Sopenharmony_civoid snd_pcm_set_hw_ptr(snd_pcm_t *pcm, volatile snd_pcm_uframes_t *hw_ptr, int fd, off_t offset); 386d5ac70f0Sopenharmony_civoid snd_pcm_set_appl_ptr(snd_pcm_t *pcm, volatile snd_pcm_uframes_t *appl_ptr, int fd, off_t offset); 387d5ac70f0Sopenharmony_civoid snd_pcm_link_hw_ptr(snd_pcm_t *pcm, snd_pcm_t *slave); 388d5ac70f0Sopenharmony_civoid snd_pcm_link_appl_ptr(snd_pcm_t *pcm, snd_pcm_t *slave); 389d5ac70f0Sopenharmony_civoid snd_pcm_unlink_hw_ptr(snd_pcm_t *pcm, snd_pcm_t *slave); 390d5ac70f0Sopenharmony_civoid snd_pcm_unlink_appl_ptr(snd_pcm_t *pcm, snd_pcm_t *slave); 391d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_mmap_appl_ptr(snd_pcm_t *pcm, off_t offset); 392d5ac70f0Sopenharmony_civoid snd_pcm_mmap_appl_backward(snd_pcm_t *pcm, snd_pcm_uframes_t frames); 393d5ac70f0Sopenharmony_civoid snd_pcm_mmap_appl_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames); 394d5ac70f0Sopenharmony_civoid snd_pcm_mmap_hw_backward(snd_pcm_t *pcm, snd_pcm_uframes_t frames); 395d5ac70f0Sopenharmony_civoid snd_pcm_mmap_hw_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames); 396d5ac70f0Sopenharmony_ci 397d5ac70f0Sopenharmony_civoid snd_pcm_sw_params_current_no_lock(snd_pcm_t *pcm, snd_pcm_sw_params_t *params); 398d5ac70f0Sopenharmony_ci 399d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_mmap_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size); 400d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_mmap_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size); 401d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_mmap_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size); 402d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_mmap_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size); 403d5ac70f0Sopenharmony_ci 404d5ac70f0Sopenharmony_citypedef snd_pcm_sframes_t (*snd_pcm_xfer_areas_func_t)(snd_pcm_t *pcm, 405d5ac70f0Sopenharmony_ci const snd_pcm_channel_area_t *areas, 406d5ac70f0Sopenharmony_ci snd_pcm_uframes_t offset, 407d5ac70f0Sopenharmony_ci snd_pcm_uframes_t size); 408d5ac70f0Sopenharmony_ci 409d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_read_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_t *areas, 410d5ac70f0Sopenharmony_ci snd_pcm_uframes_t offset, snd_pcm_uframes_t size, 411d5ac70f0Sopenharmony_ci snd_pcm_xfer_areas_func_t func); 412d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_write_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_t *areas, 413d5ac70f0Sopenharmony_ci snd_pcm_uframes_t offset, snd_pcm_uframes_t size, 414d5ac70f0Sopenharmony_ci snd_pcm_xfer_areas_func_t func); 415d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_read_mmap(snd_pcm_t *pcm, snd_pcm_uframes_t offset, 416d5ac70f0Sopenharmony_ci snd_pcm_uframes_t size); 417d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_write_mmap(snd_pcm_t *pcm, snd_pcm_uframes_t offset, 418d5ac70f0Sopenharmony_ci snd_pcm_uframes_t size); 419d5ac70f0Sopenharmony_cistatic inline int snd_pcm_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *info) 420d5ac70f0Sopenharmony_ci{ 421d5ac70f0Sopenharmony_ci if (!pcm->ops->channel_info) 422d5ac70f0Sopenharmony_ci return -ENOSYS; 423d5ac70f0Sopenharmony_ci return pcm->ops->channel_info(pcm, info); 424d5ac70f0Sopenharmony_ci} 425d5ac70f0Sopenharmony_ciint snd_pcm_channel_info_shm(snd_pcm_t *pcm, snd_pcm_channel_info_t *info, int shmid); 426d5ac70f0Sopenharmony_ciint _snd_pcm_poll_descriptor(snd_pcm_t *pcm); 427d5ac70f0Sopenharmony_ci#define _snd_pcm_link_descriptor _snd_pcm_poll_descriptor /* FIXME */ 428d5ac70f0Sopenharmony_ci#define _snd_pcm_async_descriptor _snd_pcm_poll_descriptor /* FIXME */ 429d5ac70f0Sopenharmony_ci 430d5ac70f0Sopenharmony_ci/* locked versions */ 431d5ac70f0Sopenharmony_ciint __snd_pcm_mmap_begin_generic(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, 432d5ac70f0Sopenharmony_ci snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames); 433d5ac70f0Sopenharmony_ciint __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, 434d5ac70f0Sopenharmony_ci snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames); 435d5ac70f0Sopenharmony_cisnd_pcm_sframes_t __snd_pcm_mmap_commit(snd_pcm_t *pcm, 436d5ac70f0Sopenharmony_ci snd_pcm_uframes_t offset, 437d5ac70f0Sopenharmony_ci snd_pcm_uframes_t frames); 438d5ac70f0Sopenharmony_ciint __snd_pcm_wait_in_lock(snd_pcm_t *pcm, int timeout); 439d5ac70f0Sopenharmony_ci 440d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t __snd_pcm_avail_update(snd_pcm_t *pcm) 441d5ac70f0Sopenharmony_ci{ 442d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->avail_update) 443d5ac70f0Sopenharmony_ci return -ENOSYS; 444d5ac70f0Sopenharmony_ci return pcm->fast_ops->avail_update(pcm->fast_op_arg); 445d5ac70f0Sopenharmony_ci} 446d5ac70f0Sopenharmony_ci 447d5ac70f0Sopenharmony_cistatic inline int __snd_pcm_start(snd_pcm_t *pcm) 448d5ac70f0Sopenharmony_ci{ 449d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->start) 450d5ac70f0Sopenharmony_ci return -ENOSYS; 451d5ac70f0Sopenharmony_ci return pcm->fast_ops->start(pcm->fast_op_arg); 452d5ac70f0Sopenharmony_ci} 453d5ac70f0Sopenharmony_ci 454d5ac70f0Sopenharmony_cistatic inline snd_pcm_state_t __snd_pcm_state(snd_pcm_t *pcm) 455d5ac70f0Sopenharmony_ci{ 456d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->state) 457d5ac70f0Sopenharmony_ci return SND_PCM_STATE_OPEN; 458d5ac70f0Sopenharmony_ci return pcm->fast_ops->state(pcm->fast_op_arg); 459d5ac70f0Sopenharmony_ci} 460d5ac70f0Sopenharmony_ci 461d5ac70f0Sopenharmony_cistatic inline int __snd_pcm_hwsync(snd_pcm_t *pcm) 462d5ac70f0Sopenharmony_ci{ 463d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->hwsync) 464d5ac70f0Sopenharmony_ci return -ENOSYS; 465d5ac70f0Sopenharmony_ci return pcm->fast_ops->hwsync(pcm->fast_op_arg); 466d5ac70f0Sopenharmony_ci} 467d5ac70f0Sopenharmony_ci 468d5ac70f0Sopenharmony_cistatic inline int __snd_pcm_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp) 469d5ac70f0Sopenharmony_ci{ 470d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->delay) 471d5ac70f0Sopenharmony_ci return -ENOSYS; 472d5ac70f0Sopenharmony_ci return pcm->fast_ops->delay(pcm->fast_op_arg, delayp); 473d5ac70f0Sopenharmony_ci} 474d5ac70f0Sopenharmony_ci 475d5ac70f0Sopenharmony_ci/* handle special error cases */ 476d5ac70f0Sopenharmony_cistatic inline int snd_pcm_check_error(snd_pcm_t *pcm, int err) 477d5ac70f0Sopenharmony_ci{ 478d5ac70f0Sopenharmony_ci if (err == -EINTR) { 479d5ac70f0Sopenharmony_ci switch (__snd_pcm_state(pcm)) { 480d5ac70f0Sopenharmony_ci case SND_PCM_STATE_XRUN: 481d5ac70f0Sopenharmony_ci return -EPIPE; 482d5ac70f0Sopenharmony_ci case SND_PCM_STATE_SUSPENDED: 483d5ac70f0Sopenharmony_ci return -ESTRPIPE; 484d5ac70f0Sopenharmony_ci case SND_PCM_STATE_DISCONNECTED: 485d5ac70f0Sopenharmony_ci return -ENODEV; 486d5ac70f0Sopenharmony_ci default: 487d5ac70f0Sopenharmony_ci break; 488d5ac70f0Sopenharmony_ci } 489d5ac70f0Sopenharmony_ci } 490d5ac70f0Sopenharmony_ci return err; 491d5ac70f0Sopenharmony_ci} 492d5ac70f0Sopenharmony_ci 493d5ac70f0Sopenharmony_ci/** 494d5ac70f0Sopenharmony_ci * \retval number of frames available to the application for playback 495d5ac70f0Sopenharmony_ci * 496d5ac70f0Sopenharmony_ci * This is how far ahead the hardware position in the ring buffer is, 497d5ac70f0Sopenharmony_ci * compared to the application position. ie. for playback it's the 498d5ac70f0Sopenharmony_ci * number of frames in the empty part of the ring buffer. 499d5ac70f0Sopenharmony_ci */ 500d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t __snd_pcm_playback_avail(snd_pcm_t *pcm, 501d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t hw_ptr, 502d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t appl_ptr) 503d5ac70f0Sopenharmony_ci{ 504d5ac70f0Sopenharmony_ci snd_pcm_sframes_t avail; 505d5ac70f0Sopenharmony_ci avail = hw_ptr + pcm->buffer_size - appl_ptr; 506d5ac70f0Sopenharmony_ci if (avail < 0) 507d5ac70f0Sopenharmony_ci avail += pcm->boundary; 508d5ac70f0Sopenharmony_ci else if ((snd_pcm_uframes_t) avail >= pcm->boundary) 509d5ac70f0Sopenharmony_ci avail -= pcm->boundary; 510d5ac70f0Sopenharmony_ci return avail; 511d5ac70f0Sopenharmony_ci} 512d5ac70f0Sopenharmony_ci 513d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm) 514d5ac70f0Sopenharmony_ci{ 515d5ac70f0Sopenharmony_ci return __snd_pcm_playback_avail(pcm, *pcm->hw.ptr, *pcm->appl.ptr); 516d5ac70f0Sopenharmony_ci} 517d5ac70f0Sopenharmony_ci 518d5ac70f0Sopenharmony_ci/* 519d5ac70f0Sopenharmony_ci * \retval number of frames available to the application for capture 520d5ac70f0Sopenharmony_ci * 521d5ac70f0Sopenharmony_ci * This is how far ahead the hardware position in the ring buffer is 522d5ac70f0Sopenharmony_ci * compared to the application position. ie. for capture, it's the 523d5ac70f0Sopenharmony_ci * number of frames in the filled part of the ring buffer. 524d5ac70f0Sopenharmony_ci */ 525d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t __snd_pcm_capture_avail(snd_pcm_t *pcm, 526d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t hw_ptr, 527d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t appl_ptr) 528d5ac70f0Sopenharmony_ci{ 529d5ac70f0Sopenharmony_ci snd_pcm_sframes_t avail; 530d5ac70f0Sopenharmony_ci avail = hw_ptr - appl_ptr; 531d5ac70f0Sopenharmony_ci if (avail < 0) 532d5ac70f0Sopenharmony_ci avail += pcm->boundary; 533d5ac70f0Sopenharmony_ci return avail; 534d5ac70f0Sopenharmony_ci} 535d5ac70f0Sopenharmony_ci 536d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t snd_pcm_mmap_capture_avail(snd_pcm_t *pcm) 537d5ac70f0Sopenharmony_ci{ 538d5ac70f0Sopenharmony_ci return __snd_pcm_capture_avail(pcm, *pcm->hw.ptr, *pcm->appl.ptr); 539d5ac70f0Sopenharmony_ci} 540d5ac70f0Sopenharmony_ci 541d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t __snd_pcm_avail(snd_pcm_t *pcm, 542d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t hw_ptr, 543d5ac70f0Sopenharmony_ci const snd_pcm_uframes_t appl_ptr) 544d5ac70f0Sopenharmony_ci{ 545d5ac70f0Sopenharmony_ci if (pcm->stream == SND_PCM_STREAM_PLAYBACK) 546d5ac70f0Sopenharmony_ci return __snd_pcm_playback_avail(pcm, hw_ptr, appl_ptr); 547d5ac70f0Sopenharmony_ci else 548d5ac70f0Sopenharmony_ci return __snd_pcm_capture_avail(pcm, hw_ptr, appl_ptr); 549d5ac70f0Sopenharmony_ci} 550d5ac70f0Sopenharmony_ci 551d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t snd_pcm_mmap_avail(snd_pcm_t *pcm) 552d5ac70f0Sopenharmony_ci{ 553d5ac70f0Sopenharmony_ci return __snd_pcm_avail(pcm, *pcm->hw.ptr, *pcm->appl.ptr); 554d5ac70f0Sopenharmony_ci} 555d5ac70f0Sopenharmony_ci 556d5ac70f0Sopenharmony_ci/* 557d5ac70f0Sopenharmony_ci * \retval number of frames available to the hardware for playback 558d5ac70f0Sopenharmony_ci * 559d5ac70f0Sopenharmony_ci * ie. the filled part of the ring buffer 560d5ac70f0Sopenharmony_ci */ 561d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t snd_pcm_mmap_playback_hw_avail(snd_pcm_t *pcm) 562d5ac70f0Sopenharmony_ci{ 563d5ac70f0Sopenharmony_ci return pcm->buffer_size - snd_pcm_mmap_playback_avail(pcm); 564d5ac70f0Sopenharmony_ci} 565d5ac70f0Sopenharmony_ci 566d5ac70f0Sopenharmony_ci/* 567d5ac70f0Sopenharmony_ci * \retval number of frames available to the hardware for capture 568d5ac70f0Sopenharmony_ci * 569d5ac70f0Sopenharmony_ci * ie. the empty part of the ring buffer. 570d5ac70f0Sopenharmony_ci */ 571d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t snd_pcm_mmap_capture_hw_avail(snd_pcm_t *pcm) 572d5ac70f0Sopenharmony_ci{ 573d5ac70f0Sopenharmony_ci return pcm->buffer_size - snd_pcm_mmap_capture_avail(pcm); 574d5ac70f0Sopenharmony_ci} 575d5ac70f0Sopenharmony_ci 576d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t snd_pcm_mmap_hw_avail(snd_pcm_t *pcm) 577d5ac70f0Sopenharmony_ci{ 578d5ac70f0Sopenharmony_ci return pcm->buffer_size - snd_pcm_mmap_avail(pcm); 579d5ac70f0Sopenharmony_ci} 580d5ac70f0Sopenharmony_ci 581d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t snd_pcm_mmap_playback_hw_rewindable(snd_pcm_t *pcm) 582d5ac70f0Sopenharmony_ci{ 583d5ac70f0Sopenharmony_ci snd_pcm_sframes_t ret = snd_pcm_mmap_playback_hw_avail(pcm); 584d5ac70f0Sopenharmony_ci return (ret >= 0) ? ret : 0; 585d5ac70f0Sopenharmony_ci} 586d5ac70f0Sopenharmony_ci 587d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t snd_pcm_mmap_capture_hw_rewindable(snd_pcm_t *pcm) 588d5ac70f0Sopenharmony_ci{ 589d5ac70f0Sopenharmony_ci snd_pcm_sframes_t ret = snd_pcm_mmap_capture_hw_avail(pcm); 590d5ac70f0Sopenharmony_ci return (ret >= 0) ? ret : 0; 591d5ac70f0Sopenharmony_ci} 592d5ac70f0Sopenharmony_ci 593d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t snd_pcm_mmap_hw_rewindable(snd_pcm_t *pcm) 594d5ac70f0Sopenharmony_ci{ 595d5ac70f0Sopenharmony_ci snd_pcm_sframes_t ret = snd_pcm_mmap_hw_avail(pcm); 596d5ac70f0Sopenharmony_ci return (ret >= 0) ? ret : 0; 597d5ac70f0Sopenharmony_ci} 598d5ac70f0Sopenharmony_ci 599d5ac70f0Sopenharmony_cistatic inline const snd_pcm_channel_area_t *snd_pcm_mmap_areas(snd_pcm_t *pcm) 600d5ac70f0Sopenharmony_ci{ 601d5ac70f0Sopenharmony_ci if (pcm->stopped_areas && 602d5ac70f0Sopenharmony_ci __snd_pcm_state(pcm) != SND_PCM_STATE_RUNNING) 603d5ac70f0Sopenharmony_ci return pcm->stopped_areas; 604d5ac70f0Sopenharmony_ci return pcm->running_areas; 605d5ac70f0Sopenharmony_ci} 606d5ac70f0Sopenharmony_ci 607d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t snd_pcm_mmap_offset(snd_pcm_t *pcm) 608d5ac70f0Sopenharmony_ci{ 609d5ac70f0Sopenharmony_ci assert(pcm); 610d5ac70f0Sopenharmony_ci return *pcm->appl.ptr % pcm->buffer_size; 611d5ac70f0Sopenharmony_ci} 612d5ac70f0Sopenharmony_ci 613d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t snd_pcm_mmap_hw_offset(snd_pcm_t *pcm) 614d5ac70f0Sopenharmony_ci{ 615d5ac70f0Sopenharmony_ci assert(pcm); 616d5ac70f0Sopenharmony_ci return *pcm->hw.ptr % pcm->buffer_size; 617d5ac70f0Sopenharmony_ci} 618d5ac70f0Sopenharmony_ci 619d5ac70f0Sopenharmony_ci/* 620d5ac70f0Sopenharmony_ci * \retval number of frames pending from application to hardware 621d5ac70f0Sopenharmony_ci */ 622d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t snd_pcm_mmap_playback_delay(snd_pcm_t *pcm) 623d5ac70f0Sopenharmony_ci{ 624d5ac70f0Sopenharmony_ci return snd_pcm_mmap_playback_hw_avail(pcm); 625d5ac70f0Sopenharmony_ci} 626d5ac70f0Sopenharmony_ci 627d5ac70f0Sopenharmony_ci/* 628d5ac70f0Sopenharmony_ci * \retval number of frames pending from hardware to application 629d5ac70f0Sopenharmony_ci */ 630d5ac70f0Sopenharmony_cistatic inline snd_pcm_uframes_t snd_pcm_mmap_capture_delay(snd_pcm_t *pcm) 631d5ac70f0Sopenharmony_ci{ 632d5ac70f0Sopenharmony_ci return snd_pcm_mmap_capture_avail(pcm); 633d5ac70f0Sopenharmony_ci} 634d5ac70f0Sopenharmony_ci 635d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t snd_pcm_mmap_delay(snd_pcm_t *pcm) 636d5ac70f0Sopenharmony_ci{ 637d5ac70f0Sopenharmony_ci if (pcm->stream == SND_PCM_STREAM_PLAYBACK) 638d5ac70f0Sopenharmony_ci return snd_pcm_mmap_playback_delay(pcm); 639d5ac70f0Sopenharmony_ci else 640d5ac70f0Sopenharmony_ci return snd_pcm_mmap_capture_delay(pcm); 641d5ac70f0Sopenharmony_ci} 642d5ac70f0Sopenharmony_ci 643d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t _snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size) 644d5ac70f0Sopenharmony_ci{ 645d5ac70f0Sopenharmony_ci /* lock handled in the callback */ 646d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->writei) 647d5ac70f0Sopenharmony_ci return -ENOSYS; 648d5ac70f0Sopenharmony_ci return pcm->fast_ops->writei(pcm->fast_op_arg, buffer, size); 649d5ac70f0Sopenharmony_ci} 650d5ac70f0Sopenharmony_ci 651d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t _snd_pcm_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size) 652d5ac70f0Sopenharmony_ci{ 653d5ac70f0Sopenharmony_ci /* lock handled in the callback */ 654d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->writen) 655d5ac70f0Sopenharmony_ci return -ENOSYS; 656d5ac70f0Sopenharmony_ci return pcm->fast_ops->writen(pcm->fast_op_arg, bufs, size); 657d5ac70f0Sopenharmony_ci} 658d5ac70f0Sopenharmony_ci 659d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t _snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size) 660d5ac70f0Sopenharmony_ci{ 661d5ac70f0Sopenharmony_ci /* lock handled in the callback */ 662d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->readi) 663d5ac70f0Sopenharmony_ci return -ENOSYS; 664d5ac70f0Sopenharmony_ci return pcm->fast_ops->readi(pcm->fast_op_arg, buffer, size); 665d5ac70f0Sopenharmony_ci} 666d5ac70f0Sopenharmony_ci 667d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t _snd_pcm_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size) 668d5ac70f0Sopenharmony_ci{ 669d5ac70f0Sopenharmony_ci /* lock handled in the callback */ 670d5ac70f0Sopenharmony_ci if (!pcm->fast_ops->readn) 671d5ac70f0Sopenharmony_ci return -ENOSYS; 672d5ac70f0Sopenharmony_ci return pcm->fast_ops->readn(pcm->fast_op_arg, bufs, size); 673d5ac70f0Sopenharmony_ci} 674d5ac70f0Sopenharmony_ci 675d5ac70f0Sopenharmony_cistatic inline int muldiv(int a, int b, int c, int *r) 676d5ac70f0Sopenharmony_ci{ 677d5ac70f0Sopenharmony_ci int64_t n = (int64_t)a * b; 678d5ac70f0Sopenharmony_ci int64_t v = n / c; 679d5ac70f0Sopenharmony_ci if (v > INT_MAX) { 680d5ac70f0Sopenharmony_ci *r = 0; 681d5ac70f0Sopenharmony_ci return INT_MAX; 682d5ac70f0Sopenharmony_ci } 683d5ac70f0Sopenharmony_ci if (v < INT_MIN) { 684d5ac70f0Sopenharmony_ci *r = 0; 685d5ac70f0Sopenharmony_ci return INT_MIN; 686d5ac70f0Sopenharmony_ci } 687d5ac70f0Sopenharmony_ci *r = n % c; 688d5ac70f0Sopenharmony_ci return v; 689d5ac70f0Sopenharmony_ci} 690d5ac70f0Sopenharmony_ci 691d5ac70f0Sopenharmony_cistatic inline int muldiv_down(int a, int b, int c) 692d5ac70f0Sopenharmony_ci{ 693d5ac70f0Sopenharmony_ci int64_t v = (int64_t)a * b / c; 694d5ac70f0Sopenharmony_ci if (v > INT_MAX) { 695d5ac70f0Sopenharmony_ci return INT_MAX; 696d5ac70f0Sopenharmony_ci } 697d5ac70f0Sopenharmony_ci if (v < INT_MIN) { 698d5ac70f0Sopenharmony_ci return INT_MIN; 699d5ac70f0Sopenharmony_ci } 700d5ac70f0Sopenharmony_ci return v; 701d5ac70f0Sopenharmony_ci} 702d5ac70f0Sopenharmony_ci 703d5ac70f0Sopenharmony_cistatic inline int muldiv_near(int a, int b, int c) 704d5ac70f0Sopenharmony_ci{ 705d5ac70f0Sopenharmony_ci int r; 706d5ac70f0Sopenharmony_ci int n = muldiv(a, b, c, &r); 707d5ac70f0Sopenharmony_ci if (r >= (c + 1) / 2) 708d5ac70f0Sopenharmony_ci n++; 709d5ac70f0Sopenharmony_ci return n; 710d5ac70f0Sopenharmony_ci} 711d5ac70f0Sopenharmony_ci 712d5ac70f0Sopenharmony_ciint snd_pcm_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); 713d5ac70f0Sopenharmony_ciint _snd_pcm_hw_params_internal(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); 714d5ac70f0Sopenharmony_ci#undef _snd_pcm_hw_params 715d5ac70f0Sopenharmony_ciint snd_pcm_hw_refine_soft(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); 716d5ac70f0Sopenharmony_ciint snd_pcm_hw_refine_slave(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 717d5ac70f0Sopenharmony_ci int (*cprepare)(snd_pcm_t *pcm, 718d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params), 719d5ac70f0Sopenharmony_ci int (*cchange)(snd_pcm_t *pcm, 720d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params, 721d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *sparams), 722d5ac70f0Sopenharmony_ci int (*sprepare)(snd_pcm_t *pcm, 723d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params), 724d5ac70f0Sopenharmony_ci int (*schange)(snd_pcm_t *pcm, 725d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params, 726d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *sparams), 727d5ac70f0Sopenharmony_ci int (*srefine)(snd_pcm_t *pcm, 728d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *sparams)); 729d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_slave(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 730d5ac70f0Sopenharmony_ci int (*cchange)(snd_pcm_t *pcm, 731d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params, 732d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *sparams), 733d5ac70f0Sopenharmony_ci int (*sprepare)(snd_pcm_t *pcm, 734d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params), 735d5ac70f0Sopenharmony_ci int (*schange)(snd_pcm_t *pcm, 736d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params, 737d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *sparams), 738d5ac70f0Sopenharmony_ci int (*sparams)(snd_pcm_t *pcm, 739d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *sparams)); 740d5ac70f0Sopenharmony_ci 741d5ac70f0Sopenharmony_ci 742d5ac70f0Sopenharmony_civoid _snd_pcm_hw_params_any(snd_pcm_hw_params_t *params); 743d5ac70f0Sopenharmony_civoid _snd_pcm_hw_param_set_empty(snd_pcm_hw_params_t *params, 744d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var); 745d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_set_interval(snd_pcm_hw_params_t *params, 746d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 747d5ac70f0Sopenharmony_ci const snd_interval_t *val); 748d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_set_mask(snd_pcm_hw_params_t *params, 749d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, const snd_mask_t *mask); 750d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_first(snd_pcm_hw_params_t *params, 751d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var); 752d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_last(snd_pcm_hw_params_t *params, 753d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var); 754d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_set(snd_pcm_hw_params_t *params, 755d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, unsigned int val, int dir); 756d5ac70f0Sopenharmony_cistatic inline int _snd_pcm_hw_params_set_format(snd_pcm_hw_params_t *params, 757d5ac70f0Sopenharmony_ci snd_pcm_format_t val) 758d5ac70f0Sopenharmony_ci{ 759d5ac70f0Sopenharmony_ci return _snd_pcm_hw_param_set(params, SND_PCM_HW_PARAM_FORMAT, 760d5ac70f0Sopenharmony_ci (unsigned long) val, 0); 761d5ac70f0Sopenharmony_ci} 762d5ac70f0Sopenharmony_ci 763d5ac70f0Sopenharmony_cistatic inline int _snd_pcm_hw_params_set_subformat(snd_pcm_hw_params_t *params, 764d5ac70f0Sopenharmony_ci snd_pcm_subformat_t val) 765d5ac70f0Sopenharmony_ci{ 766d5ac70f0Sopenharmony_ci return _snd_pcm_hw_param_set(params, SND_PCM_HW_PARAM_SUBFORMAT, 767d5ac70f0Sopenharmony_ci (unsigned long) val, 0); 768d5ac70f0Sopenharmony_ci} 769d5ac70f0Sopenharmony_ci 770d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_set_min(snd_pcm_hw_params_t *params, 771d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, unsigned int val, int dir); 772d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_set_max(snd_pcm_hw_params_t *params, 773d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, unsigned int val, int dir); 774d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_set_minmax(snd_pcm_hw_params_t *params, 775d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 776d5ac70f0Sopenharmony_ci unsigned int min, int mindir, 777d5ac70f0Sopenharmony_ci unsigned int max, int maxdir); 778d5ac70f0Sopenharmony_ciint _snd_pcm_hw_param_refine(snd_pcm_hw_params_t *params, 779d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 780d5ac70f0Sopenharmony_ci const snd_pcm_hw_params_t *src); 781d5ac70f0Sopenharmony_ciint _snd_pcm_hw_params_refine(snd_pcm_hw_params_t *params, 782d5ac70f0Sopenharmony_ci unsigned int vars, 783d5ac70f0Sopenharmony_ci const snd_pcm_hw_params_t *src); 784d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_refine_near(snd_pcm_t *pcm, 785d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params, 786d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 787d5ac70f0Sopenharmony_ci const snd_pcm_hw_params_t *src); 788d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_refine_multiple(snd_pcm_t *pcm, 789d5ac70f0Sopenharmony_ci snd_pcm_hw_params_t *params, 790d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 791d5ac70f0Sopenharmony_ci const snd_pcm_hw_params_t *src); 792d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_empty(const snd_pcm_hw_params_t *params, 793d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var); 794d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_always_eq(const snd_pcm_hw_params_t *params, 795d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 796d5ac70f0Sopenharmony_ci const snd_pcm_hw_params_t *params1); 797d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_never_eq(const snd_pcm_hw_params_t *params, 798d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 799d5ac70f0Sopenharmony_ci const snd_pcm_hw_params_t *params1); 800d5ac70f0Sopenharmony_ciconst snd_mask_t *snd_pcm_hw_param_get_mask(const snd_pcm_hw_params_t *params, 801d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var); 802d5ac70f0Sopenharmony_ciconst snd_interval_t *snd_pcm_hw_param_get_interval(const snd_pcm_hw_params_t *params, 803d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var); 804d5ac70f0Sopenharmony_ci 805d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_any(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 806d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var); 807d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set_integer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 808d5ac70f0Sopenharmony_ci snd_set_mode_t mode, 809d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var); 810d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 811d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, unsigned int *rval, int *dir); 812d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 813d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, unsigned int *rval, int *dir); 814d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 815d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, unsigned int *val, int *dir); 816d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 817d5ac70f0Sopenharmony_ci snd_set_mode_t mode, 818d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 819d5ac70f0Sopenharmony_ci unsigned int *val, int *dir); 820d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 821d5ac70f0Sopenharmony_ci snd_set_mode_t mode, 822d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, unsigned int *val, int *dir); 823d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 824d5ac70f0Sopenharmony_ci snd_set_mode_t mode, 825d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 826d5ac70f0Sopenharmony_ci unsigned int *min, int *mindir, 827d5ac70f0Sopenharmony_ci unsigned int *max, int *maxdir); 828d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 829d5ac70f0Sopenharmony_ci snd_set_mode_t mode, 830d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, unsigned int val, int dir); 831d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_set_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, 832d5ac70f0Sopenharmony_ci snd_set_mode_t mode, 833d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, const snd_mask_t *mask); 834d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_get(const snd_pcm_hw_params_t *params, snd_pcm_hw_param_t var, 835d5ac70f0Sopenharmony_ci unsigned int *val, int *dir); 836d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_get_min(const snd_pcm_hw_params_t *params, 837d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 838d5ac70f0Sopenharmony_ci unsigned int *val, int *dir); 839d5ac70f0Sopenharmony_ciint snd_pcm_hw_param_get_max(const snd_pcm_hw_params_t *params, 840d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 841d5ac70f0Sopenharmony_ci unsigned int *val, int *dir); 842d5ac70f0Sopenharmony_ci 843d5ac70f0Sopenharmony_ci#ifdef INTERNAL 844d5ac70f0Sopenharmony_cisnd_pcm_sframes_t INTERNAL(snd_pcm_forward)(snd_pcm_t *pcm, snd_pcm_uframes_t frames); 845d5ac70f0Sopenharmony_ci 846d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_access)(const snd_pcm_hw_params_t *params, snd_pcm_access_t *access); 847d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_access(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t access); 848d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_access(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t access); 849d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_access_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t *access); 850d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_access_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t *access); 851d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_access_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_mask_t *mask); 852d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_get_access_mask(snd_pcm_hw_params_t *params, snd_pcm_access_mask_t *mask); 853d5ac70f0Sopenharmony_ci 854d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_format)(const snd_pcm_hw_params_t *params, snd_pcm_format_t *val); 855d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val); 856d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val); 857d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_format_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t *format); 858d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_format_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t *format); 859d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_format_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_mask_t *mask); 860d5ac70f0Sopenharmony_civoid snd_pcm_hw_params_get_format_mask(snd_pcm_hw_params_t *params, snd_pcm_format_mask_t *mask); 861d5ac70f0Sopenharmony_ci 862d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_subformat)(const snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat); 863d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_subformat(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t subformat); 864d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_subformat(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t subformat); 865d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_subformat_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat); 866d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_subformat_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat); 867d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_subformat_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_mask_t *mask); 868d5ac70f0Sopenharmony_civoid snd_pcm_hw_params_get_subformat_mask(snd_pcm_hw_params_t *params, snd_pcm_subformat_mask_t *mask); 869d5ac70f0Sopenharmony_ci 870d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_channels)(const snd_pcm_hw_params_t *params, unsigned int *val); 871d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_channels_min)(const snd_pcm_hw_params_t *params, unsigned int *val); 872d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_channels_max)(const snd_pcm_hw_params_t *params, unsigned int *val); 873d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_channels(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val); 874d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_channels(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val); 875d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_channels_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val); 876d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_channels_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val); 877d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_channels_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, unsigned int *max); 878d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_channels_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val); 879d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_channels_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val); 880d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_channels_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val); 881d5ac70f0Sopenharmony_ci 882d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_rate)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 883d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_rate_min)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 884d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_rate_max)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 885d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_rate(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir); 886d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_rate(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir); 887d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_rate_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 888d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_rate_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 889d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_rate_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir); 890d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_rate_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 891d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_rate_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 892d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_rate_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 893d5ac70f0Sopenharmony_ci 894d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_period_time)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 895d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_period_time_min)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 896d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_period_time_max)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 897d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_period_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir); 898d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir); 899d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_time_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 900d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_time_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 901d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_time_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir); 902d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_period_time_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 903d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_period_time_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 904d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_period_time_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 905d5ac70f0Sopenharmony_ci 906d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_period_size)(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir); 907d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_period_size_min)(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir); 908d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_period_size_max)(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir); 909d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir); 910d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir); 911d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_size_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir); 912d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_size_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir); 913d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_size_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *min, int *mindir, snd_pcm_uframes_t *max, int *maxdir); 914d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_period_size_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir); 915d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_period_size_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir); 916d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_period_size_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir); 917d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_period_size_integer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); 918d5ac70f0Sopenharmony_ci 919d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_periods)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 920d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_periods_min)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 921d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_periods_max)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 922d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_periods(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir); 923d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_periods(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir); 924d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_periods_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 925d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_periods_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 926d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_periods_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir); 927d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_periods_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 928d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_periods_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 929d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_periods_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 930d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_periods_integer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params); 931d5ac70f0Sopenharmony_ci 932d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_buffer_time)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 933d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_buffer_time_min)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 934d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_buffer_time_max)(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 935d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_buffer_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir); 936d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_buffer_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir); 937d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_buffer_time_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 938d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_buffer_time_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 939d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_buffer_time_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir); 940d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 941d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_buffer_time_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 942d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_buffer_time_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); 943d5ac70f0Sopenharmony_ci 944d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_buffer_size)(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val); 945d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_buffer_size_min)(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val); 946d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_get_buffer_size_max)(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val); 947d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_test_buffer_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val); 948d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_buffer_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val); 949d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_buffer_size_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val); 950d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_buffer_size_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val); 951d5ac70f0Sopenharmony_ciint snd_pcm_hw_params_set_buffer_size_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *min, snd_pcm_uframes_t *max); 952d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_buffer_size_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val); 953d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_buffer_size_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val); 954d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_hw_params_set_buffer_size_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val); 955d5ac70f0Sopenharmony_ci 956d5ac70f0Sopenharmony_ciint snd_pcm_sw_params_set_tstamp_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_tstamp_t val); 957d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_sw_params_get_tstamp_mode)(const snd_pcm_sw_params_t *params, snd_pcm_tstamp_t *val); 958d5ac70f0Sopenharmony_ciint snd_pcm_sw_params_set_tstamp_type(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_tstamp_type_t val); 959d5ac70f0Sopenharmony_ciint snd_pcm_sw_params_get_tstamp_type(const snd_pcm_sw_params_t *params, snd_pcm_tstamp_type_t *val); 960d5ac70f0Sopenharmony_ciint snd_pcm_sw_params_set_avail_min(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val); 961d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_sw_params_get_avail_min)(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val); 962d5ac70f0Sopenharmony_ciint snd_pcm_sw_params_set_start_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val); 963d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_sw_params_get_start_threshold)(const snd_pcm_sw_params_t *paramsm, snd_pcm_uframes_t *val); 964d5ac70f0Sopenharmony_ciint snd_pcm_sw_params_set_stop_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val); 965d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_sw_params_get_stop_threshold)(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val); 966d5ac70f0Sopenharmony_ciint snd_pcm_sw_params_set_silence_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val); 967d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_sw_params_get_silence_threshold)(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val); 968d5ac70f0Sopenharmony_ciint snd_pcm_sw_params_set_silence_size(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val); 969d5ac70f0Sopenharmony_ciint INTERNAL(snd_pcm_sw_params_get_silence_size)(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val); 970d5ac70f0Sopenharmony_ci#endif /* INTERNAL */ 971d5ac70f0Sopenharmony_ci 972d5ac70f0Sopenharmony_ciconst char *snd_pcm_hw_param_name(snd_pcm_hw_param_t param); 973d5ac70f0Sopenharmony_civoid snd_pcm_hw_param_dump(const snd_pcm_hw_params_t *params, 974d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, snd_output_t *out); 975d5ac70f0Sopenharmony_ci#if 0 976d5ac70f0Sopenharmony_ciint snd_pcm_hw_strategy_simple_near(snd_pcm_hw_strategy_t *strategy, int order, 977d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 978d5ac70f0Sopenharmony_ci unsigned int best, 979d5ac70f0Sopenharmony_ci unsigned int mul); 980d5ac70f0Sopenharmony_ciint snd_pcm_hw_strategy_simple_choices(snd_pcm_hw_strategy_t *strategy, int order, 981d5ac70f0Sopenharmony_ci snd_pcm_hw_param_t var, 982d5ac70f0Sopenharmony_ci unsigned int count, 983d5ac70f0Sopenharmony_ci snd_pcm_hw_strategy_simple_choices_list_t *choices); 984d5ac70f0Sopenharmony_ci#endif 985d5ac70f0Sopenharmony_ci 986d5ac70f0Sopenharmony_ci#define SCONF_MANDATORY 1 987d5ac70f0Sopenharmony_ci#define SCONF_UNCHANGED 2 988d5ac70f0Sopenharmony_ci 989d5ac70f0Sopenharmony_ciint snd_pcm_slave_conf(snd_config_t *root, snd_config_t *conf, 990d5ac70f0Sopenharmony_ci snd_config_t **pcm_conf, unsigned int count, ...); 991d5ac70f0Sopenharmony_ci 992d5ac70f0Sopenharmony_ci#define SND_PCM_APPEND (1<<8) 993d5ac70f0Sopenharmony_ci 994d5ac70f0Sopenharmony_ciint snd_pcm_open_named_slave(snd_pcm_t **pcmp, const char *name, 995d5ac70f0Sopenharmony_ci snd_config_t *root, 996d5ac70f0Sopenharmony_ci snd_config_t *conf, snd_pcm_stream_t stream, 997d5ac70f0Sopenharmony_ci int mode, snd_config_t *parent_conf); 998d5ac70f0Sopenharmony_cistatic inline int 999d5ac70f0Sopenharmony_cisnd_pcm_open_slave(snd_pcm_t **pcmp, snd_config_t *root, 1000d5ac70f0Sopenharmony_ci snd_config_t *conf, snd_pcm_stream_t stream, 1001d5ac70f0Sopenharmony_ci int mode, snd_config_t *parent_conf) 1002d5ac70f0Sopenharmony_ci{ 1003d5ac70f0Sopenharmony_ci return snd_pcm_open_named_slave(pcmp, NULL, root, conf, stream, 1004d5ac70f0Sopenharmony_ci mode, parent_conf); 1005d5ac70f0Sopenharmony_ci} 1006d5ac70f0Sopenharmony_ci 1007d5ac70f0Sopenharmony_ci#define snd_pcm_conf_generic_id(id) _snd_conf_generic_id(id) 1008d5ac70f0Sopenharmony_ci 1009d5ac70f0Sopenharmony_ciint snd_pcm_hw_open_fd(snd_pcm_t **pcmp, const char *name, int fd, 1010d5ac70f0Sopenharmony_ci int sync_ptr_ioctl); 1011d5ac70f0Sopenharmony_ciint __snd_pcm_mmap_emul_open(snd_pcm_t **pcmp, const char *name, 1012d5ac70f0Sopenharmony_ci snd_pcm_t *slave, int close_slave); 1013d5ac70f0Sopenharmony_ci 1014d5ac70f0Sopenharmony_ciint snd_pcm_wait_nocheck(snd_pcm_t *pcm, int timeout); 1015d5ac70f0Sopenharmony_ci 1016d5ac70f0Sopenharmony_ciconst snd_config_t *snd_pcm_rate_get_default_converter(snd_config_t *root); 1017d5ac70f0Sopenharmony_ci 1018d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_ACCESS (1U << SND_PCM_HW_PARAM_ACCESS) 1019d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_FORMAT (1U << SND_PCM_HW_PARAM_FORMAT) 1020d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_SUBFORMAT (1U << SND_PCM_HW_PARAM_SUBFORMAT) 1021d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_CHANNELS (1U << SND_PCM_HW_PARAM_CHANNELS) 1022d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_RATE (1U << SND_PCM_HW_PARAM_RATE) 1023d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_PERIOD_TIME (1U << SND_PCM_HW_PARAM_PERIOD_TIME) 1024d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_PERIOD_SIZE (1U << SND_PCM_HW_PARAM_PERIOD_SIZE) 1025d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_PERIODS (1U << SND_PCM_HW_PARAM_PERIODS) 1026d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_BUFFER_TIME (1U << SND_PCM_HW_PARAM_BUFFER_TIME) 1027d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_BUFFER_SIZE (1U << SND_PCM_HW_PARAM_BUFFER_SIZE) 1028d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_SAMPLE_BITS (1U << SND_PCM_HW_PARAM_SAMPLE_BITS) 1029d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_FRAME_BITS (1U << SND_PCM_HW_PARAM_FRAME_BITS) 1030d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_PERIOD_BYTES (1U << SND_PCM_HW_PARAM_PERIOD_BYTES) 1031d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_BUFFER_BYTES (1U << SND_PCM_HW_PARAM_BUFFER_BYTES) 1032d5ac70f0Sopenharmony_ci#define SND_PCM_HW_PARBIT_TICK_TIME (1U << SND_PCM_HW_PARAM_TICK_TIME) 1033d5ac70f0Sopenharmony_ci 1034d5ac70f0Sopenharmony_ci 1035d5ac70f0Sopenharmony_ci#define SND_PCM_ACCBIT_MMAP { ((1U << SND_PCM_ACCESS_MMAP_INTERLEAVED) | \ 1036d5ac70f0Sopenharmony_ci (1U << SND_PCM_ACCESS_MMAP_NONINTERLEAVED) | \ 1037d5ac70f0Sopenharmony_ci (1U << SND_PCM_ACCESS_MMAP_COMPLEX)) } 1038d5ac70f0Sopenharmony_ci#define SND_PCM_ACCBIT_MMAPI { (1U << SND_PCM_ACCESS_MMAP_INTERLEAVED) } 1039d5ac70f0Sopenharmony_ci#define SND_PCM_ACCBIT_MMAPN { (1U << SND_PCM_ACCESS_MMAP_NONINTERLEAVED) } 1040d5ac70f0Sopenharmony_ci#define SND_PCM_ACCBIT_MMAPC { (1U << SND_PCM_ACCESS_MMAP_COMPLEX) } 1041d5ac70f0Sopenharmony_ci 1042d5ac70f0Sopenharmony_ci#define SND_PCM_ACCBIT_SHM { ((1U << SND_PCM_ACCESS_MMAP_INTERLEAVED) | \ 1043d5ac70f0Sopenharmony_ci (1U << SND_PCM_ACCESS_RW_INTERLEAVED) | \ 1044d5ac70f0Sopenharmony_ci (1U << SND_PCM_ACCESS_MMAP_NONINTERLEAVED) | \ 1045d5ac70f0Sopenharmony_ci (1U << SND_PCM_ACCESS_RW_NONINTERLEAVED)) } 1046d5ac70f0Sopenharmony_ci#define SND_PCM_ACCBIT_SHMI { ((1U << SND_PCM_ACCESS_MMAP_INTERLEAVED) | \ 1047d5ac70f0Sopenharmony_ci (1U << SND_PCM_ACCESS_RW_INTERLEAVED)) } 1048d5ac70f0Sopenharmony_ci#define SND_PCM_ACCBIT_SHMN { ((1U << SND_PCM_ACCESS_MMAP_NONINTERLEAVED) | \ 1049d5ac70f0Sopenharmony_ci (1U << SND_PCM_ACCESS_RW_NONINTERLEAVED)) } 1050d5ac70f0Sopenharmony_ci 1051d5ac70f0Sopenharmony_ci#define SND_PCM_FMTBIT_LINEAR \ 1052d5ac70f0Sopenharmony_ci { ((1U << SND_PCM_FORMAT_S8) | \ 1053d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U8) | \ 1054d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_S16_LE) | \ 1055d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_S16_BE) | \ 1056d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U16_LE) | \ 1057d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U16_BE) | \ 1058d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_S20_LE) | \ 1059d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_S20_BE) | \ 1060d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U20_LE) | \ 1061d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U20_BE) | \ 1062d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_S24_LE) | \ 1063d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_S24_BE) | \ 1064d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U24_LE) | \ 1065d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U24_BE) | \ 1066d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_S32_LE) | \ 1067d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_S32_BE) | \ 1068d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U32_LE) | \ 1069d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_U32_BE)), \ 1070d5ac70f0Sopenharmony_ci ((1U << (SND_PCM_FORMAT_S24_3LE - 32)) | \ 1071d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_U24_3LE - 32)) | \ 1072d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_S24_3BE - 32)) | \ 1073d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_U24_3BE - 32)) | \ 1074d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_S20_3LE - 32)) | \ 1075d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_U20_3LE - 32)) | \ 1076d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_S20_3BE - 32)) | \ 1077d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_U20_3BE - 32)) | \ 1078d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_S18_3LE - 32)) | \ 1079d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_U18_3LE - 32)) | \ 1080d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_S18_3BE - 32)) | \ 1081d5ac70f0Sopenharmony_ci (1U << (SND_PCM_FORMAT_U18_3BE - 32))) } 1082d5ac70f0Sopenharmony_ci 1083d5ac70f0Sopenharmony_ci 1084d5ac70f0Sopenharmony_ci#define SND_PCM_FMTBIT_FLOAT \ 1085d5ac70f0Sopenharmony_ci { ((1U << SND_PCM_FORMAT_FLOAT_LE) | \ 1086d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_FLOAT_BE) | \ 1087d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_FLOAT64_LE) | \ 1088d5ac70f0Sopenharmony_ci (1U << SND_PCM_FORMAT_FLOAT64_BE)) } 1089d5ac70f0Sopenharmony_ci 1090d5ac70f0Sopenharmony_ci 1091d5ac70f0Sopenharmony_citypedef union snd_tmp_float { 1092d5ac70f0Sopenharmony_ci float f; 1093d5ac70f0Sopenharmony_ci int32_t i; 1094d5ac70f0Sopenharmony_ci} snd_tmp_float_t; 1095d5ac70f0Sopenharmony_ci 1096d5ac70f0Sopenharmony_citypedef union snd_tmp_double { 1097d5ac70f0Sopenharmony_ci double d; 1098d5ac70f0Sopenharmony_ci int64_t l; 1099d5ac70f0Sopenharmony_ci} snd_tmp_double_t; 1100d5ac70f0Sopenharmony_ci 1101d5ac70f0Sopenharmony_ci/* get the current timestamp */ 1102d5ac70f0Sopenharmony_ci#ifdef HAVE_CLOCK_GETTIME 1103d5ac70f0Sopenharmony_cistatic inline void gettimestamp(snd_htimestamp_t *tstamp, 1104d5ac70f0Sopenharmony_ci snd_pcm_tstamp_type_t tstamp_type) 1105d5ac70f0Sopenharmony_ci{ 1106d5ac70f0Sopenharmony_ci clockid_t id; 1107d5ac70f0Sopenharmony_ci 1108d5ac70f0Sopenharmony_ci switch (tstamp_type) { 1109d5ac70f0Sopenharmony_ci#ifdef CLOCK_MONOTONIC_RAW 1110d5ac70f0Sopenharmony_ci case SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW: 1111d5ac70f0Sopenharmony_ci id = CLOCK_MONOTONIC_RAW; 1112d5ac70f0Sopenharmony_ci break; 1113d5ac70f0Sopenharmony_ci#endif 1114d5ac70f0Sopenharmony_ci#ifdef CLOCK_MONOTONIC 1115d5ac70f0Sopenharmony_ci case SND_PCM_TSTAMP_TYPE_MONOTONIC: 1116d5ac70f0Sopenharmony_ci id = CLOCK_MONOTONIC; 1117d5ac70f0Sopenharmony_ci break; 1118d5ac70f0Sopenharmony_ci#endif 1119d5ac70f0Sopenharmony_ci default: 1120d5ac70f0Sopenharmony_ci id = CLOCK_REALTIME; 1121d5ac70f0Sopenharmony_ci break; 1122d5ac70f0Sopenharmony_ci } 1123d5ac70f0Sopenharmony_ci clock_gettime(id, tstamp); 1124d5ac70f0Sopenharmony_ci} 1125d5ac70f0Sopenharmony_ci#else /* HAVE_CLOCK_GETTIME */ 1126d5ac70f0Sopenharmony_cistatic inline void gettimestamp(snd_htimestamp_t *tstamp, 1127d5ac70f0Sopenharmony_ci snd_pcm_tstamp_type_t tstamp_type) 1128d5ac70f0Sopenharmony_ci{ 1129d5ac70f0Sopenharmony_ci struct timeval tv; 1130d5ac70f0Sopenharmony_ci 1131d5ac70f0Sopenharmony_ci gettimeofday(&tv, 0); 1132d5ac70f0Sopenharmony_ci tstamp->tv_sec = tv.tv_sec; 1133d5ac70f0Sopenharmony_ci tstamp->tv_nsec = tv.tv_usec * 1000L; 1134d5ac70f0Sopenharmony_ci} 1135d5ac70f0Sopenharmony_ci#endif /* HAVE_CLOCK_GETTIME */ 1136d5ac70f0Sopenharmony_ci 1137d5ac70f0Sopenharmony_cisnd_pcm_chmap_query_t ** 1138d5ac70f0Sopenharmony_ci_snd_pcm_make_single_query_chmaps(const snd_pcm_chmap_t *src); 1139d5ac70f0Sopenharmony_cisnd_pcm_chmap_t *_snd_pcm_copy_chmap(const snd_pcm_chmap_t *src); 1140d5ac70f0Sopenharmony_cisnd_pcm_chmap_query_t ** 1141d5ac70f0Sopenharmony_ci_snd_pcm_copy_chmap_query(snd_pcm_chmap_query_t * const *src); 1142d5ac70f0Sopenharmony_cisnd_pcm_chmap_query_t ** 1143d5ac70f0Sopenharmony_ci_snd_pcm_parse_config_chmaps(snd_config_t *conf); 1144d5ac70f0Sopenharmony_cisnd_pcm_chmap_t * 1145d5ac70f0Sopenharmony_ci_snd_pcm_choose_fixed_chmap(snd_pcm_t *pcm, snd_pcm_chmap_query_t * const *maps); 1146d5ac70f0Sopenharmony_ci 1147d5ac70f0Sopenharmony_ci/* return true if the PCM stream may wait to get avail_min space */ 1148d5ac70f0Sopenharmony_cistatic inline int snd_pcm_may_wait_for_avail_min(snd_pcm_t *pcm, snd_pcm_uframes_t avail) 1149d5ac70f0Sopenharmony_ci{ 1150d5ac70f0Sopenharmony_ci if (avail >= pcm->avail_min) 1151d5ac70f0Sopenharmony_ci return 0; 1152d5ac70f0Sopenharmony_ci if (pcm->fast_ops->may_wait_for_avail_min) 1153d5ac70f0Sopenharmony_ci return pcm->fast_ops->may_wait_for_avail_min(pcm->fast_op_arg, avail); 1154d5ac70f0Sopenharmony_ci return 1; 1155d5ac70f0Sopenharmony_ci} 1156d5ac70f0Sopenharmony_ci 1157d5ac70f0Sopenharmony_ci/* hack to access to internal period_event in snd_pcm_sw_parmams */ 1158d5ac70f0Sopenharmony_cistatic inline int sw_get_period_event(const snd_pcm_sw_params_t *params) 1159d5ac70f0Sopenharmony_ci{ 1160d5ac70f0Sopenharmony_ci return params->reserved[sizeof(params->reserved) / sizeof(params->reserved[0])- 1]; 1161d5ac70f0Sopenharmony_ci} 1162d5ac70f0Sopenharmony_ci 1163d5ac70f0Sopenharmony_cistatic inline void sw_set_period_event(snd_pcm_sw_params_t *params, int val) 1164d5ac70f0Sopenharmony_ci{ 1165d5ac70f0Sopenharmony_ci params->reserved[sizeof(params->reserved) / sizeof(params->reserved[0]) - 1] = val; 1166d5ac70f0Sopenharmony_ci} 1167d5ac70f0Sopenharmony_ci 1168d5ac70f0Sopenharmony_ci#define PCMINABORT(pcm) (((pcm)->mode & SND_PCM_ABORT) != 0) 1169d5ac70f0Sopenharmony_ci 1170d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t pcm_frame_diff(snd_pcm_uframes_t ptr1, 1171d5ac70f0Sopenharmony_ci snd_pcm_uframes_t ptr2, 1172d5ac70f0Sopenharmony_ci snd_pcm_uframes_t boundary) 1173d5ac70f0Sopenharmony_ci{ 1174d5ac70f0Sopenharmony_ci if (ptr1 < ptr2) 1175d5ac70f0Sopenharmony_ci return ptr1 + (boundary - ptr2); 1176d5ac70f0Sopenharmony_ci else 1177d5ac70f0Sopenharmony_ci return ptr1 - ptr2; 1178d5ac70f0Sopenharmony_ci} 1179d5ac70f0Sopenharmony_ci 1180d5ac70f0Sopenharmony_cistatic inline snd_pcm_sframes_t pcm_frame_diff2(snd_pcm_uframes_t ptr1, 1181d5ac70f0Sopenharmony_ci snd_pcm_uframes_t ptr2, 1182d5ac70f0Sopenharmony_ci snd_pcm_uframes_t boundary) 1183d5ac70f0Sopenharmony_ci{ 1184d5ac70f0Sopenharmony_ci snd_pcm_sframes_t r = ptr1 - ptr2; 1185d5ac70f0Sopenharmony_ci if (r >= (snd_pcm_sframes_t)boundary / 2) 1186d5ac70f0Sopenharmony_ci return boundary - r; 1187d5ac70f0Sopenharmony_ci return r; 1188d5ac70f0Sopenharmony_ci} 1189d5ac70f0Sopenharmony_ci 1190d5ac70f0Sopenharmony_ci#ifdef THREAD_SAFE_API 1191d5ac70f0Sopenharmony_ci/* 1192d5ac70f0Sopenharmony_ci * __snd_pcm_lock() and __snd_pcm_unlock() are used to lock/unlock the plugin 1193d5ac70f0Sopenharmony_ci * forcibly even if it's declared as thread-safe. It's needed only for some 1194d5ac70f0Sopenharmony_ci * codes that are thread-unsafe per design (e.g. snd_pcm_nonblock()). 1195d5ac70f0Sopenharmony_ci * 1196d5ac70f0Sopenharmony_ci * OTOH, snd_pcm_lock() and snd_pcm_unlock() are used to lock/unlock the plugin 1197d5ac70f0Sopenharmony_ci * in normal situations. They do lock/unlock only when the plugin is 1198d5ac70f0Sopenharmony_ci * thread-unsafe. 1199d5ac70f0Sopenharmony_ci * 1200d5ac70f0Sopenharmony_ci * Both __snd_pcm_lock() and snd_pcm_lock() (and their unlocks) wouldn't do 1201d5ac70f0Sopenharmony_ci * any action when the whole locking is disabled via $LIBASOUND_THREAD_SAFE=0. 1202d5ac70f0Sopenharmony_ci */ 1203d5ac70f0Sopenharmony_cistatic inline void __snd_pcm_lock(snd_pcm_t *pcm) 1204d5ac70f0Sopenharmony_ci{ 1205d5ac70f0Sopenharmony_ci if (pcm->lock_enabled) 1206d5ac70f0Sopenharmony_ci pthread_mutex_lock(&pcm->lock); 1207d5ac70f0Sopenharmony_ci} 1208d5ac70f0Sopenharmony_cistatic inline void __snd_pcm_unlock(snd_pcm_t *pcm) 1209d5ac70f0Sopenharmony_ci{ 1210d5ac70f0Sopenharmony_ci if (pcm->lock_enabled) 1211d5ac70f0Sopenharmony_ci pthread_mutex_unlock(&pcm->lock); 1212d5ac70f0Sopenharmony_ci} 1213d5ac70f0Sopenharmony_cistatic inline void snd_pcm_lock(snd_pcm_t *pcm) 1214d5ac70f0Sopenharmony_ci{ 1215d5ac70f0Sopenharmony_ci if (pcm->lock_enabled && pcm->need_lock) 1216d5ac70f0Sopenharmony_ci pthread_mutex_lock(&pcm->lock); 1217d5ac70f0Sopenharmony_ci} 1218d5ac70f0Sopenharmony_cistatic inline void snd_pcm_unlock(snd_pcm_t *pcm) 1219d5ac70f0Sopenharmony_ci{ 1220d5ac70f0Sopenharmony_ci if (pcm->lock_enabled && pcm->need_lock) 1221d5ac70f0Sopenharmony_ci pthread_mutex_unlock(&pcm->lock); 1222d5ac70f0Sopenharmony_ci} 1223d5ac70f0Sopenharmony_ci#else /* THREAD_SAFE_API */ 1224d5ac70f0Sopenharmony_ci#define __snd_pcm_lock(pcm) do {} while (0) 1225d5ac70f0Sopenharmony_ci#define __snd_pcm_unlock(pcm) do {} while (0) 1226d5ac70f0Sopenharmony_ci#define snd_pcm_lock(pcm) do {} while (0) 1227d5ac70f0Sopenharmony_ci#define snd_pcm_unlock(pcm) do {} while (0) 1228d5ac70f0Sopenharmony_ci#endif /* THREAD_SAFE_API */ 1229d5ac70f0Sopenharmony_ci 1230d5ac70f0Sopenharmony_ci#endif /* __PCM_LOCAL_H */ 1231