VirtualBox

Changeset 89396 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 31, 2021 12:32:03 PM (4 years ago)
Author:
vboxsync
Message:

AudioMixBuffer: Converting AUDMIXBUF_CONVERT into a template file to simplify debugging (can't step macro template code in windbg). bugref:9890

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/AudioMixBuffer-Convert.cpp.h

    r89395 r89396  
    2525 */
    2626#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. */ \
     28DECLINLINE(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. */ \
     37DECLINLINE(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 */ \
     47static 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) \
    5558        { \
    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; \
    6966        } \
    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 */ \
     73static 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 */ \
     90static 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 */ \
     104static 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 */ \
     117static 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 */ \
     133static 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) \
    79144        { \
    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; \
    86152        } \
    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 */ \
     159static 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 */ \
     176static 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 */ \
     190static 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 */ \
     204static 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 */ \
     220static 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) \
    96231        { \
    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])); \
    100235        } \
    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 */ \
     242static 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 */ \
     259static 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 */ \
     274static 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 */ \
     290static 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}
    302302
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette