VirtualBox

Changeset 73575 in vbox


Ignore:
Timestamp:
Aug 8, 2018 4:25:47 PM (6 years ago)
Author:
vboxsync
Message:

Audio/DrvAudio: Made drvAudioStreamCaptureRaw() more resilient against backends which offer more (fake) data than actually needed / available.

File:
1 edited

Legend:

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

    r73574 r73575  
    16861686    AssertPtr(pThis->pHostDrvAudio->pfnStreamGetReadable);
    16871687
    1688     for (;;)
    1689     {
    1690         uint32_t cbReadable = pThis->pHostDrvAudio->pfnStreamGetReadable(pThis->pHostDrvAudio, pStream->pvBackend);
    1691         if (!cbReadable) /* Nothing to read on the backend side? Bail out. */
    1692             break;
    1693 
    1694         const uint32_t cbFree = AudioMixBufFreeBytes(&pStream->Host.MixBuf);
    1695         if (!cbFree) /* No space left in the host stream? */
    1696             break;
    1697 
    1698         if (cbReadable > cbFree) /* Don't capture more than the host stream currently can hold. */
    1699             cbReadable = cbFree;
    1700 
     1688    /* Note: Raw means *audio frames*, not bytes! */
     1689    uint32_t cfReadable = pThis->pHostDrvAudio->pfnStreamGetReadable(pThis->pHostDrvAudio, pStream->pvBackend);
     1690    if (!cfReadable)
     1691        Log2Func(("[%s] No readable data available\n", pStream->szName));
     1692
     1693    const uint32_t cfFree = AudioMixBufFree(&pStream->Guest.MixBuf); /* Parent */
     1694    if (!cfFree)
     1695        Log2Func(("[%s] Buffer full\n", pStream->szName));
     1696
     1697    if (cfReadable > cfFree) /* More data readable than we can store at the moment? Limit. */
     1698        cfReadable = cfFree;
     1699
     1700    while (cfReadable)
     1701    {
    17011702        PPDMAUDIOFRAME paFrames;
    17021703        uint32_t cfWritable;
    1703         rc = AudioMixBufPeekMutable(&pStream->Host.MixBuf, AUDIOMIXBUF_B2F(&pStream->Host.MixBuf, cbReadable),
    1704                                     &paFrames, &cfWritable);
     1704        rc = AudioMixBufPeekMutable(&pStream->Host.MixBuf, cfReadable, &paFrames, &cfWritable);
    17051705        if (   RT_FAILURE(rc)
    17061706            || !cfWritable)
     
    17161716            int rc2 = drvAudioStreamControlInternalBackend(pThis, pStream, PDMAUDIOSTREAMCMD_DISABLE);
    17171717            AssertRC(rc2);
    1718         }
    1719         else if (cfCaptured)
    1720         {
    1721             Assert(cfCaptured <= cfWritable);
    1722             if (cfCaptured > cfWritable) /* Paranoia. */
    1723                 cfCaptured = cfWritable;
    1724 
    1725             cfCapturedTotal += cfCaptured;
    1726         }
    1727         else /* Nothing captured -- bail out. */
     1718
    17281719            break;
    1729 
    1730         if (RT_FAILURE(rc))
    1731             break;
     1720        }
     1721
     1722        Assert(cfCaptured <= cfWritable);
     1723        if (cfCaptured > cfWritable) /* Paranoia. */
     1724            cfCaptured = cfWritable;
     1725
     1726        Assert(cfReadable >= cfCaptured);
     1727        cfReadable      -= cfCaptured;
     1728        cfCapturedTotal += cfCaptured;
    17321729    }
    17331730
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