VirtualBox

儲存庫 vbox 的更動 67367


忽略:
時間撮記:
2017-6-13 下午02:21:32 (7 年 以前)
作者:
vboxsync
訊息:

Audio: Forward ported audio mixing buffer changes from 5.1 (as of r115728).

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp

    r65636 r67367  
    4848        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(16 /* Bits */, 2 /* Channels */), /* Shift */
    4949        2,                                                                  /* Channels */
     50        0,                                                                  /* Alignment mask */
    5051        44100,                                                              /* Hz */
    5152        false                                                               /* Swap Endian */
     
    7677    /* int64_t samples64[2] = { 0xEE, 0xFF }; - unused */
    7778
    78     RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0, &samples8, sizeof(samples8), &cSamplesWritten));
     79    RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, &samples8, sizeof(samples8), &cSamplesWritten));
    7980    RTTESTI_CHECK(cSamplesWritten == 0 /* Samples */);
    80 
    81     RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0, &samples16, sizeof(samples16), &cSamplesWritten));
     81    RTTESTI_CHECK(AudioMixBufUsed(&mb) == 0);
     82
     83    RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, &samples16, sizeof(samples16), &cSamplesWritten));
    8284    RTTESTI_CHECK(cSamplesWritten == 1 /* Samples */);
    83 
    84     RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 2, &samples32, sizeof(samples32), &cSamplesWritten));
     85    RTTESTI_CHECK(AudioMixBufUsed(&mb) == 1);
     86
     87    RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 2 /* Offset */, &samples32, sizeof(samples32), &cSamplesWritten));
    8588    RTTESTI_CHECK(cSamplesWritten == 2 /* Samples */);
    86     cSamplesWrittenAbs = 0;
     89    RTTESTI_CHECK(AudioMixBufUsed(&mb) == 2);
    8790
    8891    /* Beyond buffer. */
    8992    RTTESTI_CHECK_RC(AudioMixBufWriteAt(&mb, AudioMixBufSize(&mb) + 1, &samples16, sizeof(samples16),
    90                                         &cSamplesWritten), VINF_BUFFER_OVERFLOW);
    91     /** @todo (bird): this was checking for VERR_BUFFER_OVERFLOW, which do you want
    92      *        the function to actually return? */
     93                                        &cSamplesWritten), VERR_BUFFER_OVERFLOW);
     94
     95    /* Offset wrap-around: When writing as much (or more) samples the mixing buffer can hold. */
     96    size_t    cbSamples = cBufSize * sizeof(int16_t) * 2 /* Channels */;
     97    RTTESTI_CHECK(cbSamples);
     98    uint16_t *paSamples = (uint16_t *)RTMemAlloc(cbSamples);
     99    RTTESTI_CHECK(paSamples);
     100    RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 0 /* Offset */, paSamples, cbSamples, &cSamplesWritten));
     101    RTTESTI_CHECK(cSamplesWritten == cBufSize /* Samples */);
     102    RTTESTI_CHECK(AudioMixBufUsed(&mb) == cBufSize);
     103    RTTESTI_CHECK(AudioMixBufReadPos(&mb) == 0);
     104    RTTESTI_CHECK(AudioMixBufWritePos(&mb) == 0);
     105    RTMemFree(paSamples);
     106    cbSamples = 0;
    93107
    94108    /*
    95109     * Circular writes.
    96110     */
     111    AudioMixBufReset(&mb);
     112
     113    RTTESTI_CHECK_RC_OK(AudioMixBufWriteAt(&mb, 2 /* Offset */, &samples32, sizeof(samples32), &cSamplesWritten));
     114    RTTESTI_CHECK(cSamplesWritten == 2 /* Samples */);
     115    RTTESTI_CHECK(AudioMixBufUsed(&mb) == 2);
     116
     117    cSamplesWrittenAbs = AudioMixBufUsed(&mb);
     118
    97119    uint32_t cToWrite = AudioMixBufSize(&mb) - cSamplesWrittenAbs - 1; /* -1 as padding plus -2 samples for above. */
    98120    for (uint32_t i = 0; i < cToWrite; i++)
     
    114136    /* Circular reads. */
    115137    uint32_t cToRead = AudioMixBufSize(&mb) - cSamplesWrittenAbs - 1;
    116     for (uint32_t i = 0; i < cToWrite; i++)
     138    for (uint32_t i = 0; i < cToRead; i++)
    117139    {
    118140        RTTESTI_CHECK_RC_OK(AudioMixBufReadCirc(&mb, &samples16, sizeof(samples16), &cSamplesRead));
     
    123145    RTTESTI_CHECK(AudioMixBufFree(&mb) == AudioMixBufSize(&mb) - cSamplesWrittenAbs - 1);
    124146    RTTESTI_CHECK(AudioMixBufFreeBytes(&mb) == AUDIOMIXBUF_S2B(&mb, cBufSize - cSamplesWrittenAbs - 1));
    125     RTTESTI_CHECK(AudioMixBufUsed(&mb) == cBufSize - cToRead + cSamplesWrittenAbs);
     147    RTTESTI_CHECK(AudioMixBufUsed(&mb) == cBufSize - cToRead);
    126148
    127149    RTTESTI_CHECK_RC_OK(AudioMixBufReadCirc(&mb, &samples16, sizeof(samples16), &cSamplesRead));
     
    139161static int tstParentChild(RTTEST hTest)
    140162{
    141     uint32_t cSamples = 16;
    142     uint32_t cBufSize = RTRandU32Ex(cSamples /* Min */, 256 /* Max */);
     163    uint32_t cParentBufSize = RTRandU32Ex(_1K /* Min */, _16K /* Max */); /* Enough room for random sizes */
    143164
    144165    /* 44100Hz, 2 Channels, S16 */
     
    149170        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(16 /* Bits */, 2 /* Channels */), /* Shift */
    150171        2,                                                                  /* Channels */
     172        0,                                                                  /* Alignment mask */
    151173        44100,                                                              /* Hz */
    152174        false                                                               /* Swap Endian */
     
    156178
    157179    PDMAUDIOMIXBUF parent;
    158     RTTESTI_CHECK_RC_OK(AudioMixBufInit(&parent, "Parent", &cfg_p, cBufSize));
     180    RTTESTI_CHECK_RC_OK(AudioMixBufInit(&parent, "Parent", &cfg_p, cParentBufSize));
    159181
    160182    /* 22050Hz, 2 Channels, S16 */
     
    165187        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(16 /* Bits */, 2 /* Channels */), /* Shift */
    166188        2,                                                                  /* Channels */
     189        0,                                                                  /* Alignment mask */
    167190        22050,                                                              /* Hz */
    168191        false                                                               /* Swap Endian */
     
    171194    RTTESTI_CHECK(DrvAudioHlpPCMPropsAreValid(&cfg_c1));
    172195
     196    uint32_t cSamples      = 16;
     197    uint32_t cChildBufSize = RTRandU32Ex(cSamples /* Min */, 64 /* Max */);
     198
    173199    PDMAUDIOMIXBUF child1;
    174     RTTESTI_CHECK_RC_OK(AudioMixBufInit(&child1, "Child1", &cfg_c1, cBufSize));
     200    RTTESTI_CHECK_RC_OK(AudioMixBufInit(&child1, "Child1", &cfg_c1, cChildBufSize));
    175201    RTTESTI_CHECK_RC_OK(AudioMixBufLinkTo(&child1, &parent));
    176202
     
    182208        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(16 /* Bits */, 2 /* Channels */), /* Shift */
    183209        2,                                                                  /* Channels */
     210        0,                                                                  /* Alignment mask */
    184211        48000,                                                              /* Hz */
    185212        false                                                               /* Swap Endian */
     
    189216
    190217    PDMAUDIOMIXBUF child2;
    191     RTTESTI_CHECK_RC_OK(AudioMixBufInit(&child2, "Child2", &cfg_c2, cBufSize));
     218    RTTESTI_CHECK_RC_OK(AudioMixBufInit(&child2, "Child2", &cfg_c2, cChildBufSize));
    192219    RTTESTI_CHECK_RC_OK(AudioMixBufLinkTo(&child2, &parent));
    193220
     
    203230    uint32_t cSamplesChild2  = cSamples;
    204231
    205     uint32_t t = RTRandU32() % 1024;
    206 
    207     RTTestPrintf(hTest, RTTESTLVL_DEBUG, "%RU32 iterations total\n", t);
     232    uint32_t t = RTRandU32() % 32;
     233
     234    RTTestPrintf(hTest, RTTESTLVL_DEBUG,
     235                 "cParentBufSize=%RU32, cChildBufSize=%RU32, %RU32 samples -> %RU32 iterations total\n",
     236                 cParentBufSize, cChildBufSize, cSamples, t);
    208237
    209238    /*
     
    212241    RTTestSubF(hTest, "2 Children -> Parent (AudioMixBufWriteAt)");
    213242
     243    uint32_t cChildrenSamplesMixedTotal = 0;
     244
    214245    for (uint32_t i = 0; i < t; i++)
    215246    {
    216247        RTTestPrintf(hTest, RTTESTLVL_DEBUG, "i=%RU32\n", i);
    217         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufWriteAt(&child1, 0, &samples, sizeof(samples), &cSamplesWritten));
    218         RTTESTI_CHECK_MSG_BREAK(cSamplesWritten == cSamplesChild1, ("Child1: Expected %RU32 written samples, got %RU32\n", cSamplesChild1, cSamplesWritten));
    219         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufMixToParent(&child1, cSamplesWritten, &cSamplesMixed));
    220         RTTESTI_CHECK_MSG_BREAK(AudioMixBufLive(&child1) == cSamplesMixed, ("Child1: Expected %RU32 mixed samples, got %RU32\n", AudioMixBufLive(&child1), cSamplesMixed));
    221         RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&child1) == AUDIOMIXBUF_S2S_RATIO(&parent, cSamplesMixed), ("Child1: Expected %RU32 used samples, got %RU32\n", AudioMixBufLive(&child1), AUDIOMIXBUF_S2S_RATIO(&parent, cSamplesMixed)));
    222         RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&parent) == 0, ("Parent: Expected 0 used samples, got %RU32\n", AudioMixBufUsed(&parent)));
    223 
    224         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufWriteAt(&child2, 0, &samples, sizeof(samples), &cSamplesWritten));
    225         RTTESTI_CHECK_MSG_BREAK(cSamplesWritten == cSamplesChild2, ("Child2: Expected %RU32 written samples, got %RU32\n", cSamplesChild2, cSamplesWritten));
    226         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufMixToParent(&child2, cSamplesWritten, &cSamplesMixed));
    227         RTTESTI_CHECK_MSG_BREAK(AudioMixBufLive(&child2) == cSamplesMixed, ("Child2: Expected %RU32 mixed samples, got %RU32\n", AudioMixBufLive(&child2), AudioMixBufUsed(&parent)));
    228         RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&child2) == AUDIOMIXBUF_S2S_RATIO(&parent, cSamplesMixed), ("Child2: Expected %RU32 used samples, got %RU32\n", AudioMixBufLive(&child2), AUDIOMIXBUF_S2S_RATIO(&parent, cSamplesMixed)));
    229         RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&parent) == 0, ("Parent2: Expected 0 used samples, got %RU32\n", AudioMixBufUsed(&parent)));
    230     }
    231 
    232     RTTESTI_CHECK(AudioMixBufUsed(&parent) == AudioMixBufLive(&child1) + AudioMixBufLive(&child2));
    233 
    234     for (;;)
    235     {
    236         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, pvBuf, cbBuf, &cSamplesRead));
    237         if (!cSamplesRead)
    238             break;
    239         AudioMixBufFinish(&parent, cSamplesRead);
     248
     249        uint32_t cChild1Writes = RTRandU32() % 8;
     250
     251        for (uint32_t c1 = 0; c1 < cChild1Writes; c1++)
     252        {
     253            /* Child 1. */
     254            RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufWriteAt(&child1, 0, &samples, sizeof(samples), &cSamplesWritten));
     255            RTTESTI_CHECK_MSG_BREAK(cSamplesWritten == cSamplesChild1, ("Child1: Expected %RU32 written samples, got %RU32\n", cSamplesChild1, cSamplesWritten));
     256            RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufMixToParent(&child1, cSamplesWritten, &cSamplesMixed));
     257
     258            cChildrenSamplesMixedTotal += cSamplesMixed;
     259
     260            RTTESTI_CHECK_MSG_BREAK(cSamplesWritten == cSamplesMixed, ("Child1: Expected %RU32 mixed samples, got %RU32\n", cSamplesWritten, cSamplesMixed));
     261            RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&child1) == 0, ("Child1: Expected %RU32 used samples, got %RU32\n", 0, AudioMixBufUsed(&child1)));
     262        }
     263
     264        uint32_t cChild2Writes = RTRandU32() % 8;
     265
     266        for (uint32_t c2 = 0; c2 < cChild2Writes; c2++)
     267        {
     268            /* Child 2. */
     269            RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufWriteAt(&child2, 0, &samples, sizeof(samples), &cSamplesWritten));
     270            RTTESTI_CHECK_MSG_BREAK(cSamplesWritten == cSamplesChild2, ("Child2: Expected %RU32 written samples, got %RU32\n", cSamplesChild2, cSamplesWritten));
     271            RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufMixToParent(&child2, cSamplesWritten, &cSamplesMixed));
     272
     273            cChildrenSamplesMixedTotal += cSamplesMixed;
     274
     275            RTTESTI_CHECK_MSG_BREAK(cSamplesWritten == cSamplesMixed, ("Child2: Expected %RU32 mixed samples, got %RU32\n", cSamplesWritten, cSamplesMixed));
     276            RTTESTI_CHECK_MSG_BREAK(AudioMixBufUsed(&child2) == 0, ("Child2: Expected %RU32 used samples, got %RU32\n", 0, AudioMixBufUsed(&child2)));
     277        }
     278
     279        /*
     280         * Read out all samples from the parent buffer and also mark the just-read samples as finished
     281         * so that both connected children buffers can keep track of their stuff.
     282         */
     283        uint32_t cParentSamples = AudioMixBufUsed(&parent);
     284        while (cParentSamples)
     285        {
     286            RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, pvBuf, cbBuf, &cSamplesRead));
     287            if (!cSamplesRead)
     288                break;
     289
     290            AudioMixBufFinish(&parent, cSamplesRead);
     291
     292            RTTESTI_CHECK(cParentSamples >= cSamplesRead);
     293            cParentSamples -= cSamplesRead;
     294        }
     295
     296        RTTESTI_CHECK(cParentSamples == 0);
    240297    }
    241298
     
    266323        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(8 /* Bits */, 1 /* Channels */), /* Shift */
    267324        1,                                                                 /* Channels */
     325        0,                                                                  /* Alignment mask */
    268326        44100,                                                             /* Hz */
    269327        false                                                              /* Swap Endian */
     
    290348        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(8 /* Bits */, 1 /* Channels */), /* Shift */
    291349        1,                                                                 /* Channels */
     350        0,                                                                 /* Alignment mask */
    292351        22050,                                                             /* Hz */
    293352        false                                                              /* Swap Endian */
     
    372431        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(16 /* Bits */, 1 /* Channels */), /* Shift */
    373432        1,                                                                  /* Channels */
     433        0,                                                                  /* Alignment mask */
    374434        44100,                                                              /* Hz */
    375435        false                                                               /* Swap Endian */
     
    388448        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(16 /* Bits */, 1 /* Channels */), /* Shift */
    389449        1,                                                                  /* Channels */
     450        0,                                                                  /* Alignment mask */
    390451        22050,                                                              /* Hz */
    391452        false                                                               /* Swap Endian */
     
    470531        PDMAUDIOPCMPROPS_MAKE_SHIFT_PARMS(16 /* Bits */, 2 /* Channels */), /* Shift */
    471532        2,                                                                  /* Channels */
     533        0,                                                                  /* Alignment mask */
    472534        44100,                                                              /* Hz */
    473535        false                                                               /* Swap Endian */
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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