0001
0002 #ifndef __SOUND_PCM_H
0003 #define __SOUND_PCM_H
0004
0005
0006
0007
0008
0009
0010
0011 #include <sound/asound.h>
0012 #include <sound/memalloc.h>
0013 #include <sound/minors.h>
0014 #include <linux/poll.h>
0015 #include <linux/mm.h>
0016 #include <linux/bitops.h>
0017 #include <linux/pm_qos.h>
0018 #include <linux/refcount.h>
0019
0020 #define snd_pcm_substream_chip(substream) ((substream)->private_data)
0021 #define snd_pcm_chip(pcm) ((pcm)->private_data)
0022
0023 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
0024 #include <sound/pcm_oss.h>
0025 #endif
0026
0027
0028
0029
0030
0031 struct snd_pcm_hardware {
0032 unsigned int info;
0033 u64 formats;
0034 unsigned int rates;
0035 unsigned int rate_min;
0036 unsigned int rate_max;
0037 unsigned int channels_min;
0038 unsigned int channels_max;
0039 size_t buffer_bytes_max;
0040 size_t period_bytes_min;
0041 size_t period_bytes_max;
0042 unsigned int periods_min;
0043 unsigned int periods_max;
0044 size_t fifo_size;
0045 };
0046
0047 struct snd_pcm_status64;
0048 struct snd_pcm_substream;
0049
0050 struct snd_pcm_audio_tstamp_config;
0051 struct snd_pcm_audio_tstamp_report;
0052
0053 struct snd_pcm_ops {
0054 int (*open)(struct snd_pcm_substream *substream);
0055 int (*close)(struct snd_pcm_substream *substream);
0056 int (*ioctl)(struct snd_pcm_substream * substream,
0057 unsigned int cmd, void *arg);
0058 int (*hw_params)(struct snd_pcm_substream *substream,
0059 struct snd_pcm_hw_params *params);
0060 int (*hw_free)(struct snd_pcm_substream *substream);
0061 int (*prepare)(struct snd_pcm_substream *substream);
0062 int (*trigger)(struct snd_pcm_substream *substream, int cmd);
0063 int (*sync_stop)(struct snd_pcm_substream *substream);
0064 snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
0065 int (*get_time_info)(struct snd_pcm_substream *substream,
0066 struct timespec64 *system_ts, struct timespec64 *audio_ts,
0067 struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
0068 struct snd_pcm_audio_tstamp_report *audio_tstamp_report);
0069 int (*fill_silence)(struct snd_pcm_substream *substream, int channel,
0070 unsigned long pos, unsigned long bytes);
0071 int (*copy_user)(struct snd_pcm_substream *substream, int channel,
0072 unsigned long pos, void __user *buf,
0073 unsigned long bytes);
0074 int (*copy_kernel)(struct snd_pcm_substream *substream, int channel,
0075 unsigned long pos, void *buf, unsigned long bytes);
0076 struct page *(*page)(struct snd_pcm_substream *substream,
0077 unsigned long offset);
0078 int (*mmap)(struct snd_pcm_substream *substream, struct vm_area_struct *vma);
0079 int (*ack)(struct snd_pcm_substream *substream);
0080 };
0081
0082
0083
0084
0085
0086 #if defined(CONFIG_SND_DYNAMIC_MINORS)
0087 #define SNDRV_PCM_DEVICES (SNDRV_OS_MINORS-2)
0088 #else
0089 #define SNDRV_PCM_DEVICES 8
0090 #endif
0091
0092 #define SNDRV_PCM_IOCTL1_RESET 0
0093
0094 #define SNDRV_PCM_IOCTL1_CHANNEL_INFO 2
0095
0096 #define SNDRV_PCM_IOCTL1_FIFO_SIZE 4
0097
0098 #define SNDRV_PCM_TRIGGER_STOP 0
0099 #define SNDRV_PCM_TRIGGER_START 1
0100 #define SNDRV_PCM_TRIGGER_PAUSE_PUSH 3
0101 #define SNDRV_PCM_TRIGGER_PAUSE_RELEASE 4
0102 #define SNDRV_PCM_TRIGGER_SUSPEND 5
0103 #define SNDRV_PCM_TRIGGER_RESUME 6
0104 #define SNDRV_PCM_TRIGGER_DRAIN 7
0105
0106 #define SNDRV_PCM_POS_XRUN ((snd_pcm_uframes_t)-1)
0107
0108
0109 #define SNDRV_PCM_RATE_5512 (1<<0)
0110 #define SNDRV_PCM_RATE_8000 (1<<1)
0111 #define SNDRV_PCM_RATE_11025 (1<<2)
0112 #define SNDRV_PCM_RATE_16000 (1<<3)
0113 #define SNDRV_PCM_RATE_22050 (1<<4)
0114 #define SNDRV_PCM_RATE_32000 (1<<5)
0115 #define SNDRV_PCM_RATE_44100 (1<<6)
0116 #define SNDRV_PCM_RATE_48000 (1<<7)
0117 #define SNDRV_PCM_RATE_64000 (1<<8)
0118 #define SNDRV_PCM_RATE_88200 (1<<9)
0119 #define SNDRV_PCM_RATE_96000 (1<<10)
0120 #define SNDRV_PCM_RATE_176400 (1<<11)
0121 #define SNDRV_PCM_RATE_192000 (1<<12)
0122 #define SNDRV_PCM_RATE_352800 (1<<13)
0123 #define SNDRV_PCM_RATE_384000 (1<<14)
0124
0125 #define SNDRV_PCM_RATE_CONTINUOUS (1<<30)
0126 #define SNDRV_PCM_RATE_KNOT (1<<31)
0127
0128 #define SNDRV_PCM_RATE_8000_44100 (SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
0129 SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
0130 SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
0131 #define SNDRV_PCM_RATE_8000_48000 (SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)
0132 #define SNDRV_PCM_RATE_8000_96000 (SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\
0133 SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
0134 #define SNDRV_PCM_RATE_8000_192000 (SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\
0135 SNDRV_PCM_RATE_192000)
0136 #define SNDRV_PCM_RATE_8000_384000 (SNDRV_PCM_RATE_8000_192000|\
0137 SNDRV_PCM_RATE_352800|\
0138 SNDRV_PCM_RATE_384000)
0139 #define _SNDRV_PCM_FMTBIT(fmt) (1ULL << (__force int)SNDRV_PCM_FORMAT_##fmt)
0140 #define SNDRV_PCM_FMTBIT_S8 _SNDRV_PCM_FMTBIT(S8)
0141 #define SNDRV_PCM_FMTBIT_U8 _SNDRV_PCM_FMTBIT(U8)
0142 #define SNDRV_PCM_FMTBIT_S16_LE _SNDRV_PCM_FMTBIT(S16_LE)
0143 #define SNDRV_PCM_FMTBIT_S16_BE _SNDRV_PCM_FMTBIT(S16_BE)
0144 #define SNDRV_PCM_FMTBIT_U16_LE _SNDRV_PCM_FMTBIT(U16_LE)
0145 #define SNDRV_PCM_FMTBIT_U16_BE _SNDRV_PCM_FMTBIT(U16_BE)
0146 #define SNDRV_PCM_FMTBIT_S24_LE _SNDRV_PCM_FMTBIT(S24_LE)
0147 #define SNDRV_PCM_FMTBIT_S24_BE _SNDRV_PCM_FMTBIT(S24_BE)
0148 #define SNDRV_PCM_FMTBIT_U24_LE _SNDRV_PCM_FMTBIT(U24_LE)
0149 #define SNDRV_PCM_FMTBIT_U24_BE _SNDRV_PCM_FMTBIT(U24_BE)
0150
0151
0152
0153 #define SNDRV_PCM_FMTBIT_S32_LE _SNDRV_PCM_FMTBIT(S32_LE)
0154 #define SNDRV_PCM_FMTBIT_S32_BE _SNDRV_PCM_FMTBIT(S32_BE)
0155 #define SNDRV_PCM_FMTBIT_U32_LE _SNDRV_PCM_FMTBIT(U32_LE)
0156 #define SNDRV_PCM_FMTBIT_U32_BE _SNDRV_PCM_FMTBIT(U32_BE)
0157 #define SNDRV_PCM_FMTBIT_FLOAT_LE _SNDRV_PCM_FMTBIT(FLOAT_LE)
0158 #define SNDRV_PCM_FMTBIT_FLOAT_BE _SNDRV_PCM_FMTBIT(FLOAT_BE)
0159 #define SNDRV_PCM_FMTBIT_FLOAT64_LE _SNDRV_PCM_FMTBIT(FLOAT64_LE)
0160 #define SNDRV_PCM_FMTBIT_FLOAT64_BE _SNDRV_PCM_FMTBIT(FLOAT64_BE)
0161 #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_LE)
0162 #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_BE)
0163 #define SNDRV_PCM_FMTBIT_MU_LAW _SNDRV_PCM_FMTBIT(MU_LAW)
0164 #define SNDRV_PCM_FMTBIT_A_LAW _SNDRV_PCM_FMTBIT(A_LAW)
0165 #define SNDRV_PCM_FMTBIT_IMA_ADPCM _SNDRV_PCM_FMTBIT(IMA_ADPCM)
0166 #define SNDRV_PCM_FMTBIT_MPEG _SNDRV_PCM_FMTBIT(MPEG)
0167 #define SNDRV_PCM_FMTBIT_GSM _SNDRV_PCM_FMTBIT(GSM)
0168 #define SNDRV_PCM_FMTBIT_S20_LE _SNDRV_PCM_FMTBIT(S20_LE)
0169 #define SNDRV_PCM_FMTBIT_U20_LE _SNDRV_PCM_FMTBIT(U20_LE)
0170 #define SNDRV_PCM_FMTBIT_S20_BE _SNDRV_PCM_FMTBIT(S20_BE)
0171 #define SNDRV_PCM_FMTBIT_U20_BE _SNDRV_PCM_FMTBIT(U20_BE)
0172 #define SNDRV_PCM_FMTBIT_SPECIAL _SNDRV_PCM_FMTBIT(SPECIAL)
0173 #define SNDRV_PCM_FMTBIT_S24_3LE _SNDRV_PCM_FMTBIT(S24_3LE)
0174 #define SNDRV_PCM_FMTBIT_U24_3LE _SNDRV_PCM_FMTBIT(U24_3LE)
0175 #define SNDRV_PCM_FMTBIT_S24_3BE _SNDRV_PCM_FMTBIT(S24_3BE)
0176 #define SNDRV_PCM_FMTBIT_U24_3BE _SNDRV_PCM_FMTBIT(U24_3BE)
0177 #define SNDRV_PCM_FMTBIT_S20_3LE _SNDRV_PCM_FMTBIT(S20_3LE)
0178 #define SNDRV_PCM_FMTBIT_U20_3LE _SNDRV_PCM_FMTBIT(U20_3LE)
0179 #define SNDRV_PCM_FMTBIT_S20_3BE _SNDRV_PCM_FMTBIT(S20_3BE)
0180 #define SNDRV_PCM_FMTBIT_U20_3BE _SNDRV_PCM_FMTBIT(U20_3BE)
0181 #define SNDRV_PCM_FMTBIT_S18_3LE _SNDRV_PCM_FMTBIT(S18_3LE)
0182 #define SNDRV_PCM_FMTBIT_U18_3LE _SNDRV_PCM_FMTBIT(U18_3LE)
0183 #define SNDRV_PCM_FMTBIT_S18_3BE _SNDRV_PCM_FMTBIT(S18_3BE)
0184 #define SNDRV_PCM_FMTBIT_U18_3BE _SNDRV_PCM_FMTBIT(U18_3BE)
0185 #define SNDRV_PCM_FMTBIT_G723_24 _SNDRV_PCM_FMTBIT(G723_24)
0186 #define SNDRV_PCM_FMTBIT_G723_24_1B _SNDRV_PCM_FMTBIT(G723_24_1B)
0187 #define SNDRV_PCM_FMTBIT_G723_40 _SNDRV_PCM_FMTBIT(G723_40)
0188 #define SNDRV_PCM_FMTBIT_G723_40_1B _SNDRV_PCM_FMTBIT(G723_40_1B)
0189 #define SNDRV_PCM_FMTBIT_DSD_U8 _SNDRV_PCM_FMTBIT(DSD_U8)
0190 #define SNDRV_PCM_FMTBIT_DSD_U16_LE _SNDRV_PCM_FMTBIT(DSD_U16_LE)
0191 #define SNDRV_PCM_FMTBIT_DSD_U32_LE _SNDRV_PCM_FMTBIT(DSD_U32_LE)
0192 #define SNDRV_PCM_FMTBIT_DSD_U16_BE _SNDRV_PCM_FMTBIT(DSD_U16_BE)
0193 #define SNDRV_PCM_FMTBIT_DSD_U32_BE _SNDRV_PCM_FMTBIT(DSD_U32_BE)
0194
0195 #ifdef SNDRV_LITTLE_ENDIAN
0196 #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_LE
0197 #define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_LE
0198 #define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_LE
0199 #define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_LE
0200 #define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_LE
0201 #define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_LE
0202 #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_LE
0203 #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_LE
0204 #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
0205 #define SNDRV_PCM_FMTBIT_S20 SNDRV_PCM_FMTBIT_S20_LE
0206 #define SNDRV_PCM_FMTBIT_U20 SNDRV_PCM_FMTBIT_U20_LE
0207 #endif
0208 #ifdef SNDRV_BIG_ENDIAN
0209 #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_BE
0210 #define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_BE
0211 #define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_BE
0212 #define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_BE
0213 #define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_BE
0214 #define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_BE
0215 #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_BE
0216 #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_BE
0217 #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
0218 #define SNDRV_PCM_FMTBIT_S20 SNDRV_PCM_FMTBIT_S20_BE
0219 #define SNDRV_PCM_FMTBIT_U20 SNDRV_PCM_FMTBIT_U20_BE
0220 #endif
0221
0222 struct snd_pcm_file {
0223 struct snd_pcm_substream *substream;
0224 int no_compat_mmap;
0225 unsigned int user_pversion;
0226 };
0227
0228 struct snd_pcm_hw_rule;
0229 typedef int (*snd_pcm_hw_rule_func_t)(struct snd_pcm_hw_params *params,
0230 struct snd_pcm_hw_rule *rule);
0231
0232 struct snd_pcm_hw_rule {
0233 unsigned int cond;
0234 int var;
0235 int deps[5];
0236
0237 snd_pcm_hw_rule_func_t func;
0238 void *private;
0239 };
0240
0241 struct snd_pcm_hw_constraints {
0242 struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
0243 SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
0244 struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
0245 SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
0246 unsigned int rules_num;
0247 unsigned int rules_all;
0248 struct snd_pcm_hw_rule *rules;
0249 };
0250
0251 static inline struct snd_mask *constrs_mask(struct snd_pcm_hw_constraints *constrs,
0252 snd_pcm_hw_param_t var)
0253 {
0254 return &constrs->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
0255 }
0256
0257 static inline struct snd_interval *constrs_interval(struct snd_pcm_hw_constraints *constrs,
0258 snd_pcm_hw_param_t var)
0259 {
0260 return &constrs->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
0261 }
0262
0263 struct snd_ratnum {
0264 unsigned int num;
0265 unsigned int den_min, den_max, den_step;
0266 };
0267
0268 struct snd_ratden {
0269 unsigned int num_min, num_max, num_step;
0270 unsigned int den;
0271 };
0272
0273 struct snd_pcm_hw_constraint_ratnums {
0274 int nrats;
0275 const struct snd_ratnum *rats;
0276 };
0277
0278 struct snd_pcm_hw_constraint_ratdens {
0279 int nrats;
0280 const struct snd_ratden *rats;
0281 };
0282
0283 struct snd_pcm_hw_constraint_list {
0284 const unsigned int *list;
0285 unsigned int count;
0286 unsigned int mask;
0287 };
0288
0289 struct snd_pcm_hw_constraint_ranges {
0290 unsigned int count;
0291 const struct snd_interval *ranges;
0292 unsigned int mask;
0293 };
0294
0295
0296
0297
0298
0299 struct snd_pcm_audio_tstamp_config {
0300
0301 u32 type_requested:4;
0302 u32 report_delay:1;
0303 };
0304
0305 static inline void snd_pcm_unpack_audio_tstamp_config(__u32 data,
0306 struct snd_pcm_audio_tstamp_config *config)
0307 {
0308 config->type_requested = data & 0xF;
0309 config->report_delay = (data >> 4) & 1;
0310 }
0311
0312
0313
0314
0315
0316 struct snd_pcm_audio_tstamp_report {
0317
0318
0319
0320 u32 valid:1;
0321
0322
0323 u32 actual_type:4;
0324
0325
0326 u32 accuracy_report:1;
0327 u32 accuracy;
0328 };
0329
0330 static inline void snd_pcm_pack_audio_tstamp_report(__u32 *data, __u32 *accuracy,
0331 const struct snd_pcm_audio_tstamp_report *report)
0332 {
0333 u32 tmp;
0334
0335 tmp = report->accuracy_report;
0336 tmp <<= 4;
0337 tmp |= report->actual_type;
0338 tmp <<= 1;
0339 tmp |= report->valid;
0340
0341 *data &= 0xffff;
0342 *data |= (tmp << 16);
0343 *accuracy = report->accuracy;
0344 }
0345
0346
0347 struct snd_pcm_runtime {
0348
0349 struct snd_pcm_substream *trigger_master;
0350 struct timespec64 trigger_tstamp;
0351 bool trigger_tstamp_latched;
0352 int overrange;
0353 snd_pcm_uframes_t avail_max;
0354 snd_pcm_uframes_t hw_ptr_base;
0355 snd_pcm_uframes_t hw_ptr_interrupt;
0356 unsigned long hw_ptr_jiffies;
0357 unsigned long hw_ptr_buffer_jiffies;
0358 snd_pcm_sframes_t delay;
0359 u64 hw_ptr_wrap;
0360
0361
0362 snd_pcm_access_t access;
0363 snd_pcm_format_t format;
0364 snd_pcm_subformat_t subformat;
0365 unsigned int rate;
0366 unsigned int channels;
0367 snd_pcm_uframes_t period_size;
0368 unsigned int periods;
0369 snd_pcm_uframes_t buffer_size;
0370 snd_pcm_uframes_t min_align;
0371 size_t byte_align;
0372 unsigned int frame_bits;
0373 unsigned int sample_bits;
0374 unsigned int info;
0375 unsigned int rate_num;
0376 unsigned int rate_den;
0377 unsigned int no_period_wakeup: 1;
0378
0379
0380 int tstamp_mode;
0381 unsigned int period_step;
0382 snd_pcm_uframes_t start_threshold;
0383 snd_pcm_uframes_t stop_threshold;
0384 snd_pcm_uframes_t silence_threshold;
0385
0386 snd_pcm_uframes_t silence_size;
0387 snd_pcm_uframes_t boundary;
0388
0389 snd_pcm_uframes_t silence_start;
0390 snd_pcm_uframes_t silence_filled;
0391
0392 union snd_pcm_sync_id sync;
0393
0394
0395 struct snd_pcm_mmap_status *status;
0396 struct snd_pcm_mmap_control *control;
0397
0398
0399 snd_pcm_uframes_t twake;
0400 wait_queue_head_t sleep;
0401 wait_queue_head_t tsleep;
0402 struct snd_fasync *fasync;
0403 bool stop_operating;
0404 struct mutex buffer_mutex;
0405 atomic_t buffer_accessing;
0406
0407
0408 void *private_data;
0409 void (*private_free)(struct snd_pcm_runtime *runtime);
0410
0411
0412 struct snd_pcm_hardware hw;
0413 struct snd_pcm_hw_constraints hw_constraints;
0414
0415
0416 unsigned int timer_resolution;
0417 int tstamp_type;
0418
0419
0420 unsigned char *dma_area;
0421 dma_addr_t dma_addr;
0422 size_t dma_bytes;
0423
0424 struct snd_dma_buffer *dma_buffer_p;
0425 unsigned int buffer_changed:1;
0426
0427
0428 struct snd_pcm_audio_tstamp_config audio_tstamp_config;
0429 struct snd_pcm_audio_tstamp_report audio_tstamp_report;
0430 struct timespec64 driver_tstamp;
0431
0432 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
0433
0434 struct snd_pcm_oss_runtime oss;
0435 #endif
0436 };
0437
0438 struct snd_pcm_group {
0439 spinlock_t lock;
0440 struct mutex mutex;
0441 struct list_head substreams;
0442 refcount_t refs;
0443 };
0444
0445 struct pid;
0446
0447 struct snd_pcm_substream {
0448 struct snd_pcm *pcm;
0449 struct snd_pcm_str *pstr;
0450 void *private_data;
0451 int number;
0452 char name[32];
0453 int stream;
0454 struct pm_qos_request latency_pm_qos_req;
0455 size_t buffer_bytes_max;
0456 struct snd_dma_buffer dma_buffer;
0457 size_t dma_max;
0458
0459 const struct snd_pcm_ops *ops;
0460
0461 struct snd_pcm_runtime *runtime;
0462
0463 struct snd_timer *timer;
0464 unsigned timer_running: 1;
0465 long wait_time;
0466
0467 struct snd_pcm_substream *next;
0468
0469 struct list_head link_list;
0470 struct snd_pcm_group self_group;
0471 struct snd_pcm_group *group;
0472
0473 int ref_count;
0474 atomic_t mmap_count;
0475 unsigned int f_flags;
0476 void (*pcm_release)(struct snd_pcm_substream *);
0477 struct pid *pid;
0478 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
0479
0480 struct snd_pcm_oss_substream oss;
0481 #endif
0482 #ifdef CONFIG_SND_VERBOSE_PROCFS
0483 struct snd_info_entry *proc_root;
0484 #endif
0485
0486 unsigned int hw_opened: 1;
0487 unsigned int managed_buffer_alloc:1;
0488 };
0489
0490 #define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0)
0491
0492
0493 struct snd_pcm_str {
0494 int stream;
0495 struct snd_pcm *pcm;
0496
0497 unsigned int substream_count;
0498 unsigned int substream_opened;
0499 struct snd_pcm_substream *substream;
0500 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
0501
0502 struct snd_pcm_oss_stream oss;
0503 #endif
0504 #ifdef CONFIG_SND_VERBOSE_PROCFS
0505 struct snd_info_entry *proc_root;
0506 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
0507 unsigned int xrun_debug;
0508 #endif
0509 #endif
0510 struct snd_kcontrol *chmap_kctl;
0511 struct device dev;
0512 };
0513
0514 struct snd_pcm {
0515 struct snd_card *card;
0516 struct list_head list;
0517 int device;
0518 unsigned int info_flags;
0519 unsigned short dev_class;
0520 unsigned short dev_subclass;
0521 char id[64];
0522 char name[80];
0523 struct snd_pcm_str streams[2];
0524 struct mutex open_mutex;
0525 wait_queue_head_t open_wait;
0526 void *private_data;
0527 void (*private_free) (struct snd_pcm *pcm);
0528 bool internal;
0529 bool nonatomic;
0530 bool no_device_suspend;
0531 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
0532 struct snd_pcm_oss oss;
0533 #endif
0534 };
0535
0536
0537
0538
0539
0540 extern const struct file_operations snd_pcm_f_ops[2];
0541
0542 int snd_pcm_new(struct snd_card *card, const char *id, int device,
0543 int playback_count, int capture_count,
0544 struct snd_pcm **rpcm);
0545 int snd_pcm_new_internal(struct snd_card *card, const char *id, int device,
0546 int playback_count, int capture_count,
0547 struct snd_pcm **rpcm);
0548 int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count);
0549
0550 #if IS_ENABLED(CONFIG_SND_PCM_OSS)
0551 struct snd_pcm_notify {
0552 int (*n_register) (struct snd_pcm * pcm);
0553 int (*n_disconnect) (struct snd_pcm * pcm);
0554 int (*n_unregister) (struct snd_pcm * pcm);
0555 struct list_head list;
0556 };
0557 int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree);
0558 #endif
0559
0560
0561
0562
0563
0564 int snd_pcm_info(struct snd_pcm_substream *substream, struct snd_pcm_info *info);
0565 int snd_pcm_info_user(struct snd_pcm_substream *substream,
0566 struct snd_pcm_info __user *info);
0567 int snd_pcm_status64(struct snd_pcm_substream *substream,
0568 struct snd_pcm_status64 *status);
0569 int snd_pcm_start(struct snd_pcm_substream *substream);
0570 int snd_pcm_stop(struct snd_pcm_substream *substream, snd_pcm_state_t status);
0571 int snd_pcm_drain_done(struct snd_pcm_substream *substream);
0572 int snd_pcm_stop_xrun(struct snd_pcm_substream *substream);
0573 #ifdef CONFIG_PM
0574 int snd_pcm_suspend_all(struct snd_pcm *pcm);
0575 #else
0576 static inline int snd_pcm_suspend_all(struct snd_pcm *pcm)
0577 {
0578 return 0;
0579 }
0580 #endif
0581 int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, unsigned int cmd, void *arg);
0582 int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, struct file *file,
0583 struct snd_pcm_substream **rsubstream);
0584 void snd_pcm_release_substream(struct snd_pcm_substream *substream);
0585 int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, struct file *file,
0586 struct snd_pcm_substream **rsubstream);
0587 void snd_pcm_detach_substream(struct snd_pcm_substream *substream);
0588 int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area);
0589
0590
0591 #ifdef CONFIG_SND_DEBUG
0592 void snd_pcm_debug_name(struct snd_pcm_substream *substream,
0593 char *name, size_t len);
0594 #else
0595 static inline void
0596 snd_pcm_debug_name(struct snd_pcm_substream *substream, char *buf, size_t size)
0597 {
0598 *buf = 0;
0599 }
0600 #endif
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612 static inline int snd_pcm_stream_linked(struct snd_pcm_substream *substream)
0613 {
0614 return substream->group != &substream->self_group;
0615 }
0616
0617 void snd_pcm_stream_lock(struct snd_pcm_substream *substream);
0618 void snd_pcm_stream_unlock(struct snd_pcm_substream *substream);
0619 void snd_pcm_stream_lock_irq(struct snd_pcm_substream *substream);
0620 void snd_pcm_stream_unlock_irq(struct snd_pcm_substream *substream);
0621 unsigned long _snd_pcm_stream_lock_irqsave(struct snd_pcm_substream *substream);
0622 unsigned long _snd_pcm_stream_lock_irqsave_nested(struct snd_pcm_substream *substream);
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633 #define snd_pcm_stream_lock_irqsave(substream, flags) \
0634 do { \
0635 typecheck(unsigned long, flags); \
0636 flags = _snd_pcm_stream_lock_irqsave(substream); \
0637 } while (0)
0638 void snd_pcm_stream_unlock_irqrestore(struct snd_pcm_substream *substream,
0639 unsigned long flags);
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649 #define snd_pcm_stream_lock_irqsave_nested(substream, flags) \
0650 do { \
0651 typecheck(unsigned long, flags); \
0652 flags = _snd_pcm_stream_lock_irqsave_nested(substream); \
0653 } while (0)
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664 #define snd_pcm_group_for_each_entry(s, substream) \
0665 list_for_each_entry(s, &substream->group->substreams, link_list)
0666
0667 #define for_each_pcm_streams(stream) \
0668 for (stream = SNDRV_PCM_STREAM_PLAYBACK; \
0669 stream <= SNDRV_PCM_STREAM_LAST; \
0670 stream++)
0671
0672
0673
0674
0675
0676
0677
0678
0679 static inline int snd_pcm_running(struct snd_pcm_substream *substream)
0680 {
0681 return (substream->runtime->status->state == SNDRV_PCM_STATE_RUNNING ||
0682 (substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING &&
0683 substream->stream == SNDRV_PCM_STREAM_PLAYBACK));
0684 }
0685
0686
0687
0688
0689
0690
0691
0692
0693 static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t size)
0694 {
0695 return size * 8 / runtime->sample_bits;
0696 }
0697
0698
0699
0700
0701
0702
0703
0704
0705 static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
0706 {
0707 return size * 8 / runtime->frame_bits;
0708 }
0709
0710
0711
0712
0713
0714
0715
0716
0717 static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t size)
0718 {
0719 return size * runtime->sample_bits / 8;
0720 }
0721
0722
0723
0724
0725
0726
0727
0728
0729 static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
0730 {
0731 return size * runtime->frame_bits / 8;
0732 }
0733
0734
0735
0736
0737
0738
0739
0740
0741 static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
0742 {
0743 return bytes % runtime->byte_align == 0;
0744 }
0745
0746
0747
0748
0749
0750
0751
0752 static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
0753 {
0754 struct snd_pcm_runtime *runtime = substream->runtime;
0755 return frames_to_bytes(runtime, runtime->buffer_size);
0756 }
0757
0758
0759
0760
0761
0762
0763
0764 static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
0765 {
0766 struct snd_pcm_runtime *runtime = substream->runtime;
0767 return frames_to_bytes(runtime, runtime->period_size);
0768 }
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778 static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
0779 {
0780 snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
0781 if (avail < 0)
0782 avail += runtime->boundary;
0783 else if ((snd_pcm_uframes_t) avail >= runtime->boundary)
0784 avail -= runtime->boundary;
0785 return avail;
0786 }
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796 static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
0797 {
0798 snd_pcm_sframes_t avail = runtime->status->hw_ptr - runtime->control->appl_ptr;
0799 if (avail < 0)
0800 avail += runtime->boundary;
0801 return avail;
0802 }
0803
0804
0805
0806
0807
0808
0809
0810 static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
0811 {
0812 return runtime->buffer_size - snd_pcm_playback_avail(runtime);
0813 }
0814
0815
0816
0817
0818
0819
0820
0821 static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
0822 {
0823 return runtime->buffer_size - snd_pcm_capture_avail(runtime);
0824 }
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834 static inline int snd_pcm_playback_ready(struct snd_pcm_substream *substream)
0835 {
0836 struct snd_pcm_runtime *runtime = substream->runtime;
0837 return snd_pcm_playback_avail(runtime) >= runtime->control->avail_min;
0838 }
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848 static inline int snd_pcm_capture_ready(struct snd_pcm_substream *substream)
0849 {
0850 struct snd_pcm_runtime *runtime = substream->runtime;
0851 return snd_pcm_capture_avail(runtime) >= runtime->control->avail_min;
0852 }
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863 static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)
0864 {
0865 struct snd_pcm_runtime *runtime = substream->runtime;
0866
0867 if (runtime->stop_threshold >= runtime->boundary)
0868 return 1;
0869 return snd_pcm_playback_avail(runtime) < runtime->buffer_size;
0870 }
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880 static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)
0881 {
0882 struct snd_pcm_runtime *runtime = substream->runtime;
0883 return snd_pcm_playback_avail(runtime) >= runtime->buffer_size;
0884 }
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894 static inline int snd_pcm_capture_empty(struct snd_pcm_substream *substream)
0895 {
0896 struct snd_pcm_runtime *runtime = substream->runtime;
0897 return snd_pcm_capture_avail(runtime) == 0;
0898 }
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914 static inline void snd_pcm_trigger_done(struct snd_pcm_substream *substream,
0915 struct snd_pcm_substream *master)
0916 {
0917 substream->runtime->trigger_master = master;
0918 }
0919
0920 static inline int hw_is_mask(int var)
0921 {
0922 return var >= SNDRV_PCM_HW_PARAM_FIRST_MASK &&
0923 var <= SNDRV_PCM_HW_PARAM_LAST_MASK;
0924 }
0925
0926 static inline int hw_is_interval(int var)
0927 {
0928 return var >= SNDRV_PCM_HW_PARAM_FIRST_INTERVAL &&
0929 var <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL;
0930 }
0931
0932 static inline struct snd_mask *hw_param_mask(struct snd_pcm_hw_params *params,
0933 snd_pcm_hw_param_t var)
0934 {
0935 return ¶ms->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
0936 }
0937
0938 static inline struct snd_interval *hw_param_interval(struct snd_pcm_hw_params *params,
0939 snd_pcm_hw_param_t var)
0940 {
0941 return ¶ms->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
0942 }
0943
0944 static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
0945 snd_pcm_hw_param_t var)
0946 {
0947 return ¶ms->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
0948 }
0949
0950 static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
0951 snd_pcm_hw_param_t var)
0952 {
0953 return ¶ms->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
0954 }
0955
0956
0957
0958
0959
0960
0961
0962 static inline unsigned int params_channels(const struct snd_pcm_hw_params *p)
0963 {
0964 return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_CHANNELS)->min;
0965 }
0966
0967
0968
0969
0970
0971
0972
0973 static inline unsigned int params_rate(const struct snd_pcm_hw_params *p)
0974 {
0975 return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_RATE)->min;
0976 }
0977
0978
0979
0980
0981
0982
0983
0984 static inline unsigned int params_period_size(const struct snd_pcm_hw_params *p)
0985 {
0986 return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_PERIOD_SIZE)->min;
0987 }
0988
0989
0990
0991
0992
0993
0994
0995 static inline unsigned int params_periods(const struct snd_pcm_hw_params *p)
0996 {
0997 return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_PERIODS)->min;
0998 }
0999
1000
1001
1002
1003
1004
1005
1006 static inline unsigned int params_buffer_size(const struct snd_pcm_hw_params *p)
1007 {
1008 return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_BUFFER_SIZE)->min;
1009 }
1010
1011
1012
1013
1014
1015
1016
1017 static inline unsigned int params_buffer_bytes(const struct snd_pcm_hw_params *p)
1018 {
1019 return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_BUFFER_BYTES)->min;
1020 }
1021
1022 int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v);
1023 int snd_interval_list(struct snd_interval *i, unsigned int count,
1024 const unsigned int *list, unsigned int mask);
1025 int snd_interval_ranges(struct snd_interval *i, unsigned int count,
1026 const struct snd_interval *list, unsigned int mask);
1027 int snd_interval_ratnum(struct snd_interval *i,
1028 unsigned int rats_count, const struct snd_ratnum *rats,
1029 unsigned int *nump, unsigned int *denp);
1030
1031 void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params);
1032 void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var);
1033
1034 int snd_pcm_hw_refine(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
1035
1036 int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1037 u_int64_t mask);
1038 int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1039 unsigned int min, unsigned int max);
1040 int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var);
1041 int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
1042 unsigned int cond,
1043 snd_pcm_hw_param_t var,
1044 const struct snd_pcm_hw_constraint_list *l);
1045 int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime,
1046 unsigned int cond,
1047 snd_pcm_hw_param_t var,
1048 const struct snd_pcm_hw_constraint_ranges *r);
1049 int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime,
1050 unsigned int cond,
1051 snd_pcm_hw_param_t var,
1052 const struct snd_pcm_hw_constraint_ratnums *r);
1053 int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime,
1054 unsigned int cond,
1055 snd_pcm_hw_param_t var,
1056 const struct snd_pcm_hw_constraint_ratdens *r);
1057 int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime,
1058 unsigned int cond,
1059 unsigned int width,
1060 unsigned int msbits);
1061 int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
1062 unsigned int cond,
1063 snd_pcm_hw_param_t var,
1064 unsigned long step);
1065 int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
1066 unsigned int cond,
1067 snd_pcm_hw_param_t var);
1068 int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime,
1069 unsigned int base_rate);
1070 int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime,
1071 unsigned int cond,
1072 int var,
1073 snd_pcm_hw_rule_func_t func, void *private,
1074 int dep, ...);
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085 static inline int snd_pcm_hw_constraint_single(
1086 struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1087 unsigned int val)
1088 {
1089 return snd_pcm_hw_constraint_minmax(runtime, var, val, val);
1090 }
1091
1092 int snd_pcm_format_signed(snd_pcm_format_t format);
1093 int snd_pcm_format_unsigned(snd_pcm_format_t format);
1094 int snd_pcm_format_linear(snd_pcm_format_t format);
1095 int snd_pcm_format_little_endian(snd_pcm_format_t format);
1096 int snd_pcm_format_big_endian(snd_pcm_format_t format);
1097 #if 0
1098
1099
1100
1101
1102
1103
1104
1105 int snd_pcm_format_cpu_endian(snd_pcm_format_t format);
1106 #endif
1107 #ifdef SNDRV_LITTLE_ENDIAN
1108 #define snd_pcm_format_cpu_endian(format) snd_pcm_format_little_endian(format)
1109 #else
1110 #define snd_pcm_format_cpu_endian(format) snd_pcm_format_big_endian(format)
1111 #endif
1112 int snd_pcm_format_width(snd_pcm_format_t format);
1113 int snd_pcm_format_physical_width(snd_pcm_format_t format);
1114 ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples);
1115 const unsigned char *snd_pcm_format_silence_64(snd_pcm_format_t format);
1116 int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int frames);
1117
1118 void snd_pcm_set_ops(struct snd_pcm * pcm, int direction,
1119 const struct snd_pcm_ops *ops);
1120 void snd_pcm_set_sync(struct snd_pcm_substream *substream);
1121 int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
1122 unsigned int cmd, void *arg);
1123 void snd_pcm_period_elapsed_under_stream_lock(struct snd_pcm_substream *substream);
1124 void snd_pcm_period_elapsed(struct snd_pcm_substream *substream);
1125 snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
1126 void *buf, bool interleaved,
1127 snd_pcm_uframes_t frames, bool in_kernel);
1128
1129 static inline snd_pcm_sframes_t
1130 snd_pcm_lib_write(struct snd_pcm_substream *substream,
1131 const void __user *buf, snd_pcm_uframes_t frames)
1132 {
1133 return __snd_pcm_lib_xfer(substream, (void __force *)buf, true, frames, false);
1134 }
1135
1136 static inline snd_pcm_sframes_t
1137 snd_pcm_lib_read(struct snd_pcm_substream *substream,
1138 void __user *buf, snd_pcm_uframes_t frames)
1139 {
1140 return __snd_pcm_lib_xfer(substream, (void __force *)buf, true, frames, false);
1141 }
1142
1143 static inline snd_pcm_sframes_t
1144 snd_pcm_lib_writev(struct snd_pcm_substream *substream,
1145 void __user **bufs, snd_pcm_uframes_t frames)
1146 {
1147 return __snd_pcm_lib_xfer(substream, (void *)bufs, false, frames, false);
1148 }
1149
1150 static inline snd_pcm_sframes_t
1151 snd_pcm_lib_readv(struct snd_pcm_substream *substream,
1152 void __user **bufs, snd_pcm_uframes_t frames)
1153 {
1154 return __snd_pcm_lib_xfer(substream, (void *)bufs, false, frames, false);
1155 }
1156
1157 static inline snd_pcm_sframes_t
1158 snd_pcm_kernel_write(struct snd_pcm_substream *substream,
1159 const void *buf, snd_pcm_uframes_t frames)
1160 {
1161 return __snd_pcm_lib_xfer(substream, (void *)buf, true, frames, true);
1162 }
1163
1164 static inline snd_pcm_sframes_t
1165 snd_pcm_kernel_read(struct snd_pcm_substream *substream,
1166 void *buf, snd_pcm_uframes_t frames)
1167 {
1168 return __snd_pcm_lib_xfer(substream, buf, true, frames, true);
1169 }
1170
1171 static inline snd_pcm_sframes_t
1172 snd_pcm_kernel_writev(struct snd_pcm_substream *substream,
1173 void **bufs, snd_pcm_uframes_t frames)
1174 {
1175 return __snd_pcm_lib_xfer(substream, bufs, false, frames, true);
1176 }
1177
1178 static inline snd_pcm_sframes_t
1179 snd_pcm_kernel_readv(struct snd_pcm_substream *substream,
1180 void **bufs, snd_pcm_uframes_t frames)
1181 {
1182 return __snd_pcm_lib_xfer(substream, bufs, false, frames, true);
1183 }
1184
1185 int snd_pcm_hw_limit_rates(struct snd_pcm_hardware *hw);
1186
1187 static inline int
1188 snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
1189 {
1190 return snd_pcm_hw_limit_rates(&runtime->hw);
1191 }
1192
1193 unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate);
1194 unsigned int snd_pcm_rate_bit_to_rate(unsigned int rate_bit);
1195 unsigned int snd_pcm_rate_mask_intersect(unsigned int rates_a,
1196 unsigned int rates_b);
1197 unsigned int snd_pcm_rate_range_to_bits(unsigned int rate_min,
1198 unsigned int rate_max);
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208 static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
1209 struct snd_dma_buffer *bufp)
1210 {
1211 struct snd_pcm_runtime *runtime = substream->runtime;
1212 if (bufp) {
1213 runtime->dma_buffer_p = bufp;
1214 runtime->dma_area = bufp->area;
1215 runtime->dma_addr = bufp->addr;
1216 runtime->dma_bytes = bufp->bytes;
1217 } else {
1218 runtime->dma_buffer_p = NULL;
1219 runtime->dma_area = NULL;
1220 runtime->dma_addr = 0;
1221 runtime->dma_bytes = 0;
1222 }
1223 }
1224
1225
1226
1227
1228
1229
1230 static inline void snd_pcm_gettime(struct snd_pcm_runtime *runtime,
1231 struct timespec64 *tv)
1232 {
1233 switch (runtime->tstamp_type) {
1234 case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC:
1235 ktime_get_ts64(tv);
1236 break;
1237 case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW:
1238 ktime_get_raw_ts64(tv);
1239 break;
1240 default:
1241 ktime_get_real_ts64(tv);
1242 break;
1243 }
1244 }
1245
1246
1247
1248
1249
1250 void snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream);
1251 void snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm);
1252 void snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream,
1253 int type, struct device *data,
1254 size_t size, size_t max);
1255 void snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm,
1256 int type, void *data,
1257 size_t size, size_t max);
1258 int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size);
1259 int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream);
1260
1261 int snd_pcm_set_managed_buffer(struct snd_pcm_substream *substream, int type,
1262 struct device *data, size_t size, size_t max);
1263 int snd_pcm_set_managed_buffer_all(struct snd_pcm *pcm, int type,
1264 struct device *data,
1265 size_t size, size_t max);
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281 static inline int __must_check
1282 snd_pcm_set_fixed_buffer(struct snd_pcm_substream *substream, int type,
1283 struct device *data, size_t size)
1284 {
1285 return snd_pcm_set_managed_buffer(substream, type, data, size, 0);
1286 }
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301 static inline int __must_check
1302 snd_pcm_set_fixed_buffer_all(struct snd_pcm *pcm, int type,
1303 struct device *data, size_t size)
1304 {
1305 return snd_pcm_set_managed_buffer_all(pcm, type, data, size, 0);
1306 }
1307
1308 int _snd_pcm_lib_alloc_vmalloc_buffer(struct snd_pcm_substream *substream,
1309 size_t size, gfp_t gfp_flags);
1310 int snd_pcm_lib_free_vmalloc_buffer(struct snd_pcm_substream *substream);
1311 struct page *snd_pcm_lib_get_vmalloc_page(struct snd_pcm_substream *substream,
1312 unsigned long offset);
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325 static inline int snd_pcm_lib_alloc_vmalloc_buffer
1326 (struct snd_pcm_substream *substream, size_t size)
1327 {
1328 return _snd_pcm_lib_alloc_vmalloc_buffer(substream, size,
1329 GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO);
1330 }
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343 static inline int snd_pcm_lib_alloc_vmalloc_32_buffer
1344 (struct snd_pcm_substream *substream, size_t size)
1345 {
1346 return _snd_pcm_lib_alloc_vmalloc_buffer(substream, size,
1347 GFP_KERNEL | GFP_DMA32 | __GFP_ZERO);
1348 }
1349
1350 #define snd_pcm_get_dma_buf(substream) ((substream)->runtime->dma_buffer_p)
1351
1352
1353
1354
1355
1356
1357
1358
1359 static inline dma_addr_t
1360 snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
1361 {
1362 return snd_sgbuf_get_addr(snd_pcm_get_dma_buf(substream), ofs);
1363 }
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374 static inline unsigned int
1375 snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream,
1376 unsigned int ofs, unsigned int size)
1377 {
1378 return snd_sgbuf_get_chunk_size(snd_pcm_get_dma_buf(substream), ofs, size);
1379 }
1380
1381
1382
1383
1384
1385
1386
1387 static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area)
1388 {
1389 struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
1390 atomic_inc(&substream->mmap_count);
1391 }
1392
1393
1394
1395
1396
1397
1398
1399 static inline void snd_pcm_mmap_data_close(struct vm_area_struct *area)
1400 {
1401 struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
1402 atomic_dec(&substream->mmap_count);
1403 }
1404
1405 int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream,
1406 struct vm_area_struct *area);
1407
1408 #if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_ALPHA)
1409 #define SNDRV_PCM_INFO_MMAP_IOMEM SNDRV_PCM_INFO_MMAP
1410 int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_struct *area);
1411 #else
1412 #define SNDRV_PCM_INFO_MMAP_IOMEM 0
1413 #define snd_pcm_lib_mmap_iomem NULL
1414 #endif
1415
1416
1417
1418
1419
1420
1421 static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)
1422 {
1423 *max = dma < 4 ? 64 * 1024 : 128 * 1024;
1424 }
1425
1426
1427
1428
1429
1430 #define SNDRV_PCM_DEFAULT_CON_SPDIF (IEC958_AES0_CON_EMPHASIS_NONE|\
1431 (IEC958_AES1_CON_ORIGINAL<<8)|\
1432 (IEC958_AES1_CON_PCM_CODER<<8)|\
1433 (IEC958_AES3_CON_FS_48000<<24))
1434
1435 const char *snd_pcm_format_name(snd_pcm_format_t format);
1436
1437
1438
1439
1440
1441
1442
1443 static inline const char *snd_pcm_direction_name(int direction)
1444 {
1445 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
1446 return "Playback";
1447 else
1448 return "Capture";
1449 }
1450
1451
1452
1453
1454
1455
1456
1457 static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream)
1458 {
1459 return snd_pcm_direction_name(substream->stream);
1460 }
1461
1462
1463
1464
1465
1466 struct snd_pcm_chmap_elem {
1467 unsigned char channels;
1468 unsigned char map[15];
1469 };
1470
1471
1472 struct snd_pcm_chmap {
1473 struct snd_pcm *pcm;
1474 int stream;
1475 struct snd_kcontrol *kctl;
1476 const struct snd_pcm_chmap_elem *chmap;
1477 unsigned int max_channels;
1478 unsigned int channel_mask;
1479 void *private_data;
1480 };
1481
1482
1483
1484
1485
1486
1487
1488
1489 static inline struct snd_pcm_substream *
1490 snd_pcm_chmap_substream(struct snd_pcm_chmap *info, unsigned int idx)
1491 {
1492 struct snd_pcm_substream *s;
1493 for (s = info->pcm->streams[info->stream].substream; s; s = s->next)
1494 if (s->number == idx)
1495 return s;
1496 return NULL;
1497 }
1498
1499
1500 extern const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[];
1501
1502 extern const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[];
1503
1504
1505 #define SND_PCM_CHMAP_MASK_24 ((1U << 2) | (1U << 4))
1506 #define SND_PCM_CHMAP_MASK_246 (SND_PCM_CHMAP_MASK_24 | (1U << 6))
1507 #define SND_PCM_CHMAP_MASK_2468 (SND_PCM_CHMAP_MASK_246 | (1U << 8))
1508
1509 int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream,
1510 const struct snd_pcm_chmap_elem *chmap,
1511 int max_channels,
1512 unsigned long private_value,
1513 struct snd_pcm_chmap **info_ret);
1514
1515
1516
1517
1518
1519
1520
1521 static inline u64 pcm_format_to_bits(snd_pcm_format_t pcm_format)
1522 {
1523 return 1ULL << (__force int) pcm_format;
1524 }
1525
1526
1527
1528
1529
1530 #define pcm_for_each_format(f) \
1531 for ((f) = SNDRV_PCM_FORMAT_FIRST; \
1532 (__force int)(f) <= (__force int)SNDRV_PCM_FORMAT_LAST; \
1533 (f) = (__force snd_pcm_format_t)((__force int)(f) + 1))
1534
1535
1536 #define pcm_err(pcm, fmt, args...) \
1537 dev_err((pcm)->card->dev, fmt, ##args)
1538 #define pcm_warn(pcm, fmt, args...) \
1539 dev_warn((pcm)->card->dev, fmt, ##args)
1540 #define pcm_dbg(pcm, fmt, args...) \
1541 dev_dbg((pcm)->card->dev, fmt, ##args)
1542
1543 struct snd_pcm_status64 {
1544 snd_pcm_state_t state;
1545 u8 rsvd[4];
1546 s64 trigger_tstamp_sec;
1547 s64 trigger_tstamp_nsec;
1548 s64 tstamp_sec;
1549 s64 tstamp_nsec;
1550 snd_pcm_uframes_t appl_ptr;
1551 snd_pcm_uframes_t hw_ptr;
1552 snd_pcm_sframes_t delay;
1553 snd_pcm_uframes_t avail;
1554 snd_pcm_uframes_t avail_max;
1555 snd_pcm_uframes_t overrange;
1556 snd_pcm_state_t suspended_state;
1557 __u32 audio_tstamp_data;
1558 s64 audio_tstamp_sec;
1559 s64 audio_tstamp_nsec;
1560 s64 driver_tstamp_sec;
1561 s64 driver_tstamp_nsec;
1562 __u32 audio_tstamp_accuracy;
1563 unsigned char reserved[52-4*sizeof(s64)];
1564 };
1565
1566 #define SNDRV_PCM_IOCTL_STATUS64 _IOR('A', 0x20, struct snd_pcm_status64)
1567 #define SNDRV_PCM_IOCTL_STATUS_EXT64 _IOWR('A', 0x24, struct snd_pcm_status64)
1568
1569 struct snd_pcm_status32 {
1570 snd_pcm_state_t state;
1571 s32 trigger_tstamp_sec;
1572 s32 trigger_tstamp_nsec;
1573 s32 tstamp_sec;
1574 s32 tstamp_nsec;
1575 u32 appl_ptr;
1576 u32 hw_ptr;
1577 s32 delay;
1578 u32 avail;
1579 u32 avail_max;
1580 u32 overrange;
1581 snd_pcm_state_t suspended_state;
1582 u32 audio_tstamp_data;
1583 s32 audio_tstamp_sec;
1584 s32 audio_tstamp_nsec;
1585 s32 driver_tstamp_sec;
1586 s32 driver_tstamp_nsec;
1587 u32 audio_tstamp_accuracy;
1588 unsigned char reserved[52-4*sizeof(s32)];
1589 };
1590
1591 #define SNDRV_PCM_IOCTL_STATUS32 _IOR('A', 0x20, struct snd_pcm_status32)
1592 #define SNDRV_PCM_IOCTL_STATUS_EXT32 _IOWR('A', 0x24, struct snd_pcm_status32)
1593
1594 #endif