VirtualBox

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


Ignore:
Timestamp:
Feb 6, 2018 10:48:43 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
120704
Message:

Audio: Renamed AudioMixBufReadCirc[Ex] -> AudioMixBufAcquireReadBlock[Ex] and added AudioMixBufReleaseReadBlock() -- this adds the ability to read less than initially announced, if required.

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

Legend:

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

    r69119 r70878  
    15201520 * @param   pvBuf                   Pointer to buffer to write output to.
    15211521 * @param   cbBuf                   Size (in bytes) of buffer to write to.
    1522  * @param   pcRead                  Number of audio frames read. Optional.
    1523  */
    1524 int AudioMixBufReadCirc(PPDMAUDIOMIXBUF pMixBuf, void *pvBuf, uint32_t cbBuf, uint32_t *pcRead)
    1525 {
    1526     return AudioMixBufReadCircEx(pMixBuf, pMixBuf->AudioFmt, pvBuf, cbBuf, pcRead);
     1522 * @param   pcBlock                 Returns acquired block to read (in audio frames).
     1523 */
     1524int AudioMixBufAcquireReadBlock(PPDMAUDIOMIXBUF pMixBuf, void *pvBuf, uint32_t cbBuf, uint32_t *pcBlock)
     1525{
     1526    return AudioMixBufAcquireReadBlockEx(pMixBuf, pMixBuf->AudioFmt, pvBuf, cbBuf, pcBlock);
    15271527}
    15281528
     
    15371537 * @param   pvBuf                   Pointer to buffer to write output to.
    15381538 * @param   cbBuf                   Size (in bytes) of buffer to write to.
    1539  * @param   pcRead                  Number of audio frames read. Optional.
    1540  */
    1541 int AudioMixBufReadCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, void *pvBuf, uint32_t cbBuf, uint32_t *pcRead)
     1539 * @param   pcBlock                 Returns acquired block to read (in audio frames).
     1540 */
     1541int AudioMixBufAcquireReadBlockEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, void *pvBuf, uint32_t cbBuf,
     1542                                  uint32_t *pcBlock)
    15421543{
    15431544    AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER);
    15441545    AssertReturn(cbBuf,      VERR_INVALID_PARAMETER);
    15451546    AssertPtrReturn(pvBuf,   VERR_INVALID_POINTER);
    1546     /* pcRead is optional. */
     1547    AssertPtrReturn(pcBlock, VERR_INVALID_POINTER);
    15471548
    15481549    /* Make sure that we at least have space for a full audio frame. */
     
    15591560        audioMixBufDbgPrintInternal(pMixBuf, __FUNCTION__);
    15601561#endif
    1561         if (pcRead)
    1562             *pcRead = 0;
     1562        *pcBlock = 0;
    15631563        return VINF_SUCCESS;
    15641564    }
     
    15971597        }
    15981598#endif
    1599         pMixBuf->offRead  = (pMixBuf->offRead + cToRead) % pMixBuf->cFrames;
    1600         Assert(pMixBuf->cUsed >= cToRead);
    1601         pMixBuf->cUsed   -= cToRead;
    1602     }
    1603 
    1604     if (pcRead)
    1605         *pcRead = cToRead;
     1599    }
     1600
     1601    *pcBlock = cToRead;
    16061602
    16071603#ifdef DEBUG
     
    16111607    AUDMIXBUF_LOG(("cRead=%RU32 (%RU32 bytes)\n", cToRead, AUDIOMIXBUF_F2B(pMixBuf, cToRead)));
    16121608    return VINF_SUCCESS;
     1609}
     1610
     1611/**
     1612 * Releases a formerly acquired read block again.
     1613 *
     1614 * @param   pMixBuf             Mixing buffer to release acquired read block for.
     1615 * @param   cBlock              Size of the block to release (in audio frames).
     1616 */
     1617void AudioMixBufReleaseReadBlock(PPDMAUDIOMIXBUF pMixBuf, uint32_t cBlock)
     1618{
     1619    AssertPtrReturnVoid(pMixBuf);
     1620
     1621    if (!cBlock)
     1622        return;
     1623
     1624    pMixBuf->offRead  = (pMixBuf->offRead + cBlock) % pMixBuf->cFrames;
     1625    Assert(pMixBuf->cUsed >= cBlock);
     1626    pMixBuf->cUsed   -= RT_MIN(cBlock, pMixBuf->cUsed);
    16131627}
    16141628
  • trunk/src/VBox/Devices/Audio/AudioMixBuffer.h

    r69119 r70878  
    55
    66/*
    7  * Copyright (C) 2014-2017 Oracle Corporation
     7 * Copyright (C) 2014-2018 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    6666int AudioMixBufReadAt(PPDMAUDIOMIXBUF pMixBuf, uint32_t offSamples, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead);
    6767int AudioMixBufReadAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, uint32_t offSamples, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead);
    68 int AudioMixBufReadCirc(PPDMAUDIOMIXBUF pMixBuf, void *pvBuf, uint32_t cbBuf, uint32_t *pcRead);
    69 int AudioMixBufReadCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, void *pvBuf, uint32_t cbBuf, uint32_t *pcRead);
     68int AudioMixBufAcquireReadBlock(PPDMAUDIOMIXBUF pMixBuf, void *pvBuf, uint32_t cbBuf, uint32_t *pcBlock);
     69int AudioMixBufAcquireReadBlockEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, void *pvBuf, uint32_t cbBuf, uint32_t *pcBlock);
     70void AudioMixBufReleaseReadBlock(PPDMAUDIOMIXBUF pMixBuf, uint32_t cBlock);
    7071uint32_t AudioMixBufReadPos(PPDMAUDIOMIXBUF pMixBuf);
    7172void AudioMixBufReset(PPDMAUDIOMIXBUF pMixBuf);
  • trunk/src/VBox/Devices/Audio/DrvAudio.cpp

    r70640 r70878  
    13101310            {
    13111311                uint32_t cfRead = 0;
    1312                 rc = AudioMixBufReadCirc(&pHstStream->MixBuf, auBuf, RT_MIN(cbChunk, cbLeft), &cfRead);
     1312                rc = AudioMixBufAcquireReadBlock(&pHstStream->MixBuf, auBuf, RT_MIN(cbChunk, cbLeft), &cfRead);
    13131313                if (   !cfRead
    13141314                    || RT_FAILURE(rc))
     
    13381338                           pHstStream->szName, cfRead, cbPlayed));*/
    13391339#endif
    1340                 cfPlayedTotal += AUDIOMIXBUF_B2F(&pHstStream->MixBuf, cbPlayed);
     1340                const uint32_t cfPlayed = AUDIOMIXBUF_B2F(&pHstStream->MixBuf, cbPlayed);
     1341
     1342                cfPlayedTotal += cfPlayed;
    13411343                Assert(cbLeft >= cbPlayed);
    13421344                cbLeft        -= cbPlayed;
     1345
     1346                AudioMixBufReleaseReadBlock(&pHstStream->MixBuf, cfPlayed);
    13431347            }
    13441348        }
     
    23032307        {
    23042308            uint32_t cRead;
    2305             rc = AudioMixBufReadCirc(&pGstStream->MixBuf, (uint8_t *)pvBuf + AUDIOMIXBUF_F2B(&pGstStream->MixBuf, cReadTotal),
    2306                                      AUDIOMIXBUF_F2B(&pGstStream->MixBuf, cToRead), &cRead);
     2309            rc = AudioMixBufAcquireReadBlock(&pGstStream->MixBuf, (uint8_t *)pvBuf + AUDIOMIXBUF_F2B(&pGstStream->MixBuf, cReadTotal),
     2310                                             AUDIOMIXBUF_F2B(&pGstStream->MixBuf, cToRead), &cRead);
    23072311            if (RT_FAILURE(rc))
    23082312                break;
     
    23202324
    23212325            cReadTotal += cRead;
     2326
     2327            AudioMixBufReleaseReadBlock(&pHstStream->MixBuf, cRead);
    23222328        }
    23232329
  • trunk/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp

    r68132 r70878  
    55
    66/*
    7  * Copyright (C) 2014-2017 Oracle Corporation
     7 * Copyright (C) 2014-2018 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    136136    for (uint32_t i = 0; i < cToRead; i++)
    137137    {
    138         RTTESTI_CHECK_RC_OK(AudioMixBufReadCirc(&mb, &aFrames16, sizeof(aFrames16), &cFramesRead));
     138        RTTESTI_CHECK_RC_OK(AudioMixBufAcquireReadBlock(&mb, &aFrames16, sizeof(aFrames16), &cFramesRead));
    139139        RTTESTI_CHECK(cFramesRead == 1);
     140        AudioMixBufReleaseReadBlock(&mb, cFramesRead);
    140141        AudioMixBufFinish(&mb, cFramesRead);
    141142    }
     
    145146    RTTESTI_CHECK(AudioMixBufUsed(&mb) == cBufSize - cToRead);
    146147
    147     RTTESTI_CHECK_RC_OK(AudioMixBufReadCirc(&mb, &aFrames16, sizeof(aFrames16), &cFramesRead));
     148    RTTESTI_CHECK_RC_OK(AudioMixBufAcquireReadBlock(&mb, &aFrames16, sizeof(aFrames16), &cFramesRead));
    148149    RTTESTI_CHECK(cFramesRead == 1);
     150    AudioMixBufReleaseReadBlock(&mb, cFramesRead);
    149151    AudioMixBufFinish(&mb, cFramesRead);
    150152    RTTESTI_CHECK(AudioMixBufFree(&mb) == cBufSize - cFramesWrittenAbs);
     
    279281        while (cParentSamples)
    280282        {
    281             RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, pvBuf, cbBuf, &cFramesRead));
     283            RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufAcquireReadBlock(&parent, pvBuf, cbBuf, &cFramesRead));
    282284            if (!cFramesRead)
    283285                break;
    284286
     287            AudioMixBufReleaseReadBlock(&parent, cFramesRead);
    285288            AudioMixBufFinish(&parent, cFramesRead);
    286289
     
    379382    for (;;)
    380383    {
    381         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &cFramesRead));
     384        RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufAcquireReadBlock(&parent, achBuf, cbBuf, &cFramesRead));
    382385        if (!cFramesRead)
    383386            break;
    384387        cFramesTotalRead += cFramesRead;
     388        AudioMixBufReleaseReadBlock(&parent, cFramesRead);
    385389        AudioMixBufFinish(&parent, cFramesRead);
    386390    }
     
    477481    for (;;)
    478482    {
    479         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &cFramesRead));
     483        RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufAcquireReadBlock(&parent, achBuf, cbBuf, &cFramesRead));
    480484        if (!cFramesRead)
    481485            break;
    482486        cFramesTotalRead += cFramesRead;
     487        AudioMixBufReleaseReadBlock(&parent, cFramesRead);
    483488        AudioMixBufFinish(&parent, cFramesRead);
    484489    }
     
    567572    for (;;)
    568573    {
    569         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &cFramesRead));
     574        RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufAcquireReadBlock(&parent, achBuf, cbBuf, &cFramesRead));
    570575        if (!cFramesRead)
    571576            break;
    572577        cFramesTotalRead += cFramesRead;
     578        AudioMixBufReleaseReadBlock(&parent, cFramesRead);
    573579        AudioMixBufFinish(&parent, cFramesRead);
    574580    }
     
    598604    for (;;)
    599605    {
    600         RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufReadCirc(&parent, achBuf, cbBuf, &cFramesRead));
     606        RTTESTI_CHECK_RC_OK_BREAK(AudioMixBufAcquireReadBlock(&parent, achBuf, cbBuf, &cFramesRead));
    601607        if (!cFramesRead)
    602608            break;
    603609        cFramesTotalRead += cFramesRead;
     610        AudioMixBufReleaseReadBlock(&parent, cFramesRead);
    604611        AudioMixBufFinish(&parent, cFramesRead);
    605612    }
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