logo

oasis

Own branch of Oasis Linux (upstream: <https://git.sr.ht/~mcf/oasis/>) git clone https://anongit.hacktivis.me/git/oasis.git

0004-alsa-Add-support-for-s24le3-s24be3.patch (3939B)


  1. From 7472a43ccf2f5bae14cd736102daab8b4be0df31 Mon Sep 17 00:00:00 2001
  2. From: Michael Forney <mforney@mforney.org>
  3. Date: Mon, 31 Oct 2022 03:47:44 -0700
  4. Subject: [PATCH] alsa: Add support for s24le3/s24be3
  5. ---
  6. libsndio/sio_alsa.c | 41 +++++++++++++++++++++++++++++++++--------
  7. 1 file changed, 33 insertions(+), 8 deletions(-)
  8. diff --git a/libsndio/sio_alsa.c b/libsndio/sio_alsa.c
  9. index e460bf6..9a65288 100644
  10. --- a/libsndio/sio_alsa.c
  11. +++ b/libsndio/sio_alsa.c
  12. @@ -112,40 +112,60 @@ static enum pcm_format cap_fmts[] = {
  13. */
  14. static int
  15. sio_alsa_fmttopar(struct sio_alsa_hdl *hdl, enum pcm_format fmt,
  16. - unsigned int *bits, unsigned int *sig, unsigned int *le)
  17. + unsigned int *bits, unsigned int *bps, unsigned int *sig, unsigned int *le)
  18. {
  19. switch (fmt) {
  20. case PCM_FORMAT_S8:
  21. *bits = 8;
  22. + *bps = 1;
  23. *sig = 1;
  24. + *le = 1;
  25. break;
  26. case PCM_FORMAT_S16_LE:
  27. *bits = 16;
  28. + *bps = 2;
  29. *sig = 1;
  30. *le = 1;
  31. break;
  32. case PCM_FORMAT_S16_BE:
  33. *bits = 16;
  34. + *bps = 2;
  35. + *sig = 1;
  36. + *le = 0;
  37. + break;
  38. + case PCM_FORMAT_S24_3LE:
  39. + *bits = 24;
  40. + *bps = 3;
  41. + *sig = 1;
  42. + *le = 1;
  43. + break;
  44. + case PCM_FORMAT_S24_3BE:
  45. + *bits = 24;
  46. + *bps = 3;
  47. *sig = 1;
  48. *le = 0;
  49. break;
  50. case PCM_FORMAT_S24_LE:
  51. *bits = 24;
  52. + *bps = 4;
  53. *sig = 1;
  54. *le = 1;
  55. break;
  56. case PCM_FORMAT_S24_BE:
  57. *bits = 24;
  58. + *bps = 4;
  59. *sig = 1;
  60. *le = 0;
  61. break;
  62. case PCM_FORMAT_S32_LE:
  63. *bits = 32;
  64. + *bps = 4;
  65. *sig = 1;
  66. *le = 1;
  67. break;
  68. case PCM_FORMAT_S32_BE:
  69. *bits = 32;
  70. + *bps = 4;
  71. *sig = 1;
  72. *le = 0;
  73. break;
  74. @@ -163,13 +183,17 @@ sio_alsa_fmttopar(struct sio_alsa_hdl *hdl, enum pcm_format fmt,
  75. */
  76. static void
  77. sio_alsa_enctofmt(struct sio_alsa_hdl *hdl, enum pcm_format *rfmt,
  78. - unsigned int bits, unsigned int sig, unsigned int le)
  79. + unsigned int bits, unsigned int bps, unsigned int sig, unsigned int le)
  80. {
  81. + if (bps == ~0U)
  82. + bps = SIO_BPS(bits);
  83. if (le == ~0U)
  84. le = SIO_LE_NATIVE;
  85. if (bits == 8)
  86. *rfmt = PCM_FORMAT_S8;
  87. - else if (bits == 24)
  88. + else if (bits == 24 && bps == 3)
  89. + *rfmt = le ? PCM_FORMAT_S24_3LE : PCM_FORMAT_S24_3BE;
  90. + else if (bits == 24 && bps == 4)
  91. *rfmt = le ? PCM_FORMAT_S24_LE : PCM_FORMAT_S24_BE;
  92. else if (bits == 32)
  93. *rfmt = le ? PCM_FORMAT_S32_LE : PCM_FORMAT_S32_BE;
  94. @@ -450,6 +474,7 @@ sio_alsa_setpar_hw(struct pcm *pcm, struct pcm_params *par,
  95. static enum pcm_format fmts[] = {
  96. PCM_FORMAT_S32_LE, PCM_FORMAT_S32_BE,
  97. PCM_FORMAT_S24_LE, PCM_FORMAT_S24_BE,
  98. + PCM_FORMAT_S24_3LE, PCM_FORMAT_S24_3BE,
  99. PCM_FORMAT_S16_LE, PCM_FORMAT_S16_BE,
  100. PCM_FORMAT_S8
  101. };
  102. @@ -582,9 +607,9 @@ sio_alsa_getcap(struct sio_hdl *sh, struct sio_cap *cap)
  103. for (i = 0; i < CAP_NFMTS; i++) {
  104. sio_alsa_fmttopar(hdl, cap_fmts[i],
  105. &cap->enc[i].bits,
  106. + &cap->enc[i].bps,
  107. &cap->enc[i].sig,
  108. &cap->enc[i].le);
  109. - cap->enc[i].bps = SIO_BPS(cap->enc[0].bits);
  110. cap->enc[i].msb = 0;
  111. }
  112. for (i = 0; i < CAP_NRATES; i++) {
  113. @@ -620,7 +645,8 @@ sio_alsa_setpar(struct sio_hdl *sh, struct sio_par *par)
  114. struct sio_alsa_hdl *hdl = (struct sio_alsa_hdl *)sh;
  115. struct pcm_config icfg, ocfg;
  116. - sio_alsa_enctofmt(hdl, &icfg.format, par->bits, par->sig, par->le);
  117. + sio_alsa_enctofmt(hdl, &icfg.format, par->bits, par->bps, par->sig,
  118. + par->le);
  119. icfg.rate = (par->rate == ~0U) ? 48000 : par->rate;
  120. if (par->appbufsz != ~0U) {
  121. icfg.period_size = (par->round != ~0U) ?
  122. @@ -674,11 +700,10 @@ sio_alsa_setpar(struct sio_hdl *sh, struct sio_par *par)
  123. hdl->sio.eof = 1;
  124. return 0;
  125. }
  126. - if (!sio_alsa_fmttopar(hdl, icfg.format,
  127. - &hdl->par.bits, &hdl->par.sig, &hdl->par.le))
  128. + if (!sio_alsa_fmttopar(hdl, icfg.format, &hdl->par.bits, &hdl->par.bps,
  129. + &hdl->par.sig, &hdl->par.le))
  130. return 0;
  131. hdl->par.msb = 0;
  132. - hdl->par.bps = SIO_BPS(hdl->par.bits);
  133. hdl->par.rate = ocfg.rate;
  134. hdl->par.round = ocfg.period_size;
  135. hdl->par.bufsz = ocfg.period_size * ocfg.period_count;
  136. --
  137. 2.37.3