VirtualBox

Changeset 67826 in vbox


Ignore:
Timestamp:
Jul 6, 2017 2:13:48 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
116758
Message:

Audio/DevIchAc97.cpp: Fixes for ichac97StreamRead().

File:
1 edited

Legend:

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

    r67806 r67826  
    911911    /* pcbRead is optional. */
    912912
     913    int rc = VINF_SUCCESS;
     914
     915    uint32_t cbReadTotal = 0;
     916
    913917    PRTCIRCBUF pCircBuf = pSrcStream->State.pCircBuf;
    914918    AssertPtr(pCircBuf);
     
    917921    size_t cbSrc;
    918922
    919     uint32_t cbWritten = 0;
    920 
    921     RTCircBufAcquireReadBlock(pCircBuf, cbToRead, &pvSrc, &cbSrc);
    922 
    923     if (cbSrc)
    924     {
     923    while (cbToRead)
     924    {
     925        uint32_t cbWritten = 0;
     926
     927        RTCircBufAcquireReadBlock(pCircBuf, cbToRead, &pvSrc, &cbSrc);
     928
     929        if (cbSrc)
     930        {
    925931#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
    926         RTFILE fh;
    927         RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "ac97StreamRead.pcm",
    928                    RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
    929         RTFileWrite(fh, pvSrc, cbSrc, NULL);
    930         RTFileClose(fh);
     932            RTFILE fh;
     933            RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "ac97StreamRead.pcm",
     934                       RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
     935            RTFileWrite(fh, pvSrc, cbSrc, NULL);
     936            RTFileClose(fh);
    931937#endif
    932         int rc2 = AudioMixerSinkWrite(pDstMixSink, AUDMIXOP_COPY, pvSrc, (uint32_t)cbSrc, &cbWritten);
    933         AssertRC(rc2);
    934 
    935 #ifdef DEBUG_andy
    936         Assert(cbWritten == cbSrc);
    937 #endif
    938     }
    939 
    940     RTCircBufReleaseReadBlock(pCircBuf, cbWritten);
     938            rc = AudioMixerSinkWrite(pDstMixSink, AUDMIXOP_COPY, pvSrc, (uint32_t)cbSrc, &cbWritten);
     939            if (RT_SUCCESS(rc))
     940            {
     941                Assert(cbWritten <= cbSrc);
     942
     943                cbReadTotal += cbWritten;
     944
     945                Assert(cbToRead >= cbWritten);
     946                cbToRead    -= cbWritten;
     947            }
     948        }
     949
     950        RTCircBufReleaseReadBlock(pCircBuf, cbWritten);
     951
     952        if (   !cbWritten
     953            || !RTCircBufUsed(pCircBuf))
     954               break;
     955
     956        if (RT_FAILURE(rc))
     957            break;
     958    }
    941959
    942960    if (pcbRead)
    943         *pcbRead = cbWritten;
    944 
    945     return VINF_SUCCESS;
     961        *pcbRead = cbReadTotal;
     962
     963    return rc;
    946964}
    947965
     
    12491267            {
    12501268                /* Read (guest output) data and write it to the stream's sink. */
    1251                 rc2 = ichac97StreamRead(pThis, pStream, pSink, cbUsed, NULL /* pcbRead */);
     1269                uint32_t cbRead;
     1270                rc2 = ichac97StreamRead(pThis, pStream, pSink, cbUsed, &cbRead);
    12521271                AssertRC(rc2);
     1272
     1273                AssertMsg(cbUsed == cbRead, ("[SD%RU8] %RU32 bytes announced to be ready to read but %RU32 bytes read\n",
     1274                                             pStream->u8SD, cbUsed, cbRead));
    12531275            }
    12541276
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