VirtualBox

Changeset 61343 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 31, 2016 3:55:57 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107638
Message:

Audio/AudioMixBuffer: Fixes (also for testcase).

Location:
trunk/src/VBox/Devices/Audio
Files:
2 edited

Legend:

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

    r61331 r61343  
    4242#include <iprt/mem.h>
    4343#include <iprt/string.h> /* For RT_BZERO. */
     44
     45#define VBOX_AUDIO_TESTCASE
    4446
    4547#ifdef VBOX_AUDIO_TESTCASE
     
    16161618{
    16171619    AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER);
    1618     AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
     1620    AssertPtrReturn(pvBuf,   VERR_INVALID_POINTER);
    16191621    /* pcWritten is optional. */
    16201622
    1621     uint32_t cDstSamples = pMixBuf->pParent
    1622                          ? pMixBuf->pParent->cSamples : pMixBuf->cSamples;
    1623     uint32_t cLive = pMixBuf->cUsed;
    1624 
    1625     uint32_t cDead = cDstSamples - cLive;
    1626     uint32_t cToProcess = (uint32_t)AUDIOMIXBUF_S2S_RATIO(pMixBuf, cDead);
    1627     cToProcess = RT_MIN(cToProcess, AUDIOMIXBUF_B2S(pMixBuf, cbBuf));
    1628 
    1629     AUDMIXBUF_LOG(("%s: offSamples=%RU32, cLive=%RU32, cDead=%RU32, cToProcess=%RU32\n",
    1630                    pMixBuf->pszName, offSamples, cLive, cDead, cToProcess));
    1631 
    1632     if (offSamples + cToProcess > pMixBuf->cSamples)
    1633         return VERR_BUFFER_OVERFLOW;
     1623    uint32_t cToWrite = AUDIOMIXBUF_B2S(pMixBuf, cbBuf);
     1624
     1625    int rc = VINF_SUCCESS;
     1626
     1627    if (offSamples + cToWrite > pMixBuf->cSamples)
     1628        rc = VINF_BUFFER_OVERFLOW;
     1629
     1630    cToWrite = RT_MIN(cToWrite, pMixBuf->cSamples - offSamples);
    16341631
    16351632    PPDMAUDMIXBUF_FN_CONVFROM pConv;
     
    16431640
    16441641    if (!pConv)
    1645         return VERR_NOT_SUPPORTED;
    1646 
    1647     int rc;
     1642        rc = VERR_NOT_SUPPORTED;
     1643
    16481644    uint32_t cWritten;
    16491645
    16501646#ifdef AUDIOMIXBUF_DEBUG_DUMP_PCM_DATA
    16511647    RTFILE fh;
    1652     rc = RTFileOpen(&fh, AUDIOMIXBUF_DEBUG_DUMP_PCM_DATA_PATH "mixbuf_writeat.pcm",
    1653                     RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
    1654     if (RT_SUCCESS(rc))
    1655     {
    1656         RTFileWrite(fh, pvBuf, cbBuf, NULL);
     1648    int rc2 = RTFileOpen(&fh, AUDIOMIXBUF_DEBUG_DUMP_PCM_DATA_PATH "mixbuf_writeat.pcm",
     1649                         RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
     1650    if (RT_SUCCESS(rc2))
     1651    {
     1652        RTFileWrite(fh, pvBuf, AUDIOMIXBUF_S2B(pMixBuf, cToWrite), NULL);
    16571653        RTFileClose(fh);
    16581654    }
    16591655#endif
    16601656
    1661     if (cToProcess)
    1662     {
    1663         PDMAUDMIXBUF_CONVOPTS convOpts = { cToProcess, pMixBuf->Volume };
    1664 
    1665         cWritten = pConv(pMixBuf->pSamples + offSamples, pvBuf, cbBuf, &convOpts);
     1657    if (   pConv
     1658        && cToWrite)
     1659    {
     1660        PDMAUDMIXBUF_CONVOPTS convOpts = { cToWrite, pMixBuf->Volume };
     1661
     1662        cWritten = pConv(pMixBuf->pSamples + offSamples, pvBuf, AUDIOMIXBUF_S2B(pMixBuf, cToWrite), &convOpts);
     1663    }
     1664    else
     1665        cWritten = 0;
     1666
    16661667#ifdef DEBUG
    1667         audioMixBufDbgPrintInternal(pMixBuf);
    1668 #endif
    1669         rc = cWritten ? VINF_SUCCESS : VERR_GENERAL_FAILURE; /** @todo Fudge! */
    1670     }
    1671     else
    1672     {
    1673         cWritten = 0;
    1674         rc = VINF_SUCCESS;
    1675     }
     1668    audioMixBufDbgPrintInternal(pMixBuf);
     1669#endif
     1670
     1671    AUDMIXBUF_LOG(("%s: offSamples=%RU32, cbBuf=%RU32, cToWrite=%RU32 (%zu bytes), cWritten=%RU32 (%zu bytes), rc=%Rrc\n",
     1672                   pMixBuf->pszName, offSamples, cbBuf,
     1673                   cToWrite, AUDIOMIXBUF_S2B(pMixBuf, cToWrite),
     1674                   cWritten, AUDIOMIXBUF_S2B(pMixBuf, cWritten), rc));
    16761675
    16771676    if (RT_SUCCESS(rc))
     
    16811680    }
    16821681
    1683     AUDMIXBUF_LOG(("cWritten=%RU32, rc=%Rrc\n", cWritten, rc));
    16841682    return rc;
    16851683}
  • trunk/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp

    r61331 r61343  
    139139static int tstParentChild(RTTEST hTest)
    140140{
    141     uint32_t cBufSize = RTRandU32() % 256;
     141    uint32_t cSamples = 16;
     142    uint32_t cBufSize = RTRandU32Ex(cSamples /* Min */, 256 /* Max */);
    142143
    143144    PDMAUDIOSTREAMCFG cfg_p =
     
    205206    uint32_t cChild1Free     = cBufSize;
    206207    uint32_t cChild1Mixed    = 0;
    207     uint32_t cSamplesParent1 = 16;
    208     uint32_t cSamplesChild1  = 16;
     208    uint32_t cSamplesParent1 = cSamples;
     209    uint32_t cSamplesChild1  = cSamples;
    209210
    210211    uint32_t cChild2Free     = cBufSize;
    211212    uint32_t cChild2Mixed    = 0;
    212     uint32_t cSamplesParent2 = 16;
    213     uint32_t cSamplesChild2  = 16;
     213    uint32_t cSamplesParent2 = cSamples;
     214    uint32_t cSamplesChild2  = cSamples;
    214215
    215216    uint32_t t = RTRandU32() % 1024;
Note: See TracChangeset for help on using the changeset viewer.

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