| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /*
- * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
- *
- * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
- * the the people's Republic of China and other countries.
- * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
- *
- * DISCLAIMER
- * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
- * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
- * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
- * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
- * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
- * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
- * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
- * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
- * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
- * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
- * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #ifndef __SOUND_PCM_H
- #define __SOUND_PCM_H
- #include <unistd.h>
- #define SND_SOC_DAIFMT_I2S 1 /* I2S mode */
- #define SND_SOC_DAIFMT_RIGHT_J 2 /* Right Justified mode */
- #define SND_SOC_DAIFMT_LEFT_J 3 /* Left Justified mode */
- #define SND_SOC_DAIFMT_DSP_A 4 /* L data MSB after FRM LRC */
- #define SND_SOC_DAIFMT_DSP_B 5 /* L data MSB during FRM LRC */
- #define SND_SOC_DAIFMT_AC97 6 /* AC97 */
- #define SND_SOC_DAIFMT_PDM 7 /* Pulse density modulation */
- /* left and right justified also known as MSB and LSB respectively */
- #define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J
- #define SND_SOC_DAIFMT_LSB SND_SOC_DAIFMT_RIGHT_J
- #define SND_SOC_DAIFMT_SIG_SHIFT 8
- #define SND_SOC_DAIFMT_MASTER_SHIFT 12
- #define SND_SOC_DAIFMT_NB_NF (1 << 8) /* normal bit clock + frame */
- #define SND_SOC_DAIFMT_NB_IF (2 << 8) /* normal BCLK + inv FRM */
- #define SND_SOC_DAIFMT_IB_NF (3 << 8) /* invert BCLK + nor FRM */
- #define SND_SOC_DAIFMT_IB_IF (4 << 8) /* invert BCLK + FRM */
- #define SND_SOC_DAIFMT_CBM_CFM (1 << 12) /* codec clk & FRM master */
- #define SND_SOC_DAIFMT_CBS_CFM (2 << 12) /* codec clk slave & FRM master */
- #define SND_SOC_DAIFMT_CBM_CFS (3 << 12) /* codec clk master & frame slave */
- #define SND_SOC_DAIFMT_CBS_CFS (4 << 12) /* codec clk & FRM slave */
- #define SND_SOC_DAIFMT_FORMAT_MASK 0x000f
- #define SND_SOC_DAIFMT_CLOCK_MASK 0x00f0
- #define SND_SOC_DAIFMT_INV_MASK 0x0f00
- #define SND_SOC_DAIFMT_MASTER_MASK 0xf000
- #define SNDRV_PCM_IOCTL1_RESET 0
- /* 1 is absent slot. */
- #define SNDRV_PCM_IOCTL1_CHANNEL_INFO 2
- #define SNDRV_PCM_IOCTL1_GSTATE 3
- #define SNDRV_PCM_IOCTL1_FIFO_SIZE 4
- #define SNDRV_PCM_TRIGGER_STOP 0
- #define SNDRV_PCM_TRIGGER_START 1
- #define SNDRV_PCM_TRIGGER_PAUSE_PUSH 3
- #define SNDRV_PCM_TRIGGER_PAUSE_RELEASE 4
- #define SNDRV_PCM_TRIGGER_SUSPEND 5
- #define SNDRV_PCM_TRIGGER_RESUME 6
- #define SNDRV_PCM_TRIGGER_DRAIN 7
- #define SNDRV_PCM_RATE_5512 (1<<0) /* 5512Hz */
- #define SNDRV_PCM_RATE_8000 (1<<1) /* 8000Hz */
- #define SNDRV_PCM_RATE_11025 (1<<2) /* 11025Hz */
- #define SNDRV_PCM_RATE_16000 (1<<3) /* 16000Hz */
- #define SNDRV_PCM_RATE_22050 (1<<4) /* 22050Hz */
- #define SNDRV_PCM_RATE_32000 (1<<5) /* 32000Hz */
- #define SNDRV_PCM_RATE_44100 (1<<6) /* 44100Hz */
- #define SNDRV_PCM_RATE_48000 (1<<7) /* 48000Hz */
- #define SNDRV_PCM_RATE_64000 (1<<8) /* 64000Hz */
- #define SNDRV_PCM_RATE_88200 (1<<9) /* 88200Hz */
- #define SNDRV_PCM_RATE_96000 (1<<10) /* 96000Hz */
- #define SNDRV_PCM_RATE_176400 (1<<11) /* 176400Hz */
- #define SNDRV_PCM_RATE_192000 (1<<12) /* 192000Hz */
- #define SNDRV_PCM_RATE_CONTINUOUS (1<<30) /* continuous range */
- #define SNDRV_PCM_RATE_KNOT (1<<31) /* supports more non-continuos rates */
- #define SNDRV_PCM_RATE_8000_44100 (SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
- SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
- SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
- #define SNDRV_PCM_RATE_8000_48000 (SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)
- #define SNDRV_PCM_RATE_8000_96000 (SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\
- SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
- #define SNDRV_PCM_RATE_8000_192000 (SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\
- SNDRV_PCM_RATE_192000)
- #define SNDRV_PCM_FORMAT_S8 ((snd_pcm_format_t) 0)
- #define SNDRV_PCM_FORMAT_U8 ((snd_pcm_format_t) 1)
- #define SNDRV_PCM_FORMAT_S16_LE ((snd_pcm_format_t) 2)
- #define SNDRV_PCM_FORMAT_S16_BE ((snd_pcm_format_t) 3)
- #define SNDRV_PCM_FORMAT_U16_LE ((snd_pcm_format_t) 4)
- #define SNDRV_PCM_FORMAT_U16_BE ((snd_pcm_format_t) 5)
- #define SNDRV_PCM_FORMAT_S24_LE ((snd_pcm_format_t) 6)
- #define SNDRV_PCM_FORMAT_S24_BE ((snd_pcm_format_t) 7)
- #define SNDRV_PCM_FORMAT_U24_LE ((snd_pcm_format_t) 8)
- #define SNDRV_PCM_FORMAT_U24_BE ((snd_pcm_format_t) 9)
- #define SNDRV_PCM_FORMAT_S32_LE ((snd_pcm_format_t) 10)
- #define SNDRV_PCM_FORMAT_S32_BE ((snd_pcm_format_t) 11)
- #define SNDRV_PCM_FORMAT_U32_LE ((snd_pcm_format_t) 12)
- #define SNDRV_PCM_FORMAT_U32_BE ((snd_pcm_format_t) 13)
- #define _SNDRV_PCM_FMTBIT(fmt) (1ULL << (int)SND_PCM_FORMAT_##fmt)
- #define SNDRV_PCM_FMTBIT_S8 _SNDRV_PCM_FMTBIT(S8)
- #define SNDRV_PCM_FMTBIT_U8 _SNDRV_PCM_FMTBIT(U8)
- #define SNDRV_PCM_FMTBIT_S16_LE _SNDRV_PCM_FMTBIT(S16_LE)
- #define SNDRV_PCM_FMTBIT_S16_BE _SNDRV_PCM_FMTBIT(S16_BE)
- #define SNDRV_PCM_FMTBIT_U16_LE _SNDRV_PCM_FMTBIT(U16_LE)
- #define SNDRV_PCM_FMTBIT_U16_BE _SNDRV_PCM_FMTBIT(U16_BE)
- #define SNDRV_PCM_FMTBIT_S24_LE _SNDRV_PCM_FMTBIT(S24_LE)
- #define SNDRV_PCM_FMTBIT_S24_BE _SNDRV_PCM_FMTBIT(S24_BE)
- #define SNDRV_PCM_FMTBIT_U24_LE _SNDRV_PCM_FMTBIT(U24_LE)
- #define SNDRV_PCM_FMTBIT_U24_BE _SNDRV_PCM_FMTBIT(U24_BE)
- #define SNDRV_PCM_FMTBIT_S32_LE _SNDRV_PCM_FMTBIT(S32_LE)
- #define SNDRV_PCM_FMTBIT_S32_BE _SNDRV_PCM_FMTBIT(S32_BE)
- #define SNDRV_PCM_FMTBIT_U32_LE _SNDRV_PCM_FMTBIT(U32_LE)
- #define SNDRV_PCM_FMTBIT_U32_BE _SNDRV_PCM_FMTBIT(U32_BE)
- #ifdef SNDRV_LITTLE_ENDIAN
- #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_LE
- #define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_LE
- #define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_LE
- #define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_LE
- #define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_LE
- #define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_LE
- #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_LE
- #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_LE
- #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
- #endif
- #ifdef SNDRV_BIG_ENDIAN
- #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_BE
- #define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_BE
- #define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_BE
- #define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_BE
- #define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_BE
- #define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_BE
- #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_BE
- #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_BE
- #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
- #endif
- static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
- {
- return size * 8 / runtime->frame_bits;
- }
- static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
- {
- return size * runtime->frame_bits / 8;
- }
- static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
- {
- struct snd_pcm_runtime *runtime = substream->runtime;
- return frames_to_bytes(runtime, runtime->buffer_size);
- }
- static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
- {
- struct snd_pcm_runtime *runtime = substream->runtime;
- return frames_to_bytes(runtime, runtime->period_size);
- }
- /* Get the available(readable) space for capture */
- static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
- {
- snd_pcm_sframes_t avail = runtime->status->hw_ptr - runtime->control->appl_ptr;
- if (avail < 0)
- avail += runtime->boundary;
- return avail;
- }
- /* Get the available(writeable) space for playback */
- static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
- {
- snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
- if (avail < 0)
- avail += runtime->boundary;
- else if ((snd_pcm_uframes_t) avail >= runtime->boundary)
- avail -= runtime->boundary;
- return avail;
- }
- /* Get the queued space(has been written) for playback */
- static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
- {
- return runtime->buffer_size - snd_pcm_playback_avail(runtime);
- }
- /* Get the free space for capture */
- static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
- {
- return runtime->buffer_size - snd_pcm_capture_avail(runtime);
- }
- static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)
- {
- struct snd_pcm_runtime *runtime = substream->runtime;
- if (runtime->stop_threshold >= runtime->boundary)
- return 1;
- return snd_pcm_playback_avail(runtime) < runtime->buffer_size;
- }
- static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)
- {
- struct snd_pcm_runtime *runtime = substream->runtime;
- return snd_pcm_playback_avail(runtime) >= runtime->buffer_size;
- }
- #endif /* __SOUND_PCM_H */
|