VirtualBox

Changeset 87267 in vbox


Ignore:
Timestamp:
Jan 15, 2021 12:43:52 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142226
Message:

Audio/HDA: Added a per-stream FIFOS scratch buffer to avoid intermediate (re-)allocations. ticketoem2ref:36

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

Legend:

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

    r83298 r87267  
    10181018    uint32_t cbLeft      = cbToProcess;
    10191019
    1020     uint8_t abChunk[HDA_FIFO_MAX + 1];
    10211020    while (cbLeft)
    10221021    {
     
    10401039        uint32_t   cbDMA    = 0;
    10411040        PRTCIRCBUF pCircBuf = pStreamR3->State.pCircBuf;
     1041        uint8_t   *pabFIFO  = pStreamShared->abFIFO;
    10421042
    10431043        if (hdaGetDirFromSD(uSD) == PDMAUDIODIR_IN) /* Input (SDI). */
     
    10591059                    break;
    10601060
    1061                 memcpy(abChunk + cbDMAWritten, pvBuf, cbBuf);
     1061                memcpy(pabFIFO + cbDMAWritten, pvBuf, cbBuf);
    10621062
    10631063                RTCircBufReleaseReadBlock(pCircBuf, cbBuf);
     
    10741074
    10751075                Assert(cbChunk == cbDMAWritten + cbDMAToWrite);
    1076                 memset((uint8_t *)abChunk + cbDMAWritten, 0, cbDMAToWrite);
     1076                memset((uint8_t *)pabFIFO + cbDMAWritten, 0, cbDMAToWrite);
    10771077                cbDMAWritten = cbChunk;
    10781078            }
    10791079
    1080             rc = hdaR3DMAWrite(pDevIns, pThis, pStreamShared, pStreamR3, abChunk, cbDMAWritten, &cbDMA /* pcbWritten */);
     1080            rc = hdaR3DMAWrite(pDevIns, pThis, pStreamShared, pStreamR3, pabFIFO, cbDMAWritten, &cbDMA /* pcbWritten */);
    10811081            if (RT_FAILURE(rc))
    10821082                LogRel(("HDA: Writing to stream #%RU8 DMA failed with %Rrc\n", uSD, rc));
     
    10881088            STAM_PROFILE_START(&pThis->StatOut, a);
    10891089
    1090             rc = hdaR3DMARead(pDevIns, pThis, pStreamShared, pStreamR3, abChunk, cbChunk, &cbDMA /* pcbRead */);
     1090            rc = hdaR3DMARead(pDevIns, pThis, pStreamShared, pStreamR3, pabFIFO, cbChunk, &cbDMA /* pcbRead */);
    10911091            if (RT_SUCCESS(rc))
    10921092            {
     
    11121112                        if (cbBuf)
    11131113                        {
    1114                             memcpy(pvBuf, abChunk + cbDMARead, cbBuf);
     1114                            memcpy(pvBuf, pabFIFO + cbDMARead, cbBuf);
    11151115                            cbDMARead += (uint32_t)cbBuf;
    11161116                            cbDMALeft -= (uint32_t)cbBuf;
     
    11601160                        }
    11611161
    1162                         uint8_t *pbSrcBuf = abChunk;
     1162                        uint8_t *pbSrcBuf = pabFIFO;
    11631163                        size_t cbSrcOff   = pMap->offNext;
    11641164
     
    15581558            if (cbSinkReadable)
    15591559            {
    1560                 uint8_t abFIFO[HDA_FIFO_MAX + 1];
     1560                uint8_t *pabFIFO = pStreamShared->abFIFO;
     1561
    15611562                while (cbSinkReadable)
    15621563                {
    15631564                    uint32_t cbRead;
    15641565                    rc2 = AudioMixerSinkRead(pSink, AUDMIXOP_COPY,
    1565                                              abFIFO, RT_MIN(cbSinkReadable, (uint32_t)sizeof(abFIFO)), &cbRead);
     1566                                             pabFIFO, RT_MIN(cbSinkReadable, (uint32_t)sizeof(pStreamShared->abFIFO)), &cbRead);
    15661567                    AssertRCBreak(rc2);
    15671568
     
    15741575                    /* Write (guest input) data to the stream which was read from stream's sink before. */
    15751576                    uint32_t cbWritten;
    1576                     rc2 = hdaR3StreamWrite(pStreamR3, abFIFO, cbRead, &cbWritten);
     1577                    rc2 = hdaR3StreamWrite(pStreamR3, pabFIFO, cbRead, &cbWritten);
    15771578                    AssertRCBreak(rc2);
    15781579                    AssertBreak(cbWritten > 0); /* Should never happen, as we know how much we can write. */
  • trunk/src/VBox/Devices/Audio/HDAStream.h

    r82968 r87267  
    211211    /** FIFO Watermark. */
    212212    uint16_t                    u16FIFOW;
     213    /** FIFO scratch buffer, to avoid intermediate (re-)allocations. */
     214    uint8_t                     abFIFO[HDA_FIFO_MAX + 1];
    213215    /** Last Valid Index (SDnLVI).
    214216     *  Will be updated in hdaR3StreamInit(). */
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