VirtualBox

Changeset 87875 in vbox for trunk/src/VBox/Devices/Audio


Ignore:
Timestamp:
Feb 25, 2021 4:35:19 PM (4 years ago)
Author:
vboxsync
Message:

Audio/DrvAudio: Got rid of more big stack-allocated stuff. ticketoem2ref:36

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

Legend:

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

    r87862 r87875  
    13521352    uint32_t cfPlayedTotal = 0;
    13531353
    1354     uint8_t auBuf[256]; /** @todo Get rid of this here. */
    1355 
    13561354    uint32_t cfLeft  = cfToPlay;
    1357     uint32_t cbChunk = sizeof(auBuf);
     1355
     1356    uint8_t  *pvChunk = (uint8_t *)pThis->pvScratchBuf;
     1357    uint32_t  cbChunk = pThis->cbScratchBuf;
    13581358
    13591359    while (cfLeft)
     
    13611361        uint32_t cfRead = 0;
    13621362        rc = AudioMixBufAcquireReadBlock(&pStream->Host.MixBuf,
    1363                                          auBuf, RT_MIN(cbChunk, AUDIOMIXBUF_F2B(&pStream->Host.MixBuf, cfLeft)),
     1363                                         pvChunk, RT_MIN(cbChunk, AUDIOMIXBUF_F2B(&pStream->Host.MixBuf, cfLeft)),
    13641364                                         &cfRead);
    13651365        if (RT_FAILURE(rc))
     
    13721372        uint32_t cbPlayed = 0;
    13731373        rc = pThis->pHostDrvAudio->pfnStreamPlay(pThis->pHostDrvAudio, pStream->pvBackend,
    1374                                                  auBuf, cbRead, &cbPlayed);
     1374                                                 pvChunk, cbRead, &cbPlayed);
    13751375        if (   RT_SUCCESS(rc)
    13761376            && cbPlayed)
    13771377        {
    13781378            if (pThis->Out.Cfg.Dbg.fEnabled)
    1379                 DrvAudioHlpFileWrite(pStream->Out.Dbg.pFilePlayNonInterleaved, auBuf, cbPlayed, 0 /* fFlags */);
     1379                DrvAudioHlpFileWrite(pStream->Out.Dbg.pFilePlayNonInterleaved, pvChunk, cbPlayed, 0 /* fFlags */);
    13801380
    13811381            if (cbRead != cbPlayed)
     
    14381438    uint32_t cfPlayedTotal = 0;
    14391439
    1440     PDMAUDIOFRAME aFrameBuf[_4K]; /** @todo Get rid of this here. */
     1440    PPDMAUDIOFRAME paFrames = (PPDMAUDIOFRAME)pThis->pvScratchBuf;
     1441    const size_t    cFrames =                 pThis->cbScratchBuf / sizeof(PDMAUDIOFRAME);
    14411442
    14421443    uint32_t cfLeft = cfToPlay;
     
    14441445    {
    14451446        uint32_t cfRead = 0;
    1446         rc = AudioMixBufPeek(&pStream->Host.MixBuf, cfLeft, aFrameBuf,
    1447                              RT_MIN(cfLeft, RT_ELEMENTS(aFrameBuf)), &cfRead);
     1447        rc = AudioMixBufPeek(&pStream->Host.MixBuf, cfLeft, paFrames,
     1448                             RT_MIN(cfLeft, cFrames), &cfRead);
    14481449
    14491450        if (RT_SUCCESS(rc))
     
    14551456                /* Note: As the stream layout is RPDMAUDIOSTREAMLAYOUT_RAW, operate on audio frames
    14561457                 *       rather on bytes. */
    1457                 Assert(cfRead <= RT_ELEMENTS(aFrameBuf));
     1458                Assert(cfRead <= cFrames);
    14581459                rc = pThis->pHostDrvAudio->pfnStreamPlay(pThis->pHostDrvAudio, pStream->pvBackend,
    1459                                                          aFrameBuf, cfRead, &cfPlayed);
     1460                                                         paFrames, cfRead, &cfPlayed);
    14601461                if (   RT_FAILURE(rc)
    14611462                    || !cfPlayed)
     
    17241725    AssertPtr(pThis->pHostDrvAudio->pfnStreamGetReadable);
    17251726
    1726     uint8_t  auBuf[_1K]; /** @todo Get rid of this. */
    1727     uint32_t cbBuf = sizeof(auBuf);
    1728 
    17291727    uint32_t cbReadable = pThis->pHostDrvAudio->pfnStreamGetReadable(pThis->pHostDrvAudio, pStream->pvBackend);
    17301728    if (!cbReadable)
     
    17421740        uint32_t cbCaptured;
    17431741        rc = pThis->pHostDrvAudio->pfnStreamCapture(pThis->pHostDrvAudio, pStream->pvBackend,
    1744                                                     auBuf, RT_MIN(cbReadable, cbBuf), &cbCaptured);
     1742                                                    pThis->pvScratchBuf, RT_MIN(cbReadable, pThis->cbScratchBuf), &cbCaptured);
    17451743        if (RT_FAILURE(rc))
    17461744        {
     
    17511749        }
    17521750
    1753         Assert(cbCaptured <= cbBuf);
    1754         if (cbCaptured > cbBuf) /* Paranoia. */
    1755             cbCaptured = cbBuf;
     1751        Assert(cbCaptured <= pThis->cbScratchBuf);
     1752        if (cbCaptured > pThis->cbScratchBuf) /* Paranoia. */
     1753            cbCaptured = pThis->cbScratchBuf;
    17561754
    17571755        if (!cbCaptured) /* Nothing captured? Take a shortcut. */
     
    17611759         * (first) processing (if needed), so always write the incoming data at offset 0. */
    17621760        uint32_t cfHstWritten = 0;
    1763         rc = AudioMixBufWriteAt(&pStream->Host.MixBuf, 0 /* offFrames */, auBuf, cbCaptured, &cfHstWritten);
     1761        rc = AudioMixBufWriteAt(&pStream->Host.MixBuf, 0 /* offFrames */, pThis->pvScratchBuf, cbCaptured, &cfHstWritten);
    17641762        if (   RT_FAILURE(rc)
    17651763            || !cfHstWritten)
     
    17711769
    17721770        if (pThis->In.Cfg.Dbg.fEnabled)
    1773             DrvAudioHlpFileWrite(pStream->In.Dbg.pFileCaptureNonInterleaved, auBuf, cbCaptured, 0 /* fFlags */);
     1771            DrvAudioHlpFileWrite(pStream->In.Dbg.pFileCaptureNonInterleaved, pThis->pvScratchBuf, cbCaptured, 0 /* fFlags */);
    17741772
    17751773        uint32_t cfHstMixed = 0;
     
    23812379    int rc = RTCritSectInit(&pThis->CritSect);
    23822380    AssertRCReturn(rc, rc);
     2381
     2382    const size_t cbScratchBuf = _4K; /** @todo Make this configurable? */
     2383    pThis->pvScratchBuf = RTMemAlloc(cbScratchBuf);
     2384    AssertPtrReturn(pThis->pvScratchBuf, VERR_NO_MEMORY);
     2385    pThis->cbScratchBuf = cbScratchBuf;
    23832386
    23842387    /*
     
    37323735        drvAudioCallbackDestroy(pCB);
    37333736#endif
     3737
     3738    if (pThis->pvScratchBuf)
     3739    {
     3740        Assert(pThis->cbScratchBuf);
     3741
     3742        RTMemFree(pThis->pvScratchBuf);
     3743        pThis->pvScratchBuf = NULL;
     3744    }
    37343745
    37353746    if (RTCritSectIsInitialized(&pThis->CritSect))
  • trunk/src/VBox/Devices/Audio/DrvAudio.h

    r87861 r87875  
    143143    /** Audio configuration settings retrieved from the backend. */
    144144    PDMAUDIOBACKENDCFG      BackendCfg;
     145    /** Commonly used scratch buffer. */
     146    void                   *pvScratchBuf;
     147    /** Size (in bytes) of commonly used scratch buffer. */
     148    size_t                  cbScratchBuf;
    145149#ifdef VBOX_WITH_STATISTICS
    146150    /** Statistics for the statistics manager (STAM). */
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