Changeset 89396 in vbox for trunk/src/VBox
- Timestamp:
- May 31, 2021 12:32:03 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/AudioMixBuffer-Convert.cpp.h
r89395 r89396 25 25 */ 26 26 #define AUDMIXBUF_CONVERT(a_Name, a_Type, _aMin, _aMax, _aSigned, _aShift) \ 27 /* Clips a specific output value to a single sample value. */ \ 28 DECLINLINE(int32_t) audioMixBufSampleFrom##a_Name(a_Type aVal) \ 29 { \ 30 /* left shifting of signed values is not defined, therefore the intermediate uint64_t cast */ \ 31 if (_aSigned) \ 32 return (int32_t) (((uint32_t) ((int32_t) aVal )) << (32 - _aShift)); \ 33 return (int32_t) (((uint32_t) ((int32_t) aVal - ((_aMax >> 1) + 1))) << (32 - _aShift)); \ 34 } \ 35 \ 36 /* Clips a single sample value to a specific output value. */ \ 37 DECLINLINE(a_Type) audioMixBufSampleTo##a_Name(int32_t iVal) \ 38 { \ 39 if (_aSigned) \ 40 return (a_Type) (iVal >> (32 - _aShift)); \ 41 return (a_Type) ((iVal >> (32 - _aShift)) + ((_aMax >> 1) + 1)); \ 42 } \ 43 \ 44 /* Encoders for peek: */ \ 45 \ 46 /* Generic */ \ 47 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncodeGeneric,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 48 PAUDIOMIXBUFPEEKSTATE pState) \ 49 { \ 50 RT_NOREF_PV(pState); \ 51 uintptr_t const cSrcChannels = pState->cSrcChannels; \ 52 uintptr_t const cDstChannels = pState->cDstChannels; \ 53 a_Type *pDst = (a_Type *)pvDst; \ 54 while (cFrames-- > 0) \ 27 /* Clips a specific output value to a single sample value. */ \ 28 DECLINLINE(int32_t) audioMixBufSampleFrom##a_Name(a_Type aVal) \ 29 { \ 30 /* left shifting of signed values is not defined, therefore the intermediate uint64_t cast */ \ 31 if (_aSigned) \ 32 return (int32_t) (((uint32_t) ((int32_t) aVal )) << (32 - _aShift)); \ 33 return (int32_t) (((uint32_t) ((int32_t) aVal - ((_aMax >> 1) + 1))) << (32 - _aShift)); \ 34 } \ 35 \ 36 /* Clips a single sample value to a specific output value. */ \ 37 DECLINLINE(a_Type) audioMixBufSampleTo##a_Name(int32_t iVal) \ 38 { \ 39 if (_aSigned) \ 40 return (a_Type) (iVal >> (32 - _aShift)); \ 41 return (a_Type) ((iVal >> (32 - _aShift)) + ((_aMax >> 1) + 1)); \ 42 } \ 43 \ 44 /* Encoders for peek: */ \ 45 \ 46 /* Generic */ \ 47 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncodeGeneric,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 48 PAUDIOMIXBUFPEEKSTATE pState) \ 49 { \ 50 RT_NOREF_PV(pState); \ 51 uintptr_t const cSrcChannels = pState->cSrcChannels; \ 52 uintptr_t const cDstChannels = pState->cDstChannels; \ 53 a_Type *pDst = (a_Type *)pvDst; \ 54 while (cFrames-- > 0) \ 55 { \ 56 uintptr_t idxDst = cDstChannels; \ 57 while (idxDst-- > 0) \ 55 58 { \ 56 uintptr_t idxDst = cDstChannels; \ 57 while (idxDst-- > 0) \ 58 { \ 59 int8_t idxSrc = pState->aidxChannelMap[idxDst]; \ 60 if (idxSrc >= 0) \ 61 pDst[idxDst] = audioMixBufSampleTo##a_Name(pi32Src[idxSrc]); \ 62 else if (idxSrc != -2) \ 63 pDst[idxDst] = (_aSigned) ? 0 : (_aMax >> 1); \ 64 else \ 65 pDst[idxDst] = 0; \ 66 } \ 67 pDst += cDstChannels; \ 68 pi32Src += cSrcChannels; \ 59 int8_t idxSrc = pState->aidxChannelMap[idxDst]; \ 60 if (idxSrc >= 0) \ 61 pDst[idxDst] = audioMixBufSampleTo##a_Name(pi32Src[idxSrc]); \ 62 else if (idxSrc != -2) \ 63 pDst[idxDst] = (_aSigned) ? 0 : (_aMax >> 1); \ 64 else \ 65 pDst[idxDst] = 0; \ 69 66 } \ 70 } \ 71 \ 72 /* 2ch -> 2ch */ \ 73 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncode2ChTo2Ch,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 74 PAUDIOMIXBUFPEEKSTATE pState) \ 75 { \ 76 RT_NOREF_PV(pState); \ 77 a_Type *pDst = (a_Type *)pvDst; \ 78 while (cFrames-- > 0) \ 67 pDst += cDstChannels; \ 68 pi32Src += cSrcChannels; \ 69 } \ 70 } \ 71 \ 72 /* 2ch -> 2ch */ \ 73 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncode2ChTo2Ch,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 74 PAUDIOMIXBUFPEEKSTATE pState) \ 75 { \ 76 RT_NOREF_PV(pState); \ 77 a_Type *pDst = (a_Type *)pvDst; \ 78 while (cFrames-- > 0) \ 79 { \ 80 pDst[0] = audioMixBufSampleTo##a_Name(pi32Src[0]); \ 81 pDst[1] = audioMixBufSampleTo##a_Name(pi32Src[1]); \ 82 AUDMIXBUF_MACRO_LOG(("%p: %RI32 / %RI32 => %RI32 / %RI32\n", \ 83 &pi32Src[0], pi32Src[0], pi32Src[1], (int32_t)pDst[0], (int32_t)pDst[1])); \ 84 pDst += 2; \ 85 pi32Src += 2; \ 86 } \ 87 } \ 88 \ 89 /* 2ch -> 1ch */ \ 90 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncode2ChTo1Ch,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 91 PAUDIOMIXBUFPEEKSTATE pState) \ 92 { \ 93 RT_NOREF_PV(pState); \ 94 a_Type *pDst = (a_Type *)pvDst; \ 95 while (cFrames-- > 0) \ 96 { \ 97 pDst[0] = audioMixBufSampleTo##a_Name(audioMixBufBlendSampleRet(pi32Src[0], pi32Src[1])); \ 98 pDst += 1; \ 99 pi32Src += 2; \ 100 } \ 101 } \ 102 \ 103 /* 1ch -> 2ch */ \ 104 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncode1ChTo2Ch,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 105 PAUDIOMIXBUFPEEKSTATE pState) \ 106 { \ 107 RT_NOREF_PV(pState); \ 108 a_Type *pDst = (a_Type *)pvDst; \ 109 while (cFrames-- > 0) \ 110 { \ 111 pDst[0] = pDst[1] = audioMixBufSampleTo##a_Name(pi32Src[0]); \ 112 pDst += 2; \ 113 pi32Src += 1; \ 114 } \ 115 } \ 116 /* 1ch -> 1ch */ \ 117 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncode1ChTo1Ch,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 118 PAUDIOMIXBUFPEEKSTATE pState) \ 119 { \ 120 RT_NOREF_PV(pState); \ 121 a_Type *pDst = (a_Type *)pvDst; \ 122 while (cFrames-- > 0) \ 123 { \ 124 pDst[0] = audioMixBufSampleTo##a_Name(pi32Src[0]); \ 125 pDst += 1; \ 126 pi32Src += 1; \ 127 } \ 128 } \ 129 \ 130 /* Decoders for write: */ \ 131 \ 132 /* Generic */ \ 133 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecodeGeneric,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 134 PAUDIOMIXBUFWRITESTATE pState) \ 135 { \ 136 RT_NOREF_PV(pState); \ 137 uintptr_t const cSrcChannels = pState->cSrcChannels; \ 138 uintptr_t const cDstChannels = pState->cDstChannels; \ 139 a_Type const *pSrc = (a_Type const *)pvSrc; \ 140 while (cFrames-- > 0) \ 141 { \ 142 uintptr_t idxDst = cDstChannels; \ 143 while (idxDst-- > 0) \ 79 144 { \ 80 pDst[0] = audioMixBufSampleTo##a_Name(pi32Src[0]); \ 81 pDst[1] = audioMixBufSampleTo##a_Name(pi32Src[1]); \ 82 AUDMIXBUF_MACRO_LOG(("%p: %RI32 / %RI32 => %RI32 / %RI32\n", \ 83 &pi32Src[0], pi32Src[0], pi32Src[1], (int32_t)pDst[0], (int32_t)pDst[1])); \ 84 pDst += 2; \ 85 pi32Src += 2; \ 145 int8_t idxSrc = pState->aidxChannelMap[idxDst]; \ 146 if (idxSrc >= 0) \ 147 pi32Dst[idxDst] = audioMixBufSampleTo##a_Name(pSrc[idxSrc]); \ 148 else if (idxSrc != -2) \ 149 pi32Dst[idxDst] = (_aSigned) ? 0 : (_aMax >> 1); \ 150 else \ 151 pi32Dst[idxDst] = 0; \ 86 152 } \ 87 } \ 88 \ 89 /* 2ch -> 1ch */ \ 90 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncode2ChTo1Ch,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 91 PAUDIOMIXBUFPEEKSTATE pState) \ 92 { \ 93 RT_NOREF_PV(pState); \ 94 a_Type *pDst = (a_Type *)pvDst; \ 95 while (cFrames-- > 0) \ 153 pi32Dst += cDstChannels; \ 154 pSrc += cSrcChannels; \ 155 } \ 156 } \ 157 \ 158 /* 2ch -> 2ch */ \ 159 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecode2ChTo2Ch,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 160 PAUDIOMIXBUFWRITESTATE pState) \ 161 { \ 162 RT_NOREF_PV(pState); \ 163 a_Type const *pSrc = (a_Type const *)pvSrc; \ 164 while (cFrames-- > 0) \ 165 { \ 166 pi32Dst[0] = audioMixBufSampleFrom##a_Name(pSrc[0]); \ 167 pi32Dst[1] = audioMixBufSampleFrom##a_Name(pSrc[1]); \ 168 AUDMIXBUF_MACRO_LOG(("%p: %RI32 / %RI32 => %RI32 / %RI32\n", \ 169 &pSrc[0], (int32_t)pSrc[0], (int32_t)pSrc[1], pi32Dst[0], pi32Dst[1])); \ 170 pi32Dst += 2; \ 171 pSrc += 2; \ 172 } \ 173 } \ 174 \ 175 /* 2ch -> 1ch */ \ 176 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecode2ChTo1Ch,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 177 PAUDIOMIXBUFWRITESTATE pState) \ 178 { \ 179 RT_NOREF_PV(pState); \ 180 a_Type const *pSrc = (a_Type const *)pvSrc; \ 181 while (cFrames-- > 0) \ 182 { \ 183 pi32Dst[0] = audioMixBufBlendSampleRet(audioMixBufSampleFrom##a_Name(pSrc[0]), audioMixBufSampleFrom##a_Name(pSrc[1])); \ 184 pi32Dst += 1; \ 185 pSrc += 2; \ 186 } \ 187 } \ 188 \ 189 /* 1ch -> 2ch */ \ 190 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecode1ChTo2Ch,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 191 PAUDIOMIXBUFWRITESTATE pState) \ 192 { \ 193 RT_NOREF_PV(pState); \ 194 a_Type const *pSrc = (a_Type const *)pvSrc; \ 195 while (cFrames-- > 0) \ 196 { \ 197 pi32Dst[1] = pi32Dst[0] = audioMixBufSampleFrom##a_Name(pSrc[0]); \ 198 pi32Dst += 2; \ 199 pSrc += 1; \ 200 } \ 201 } \ 202 \ 203 /* 1ch -> 1ch */ \ 204 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecode1ChTo1Ch,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 205 PAUDIOMIXBUFWRITESTATE pState) \ 206 { \ 207 RT_NOREF_PV(pState); \ 208 a_Type const *pSrc = (a_Type const *)pvSrc; \ 209 while (cFrames-- > 0) \ 210 { \ 211 pi32Dst[0] = audioMixBufSampleFrom##a_Name(pSrc[0]); \ 212 pi32Dst += 1; \ 213 pSrc += 1; \ 214 } \ 215 } \ 216 \ 217 /* Decoders for blending: */ \ 218 \ 219 /* Generic */ \ 220 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecodeGeneric,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 221 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 222 { \ 223 RT_NOREF_PV(pState); \ 224 uintptr_t const cSrcChannels = pState->cSrcChannels; \ 225 uintptr_t const cDstChannels = pState->cDstChannels; \ 226 a_Type const *pSrc = (a_Type const *)pvSrc; \ 227 while (cFrames-- > 0) \ 228 { \ 229 uintptr_t idxDst = cDstChannels; \ 230 while (idxDst-- > 0) \ 96 231 { \ 97 pDst[0] = audioMixBufSampleTo##a_Name(audioMixBufBlendSampleRet(pi32Src[0], pi32Src[1])); \98 pDst += 1;\99 pi32Src += 2; \232 int8_t idxSrc = pState->aidxChannelMap[idxDst]; \ 233 if (idxSrc >= 0) \ 234 audioMixBufBlendSample(&pi32Dst[idxDst], audioMixBufSampleTo##a_Name(pSrc[idxSrc])); \ 100 235 } \ 101 } \ 102 \ 103 /* 1ch -> 2ch */ \ 104 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncode1ChTo2Ch,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 105 PAUDIOMIXBUFPEEKSTATE pState) \ 106 { \ 107 RT_NOREF_PV(pState); \ 108 a_Type *pDst = (a_Type *)pvDst; \ 109 while (cFrames-- > 0) \ 110 { \ 111 pDst[0] = pDst[1] = audioMixBufSampleTo##a_Name(pi32Src[0]); \ 112 pDst += 2; \ 113 pi32Src += 1; \ 114 } \ 115 } \ 116 /* 1ch -> 1ch */ \ 117 static DECLCALLBACK(void) RT_CONCAT(audioMixBufEncode1ChTo1Ch,a_Name)(void *pvDst, int32_t const *pi32Src, uint32_t cFrames, \ 118 PAUDIOMIXBUFPEEKSTATE pState) \ 119 { \ 120 RT_NOREF_PV(pState); \ 121 a_Type *pDst = (a_Type *)pvDst; \ 122 while (cFrames-- > 0) \ 123 { \ 124 pDst[0] = audioMixBufSampleTo##a_Name(pi32Src[0]); \ 125 pDst += 1; \ 126 pi32Src += 1; \ 127 } \ 128 } \ 129 \ 130 /* Decoders for write: */ \ 131 \ 132 /* Generic */ \ 133 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecodeGeneric,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 134 PAUDIOMIXBUFWRITESTATE pState) \ 135 { \ 136 RT_NOREF_PV(pState); \ 137 uintptr_t const cSrcChannels = pState->cSrcChannels; \ 138 uintptr_t const cDstChannels = pState->cDstChannels; \ 139 a_Type const *pSrc = (a_Type const *)pvSrc; \ 140 while (cFrames-- > 0) \ 141 { \ 142 uintptr_t idxDst = cDstChannels; \ 143 while (idxDst-- > 0) \ 144 { \ 145 int8_t idxSrc = pState->aidxChannelMap[idxDst]; \ 146 if (idxSrc >= 0) \ 147 pi32Dst[idxDst] = audioMixBufSampleTo##a_Name(pSrc[idxSrc]); \ 148 else if (idxSrc != -2) \ 149 pi32Dst[idxDst] = (_aSigned) ? 0 : (_aMax >> 1); \ 150 else \ 151 pi32Dst[idxDst] = 0; \ 152 } \ 153 pi32Dst += cDstChannels; \ 154 pSrc += cSrcChannels; \ 155 } \ 156 } \ 157 \ 158 /* 2ch -> 2ch */ \ 159 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecode2ChTo2Ch,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 160 PAUDIOMIXBUFWRITESTATE pState) \ 161 { \ 162 RT_NOREF_PV(pState); \ 163 a_Type const *pSrc = (a_Type const *)pvSrc; \ 164 while (cFrames-- > 0) \ 165 { \ 166 pi32Dst[0] = audioMixBufSampleFrom##a_Name(pSrc[0]); \ 167 pi32Dst[1] = audioMixBufSampleFrom##a_Name(pSrc[1]); \ 168 AUDMIXBUF_MACRO_LOG(("%p: %RI32 / %RI32 => %RI32 / %RI32\n", \ 169 &pSrc[0], (int32_t)pSrc[0], (int32_t)pSrc[1], pi32Dst[0], pi32Dst[1])); \ 170 pi32Dst += 2; \ 171 pSrc += 2; \ 172 } \ 173 } \ 174 \ 175 /* 2ch -> 1ch */ \ 176 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecode2ChTo1Ch,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 177 PAUDIOMIXBUFWRITESTATE pState) \ 178 { \ 179 RT_NOREF_PV(pState); \ 180 a_Type const *pSrc = (a_Type const *)pvSrc; \ 181 while (cFrames-- > 0) \ 182 { \ 183 pi32Dst[0] = audioMixBufBlendSampleRet(audioMixBufSampleFrom##a_Name(pSrc[0]), audioMixBufSampleFrom##a_Name(pSrc[1])); \ 184 pi32Dst += 1; \ 185 pSrc += 2; \ 186 } \ 187 } \ 188 \ 189 /* 1ch -> 2ch */ \ 190 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecode1ChTo2Ch,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 191 PAUDIOMIXBUFWRITESTATE pState) \ 192 { \ 193 RT_NOREF_PV(pState); \ 194 a_Type const *pSrc = (a_Type const *)pvSrc; \ 195 while (cFrames-- > 0) \ 196 { \ 197 pi32Dst[1] = pi32Dst[0] = audioMixBufSampleFrom##a_Name(pSrc[0]); \ 198 pi32Dst += 2; \ 199 pSrc += 1; \ 200 } \ 201 } \ 202 \ 203 /* 1ch -> 1ch */ \ 204 static DECLCALLBACK(void) RT_CONCAT(audioMixBufDecode1ChTo1Ch,a_Name)(int32_t *pi32Dst, void const *pvSrc, uint32_t cFrames, \ 205 PAUDIOMIXBUFWRITESTATE pState) \ 206 { \ 207 RT_NOREF_PV(pState); \ 208 a_Type const *pSrc = (a_Type const *)pvSrc; \ 209 while (cFrames-- > 0) \ 210 { \ 211 pi32Dst[0] = audioMixBufSampleFrom##a_Name(pSrc[0]); \ 212 pi32Dst += 1; \ 213 pSrc += 1; \ 214 } \ 215 } \ 216 \ 217 /* Decoders for blending: */ \ 218 \ 219 /* Generic */ \ 220 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecodeGeneric,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 221 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 222 { \ 223 RT_NOREF_PV(pState); \ 224 uintptr_t const cSrcChannels = pState->cSrcChannels; \ 225 uintptr_t const cDstChannels = pState->cDstChannels; \ 226 a_Type const *pSrc = (a_Type const *)pvSrc; \ 227 while (cFrames-- > 0) \ 228 { \ 229 uintptr_t idxDst = cDstChannels; \ 230 while (idxDst-- > 0) \ 231 { \ 232 int8_t idxSrc = pState->aidxChannelMap[idxDst]; \ 233 if (idxSrc >= 0) \ 234 audioMixBufBlendSample(&pi32Dst[idxDst], audioMixBufSampleTo##a_Name(pSrc[idxSrc])); \ 235 } \ 236 pi32Dst += cDstChannels; \ 237 pSrc += cSrcChannels; \ 238 } \ 239 } \ 240 \ 241 /* 2ch -> 2ch */ \ 242 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecode2ChTo2Ch,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 243 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 244 { \ 245 RT_NOREF_PV(pState); \ 246 a_Type const *pSrc = (a_Type const *)pvSrc; \ 247 while (cFrames-- > 0) \ 248 { \ 249 audioMixBufBlendSample(&pi32Dst[0], audioMixBufSampleFrom##a_Name(pSrc[0])); \ 250 audioMixBufBlendSample(&pi32Dst[1], audioMixBufSampleFrom##a_Name(pSrc[1])); \ 251 AUDMIXBUF_MACRO_LOG(("%p: %RI32 / %RI32 => %RI32 / %RI32\n", \ 252 &pSrc[0], (int32_t)pSrc[0], (int32_t)pSrc[1], pi32Dst[0], pi32Dst[1])); \ 253 pi32Dst += 2; \ 254 pSrc += 2; \ 255 } \ 256 } \ 257 \ 258 /* 2ch -> 1ch */ \ 259 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecode2ChTo1Ch,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 260 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 261 { \ 262 RT_NOREF_PV(pState); \ 263 a_Type const *pSrc = (a_Type const *)pvSrc; \ 264 while (cFrames-- > 0) \ 265 { \ 266 audioMixBufBlendSample(&pi32Dst[0], audioMixBufBlendSampleRet(audioMixBufSampleFrom##a_Name(pSrc[0]), \ 267 audioMixBufSampleFrom##a_Name(pSrc[1]))); \ 268 pi32Dst += 1; \ 269 pSrc += 2; \ 270 } \ 271 } \ 272 \ 273 /* 1ch -> 2ch */ \ 274 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecode1ChTo2Ch,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 275 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 276 { \ 277 RT_NOREF_PV(pState); \ 278 a_Type const *pSrc = (a_Type const *)pvSrc; \ 279 while (cFrames-- > 0) \ 280 { \ 281 int32_t const i32Src = audioMixBufSampleFrom##a_Name(pSrc[0]); \ 282 audioMixBufBlendSample(&pi32Dst[0], i32Src); \ 283 audioMixBufBlendSample(&pi32Dst[1], i32Src); \ 284 pi32Dst += 2; \ 285 pSrc += 1; \ 286 } \ 287 } \ 288 \ 289 /* 1ch -> 1ch */ \ 290 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecode1ChTo1Ch,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 291 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 292 { \ 293 RT_NOREF_PV(pState); \ 294 a_Type const *pSrc = (a_Type const *)pvSrc; \ 295 while (cFrames-- > 0) \ 296 { \ 297 audioMixBufBlendSample(&pi32Dst[0], audioMixBufSampleFrom##a_Name(pSrc[0])); \ 298 pi32Dst += 1; \ 299 pSrc += 1; \ 300 } \ 301 } 236 pi32Dst += cDstChannels; \ 237 pSrc += cSrcChannels; \ 238 } \ 239 } \ 240 \ 241 /* 2ch -> 2ch */ \ 242 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecode2ChTo2Ch,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 243 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 244 { \ 245 RT_NOREF_PV(pState); \ 246 a_Type const *pSrc = (a_Type const *)pvSrc; \ 247 while (cFrames-- > 0) \ 248 { \ 249 audioMixBufBlendSample(&pi32Dst[0], audioMixBufSampleFrom##a_Name(pSrc[0])); \ 250 audioMixBufBlendSample(&pi32Dst[1], audioMixBufSampleFrom##a_Name(pSrc[1])); \ 251 AUDMIXBUF_MACRO_LOG(("%p: %RI32 / %RI32 => %RI32 / %RI32\n", \ 252 &pSrc[0], (int32_t)pSrc[0], (int32_t)pSrc[1], pi32Dst[0], pi32Dst[1])); \ 253 pi32Dst += 2; \ 254 pSrc += 2; \ 255 } \ 256 } \ 257 \ 258 /* 2ch -> 1ch */ \ 259 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecode2ChTo1Ch,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 260 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 261 { \ 262 RT_NOREF_PV(pState); \ 263 a_Type const *pSrc = (a_Type const *)pvSrc; \ 264 while (cFrames-- > 0) \ 265 { \ 266 audioMixBufBlendSample(&pi32Dst[0], audioMixBufBlendSampleRet(audioMixBufSampleFrom##a_Name(pSrc[0]), \ 267 audioMixBufSampleFrom##a_Name(pSrc[1]))); \ 268 pi32Dst += 1; \ 269 pSrc += 2; \ 270 } \ 271 } \ 272 \ 273 /* 1ch -> 2ch */ \ 274 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecode1ChTo2Ch,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 275 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 276 { \ 277 RT_NOREF_PV(pState); \ 278 a_Type const *pSrc = (a_Type const *)pvSrc; \ 279 while (cFrames-- > 0) \ 280 { \ 281 int32_t const i32Src = audioMixBufSampleFrom##a_Name(pSrc[0]); \ 282 audioMixBufBlendSample(&pi32Dst[0], i32Src); \ 283 audioMixBufBlendSample(&pi32Dst[1], i32Src); \ 284 pi32Dst += 2; \ 285 pSrc += 1; \ 286 } \ 287 } \ 288 \ 289 /* 1ch -> 1ch */ \ 290 static DECLCALLBACK(void) RT_CONCAT3(audioMixBufDecode1ChTo1Ch,a_Name,Blend)(int32_t *pi32Dst, void const *pvSrc, \ 291 uint32_t cFrames, PAUDIOMIXBUFWRITESTATE pState) \ 292 { \ 293 RT_NOREF_PV(pState); \ 294 a_Type const *pSrc = (a_Type const *)pvSrc; \ 295 while (cFrames-- > 0) \ 296 { \ 297 audioMixBufBlendSample(&pi32Dst[0], audioMixBufSampleFrom##a_Name(pSrc[0])); \ 298 pi32Dst += 1; \ 299 pSrc += 1; \ 300 } \ 301 } 302 302
Note:
See TracChangeset
for help on using the changeset viewer.