snd_pcm.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /*
  2. * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  3. *
  4. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  5. * the the people's Republic of China and other countries.
  6. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  7. *
  8. * DISCLAIMER
  9. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  10. * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  11. * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  12. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  13. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  14. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  15. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
  16. *
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  19. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  20. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  21. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  22. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  25. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  26. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  28. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  30. * OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. #ifndef __SOUND_PCM_H
  33. #define __SOUND_PCM_H
  34. #include <unistd.h>
  35. #define SND_SOC_DAIFMT_I2S 1 /* I2S mode */
  36. #define SND_SOC_DAIFMT_RIGHT_J 2 /* Right Justified mode */
  37. #define SND_SOC_DAIFMT_LEFT_J 3 /* Left Justified mode */
  38. #define SND_SOC_DAIFMT_DSP_A 4 /* L data MSB after FRM LRC */
  39. #define SND_SOC_DAIFMT_DSP_B 5 /* L data MSB during FRM LRC */
  40. #define SND_SOC_DAIFMT_AC97 6 /* AC97 */
  41. #define SND_SOC_DAIFMT_PDM 7 /* Pulse density modulation */
  42. /* left and right justified also known as MSB and LSB respectively */
  43. #define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J
  44. #define SND_SOC_DAIFMT_LSB SND_SOC_DAIFMT_RIGHT_J
  45. #define SND_SOC_DAIFMT_SIG_SHIFT 8
  46. #define SND_SOC_DAIFMT_MASTER_SHIFT 12
  47. #define SND_SOC_DAIFMT_NB_NF (1 << 8) /* normal bit clock + frame */
  48. #define SND_SOC_DAIFMT_NB_IF (2 << 8) /* normal BCLK + inv FRM */
  49. #define SND_SOC_DAIFMT_IB_NF (3 << 8) /* invert BCLK + nor FRM */
  50. #define SND_SOC_DAIFMT_IB_IF (4 << 8) /* invert BCLK + FRM */
  51. #define SND_SOC_DAIFMT_CBM_CFM (1 << 12) /* codec clk & FRM master */
  52. #define SND_SOC_DAIFMT_CBS_CFM (2 << 12) /* codec clk slave & FRM master */
  53. #define SND_SOC_DAIFMT_CBM_CFS (3 << 12) /* codec clk master & frame slave */
  54. #define SND_SOC_DAIFMT_CBS_CFS (4 << 12) /* codec clk & FRM slave */
  55. #define SND_SOC_DAIFMT_FORMAT_MASK 0x000f
  56. #define SND_SOC_DAIFMT_CLOCK_MASK 0x00f0
  57. #define SND_SOC_DAIFMT_INV_MASK 0x0f00
  58. #define SND_SOC_DAIFMT_MASTER_MASK 0xf000
  59. #define SNDRV_PCM_IOCTL1_RESET 0
  60. /* 1 is absent slot. */
  61. #define SNDRV_PCM_IOCTL1_CHANNEL_INFO 2
  62. #define SNDRV_PCM_IOCTL1_GSTATE 3
  63. #define SNDRV_PCM_IOCTL1_FIFO_SIZE 4
  64. #define SNDRV_PCM_TRIGGER_STOP 0
  65. #define SNDRV_PCM_TRIGGER_START 1
  66. #define SNDRV_PCM_TRIGGER_PAUSE_PUSH 3
  67. #define SNDRV_PCM_TRIGGER_PAUSE_RELEASE 4
  68. #define SNDRV_PCM_TRIGGER_SUSPEND 5
  69. #define SNDRV_PCM_TRIGGER_RESUME 6
  70. #define SNDRV_PCM_TRIGGER_DRAIN 7
  71. #define SNDRV_PCM_RATE_5512 (1<<0) /* 5512Hz */
  72. #define SNDRV_PCM_RATE_8000 (1<<1) /* 8000Hz */
  73. #define SNDRV_PCM_RATE_11025 (1<<2) /* 11025Hz */
  74. #define SNDRV_PCM_RATE_16000 (1<<3) /* 16000Hz */
  75. #define SNDRV_PCM_RATE_22050 (1<<4) /* 22050Hz */
  76. #define SNDRV_PCM_RATE_32000 (1<<5) /* 32000Hz */
  77. #define SNDRV_PCM_RATE_44100 (1<<6) /* 44100Hz */
  78. #define SNDRV_PCM_RATE_48000 (1<<7) /* 48000Hz */
  79. #define SNDRV_PCM_RATE_64000 (1<<8) /* 64000Hz */
  80. #define SNDRV_PCM_RATE_88200 (1<<9) /* 88200Hz */
  81. #define SNDRV_PCM_RATE_96000 (1<<10) /* 96000Hz */
  82. #define SNDRV_PCM_RATE_176400 (1<<11) /* 176400Hz */
  83. #define SNDRV_PCM_RATE_192000 (1<<12) /* 192000Hz */
  84. #define SNDRV_PCM_RATE_CONTINUOUS (1<<30) /* continuous range */
  85. #define SNDRV_PCM_RATE_KNOT (1<<31) /* supports more non-continuos rates */
  86. #define SNDRV_PCM_RATE_8000_44100 (SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
  87. SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
  88. SNDRV_PCM_RATE_32000|SNDRV_PCM_RATE_44100)
  89. #define SNDRV_PCM_RATE_8000_48000 (SNDRV_PCM_RATE_8000_44100|SNDRV_PCM_RATE_48000)
  90. #define SNDRV_PCM_RATE_8000_96000 (SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_64000|\
  91. SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000)
  92. #define SNDRV_PCM_RATE_8000_192000 (SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\
  93. SNDRV_PCM_RATE_192000)
  94. #define SNDRV_PCM_FORMAT_S8 ((snd_pcm_format_t) 0)
  95. #define SNDRV_PCM_FORMAT_U8 ((snd_pcm_format_t) 1)
  96. #define SNDRV_PCM_FORMAT_S16_LE ((snd_pcm_format_t) 2)
  97. #define SNDRV_PCM_FORMAT_S16_BE ((snd_pcm_format_t) 3)
  98. #define SNDRV_PCM_FORMAT_U16_LE ((snd_pcm_format_t) 4)
  99. #define SNDRV_PCM_FORMAT_U16_BE ((snd_pcm_format_t) 5)
  100. #define SNDRV_PCM_FORMAT_S24_LE ((snd_pcm_format_t) 6)
  101. #define SNDRV_PCM_FORMAT_S24_BE ((snd_pcm_format_t) 7)
  102. #define SNDRV_PCM_FORMAT_U24_LE ((snd_pcm_format_t) 8)
  103. #define SNDRV_PCM_FORMAT_U24_BE ((snd_pcm_format_t) 9)
  104. #define SNDRV_PCM_FORMAT_S32_LE ((snd_pcm_format_t) 10)
  105. #define SNDRV_PCM_FORMAT_S32_BE ((snd_pcm_format_t) 11)
  106. #define SNDRV_PCM_FORMAT_U32_LE ((snd_pcm_format_t) 12)
  107. #define SNDRV_PCM_FORMAT_U32_BE ((snd_pcm_format_t) 13)
  108. #define _SNDRV_PCM_FMTBIT(fmt) (1ULL << (int)SND_PCM_FORMAT_##fmt)
  109. #define SNDRV_PCM_FMTBIT_S8 _SNDRV_PCM_FMTBIT(S8)
  110. #define SNDRV_PCM_FMTBIT_U8 _SNDRV_PCM_FMTBIT(U8)
  111. #define SNDRV_PCM_FMTBIT_S16_LE _SNDRV_PCM_FMTBIT(S16_LE)
  112. #define SNDRV_PCM_FMTBIT_S16_BE _SNDRV_PCM_FMTBIT(S16_BE)
  113. #define SNDRV_PCM_FMTBIT_U16_LE _SNDRV_PCM_FMTBIT(U16_LE)
  114. #define SNDRV_PCM_FMTBIT_U16_BE _SNDRV_PCM_FMTBIT(U16_BE)
  115. #define SNDRV_PCM_FMTBIT_S24_LE _SNDRV_PCM_FMTBIT(S24_LE)
  116. #define SNDRV_PCM_FMTBIT_S24_BE _SNDRV_PCM_FMTBIT(S24_BE)
  117. #define SNDRV_PCM_FMTBIT_U24_LE _SNDRV_PCM_FMTBIT(U24_LE)
  118. #define SNDRV_PCM_FMTBIT_U24_BE _SNDRV_PCM_FMTBIT(U24_BE)
  119. #define SNDRV_PCM_FMTBIT_S32_LE _SNDRV_PCM_FMTBIT(S32_LE)
  120. #define SNDRV_PCM_FMTBIT_S32_BE _SNDRV_PCM_FMTBIT(S32_BE)
  121. #define SNDRV_PCM_FMTBIT_U32_LE _SNDRV_PCM_FMTBIT(U32_LE)
  122. #define SNDRV_PCM_FMTBIT_U32_BE _SNDRV_PCM_FMTBIT(U32_BE)
  123. #ifdef SNDRV_LITTLE_ENDIAN
  124. #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_LE
  125. #define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_LE
  126. #define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_LE
  127. #define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_LE
  128. #define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_LE
  129. #define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_LE
  130. #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_LE
  131. #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_LE
  132. #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
  133. #endif
  134. #ifdef SNDRV_BIG_ENDIAN
  135. #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_BE
  136. #define SNDRV_PCM_FMTBIT_U16 SNDRV_PCM_FMTBIT_U16_BE
  137. #define SNDRV_PCM_FMTBIT_S24 SNDRV_PCM_FMTBIT_S24_BE
  138. #define SNDRV_PCM_FMTBIT_U24 SNDRV_PCM_FMTBIT_U24_BE
  139. #define SNDRV_PCM_FMTBIT_S32 SNDRV_PCM_FMTBIT_S32_BE
  140. #define SNDRV_PCM_FMTBIT_U32 SNDRV_PCM_FMTBIT_U32_BE
  141. #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_BE
  142. #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_BE
  143. #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE
  144. #endif
  145. static inline snd_pcm_sframes_t bytes_to_frames(struct snd_pcm_runtime *runtime, ssize_t size)
  146. {
  147. return size * 8 / runtime->frame_bits;
  148. }
  149. static inline ssize_t frames_to_bytes(struct snd_pcm_runtime *runtime, snd_pcm_sframes_t size)
  150. {
  151. return size * runtime->frame_bits / 8;
  152. }
  153. static inline size_t snd_pcm_lib_buffer_bytes(struct snd_pcm_substream *substream)
  154. {
  155. struct snd_pcm_runtime *runtime = substream->runtime;
  156. return frames_to_bytes(runtime, runtime->buffer_size);
  157. }
  158. static inline size_t snd_pcm_lib_period_bytes(struct snd_pcm_substream *substream)
  159. {
  160. struct snd_pcm_runtime *runtime = substream->runtime;
  161. return frames_to_bytes(runtime, runtime->period_size);
  162. }
  163. /* Get the available(readable) space for capture */
  164. static inline snd_pcm_uframes_t snd_pcm_capture_avail(struct snd_pcm_runtime *runtime)
  165. {
  166. snd_pcm_sframes_t avail = runtime->status->hw_ptr - runtime->control->appl_ptr;
  167. if (avail < 0)
  168. avail += runtime->boundary;
  169. return avail;
  170. }
  171. /* Get the available(writeable) space for playback */
  172. static inline snd_pcm_uframes_t snd_pcm_playback_avail(struct snd_pcm_runtime *runtime)
  173. {
  174. snd_pcm_sframes_t avail = runtime->status->hw_ptr + runtime->buffer_size - runtime->control->appl_ptr;
  175. if (avail < 0)
  176. avail += runtime->boundary;
  177. else if ((snd_pcm_uframes_t) avail >= runtime->boundary)
  178. avail -= runtime->boundary;
  179. return avail;
  180. }
  181. /* Get the queued space(has been written) for playback */
  182. static inline snd_pcm_sframes_t snd_pcm_playback_hw_avail(struct snd_pcm_runtime *runtime)
  183. {
  184. return runtime->buffer_size - snd_pcm_playback_avail(runtime);
  185. }
  186. /* Get the free space for capture */
  187. static inline snd_pcm_sframes_t snd_pcm_capture_hw_avail(struct snd_pcm_runtime *runtime)
  188. {
  189. return runtime->buffer_size - snd_pcm_capture_avail(runtime);
  190. }
  191. static inline int snd_pcm_playback_data(struct snd_pcm_substream *substream)
  192. {
  193. struct snd_pcm_runtime *runtime = substream->runtime;
  194. if (runtime->stop_threshold >= runtime->boundary)
  195. return 1;
  196. return snd_pcm_playback_avail(runtime) < runtime->buffer_size;
  197. }
  198. static inline int snd_pcm_playback_empty(struct snd_pcm_substream *substream)
  199. {
  200. struct snd_pcm_runtime *runtime = substream->runtime;
  201. return snd_pcm_playback_avail(runtime) >= runtime->buffer_size;
  202. }
  203. #endif /* __SOUND_PCM_H */