VirtualBox

Changeset 88160 in vbox


Ignore:
Timestamp:
Mar 17, 2021 3:45:09 PM (4 years ago)
Author:
vboxsync
Message:

DevHDA: Merged hdaR3StreamRead into hdaR3StreamPushToMixer. bugref:9890

File:
1 edited

Legend:

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

    r88159 r88160  
    10541054        return (uint32_t)RTCircBufFree(pStreamR3->State.pCircBuf);
    10551055    return 0;
    1056 }
    1057 
    1058 /**
    1059  * Reads audio data from an HDA stream's DMA buffer and writes into a specified mixer sink.
    1060  *
    1061  * @returns IPRT status code.
    1062  * @param   pStreamR3           HDA stream to read audio data from (ring-3).
    1063  * @param   cbToRead            Number of bytes to read.
    1064  * @param   pcbRead             Number of bytes read. Optional.
    1065  */
    1066 static int hdaR3StreamRead(PHDASTREAMR3 pStreamR3, uint32_t cbToRead, uint32_t *pcbRead)
    1067 {
    1068     Assert(cbToRead);
    1069 
    1070     PHDAMIXERSINK pSink = pStreamR3->pMixSink;
    1071     AssertMsgReturnStmt(pSink, ("[SD%RU8] Can't read from a stream with no sink attached\n", pStreamR3->u8SD),
    1072                         if (pcbRead) *pcbRead = 0,
    1073                         VINF_SUCCESS);
    1074 
    1075     PRTCIRCBUF pCircBuf = pStreamR3->State.pCircBuf;
    1076     AssertPtr(pCircBuf);
    1077 
    1078     int rc = VINF_SUCCESS;
    1079 
    1080     uint32_t cbReadTotal = 0;
    1081     uint32_t cbLeft      = RT_MIN(cbToRead, (uint32_t)RTCircBufUsed(pCircBuf));
    1082 
    1083     while (cbLeft)
    1084     {
    1085         void *pvSrc;
    1086         size_t cbSrc;
    1087 
    1088         uint32_t cbWritten = 0;
    1089 
    1090         RTCircBufAcquireReadBlock(pCircBuf, cbLeft, &pvSrc, &cbSrc);
    1091 
    1092         if (cbSrc)
    1093         {
    1094             if (pStreamR3->Dbg.Runtime.fEnabled)
    1095                 DrvAudioHlpFileWrite(pStreamR3->Dbg.Runtime.pFileStream, pvSrc, cbSrc, 0 /* fFlags */);
    1096 
    1097             rc = AudioMixerSinkWrite(pSink->pMixSink, AUDMIXOP_COPY, pvSrc, (uint32_t)cbSrc, &cbWritten);
    1098             AssertRC(rc);
    1099             Assert(cbSrc >= cbWritten);
    1100 
    1101             Log2Func(("[SD%RU8] %#RX32/%#zx bytes read @ %#RX64\n", pStreamR3->u8SD, cbWritten, cbSrc, pStreamR3->State.offRead));
    1102 #ifdef VBOX_WITH_DTRACE
    1103             VBOXDD_HDA_STREAM_AIO_OUT(pStreamR3->u8SD, (uint32_t)cbSrc, pStreamR3->State.offRead);
    1104 #endif
    1105             pStreamR3->State.offRead += cbSrc;
    1106         }
    1107 
    1108         RTCircBufReleaseReadBlock(pCircBuf, cbWritten);
    1109 
    1110         if (   !cbWritten /* Nothing written? */
    1111             || RT_FAILURE(rc))
    1112             break;
    1113 
    1114         Assert(cbLeft  >= cbWritten);
    1115         cbLeft         -= cbWritten;
    1116 
    1117         cbReadTotal    += cbWritten;
    1118     }
    1119 
    1120     if (pcbRead)
    1121         *pcbRead = cbReadTotal;
    1122 
    1123     return rc;
    11241056}
    11251057
     
    19901922static void hdaR3StreamPushToMixer(PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, PAUDMIXSINK pSink, uint64_t nsNow)
    19911923{
     1924    /*
     1925     * Figure how much that we can push down.
     1926     */
    19921927    uint32_t const cbSinkWritable     = AudioMixerSinkGetWritable(pSink);
    19931928    uint32_t const cbStreamReadable   = hdaR3StreamGetUsed(pStreamR3);
     
    20011936    RT_NOREF(pStreamShared, nsNow);
    20021937
    2003     if (cbToReadFromStream)
    2004     {
    2005         /* Read (guest output) data and write it to the stream's sink. */
    2006         int rc2 = hdaR3StreamRead(pStreamR3, cbToReadFromStream, NULL /* pcbRead */);
    2007         AssertRC(rc2);
     1938    /*
     1939     * Do the pushing.
     1940     */
     1941    Assert(pStreamR3->State.pCircBuf);
     1942    while (cbToReadFromStream > 0)
     1943    {
     1944        void /*const*/ *pvSrcBuf;
     1945        size_t          cbSrcBuf;
     1946        RTCircBufAcquireReadBlock(pStreamR3->State.pCircBuf, cbToReadFromStream, &pvSrcBuf, &cbSrcBuf);
     1947
     1948        if (!pStreamR3->Dbg.Runtime.fEnabled)
     1949        { /* likely */ }
     1950        else
     1951            DrvAudioHlpFileWrite(pStreamR3->Dbg.Runtime.pFileStream, pvSrcBuf, cbSrcBuf, 0 /* fFlags */);
     1952
     1953        uint32_t cbWritten = 0;
     1954        int rc = AudioMixerSinkWrite(pSink, AUDMIXOP_COPY, pvSrcBuf, (uint32_t)cbSrcBuf, &cbWritten);
     1955        AssertRC(rc);
     1956        Assert(cbWritten <= cbSrcBuf);
     1957
     1958        Log2Func(("[SD%RU8] %#RX32/%#zx bytes read @ %#RX64\n", pStreamR3->u8SD, cbWritten, cbSrcBuf, pStreamR3->State.offRead));
     1959#ifdef VBOX_WITH_DTRACE
     1960        VBOXDD_HDA_STREAM_AIO_OUT(pStreamR3->u8SD, cbWritten, pStreamR3->State.offRead);
     1961#endif
     1962        pStreamR3->State.offRead += cbWritten;
     1963
     1964        RTCircBufReleaseReadBlock(pStreamR3->State.pCircBuf, cbWritten);
     1965
     1966        /* advance */
     1967        cbToReadFromStream -= cbWritten;
    20081968    }
    20091969
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