^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef __SOUND_PCM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __SOUND_PCM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Digital Audio (PCM) abstract layer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (c) by Jaroslav Kysela <perex@perex.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Abramo Bagnara <abramo@alsa-project.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <sound/asound.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <sound/memalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <sound/minors.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/pm_qos.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/refcount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define snd_pcm_substream_chip(substream) ((substream)->private_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define snd_pcm_chip(pcm) ((pcm)->private_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <sound/pcm_oss.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * Hardware (lowlevel) section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) struct snd_pcm_hardware {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) unsigned int info; /* SNDRV_PCM_INFO_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) u64 formats; /* SNDRV_PCM_FMTBIT_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) unsigned int rates; /* SNDRV_PCM_RATE_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) unsigned int rate_min; /* min rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) unsigned int rate_max; /* max rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) unsigned int channels_min; /* min channels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) unsigned int channels_max; /* max channels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) size_t buffer_bytes_max; /* max buffer size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) size_t period_bytes_min; /* min period size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) size_t period_bytes_max; /* max period size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) unsigned int periods_min; /* min # of periods */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) unsigned int periods_max; /* max # of periods */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) size_t fifo_size; /* fifo size in bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct snd_pcm_status64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct snd_pcm_substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct snd_pcm_audio_tstamp_config; /* definitions further down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct snd_pcm_audio_tstamp_report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct snd_pcm_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) int (*open)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int (*close)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) int (*ioctl)(struct snd_pcm_substream * substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) unsigned int cmd, void *arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) int (*hw_params)(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct snd_pcm_hw_params *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) int (*hw_free)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) int (*prepare)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) int (*trigger)(struct snd_pcm_substream *substream, int cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int (*sync_stop)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) int (*get_time_info)(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct timespec64 *system_ts, struct timespec64 *audio_ts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct snd_pcm_audio_tstamp_report *audio_tstamp_report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int (*fill_silence)(struct snd_pcm_substream *substream, int channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) unsigned long pos, unsigned long bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int (*copy_user)(struct snd_pcm_substream *substream, int channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) unsigned long pos, void __user *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) unsigned long bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) int (*copy_kernel)(struct snd_pcm_substream *substream, int channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) unsigned long pos, void *buf, unsigned long bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct page *(*page)(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) unsigned long offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) int (*mmap)(struct snd_pcm_substream *substream, struct vm_area_struct *vma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) int (*ack)(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #if defined(CONFIG_SND_DYNAMIC_MINORS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define SNDRV_PCM_DEVICES (SNDRV_OS_MINORS-2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define SNDRV_PCM_DEVICES 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define SNDRV_PCM_IOCTL1_RESET 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* 1 is absent slot. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define SNDRV_PCM_IOCTL1_CHANNEL_INFO 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* 3 is absent slot. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define SNDRV_PCM_IOCTL1_FIFO_SIZE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define SNDRV_PCM_TRIGGER_STOP 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define SNDRV_PCM_TRIGGER_START 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define SNDRV_PCM_TRIGGER_PAUSE_PUSH 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define SNDRV_PCM_TRIGGER_PAUSE_RELEASE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define SNDRV_PCM_TRIGGER_SUSPEND 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define SNDRV_PCM_TRIGGER_RESUME 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define SNDRV_PCM_TRIGGER_DRAIN 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define SNDRV_PCM_POS_XRUN ((snd_pcm_uframes_t)-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /* If you change this don't forget to change rates[] table in pcm_native.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define SNDRV_PCM_RATE_5512 (1<<0) /* 5512Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define SNDRV_PCM_RATE_8000 (1<<1) /* 8000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define SNDRV_PCM_RATE_11025 (1<<2) /* 11025Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define SNDRV_PCM_RATE_16000 (1<<3) /* 16000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define SNDRV_PCM_RATE_22050 (1<<4) /* 22050Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define SNDRV_PCM_RATE_32000 (1<<5) /* 32000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define SNDRV_PCM_RATE_44100 (1<<6) /* 44100Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define SNDRV_PCM_RATE_48000 (1<<7) /* 48000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define SNDRV_PCM_RATE_64000 (1<<8) /* 64000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define SNDRV_PCM_RATE_88200 (1<<9) /* 88200Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define SNDRV_PCM_RATE_96000 (1<<10) /* 96000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define SNDRV_PCM_RATE_176400 (1<<11) /* 176400Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define SNDRV_PCM_RATE_192000 (1<<12) /* 192000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define SNDRV_PCM_RATE_352800 (1<<13) /* 352800Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define SNDRV_PCM_RATE_384000 (1<<14) /* 384000Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define SNDRV_PCM_RATE_CONTINUOUS (1<<30) /* continuous range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define SNDRV_PCM_RATE_KNOT (1<<31) /* supports more non-continuos rates */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define SNDRV_PCM_RATE_8000_44100 (SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define SNDRV_PCM_RATE_8000_48000 (SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define SNDRV_PCM_RATE_8000_96000 (SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define SNDRV_PCM_RATE_8000_192000 (SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) SNDRV_PCM_RATE_192000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SNDRV_PCM_RATE_8000_384000 (SNDRV_PCM_RATE_8000_192000|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) SNDRV_PCM_RATE_352800|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) SNDRV_PCM_RATE_384000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define _SNDRV_PCM_FMTBIT(fmt) (1ULL << (__force int)SNDRV_PCM_FORMAT_##fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define SNDRV_PCM_FMTBIT_S8 _SNDRV_PCM_FMTBIT(S8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define SNDRV_PCM_FMTBIT_U8 _SNDRV_PCM_FMTBIT(U8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SNDRV_PCM_FMTBIT_S16_LE _SNDRV_PCM_FMTBIT(S16_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define SNDRV_PCM_FMTBIT_S16_BE _SNDRV_PCM_FMTBIT(S16_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define SNDRV_PCM_FMTBIT_U16_LE _SNDRV_PCM_FMTBIT(U16_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define SNDRV_PCM_FMTBIT_U16_BE _SNDRV_PCM_FMTBIT(U16_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define SNDRV_PCM_FMTBIT_S24_LE _SNDRV_PCM_FMTBIT(S24_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define SNDRV_PCM_FMTBIT_S24_BE _SNDRV_PCM_FMTBIT(S24_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define SNDRV_PCM_FMTBIT_U24_LE _SNDRV_PCM_FMTBIT(U24_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define SNDRV_PCM_FMTBIT_U24_BE _SNDRV_PCM_FMTBIT(U24_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define SNDRV_PCM_FMTBIT_S32_LE _SNDRV_PCM_FMTBIT(S32_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define SNDRV_PCM_FMTBIT_S32_BE _SNDRV_PCM_FMTBIT(S32_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define SNDRV_PCM_FMTBIT_U32_LE _SNDRV_PCM_FMTBIT(U32_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define SNDRV_PCM_FMTBIT_U32_BE _SNDRV_PCM_FMTBIT(U32_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define SNDRV_PCM_FMTBIT_FLOAT_LE _SNDRV_PCM_FMTBIT(FLOAT_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define SNDRV_PCM_FMTBIT_FLOAT_BE _SNDRV_PCM_FMTBIT(FLOAT_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define SNDRV_PCM_FMTBIT_FLOAT64_LE _SNDRV_PCM_FMTBIT(FLOAT64_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define SNDRV_PCM_FMTBIT_FLOAT64_BE _SNDRV_PCM_FMTBIT(FLOAT64_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define SNDRV_PCM_FMTBIT_MU_LAW _SNDRV_PCM_FMTBIT(MU_LAW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define SNDRV_PCM_FMTBIT_A_LAW _SNDRV_PCM_FMTBIT(A_LAW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define SNDRV_PCM_FMTBIT_IMA_ADPCM _SNDRV_PCM_FMTBIT(IMA_ADPCM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define SNDRV_PCM_FMTBIT_MPEG _SNDRV_PCM_FMTBIT(MPEG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define SNDRV_PCM_FMTBIT_GSM _SNDRV_PCM_FMTBIT(GSM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define SNDRV_PCM_FMTBIT_S20_LE _SNDRV_PCM_FMTBIT(S20_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define SNDRV_PCM_FMTBIT_U20_LE _SNDRV_PCM_FMTBIT(U20_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define SNDRV_PCM_FMTBIT_S20_BE _SNDRV_PCM_FMTBIT(S20_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define SNDRV_PCM_FMTBIT_U20_BE _SNDRV_PCM_FMTBIT(U20_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define SNDRV_PCM_FMTBIT_SPECIAL _SNDRV_PCM_FMTBIT(SPECIAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define SNDRV_PCM_FMTBIT_S24_3LE _SNDRV_PCM_FMTBIT(S24_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define SNDRV_PCM_FMTBIT_U24_3LE _SNDRV_PCM_FMTBIT(U24_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define SNDRV_PCM_FMTBIT_S24_3BE _SNDRV_PCM_FMTBIT(S24_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define SNDRV_PCM_FMTBIT_U24_3BE _SNDRV_PCM_FMTBIT(U24_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define SNDRV_PCM_FMTBIT_S20_3LE _SNDRV_PCM_FMTBIT(S20_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define SNDRV_PCM_FMTBIT_U20_3LE _SNDRV_PCM_FMTBIT(U20_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define SNDRV_PCM_FMTBIT_S20_3BE _SNDRV_PCM_FMTBIT(S20_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define SNDRV_PCM_FMTBIT_U20_3BE _SNDRV_PCM_FMTBIT(U20_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define SNDRV_PCM_FMTBIT_S18_3LE _SNDRV_PCM_FMTBIT(S18_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define SNDRV_PCM_FMTBIT_U18_3LE _SNDRV_PCM_FMTBIT(U18_3LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define SNDRV_PCM_FMTBIT_S18_3BE _SNDRV_PCM_FMTBIT(S18_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define SNDRV_PCM_FMTBIT_U18_3BE _SNDRV_PCM_FMTBIT(U18_3BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define SNDRV_PCM_FMTBIT_G723_24 _SNDRV_PCM_FMTBIT(G723_24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define SNDRV_PCM_FMTBIT_G723_24_1B _SNDRV_PCM_FMTBIT(G723_24_1B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define SNDRV_PCM_FMTBIT_G723_40 _SNDRV_PCM_FMTBIT(G723_40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define SNDRV_PCM_FMTBIT_G723_40_1B _SNDRV_PCM_FMTBIT(G723_40_1B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define SNDRV_PCM_FMTBIT_DSD_U8 _SNDRV_PCM_FMTBIT(DSD_U8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #define SNDRV_PCM_FMTBIT_DSD_U16_LE _SNDRV_PCM_FMTBIT(DSD_U16_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define SNDRV_PCM_FMTBIT_DSD_U32_LE _SNDRV_PCM_FMTBIT(DSD_U32_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define SNDRV_PCM_FMTBIT_DSD_U16_BE _SNDRV_PCM_FMTBIT(DSD_U16_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define SNDRV_PCM_FMTBIT_DSD_U32_BE _SNDRV_PCM_FMTBIT(DSD_U32_BE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #ifdef SNDRV_LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) #define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) #define SNDRV_PCM_FMTBIT_S20 SNDRV_PCM_FMTBIT_S20_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define SNDRV_PCM_FMTBIT_U20 SNDRV_PCM_FMTBIT_U20_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #ifdef SNDRV_BIG_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) #define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) #define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) #define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define SNDRV_PCM_FMTBIT_S20 SNDRV_PCM_FMTBIT_S20_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define SNDRV_PCM_FMTBIT_U20 SNDRV_PCM_FMTBIT_U20_BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct snd_pcm_file {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct snd_pcm_substream *substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) int no_compat_mmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) unsigned int user_pversion; /* supported protocol version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct snd_pcm_hw_rule;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) typedef int (*snd_pcm_hw_rule_func_t)(struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) struct snd_pcm_hw_rule *rule);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) struct snd_pcm_hw_rule {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) unsigned int cond;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) int var;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) int deps[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) snd_pcm_hw_rule_func_t func;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) void *private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct snd_pcm_hw_constraints {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) unsigned int rules_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) unsigned int rules_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) struct snd_pcm_hw_rule *rules;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) static inline struct snd_mask *constrs_mask(struct snd_pcm_hw_constraints *constrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) return &constrs->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) static inline struct snd_interval *constrs_interval(struct snd_pcm_hw_constraints *constrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) return &constrs->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) struct snd_ratnum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) unsigned int num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) unsigned int den_min, den_max, den_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct snd_ratden {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) unsigned int num_min, num_max, num_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) unsigned int den;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) struct snd_pcm_hw_constraint_ratnums {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) int nrats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) const struct snd_ratnum *rats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) struct snd_pcm_hw_constraint_ratdens {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) int nrats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) const struct snd_ratden *rats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) struct snd_pcm_hw_constraint_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) const unsigned int *list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) unsigned int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) unsigned int mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) struct snd_pcm_hw_constraint_ranges {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) unsigned int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) const struct snd_interval *ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) unsigned int mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * userspace-provided audio timestamp config to kernel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) * structure is for internal use only and filled with dedicated unpack routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) struct snd_pcm_audio_tstamp_config {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /* 5 of max 16 bits used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) u32 type_requested:4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) u32 report_delay:1; /* add total delay to A/D or D/A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) static inline void snd_pcm_unpack_audio_tstamp_config(__u32 data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) struct snd_pcm_audio_tstamp_config *config)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) config->type_requested = data & 0xF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) config->report_delay = (data >> 4) & 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) * kernel-provided audio timestamp report to user-space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) * structure is for internal use only and read by dedicated pack routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) struct snd_pcm_audio_tstamp_report {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* 6 of max 16 bits used for bit-fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) /* for backwards compatibility */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) u32 valid:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) /* actual type if hardware could not support requested timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) u32 actual_type:4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) /* accuracy represented in ns units */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) u32 accuracy_report:1; /* 0 if accuracy unknown, 1 if accuracy field is valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) u32 accuracy; /* up to 4.29s, will be packed in separate field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) static inline void snd_pcm_pack_audio_tstamp_report(__u32 *data, __u32 *accuracy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) const struct snd_pcm_audio_tstamp_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) u32 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) tmp = report->accuracy_report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) tmp <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) tmp |= report->actual_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) tmp <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) tmp |= report->valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) *data &= 0xffff; /* zero-clear MSBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) *data |= (tmp << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) *accuracy = report->accuracy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) struct snd_pcm_runtime {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* -- Status -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) struct snd_pcm_substream *trigger_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) struct timespec64 trigger_tstamp; /* trigger timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) bool trigger_tstamp_latched; /* trigger timestamp latched in low-level driver/hardware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) int overrange;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) snd_pcm_uframes_t avail_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) snd_pcm_uframes_t hw_ptr_base; /* Position at buffer restart */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) unsigned long hw_ptr_jiffies; /* Time when hw_ptr is updated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) unsigned long hw_ptr_buffer_jiffies; /* buffer time in jiffies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) snd_pcm_sframes_t delay; /* extra delay; typically FIFO size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) u64 hw_ptr_wrap; /* offset for hw_ptr due to boundary wrap-around */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /* -- HW params -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) snd_pcm_access_t access; /* access mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) snd_pcm_format_t format; /* SNDRV_PCM_FORMAT_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) snd_pcm_subformat_t subformat; /* subformat */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) unsigned int rate; /* rate in Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) unsigned int channels; /* channels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) snd_pcm_uframes_t period_size; /* period size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) unsigned int periods; /* periods */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) snd_pcm_uframes_t buffer_size; /* buffer size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) snd_pcm_uframes_t min_align; /* Min alignment for the format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) size_t byte_align;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) unsigned int frame_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) unsigned int sample_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) unsigned int info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) unsigned int rate_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) unsigned int rate_den;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) unsigned int no_period_wakeup: 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) /* -- SW params -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) int tstamp_mode; /* mmap timestamp is updated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) unsigned int period_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) snd_pcm_uframes_t start_threshold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) snd_pcm_uframes_t stop_threshold;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) snd_pcm_uframes_t silence_threshold; /* Silence filling happens when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) noise is nearest than this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) snd_pcm_uframes_t silence_size; /* Silence filling size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) snd_pcm_uframes_t boundary; /* pointers wrap point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) snd_pcm_uframes_t silence_start; /* starting pointer to silence area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) snd_pcm_uframes_t silence_filled; /* size filled with silence */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) union snd_pcm_sync_id sync; /* hardware synchronization ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) /* -- mmap -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) struct snd_pcm_mmap_status *status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) struct snd_pcm_mmap_control *control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) /* -- locking / scheduling -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) snd_pcm_uframes_t twake; /* do transfer (!poll) wakeup if non-zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) wait_queue_head_t sleep; /* poll sleep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) wait_queue_head_t tsleep; /* transfer sleep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) struct fasync_struct *fasync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) bool stop_operating; /* sync_stop will be called */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) /* -- private section -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) void *private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) void (*private_free)(struct snd_pcm_runtime *runtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) /* -- hardware description -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) struct snd_pcm_hardware hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) struct snd_pcm_hw_constraints hw_constraints;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /* -- timer -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) unsigned int timer_resolution; /* timer resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) int tstamp_type; /* timestamp type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) /* -- DMA -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) unsigned char *dma_area; /* DMA area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) dma_addr_t dma_addr; /* physical bus address (not accessible from main CPU) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) size_t dma_bytes; /* size of DMA area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) struct snd_dma_buffer *dma_buffer_p; /* allocated buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) unsigned int buffer_changed:1; /* buffer allocation changed; set only in managed mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) /* -- audio timestamp config -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) struct snd_pcm_audio_tstamp_config audio_tstamp_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) struct snd_pcm_audio_tstamp_report audio_tstamp_report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) struct timespec64 driver_tstamp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* -- OSS things -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) struct snd_pcm_oss_runtime oss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) #ifndef __GENKSYMS__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) struct mutex buffer_mutex; /* protect for buffer changes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) atomic_t buffer_accessing; /* >0: in r/w operation, <0: blocked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) struct snd_pcm_group { /* keep linked substreams */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) struct mutex mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) struct list_head substreams;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) refcount_t refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) struct pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) struct snd_pcm_substream {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) struct snd_pcm *pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) struct snd_pcm_str *pstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) void *private_data; /* copied from pcm->private_data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) int number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) char name[32]; /* substream name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) int stream; /* stream (direction) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) struct pm_qos_request latency_pm_qos_req; /* pm_qos request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) size_t buffer_bytes_max; /* limit ring buffer size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) struct snd_dma_buffer dma_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) size_t dma_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) /* -- hardware operations -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) const struct snd_pcm_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) /* -- runtime information -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) struct snd_pcm_runtime *runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) /* -- timer section -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) struct snd_timer *timer; /* timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) unsigned timer_running: 1; /* time is running */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) long wait_time; /* time in ms for R/W to wait for avail */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) /* -- next substream -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) struct snd_pcm_substream *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) /* -- linked substreams -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) struct list_head link_list; /* linked list member */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) struct snd_pcm_group self_group; /* fake group for non linked substream (with substream lock inside) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) struct snd_pcm_group *group; /* pointer to current group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) /* -- assigned files -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) int ref_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) atomic_t mmap_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) unsigned int f_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) void (*pcm_release)(struct snd_pcm_substream *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) struct pid *pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) /* -- OSS things -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) struct snd_pcm_oss_substream oss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) #ifdef CONFIG_SND_VERBOSE_PROCFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) struct snd_info_entry *proc_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) #endif /* CONFIG_SND_VERBOSE_PROCFS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) /* misc flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) unsigned int hw_opened: 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) unsigned int managed_buffer_alloc:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) #define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) struct snd_pcm_str {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) int stream; /* stream (direction) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) struct snd_pcm *pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) /* -- substreams -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) unsigned int substream_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) unsigned int substream_opened;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) struct snd_pcm_substream *substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) /* -- OSS things -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct snd_pcm_oss_stream oss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) #ifdef CONFIG_SND_VERBOSE_PROCFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) struct snd_info_entry *proc_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) #ifdef CONFIG_SND_PCM_XRUN_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) unsigned int xrun_debug; /* 0 = disabled, 1 = verbose, 2 = stacktrace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) struct snd_kcontrol *chmap_kctl; /* channel-mapping controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) struct device dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) struct snd_pcm {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) struct snd_card *card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) int device; /* device number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) unsigned int info_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) unsigned short dev_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) unsigned short dev_subclass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) char id[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) char name[80];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) struct snd_pcm_str streams[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) struct mutex open_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) wait_queue_head_t open_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) void *private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) void (*private_free) (struct snd_pcm *pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) bool internal; /* pcm is for internal use only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) bool nonatomic; /* whole PCM operations are in non-atomic context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) bool no_device_suspend; /* don't invoke device PM suspend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) struct snd_pcm_oss oss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) * Registering
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) extern const struct file_operations snd_pcm_f_ops[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) int snd_pcm_new(struct snd_card *card, const char *id, int device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) int playback_count, int capture_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) struct snd_pcm **rpcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) int snd_pcm_new_internal(struct snd_card *card, const char *id, int device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) int playback_count, int capture_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) struct snd_pcm **rpcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) #if IS_ENABLED(CONFIG_SND_PCM_OSS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) struct snd_pcm_notify {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) int (*n_register) (struct snd_pcm * pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) int (*n_disconnect) (struct snd_pcm * pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) int (*n_unregister) (struct snd_pcm * pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) * Native I/O
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) int snd_pcm_info(struct snd_pcm_substream *substream, struct snd_pcm_info *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) int snd_pcm_info_user(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) struct snd_pcm_info __user *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) int snd_pcm_status64(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) struct snd_pcm_status64 *status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) int snd_pcm_start(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) int snd_pcm_stop(struct snd_pcm_substream *substream, snd_pcm_state_t status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) int snd_pcm_drain_done(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) int snd_pcm_stop_xrun(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) int snd_pcm_suspend_all(struct snd_pcm *pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) static inline int snd_pcm_suspend_all(struct snd_pcm *pcm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, unsigned int cmd, void *arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) struct snd_pcm_substream **rsubstream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) void snd_pcm_release_substream(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) struct snd_pcm_substream **rsubstream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) void snd_pcm_detach_substream(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) #ifdef CONFIG_SND_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) void snd_pcm_debug_name(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) char *name, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) snd_pcm_debug_name(struct snd_pcm_substream *substream, char *buf, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) *buf = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) * PCM library
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) * snd_pcm_stream_linked - Check whether the substream is linked with others
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) * @substream: substream to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) * Returns true if the given substream is being linked with others.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) static inline int snd_pcm_stream_linked(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) return substream->group != &substream->self_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) void snd_pcm_stream_lock(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) void snd_pcm_stream_unlock(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) void snd_pcm_stream_lock_irq(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) void snd_pcm_stream_unlock_irq(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) unsigned long _snd_pcm_stream_lock_irqsave(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) * snd_pcm_stream_lock_irqsave - Lock the PCM stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) * @flags: irq flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) * This locks the PCM stream like snd_pcm_stream_lock() but with the local
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) * IRQ (only when nonatomic is false). In nonatomic case, this is identical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) * as snd_pcm_stream_lock().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) #define snd_pcm_stream_lock_irqsave(substream, flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) typecheck(unsigned long, flags); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) flags = _snd_pcm_stream_lock_irqsave(substream); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) void snd_pcm_stream_unlock_irqrestore(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) unsigned long flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * snd_pcm_group_for_each_entry - iterate over the linked substreams
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) * @s: the iterator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) * @substream: the substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) * Iterate over the all linked substreams to the given @substream.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) * When @substream isn't linked with any others, this gives returns @substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) * itself once.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) #define snd_pcm_group_for_each_entry(s, substream) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) list_for_each_entry(s, &substream->group->substreams, link_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) #define for_each_pcm_streams(stream) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) for (stream = SNDRV_PCM_STREAM_PLAYBACK; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) stream <= SNDRV_PCM_STREAM_LAST; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) stream++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) * snd_pcm_running - Check whether the substream is in a running state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) * @substream: substream to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) * Returns true if the given substream is in the state RUNNING, or in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) * state DRAINING for playback.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) static inline int snd_pcm_running(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) return (substream->runtime->status->state == SNDRV_PCM_STATE_RUNNING ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) (substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) substream->stream == SNDRV_PCM_STREAM_PLAYBACK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) * bytes_to_samples - Unit conversion of the size from bytes to samples
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) * @size: size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) static inline ssize_t bytes_to_samples(struct snd_pcm_runtime *runtime, ssize_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) return size * 8 / runtime->sample_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) * bytes_to_frames - Unit conversion of the size from bytes to frames
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) * @size: size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) return size * 8 / runtime->frame_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) * samples_to_bytes - Unit conversion of the size from samples to bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) * @size: size in samples
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) static inline ssize_t samples_to_bytes(struct snd_pcm_runtime *runtime, ssize_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) return size * runtime->sample_bits / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) * frames_to_bytes - Unit conversion of the size from frames to bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) * @size: size in frames
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) return size * runtime->frame_bits / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) * frame_aligned - Check whether the byte size is aligned to frames
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) * @bytes: size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) static inline int frame_aligned(struct snd_pcm_runtime *runtime, ssize_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) return bytes % runtime->byte_align == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) * snd_pcm_lib_buffer_bytes - Get the buffer size of the current PCM in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) return frames_to_bytes(runtime, runtime->buffer_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) * snd_pcm_lib_period_bytes - Get the period size of the current PCM in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) return frames_to_bytes(runtime, runtime->period_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * snd_pcm_playback_avail - Get the available (writable) space for playback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) * Result is between 0 ... (boundary - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) if (avail < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) avail += runtime->boundary;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) else if ((snd_pcm_uframes_t) avail >= runtime->boundary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) avail -= runtime->boundary;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) return avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) * snd_pcm_capture_avail - Get the available (readable) space for capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) * Result is between 0 ... (boundary - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) snd_pcm_sframes_t avail = runtime->status->hw_ptr - runtime->control->appl_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) if (avail < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) avail += runtime->boundary;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) return avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) * snd_pcm_playback_hw_avail - Get the queued space for playback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) return runtime->buffer_size - snd_pcm_playback_avail(runtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) * snd_pcm_capture_hw_avail - Get the free space for capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) return runtime->buffer_size - snd_pcm_capture_avail(runtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) * snd_pcm_playback_ready - check whether the playback buffer is available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) * Checks whether enough free space is available on the playback buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) * Return: Non-zero if available, or zero if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) static inline int snd_pcm_playback_ready(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) return snd_pcm_playback_avail(runtime) >= runtime->control->avail_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) * snd_pcm_capture_ready - check whether the capture buffer is available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) * Checks whether enough capture data is available on the capture buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) * Return: Non-zero if available, or zero if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) static inline int snd_pcm_capture_ready(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) return snd_pcm_capture_avail(runtime) >= runtime->control->avail_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) * snd_pcm_playback_data - check whether any data exists on the playback buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) * Checks whether any data exists on the playback buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) * Return: Non-zero if any data exists, or zero if not. If stop_threshold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) * is bigger or equal to boundary, then this function returns always non-zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) if (runtime->stop_threshold >= runtime->boundary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) return snd_pcm_playback_avail(runtime) < runtime->buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) * snd_pcm_playback_empty - check whether the playback buffer is empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) * Checks whether the playback buffer is empty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) * Return: Non-zero if empty, or zero if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) return snd_pcm_playback_avail(runtime) >= runtime->buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) * snd_pcm_capture_empty - check whether the capture buffer is empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) * Checks whether the capture buffer is empty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) * Return: Non-zero if empty, or zero if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) static inline int snd_pcm_capture_empty(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) return snd_pcm_capture_avail(runtime) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) * snd_pcm_trigger_done - Mark the master substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) * @master: the linked master substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) * When multiple substreams of the same card are linked and the hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) * supports the single-shot operation, the driver calls this in the loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) * in snd_pcm_group_for_each_entry() for marking the substream as "done".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) * Then most of trigger operations are performed only to the given master
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * substream.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) * The trigger_master mark is cleared at timestamp updates at the end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) * of trigger operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) static inline void snd_pcm_trigger_done(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) struct snd_pcm_substream *master)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) substream->runtime->trigger_master = master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) static inline int hw_is_mask(int var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) return var >= SNDRV_PCM_HW_PARAM_FIRST_MASK &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) var <= SNDRV_PCM_HW_PARAM_LAST_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) static inline int hw_is_interval(int var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) return var >= SNDRV_PCM_HW_PARAM_FIRST_INTERVAL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) var <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) static inline struct snd_mask *hw_param_mask(struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) return ¶ms->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) static inline struct snd_interval *hw_param_interval(struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) return ¶ms->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) static inline const struct snd_mask *hw_param_mask_c(const struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) return ¶ms->masks[var - SNDRV_PCM_HW_PARAM_FIRST_MASK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) static inline const struct snd_interval *hw_param_interval_c(const struct snd_pcm_hw_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) snd_pcm_hw_param_t var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) return ¶ms->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) * params_channels - Get the number of channels from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) static inline unsigned int params_channels(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_CHANNELS)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) * params_rate - Get the sample rate from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) static inline unsigned int params_rate(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_RATE)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) * params_period_size - Get the period size (in frames) from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) static inline unsigned int params_period_size(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_PERIOD_SIZE)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) * params_periods - Get the number of periods from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) static inline unsigned int params_periods(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_PERIODS)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) * params_buffer_size - Get the buffer size (in frames) from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) static inline unsigned int params_buffer_size(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_BUFFER_SIZE)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) * params_buffer_bytes - Get the buffer size (in bytes) from the hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) * @p: hw params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) static inline unsigned int params_buffer_bytes(const struct snd_pcm_hw_params *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_BUFFER_BYTES)->min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) int snd_interval_list(struct snd_interval *i, unsigned int count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) const unsigned int *list, unsigned int mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) int snd_interval_ranges(struct snd_interval *i, unsigned int count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) const struct snd_interval *list, unsigned int mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) int snd_interval_ratnum(struct snd_interval *i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) unsigned int rats_count, const struct snd_ratnum *rats,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) unsigned int *nump, unsigned int *denp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) int snd_pcm_hw_refine(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) u_int64_t mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) unsigned int min, unsigned int max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) const struct snd_pcm_hw_constraint_list *l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) const struct snd_pcm_hw_constraint_ranges *r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) const struct snd_pcm_hw_constraint_ratnums *r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) const struct snd_pcm_hw_constraint_ratdens *r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) unsigned int width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) unsigned int msbits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) unsigned long step);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) snd_pcm_hw_param_t var);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) unsigned int base_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) unsigned int cond,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) int var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) snd_pcm_hw_rule_func_t func, void *private,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) int dep, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) * snd_pcm_hw_constraint_single() - Constrain parameter to a single value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) * @var: The hw_params variable to constrain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) * @val: The value to constrain to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) * Return: Positive if the value is changed, zero if it's not changed, or a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) * negative error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) static inline int snd_pcm_hw_constraint_single(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) unsigned int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) return snd_pcm_hw_constraint_minmax(runtime, var, val, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) int snd_pcm_format_signed(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) int snd_pcm_format_unsigned(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) int snd_pcm_format_linear(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) int snd_pcm_format_little_endian(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) int snd_pcm_format_big_endian(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) #if 0 /* just for kernel-doc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) * snd_pcm_format_cpu_endian - Check the PCM format is CPU-endian
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) * @format: the format to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) * Return: 1 if the given PCM format is CPU-endian, 0 if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) * opposite, or a negative error code if endian not specified.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) int snd_pcm_format_cpu_endian(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) #endif /* DocBook */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) #ifdef SNDRV_LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) #define snd_pcm_format_cpu_endian(format) snd_pcm_format_little_endian(format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) #define snd_pcm_format_cpu_endian(format) snd_pcm_format_big_endian(format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) int snd_pcm_format_width(snd_pcm_format_t format); /* in bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) int snd_pcm_format_physical_width(snd_pcm_format_t format); /* in bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) const unsigned char *snd_pcm_format_silence_64(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int frames);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) void snd_pcm_set_ops(struct snd_pcm * pcm, int direction,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) const struct snd_pcm_ops *ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) void snd_pcm_set_sync(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) unsigned int cmd, void *arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) void snd_pcm_period_elapsed(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) void *buf, bool interleaved,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) snd_pcm_uframes_t frames, bool in_kernel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) snd_pcm_lib_write(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) const void __user *buf, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) return __snd_pcm_lib_xfer(substream, (void __force *)buf, true, frames, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) snd_pcm_lib_read(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) void __user *buf, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) return __snd_pcm_lib_xfer(substream, (void __force *)buf, true, frames, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) snd_pcm_lib_writev(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) void __user **bufs, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) return __snd_pcm_lib_xfer(substream, (void *)bufs, false, frames, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) snd_pcm_lib_readv(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) void __user **bufs, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) return __snd_pcm_lib_xfer(substream, (void *)bufs, false, frames, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) snd_pcm_kernel_write(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) const void *buf, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) return __snd_pcm_lib_xfer(substream, (void *)buf, true, frames, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) snd_pcm_kernel_read(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) void *buf, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) return __snd_pcm_lib_xfer(substream, buf, true, frames, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) snd_pcm_kernel_writev(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) void **bufs, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) return __snd_pcm_lib_xfer(substream, bufs, false, frames, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) static inline snd_pcm_sframes_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) snd_pcm_kernel_readv(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) void **bufs, snd_pcm_uframes_t frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) return __snd_pcm_lib_xfer(substream, bufs, false, frames, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) int snd_pcm_hw_limit_rates(struct snd_pcm_hardware *hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) return snd_pcm_hw_limit_rates(&runtime->hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) unsigned int snd_pcm_rate_to_rate_bit(unsigned int rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) unsigned int snd_pcm_rate_bit_to_rate(unsigned int rate_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) unsigned int snd_pcm_rate_mask_intersect(unsigned int rates_a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) unsigned int rates_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) unsigned int snd_pcm_rate_range_to_bits(unsigned int rate_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) unsigned int rate_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) * snd_pcm_set_runtime_buffer - Set the PCM runtime buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) * @substream: PCM substream to set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) * @bufp: the buffer information, NULL to clear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) * Copy the buffer information to runtime->dma_buffer when @bufp is non-NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) * Otherwise it clears the current buffer information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) static inline void snd_pcm_set_runtime_buffer(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) struct snd_dma_buffer *bufp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) struct snd_pcm_runtime *runtime = substream->runtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) if (bufp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) runtime->dma_buffer_p = bufp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) runtime->dma_area = bufp->area;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) runtime->dma_addr = bufp->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) runtime->dma_bytes = bufp->bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) runtime->dma_buffer_p = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) runtime->dma_area = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) runtime->dma_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) runtime->dma_bytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) * snd_pcm_gettime - Fill the timespec64 depending on the timestamp mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) * @runtime: PCM runtime instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) * @tv: timespec64 to fill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) static inline void snd_pcm_gettime(struct snd_pcm_runtime *runtime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) struct timespec64 *tv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) switch (runtime->tstamp_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) ktime_get_ts64(tv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) ktime_get_raw_ts64(tv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) ktime_get_real_ts64(tv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) * Memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) void snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) void snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) void snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) int type, struct device *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) size_t size, size_t max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) void snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) int type, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) size_t size, size_t max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) void snd_pcm_set_managed_buffer(struct snd_pcm_substream *substream, int type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) struct device *data, size_t size, size_t max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) void snd_pcm_set_managed_buffer_all(struct snd_pcm *pcm, int type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) struct device *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) size_t size, size_t max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) int _snd_pcm_lib_alloc_vmalloc_buffer(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) size_t size, gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) int snd_pcm_lib_free_vmalloc_buffer(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) struct page *snd_pcm_lib_get_vmalloc_page(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) unsigned long offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) * snd_pcm_lib_alloc_vmalloc_buffer - allocate virtual DMA buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) * @substream: the substream to allocate the buffer to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) * @size: the requested buffer size, in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) * Allocates the PCM substream buffer using vmalloc(), i.e., the memory is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * contiguous in kernel virtual space, but not in physical memory. Use this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) * if the buffer is accessed by kernel code but not by device DMA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) * Return: 1 if the buffer was changed, 0 if not changed, or a negative error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) static inline int snd_pcm_lib_alloc_vmalloc_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) (struct snd_pcm_substream *substream, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) return _snd_pcm_lib_alloc_vmalloc_buffer(substream, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) * snd_pcm_lib_alloc_vmalloc_32_buffer - allocate 32-bit-addressable buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) * @substream: the substream to allocate the buffer to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) * @size: the requested buffer size, in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) * This function works like snd_pcm_lib_alloc_vmalloc_buffer(), but uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) * vmalloc_32(), i.e., the pages are allocated from 32-bit-addressable memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) * Return: 1 if the buffer was changed, 0 if not changed, or a negative error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) * code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) static inline int snd_pcm_lib_alloc_vmalloc_32_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) (struct snd_pcm_substream *substream, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) return _snd_pcm_lib_alloc_vmalloc_buffer(substream, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) GFP_KERNEL | GFP_DMA32 | __GFP_ZERO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) #define snd_pcm_get_dma_buf(substream) ((substream)->runtime->dma_buffer_p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) #ifdef CONFIG_SND_DMA_SGBUF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) * SG-buffer handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) #define snd_pcm_substream_sgbuf(substream) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) snd_pcm_get_dma_buf(substream)->private_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) #endif /* SND_DMA_SGBUF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) * snd_pcm_sgbuf_get_addr - Get the DMA address at the corresponding offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) * @ofs: byte offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) static inline dma_addr_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) return snd_sgbuf_get_addr(snd_pcm_get_dma_buf(substream), ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) * snd_pcm_sgbuf_get_ptr - Get the virtual address at the corresponding offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) * @ofs: byte offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) static inline void *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) return snd_sgbuf_get_ptr(snd_pcm_get_dma_buf(substream), ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) * snd_pcm_sgbuf_get_chunk_size - Compute the max size that fits within the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) * contig. page from the given size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) * @substream: PCM substream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) * @ofs: byte offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) * @size: byte size to examine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) static inline unsigned int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) unsigned int ofs, unsigned int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) return snd_sgbuf_get_chunk_size(snd_pcm_get_dma_buf(substream), ofs, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) * snd_pcm_mmap_data_open - increase the mmap counter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) * @area: VMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) * PCM mmap callback should handle this counter properly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) atomic_inc(&substream->mmap_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) * snd_pcm_mmap_data_close - decrease the mmap counter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) * @area: VMA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) * PCM mmap callback should handle this counter properly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) static inline void snd_pcm_mmap_data_close(struct vm_area_struct *area)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) atomic_dec(&substream->mmap_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) struct vm_area_struct *area);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) /* mmap for io-memory area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) #if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_ALPHA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) #define SNDRV_PCM_INFO_MMAP_IOMEM SNDRV_PCM_INFO_MMAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, struct vm_area_struct *area);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) #define SNDRV_PCM_INFO_MMAP_IOMEM 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) #define snd_pcm_lib_mmap_iomem NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) * snd_pcm_limit_isa_dma_size - Get the max size fitting with ISA DMA transfer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) * @dma: DMA number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) * @max: pointer to store the max size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) *max = dma < 4 ? 64 * 1024 : 128 * 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) * Misc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) #define SNDRV_PCM_DEFAULT_CON_SPDIF (IEC958_AES0_CON_EMPHASIS_NONE|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) (IEC958_AES1_CON_ORIGINAL<<8)|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) (IEC958_AES1_CON_PCM_CODER<<8)|\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) (IEC958_AES3_CON_FS_48000<<24))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) const char *snd_pcm_format_name(snd_pcm_format_t format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) * snd_pcm_stream_str - Get a string naming the direction of a stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) * @substream: the pcm substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) * Return: A string naming the direction of the stream.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) return "Playback";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) return "Capture";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) * PCM channel-mapping control API
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) /* array element of channel maps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) struct snd_pcm_chmap_elem {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) unsigned char channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) unsigned char map[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) /* channel map information; retrieved via snd_kcontrol_chip() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) struct snd_pcm_chmap {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) struct snd_pcm *pcm; /* assigned PCM instance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) int stream; /* PLAYBACK or CAPTURE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) struct snd_kcontrol *kctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) const struct snd_pcm_chmap_elem *chmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) unsigned int max_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) unsigned int channel_mask; /* optional: active channels bitmask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) void *private_data; /* optional: private data pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) * snd_pcm_chmap_substream - get the PCM substream assigned to the given chmap info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) * @info: chmap information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) * @idx: the substream number index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) static inline struct snd_pcm_substream *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) snd_pcm_chmap_substream(struct snd_pcm_chmap *info, unsigned int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) struct snd_pcm_substream *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) for (s = info->pcm->streams[info->stream].substream; s; s = s->next)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) if (s->number == idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) return s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) /* ALSA-standard channel maps (RL/RR prior to C/LFE) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) extern const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) /* Other world's standard channel maps (C/LFE prior to RL/RR) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) extern const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) /* bit masks to be passed to snd_pcm_chmap.channel_mask field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) #define SND_PCM_CHMAP_MASK_24 ((1U << 2) | (1U << 4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) #define SND_PCM_CHMAP_MASK_246 (SND_PCM_CHMAP_MASK_24 | (1U << 6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) #define SND_PCM_CHMAP_MASK_2468 (SND_PCM_CHMAP_MASK_246 | (1U << 8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) const struct snd_pcm_chmap_elem *chmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) int max_channels,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) unsigned long private_value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) struct snd_pcm_chmap **info_ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) * pcm_format_to_bits - Strong-typed conversion of pcm_format to bitwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) * @pcm_format: PCM format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) static inline u64 pcm_format_to_bits(snd_pcm_format_t pcm_format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) return 1ULL << (__force int) pcm_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) * pcm_for_each_format - helper to iterate for each format type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) * @f: the iterator variable in snd_pcm_format_t type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) #define pcm_for_each_format(f) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) for ((f) = SNDRV_PCM_FORMAT_FIRST; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) (__force int)(f) <= (__force int)SNDRV_PCM_FORMAT_LAST; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) (f) = (__force snd_pcm_format_t)((__force int)(f) + 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) #if IS_ENABLED(CONFIG_SND_SOC_ROCKCHIP_VAD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) * snd_pcm_vad_read - Read raw pcm data from vad buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) * @buf: dst buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) * @frames: size in frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) * Result is read frames for success or errno for fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) snd_pcm_sframes_t snd_pcm_vad_read(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) void __user *buf, snd_pcm_uframes_t frames);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) * snd_pcm_vad_avail - Get the available (readable) space for vad
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) * Result is between 0 ... (boundary - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) snd_pcm_uframes_t snd_pcm_vad_avail(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) * snd_pcm_vad_attached - Check whether vad is attached to substream or not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) * Result is true for attached or false for detached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) bool snd_pcm_vad_attached(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) * snd_pcm_vad_preprocess - Pre process vad data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) * @size: size in frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) * Result is zero for success or errno for fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) int snd_pcm_vad_preprocess(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) void *buf, snd_pcm_uframes_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) * snd_pcm_vad_memcpy - Copy vad data to dst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) * @substream: PCM substream instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) * @buf: dst buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) * @frames: size in frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) * Result is copied frames for success or errno for fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) snd_pcm_sframes_t snd_pcm_vad_memcpy(struct snd_pcm_substream *substream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) void *buf, snd_pcm_uframes_t frames);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) /* printk helpers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) #define pcm_err(pcm, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) dev_err((pcm)->card->dev, fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) #define pcm_warn(pcm, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) dev_warn((pcm)->card->dev, fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) #define pcm_dbg(pcm, fmt, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) dev_dbg((pcm)->card->dev, fmt, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) struct snd_pcm_status64 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) snd_pcm_state_t state; /* stream state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) u8 rsvd[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) s64 trigger_tstamp_sec; /* time when stream was started/stopped/paused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) s64 trigger_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) s64 tstamp_sec; /* reference timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) s64 tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) snd_pcm_uframes_t appl_ptr; /* appl ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) snd_pcm_uframes_t hw_ptr; /* hw ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) snd_pcm_sframes_t delay; /* current delay in frames */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) snd_pcm_uframes_t avail; /* number of frames available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) snd_pcm_uframes_t avail_max; /* max frames available on hw since last status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) snd_pcm_uframes_t overrange; /* count of ADC (capture) overrange detections from last status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) snd_pcm_state_t suspended_state; /* suspended stream state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) __u32 audio_tstamp_data; /* needed for 64-bit alignment, used for configs/report to/from userspace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) s64 audio_tstamp_sec; /* sample counter, wall clock, PHC or on-demand sync'ed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) s64 audio_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) s64 driver_tstamp_sec; /* useful in case reference system tstamp is reported with delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) s64 driver_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) __u32 audio_tstamp_accuracy; /* in ns units, only valid if indicated in audio_tstamp_data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) unsigned char reserved[52-4*sizeof(s64)]; /* must be filled with zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) #define SNDRV_PCM_IOCTL_STATUS64 _IOR('A', 0x20, struct snd_pcm_status64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) #define SNDRV_PCM_IOCTL_STATUS_EXT64 _IOWR('A', 0x24, struct snd_pcm_status64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) struct snd_pcm_status32 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) snd_pcm_state_t state; /* stream state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) s32 trigger_tstamp_sec; /* time when stream was started/stopped/paused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) s32 trigger_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) s32 tstamp_sec; /* reference timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) s32 tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) u32 appl_ptr; /* appl ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) u32 hw_ptr; /* hw ptr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) s32 delay; /* current delay in frames */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) u32 avail; /* number of frames available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) u32 avail_max; /* max frames available on hw since last status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) u32 overrange; /* count of ADC (capture) overrange detections from last status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) snd_pcm_state_t suspended_state; /* suspended stream state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) u32 audio_tstamp_data; /* needed for 64-bit alignment, used for configs/report to/from userspace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) s32 audio_tstamp_sec; /* sample counter, wall clock, PHC or on-demand sync'ed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) s32 audio_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) s32 driver_tstamp_sec; /* useful in case reference system tstamp is reported with delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) s32 driver_tstamp_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) u32 audio_tstamp_accuracy; /* in ns units, only valid if indicated in audio_tstamp_data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) unsigned char reserved[52-4*sizeof(s32)]; /* must be filled with zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) #define SNDRV_PCM_IOCTL_STATUS32 _IOR('A', 0x20, struct snd_pcm_status32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) #define SNDRV_PCM_IOCTL_STATUS_EXT32 _IOWR('A', 0x24, struct snd_pcm_status32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) #endif /* __SOUND_PCM_H */