VirtualBox

Changeset 65739 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Feb 10, 2017 4:12:36 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
113454
Message:

AudioMixBuffer: Added AudioMixBufPeekMutable().

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

Legend:

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

    r65694 r65739  
    199199    if (pcSamplesRead)
    200200        *pcSamplesRead = cRead;
     201
     202    return rc;
     203}
     204
     205/**
     206 * Returns a mutable pointer to the mixing buffer's audio sample buffer for writing raw
     207 * audio samples.
     208 *
     209 * @return  IPRT status code. VINF_TRY_AGAIN for getting next pointer at beginning (circular).
     210 * @param   pMixBuf                 Mixing buffer to acquire audio samples from.
     211 * @param   cSamples                Number of requested audio samples to write.
     212 * @param   ppvSamples              Returns a mutable pointer to the buffer's audio sample data.
     213 * @param   pcSamplesToWrite        Number of available audio samples to write.
     214 *
     215 * @remark  This function is not thread safe!
     216 */
     217int AudioMixBufPeekMutable(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples,
     218                           PPDMAUDIOSAMPLE *ppvSamples, uint32_t *pcSamplesToWrite)
     219{
     220    AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER);
     221    AssertPtrReturn(ppvSamples, VERR_INVALID_POINTER);
     222    AssertPtrReturn(pcSamplesToWrite, VERR_INVALID_POINTER);
     223
     224    int rc;
     225
     226    if (!cSamples)
     227    {
     228        *pcSamplesToWrite = 0;
     229        return VINF_SUCCESS;
     230    }
     231
     232    uint32_t cSamplesToWrite;
     233    if (pMixBuf->offWrite + cSamples > pMixBuf->cSamples)
     234    {
     235        cSamplesToWrite = pMixBuf->cSamples - pMixBuf->offWrite;
     236        rc = VINF_TRY_AGAIN;
     237    }
     238    else
     239    {
     240        cSamplesToWrite = cSamples;
     241        rc = VINF_SUCCESS;
     242    }
     243
     244    *ppvSamples = &pMixBuf->pSamples[pMixBuf->offWrite];
     245    AssertPtr(ppvSamples);
     246
     247    pMixBuf->offWrite = (pMixBuf->offWrite + cSamplesToWrite) % pMixBuf->cSamples;
     248    Assert(pMixBuf->offWrite <= pMixBuf->cSamples);
     249    pMixBuf->cUsed += RT_MIN(cSamplesToWrite, pMixBuf->cUsed);
     250
     251    *pcSamplesToWrite = cSamplesToWrite;
    201252
    202253    return rc;
  • trunk/src/VBox/Devices/Audio/AudioMixBuffer.h

    r65630 r65739  
    6161int AudioMixBufMixToParent(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples, uint32_t *pcProcessed);
    6262int AudioMixBufPeek(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamplesToRead, PPDMAUDIOSAMPLE paSampleBuf, uint32_t cSampleBuf, uint32_t *pcSamplesRead);
     63int AudioMixBufPeekMutable(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamplesToRead, PPDMAUDIOSAMPLE *ppvSamples, uint32_t *pcSamplesRead);
    6364uint32_t AudioMixBufUsed(PPDMAUDIOMIXBUF pMixBuf);
    6465int AudioMixBufReadAt(PPDMAUDIOMIXBUF pMixBuf, uint32_t offSamples, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead);
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