VirtualBox

Changeset 67467 in vbox


Ignore:
Timestamp:
Jun 19, 2017 10:27:57 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
116203
Message:

Audio/DevHDA: Cleaned up hdaStreamRead() / hdaStreamWrite().

File:
1 edited

Legend:

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

    r67462 r67467  
    48764876    AssertPtr(pCircBuf);
    48774877
    4878     void *pvDst;
    4879     size_t cbDst;
    4880 
    4881     uint32_t cbWritten = 0;
    4882 
    4883     RTCircBufAcquireWriteBlock(pCircBuf, cbToWrite, &pvDst, &cbDst);
    4884 
    4885     if (cbDst)
    4886     {
    4887         int rc2 = AudioMixerSinkRead(pSink->pMixSink, AUDMIXOP_COPY, pvDst, (uint32_t)cbDst, &cbWritten);
    4888         AssertRC(rc2);
    4889 
    4890         Assert(cbDst >= cbWritten);
    4891         Log2Func(("[SD%RU8]: %zu/%zu bytes written\n", pStream->u8SD, cbWritten, cbDst));
     4878    int rc = VINF_SUCCESS;
     4879
     4880    uint32_t cbWrittenTotal = 0;
     4881    uint32_t cbLeft         = RT_MIN(cbToWrite, (uint32_t)RTCircBufFree(pCircBuf));
     4882
     4883    while (cbLeft)
     4884    {
     4885        void *pvDst;
     4886        size_t cbDst;
     4887
     4888        uint32_t cbRead = 0;
     4889
     4890        RTCircBufAcquireWriteBlock(pCircBuf, cbToWrite, &pvDst, &cbDst);
     4891
     4892        if (cbDst)
     4893        {
     4894            rc = AudioMixerSinkRead(pSink->pMixSink, AUDMIXOP_COPY, pvDst, (uint32_t)cbDst, &cbRead);
     4895            AssertRC(rc);
     4896
     4897            Assert(cbDst >= cbRead);
     4898            Log2Func(("[SD%RU8]: %zu/%zu bytes read\n", pStream->u8SD, cbRead, cbDst));
    48924899
    48934900#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
    4894         RTFILE fh;
    4895         RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaStreamWrite.pcm",
    4896                    RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
    4897         RTFileWrite(fh, pvDst, cbWritten, NULL);
    4898         RTFileClose(fh);
    4899 #endif
    4900     }
    4901 
    4902     RTCircBufReleaseWriteBlock(pCircBuf, cbWritten);
     4901            RTFILE fh;
     4902            RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaStreamWrite.pcm",
     4903                       RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
     4904            RTFileWrite(fh, pvDst, cbRead, NULL);
     4905            RTFileClose(fh);
     4906#endif
     4907        }
     4908
     4909        RTCircBufReleaseWriteBlock(pCircBuf, cbRead);
     4910
     4911        if (RT_FAILURE(rc))
     4912            break;
     4913
     4914        Assert(cbLeft  >= cbRead);
     4915        cbLeft         -= cbRead;
     4916
     4917        cbWrittenTotal += cbRead;
     4918    }
    49034919
    49044920    if (pcbWritten)
    4905         *pcbWritten = cbWritten;
    4906 
    4907     return VINF_SUCCESS;
     4921        *pcbWritten = cbWrittenTotal;
     4922
     4923    return rc;
    49084924}
    49094925
     
    49384954    AssertPtr(pCircBuf);
    49394955
    4940     void *pvSrc;
    4941     size_t cbSrc;
    4942 
    4943     uint32_t cbRead = 0;
    4944 
    4945     RTCircBufAcquireReadBlock(pCircBuf, cbToRead, &pvSrc, &cbSrc);
    4946 
    4947     if (cbSrc)
    4948     {
    4949         Log2Func(("[SD%RU8]: Reading %zu bytes ...\n", pStream->u8SD, cbSrc));
    4950 
     4956    int rc = VINF_SUCCESS;
     4957
     4958    uint32_t cbReadTotal = 0;
     4959    uint32_t cbLeft      = RT_MIN(cbToRead, (uint32_t)RTCircBufUsed(pCircBuf));
     4960
     4961    while (cbLeft)
     4962    {
     4963        void *pvSrc;
     4964        size_t cbSrc;
     4965
     4966        uint32_t cbWritten = 0;
     4967
     4968        RTCircBufAcquireReadBlock(pCircBuf, cbToRead, &pvSrc, &cbSrc);
     4969
     4970        if (cbSrc)
     4971        {
    49514972#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
    4952         RTFILE fh;
    4953         RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaStreamRead.pcm",
    4954                    RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
    4955         RTFileWrite(fh, pvSrc, cbSrc, NULL);
    4956         RTFileClose(fh);
    4957 #endif
    4958         int rc2 = AudioMixerSinkWrite(pSink->pMixSink, AUDMIXOP_COPY, pvSrc, (uint32_t)cbSrc, &cbRead);
    4959         AssertRC(rc2);
    4960 
    4961         Assert(cbSrc >= cbRead);
    4962         Log2Func(("[SD%RU8]: %zu/%zu bytes read\n", pStream->u8SD, cbRead, cbSrc));
    4963     }
    4964 
    4965     RTCircBufReleaseReadBlock(pCircBuf, cbRead);
     4973            RTFILE fh;
     4974            RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaStreamRead.pcm",
     4975                       RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
     4976            RTFileWrite(fh, pvSrc, cbSrc, NULL);
     4977            RTFileClose(fh);
     4978#endif
     4979            rc = AudioMixerSinkWrite(pSink->pMixSink, AUDMIXOP_COPY, pvSrc, (uint32_t)cbSrc, &cbWritten);
     4980            AssertRC(rc);
     4981
     4982            Assert(cbSrc >= cbWritten);
     4983            Log2Func(("[SD%RU8]: %zu/%zu bytes read\n", pStream->u8SD, cbWritten, cbSrc));
     4984        }
     4985
     4986        RTCircBufReleaseReadBlock(pCircBuf, cbWritten);
     4987
     4988        if (RT_FAILURE(rc))
     4989            break;
     4990
     4991        Assert(cbLeft  >= cbWritten);
     4992        cbLeft         -= cbWritten;
     4993
     4994        cbReadTotal    += cbWritten;
     4995    }
    49664996
    49674997    if (pcbRead)
    4968         *pcbRead = cbRead;
    4969 
    4970     return VINF_SUCCESS;
     4998        *pcbRead = cbReadTotal;
     4999
     5000    return rc;
    49715001}
    49725002
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