VirtualBox

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


Ignore:
Timestamp:
Dec 28, 2016 11:21:57 AM (8 years ago)
Author:
vboxsync
Message:

Audio: Update for async / non-async I/O code paths.

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

Legend:

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

    r65013 r65018  
    46474647    {
    46484648        int rc2;
     4649        uint32_t cbDMA = 0;
    46494650
    46504651        if (hdaGetDirFromSD(pStream->u8SD) == PDMAUDIODIR_OUT) /* Output (SDO). */
     
    46564657             */
    46574658
    4658             uint8_t  abFIFO[HDA_FIFO_MAX + 1];
    4659             uint32_t cbProcessed = 0;
     4659            uint8_t abFIFO[HDA_FIFO_MAX + 1];
     4660            size_t  offFIFO = 0;
    46604661
    46614662            /* Do one DMA transfer with FIFOS size at a time. */
    4662             rc2 = hdaStreamDoDMA(pThis, pStream, abFIFO, sizeof(abFIFO), (uint32_t)pStream->u16FIFOS /* cbToProcess */,
    4663                                  &cbProcessed);
     4663            rc2 = hdaStreamDoDMA(pThis, pStream, abFIFO, sizeof(abFIFO), (uint32_t)pStream->u16FIFOS /* cbToProcess */, &cbDMA);
    46644664            AssertRC(rc2);
    46654665
    4666             if (cbProcessed)
     4666            uint32_t cbDMALeft = cbDMA;
     4667
     4668            while (   cbDMALeft
     4669                   && RTCircBufFree(pCircBuf))
    46674670            {
    46684671                void *pvDst;
    46694672                size_t cbDst;
    46704673
    4671                 Assert(pStream->u16FIFOS);
    4672                 RTCircBufAcquireWriteBlock(pCircBuf, cbProcessed, &pvDst, &cbDst);
     4674                RTCircBufAcquireWriteBlock(pCircBuf, cbDMALeft, &pvDst, &cbDst);
    46734675
    46744676                if (cbDst)
    46754677                {
    4676                     Assert(cbDst == cbProcessed);
    4677                     memcpy(pvDst, abFIFO, cbDst);
     4678                    memcpy(pvDst, abFIFO + offFIFO, cbDst);
     4679
     4680                    offFIFO += cbDst;
     4681                    Assert(offFIFO <= sizeof(abFIFO));
    46784682                }
    46794683
    46804684                RTCircBufReleaseWriteBlock(pCircBuf, cbDst);
     4685
     4686                Assert(cbDst <= cbDMALeft);
     4687                cbDMALeft -= (uint32_t)cbDst;
    46814688            }
    46824689
     4690#ifdef DEBUG_andy
     4691            AssertMsg(cbDMALeft == 0, ("%RU32 bytes of DMA data left, CircBuf=%zu/%zu\n",
     4692                                       cbDMALeft, RTCircBufUsed(pCircBuf), RTCircBufSize(pCircBuf)));
     4693#endif
    46834694            /*
    46844695             * Process backends.
     
    46924703                hdaStreamAsyncIONotify(pThis, pStream);
    46934704#else
     4705                /* Read audio data from the HDA stream and write to the backends. */
    46944706                rc2 = hdaStreamRead(pThis, pStream, cbUsed, NULL /* pcbRead */);
    46954707                AssertRC(rc2);
    46964708#endif
     4709            }
     4710
     4711            /* All DMA transfers done for now? */
     4712            if (   !cbDMA
     4713#ifndef VBOX_WITH_AUDIO_AC97_ASYNC_IO
     4714            /* All data read *and* processed for now? */
     4715                && RTCircBufUsed(pCircBuf) == 0
     4716#endif
     4717               )
     4718            {
     4719                fDone = true;
    46974720            }
    46984721
     
    47014724            AssertRC(rc2);
    47024725#endif
    4703             if (!cbProcessed)
    4704                 fDone = true;
    4705 
    47064726            STAM_PROFILE_STOP(&pThis->StatOut, a);
    47074727        }
     
    47214741            AssertRC(rc2);
    47224742
     4743            /* Write read data from the backend to the HDA stream. */
    47234744            rc2 = hdaStreamWrite(pThis, pStream, pStream->u16FIFOS, NULL /* pcbWritten */);
    47244745            AssertRC(rc2);
     
    47334754            RTCircBufAcquireReadBlock(pCircBuf, pStream->u16FIFOS, &pvSrc, &cbSrc);
    47344755
    4735             uint32_t cbProcessed = 0;
    4736 
    47374756            if (cbSrc)
    47384757            {
    47394758                /* Do one DMA transfer with FIFOS size at a time. */
    4740                 rc2 = hdaStreamDoDMA(pThis, pStream, pvSrc, (uint32_t)cbSrc, (uint32_t)cbSrc /* cbToProcess */, &cbProcessed);
     4759                rc2 = hdaStreamDoDMA(pThis, pStream, pvSrc, (uint32_t)cbSrc, (uint32_t)cbSrc /* cbToProcess */, &cbDMA);
    47414760                AssertRC(rc2);
    47424761            }
    47434762
    4744             RTCircBufReleaseReadBlock(pCircBuf, cbProcessed);
    4745 
    4746             if (!cbProcessed)
     4763            RTCircBufReleaseReadBlock(pCircBuf, cbDMA);
     4764
     4765            if (!cbDMA)
    47474766                fDone = true;
    47484767
  • trunk/src/VBox/Devices/Audio/DevIchAc97.cpp

    r65014 r65018  
    6666/** Default timer frequency (in Hz). */
    6767#define AC97_TIMER_HZ       100
     68
     69/** Maximum FIFO size (in bytes). */
     70#define AC97_FIFO_MAX       256
    6871
    6972#define AC97_SR_FIFOE RT_BIT(4)          /* rwc, FIFO error. */
     
    473476static int                ichac97StreamReOpen(PAC97STATE pThis, PAC97STREAM pStream);
    474477static int                ichac97StreamClose(PAC97STATE pThis, PAC97STREAM pStream);
     478static void               ichac97StreamReset(PAC97STATE pThis, PAC97STREAM pStream);
    475479
    476480static DECLCALLBACK(void) ichac97Reset(PPDMDEVINS pDevIns);
     
    691695    pRegs->lvi      = 0;
    692696
     697    ichac97StreamReset(pThis, pStream);
     698
    693699    ichac97StreamEnable(pThis, pStream, false /* fEnable */);
    694700
     
    913919        int rc2 = AudioMixerSinkWrite(pDstMixSink, AUDMIXOP_COPY, pvSrc, (uint32_t)cbSrc, &cbWritten);
    914920        AssertRC(rc2);
     921
     922#ifdef DEBUG_andy
     923        Assert(cbWritten == cbSrc);
     924#endif
    915925    }
    916926
     
    11791189    bool fDone = false;
    11801190
    1181     LogFunc(("[SD%RU8] Started\n", pStream->u8Strm));
     1191    Log3Func(("[SD%RU8] Started\n", pStream->u8Strm));
    11821192
    11831193    while (!fDone)
    11841194    {
    11851195        int rc2;
    1186         uint32_t cbProcessed = 0;
     1196        uint32_t cbDMA = 0;
    11871197
    11881198        if (pStream->u8Strm == AC97SOUNDSOURCE_PO_INDEX) /* Output. */
     
    11931203             * Read from DMA.
    11941204             */
    1195 
    1196             void *pvDst;
    1197             size_t cbDst;
    1198 
    1199             RTCircBufAcquireWriteBlock(pCircBuf, 256 /** @todo */, &pvDst, &cbDst);
    1200 
    1201             if (cbDst)
     1205            uint8_t abFIFO[AC97_FIFO_MAX + 1];
     1206            size_t  offFIFO = 0;
     1207
     1208            /* Do one DMA transfer with FIFOS size at a time. */
     1209            rc2 = ichac97DoDMA(pThis, pStream, abFIFO, sizeof(abFIFO), AC97_FIFO_MAX /** @todo FIFOS? */, &cbDMA);
     1210            AssertRC(rc2);
     1211
     1212            uint32_t cbDMALeft = cbDMA;
     1213
     1214            while (   cbDMALeft
     1215                   && RTCircBufFree(pCircBuf))
    12021216            {
    1203                 /* Do one DMA transfer with FIFOS size at a time. */
    1204                 rc2 = ichac97DoDMA(pThis, pStream, pvDst, (uint32_t)cbDst, (uint32_t)cbDst /* cbToProcess */, &cbProcessed);
    1205                 AssertRC(rc2);
     1217                Log3Func(("[SD%RU8] cbLeft=%RU32\n", pStream->u8Strm, cbDMALeft));
     1218
     1219                void *pvDst;
     1220                size_t cbDst;
     1221
     1222                RTCircBufAcquireWriteBlock(pCircBuf, cbDMALeft, &pvDst, &cbDst);
     1223
     1224                if (cbDst)
     1225                {
     1226                    memcpy(pvDst, abFIFO + offFIFO, cbDst);
     1227
     1228                    offFIFO += cbDst;
     1229                    Assert(offFIFO <= sizeof(abFIFO));
     1230                }
     1231
     1232                RTCircBufReleaseWriteBlock(pCircBuf, cbDst);
     1233
     1234                Assert(cbDst <= cbDMALeft);
     1235                cbDMALeft -= (uint32_t)cbDst;
    12061236            }
    12071237
    1208             RTCircBufReleaseWriteBlock(pCircBuf, cbProcessed);
    1209 
     1238#ifdef DEBUG_andy
     1239            AssertMsg(cbDMALeft == 0, ("%RU32 bytes of DMA data left, CircBuf=%zu/%zu\n",
     1240                                       cbDMALeft, RTCircBufUsed(pCircBuf), RTCircBufSize(pCircBuf)));
     1241#endif
    12101242            /*
    12111243             * Process backends.
     
    12161248            if (cbUsed)
    12171249            {
     1250                Log3Func(("[SD%RU8] cbUsed=%RU32\n", pStream->u8Strm, cbUsed));
     1251
    12181252#ifdef VBOX_WITH_AUDIO_AC97_ASYNC_IO
    12191253                /* Let the asynchronous thread know that there is some new data to process. */
     
    12211255#else
    12221256                /* Read audio data from the AC'97 stream and write to the backends. */
    1223                 rc2 = ichac97StreamRead(pThis, pStream, pMixSink, cbProcessed, NULL /* pcbRead */);
     1257                rc2 = ichac97StreamRead(pThis, pStream, pMixSink, cbUsed, NULL /* pcbRead */);
    12241258                AssertRC(rc2);
    12251259#endif
     
    12271261
    12281262            /* All DMA transfers done for now? */
    1229             if (   !cbProcessed
     1263            if (   !cbDMA
    12301264#ifndef VBOX_WITH_AUDIO_AC97_ASYNC_IO
    12311265            /* All data read *and* processed for now? */
     
    12661300             * Write to DMA.
    12671301             */
    1268 
    12691302            void *pvSrc;
    12701303            size_t cbSrc;
     
    12751308            {
    12761309                /* Do one DMA transfer with FIFOS size at a time. */
    1277                 rc2 = ichac97DoDMA(pThis, pStream, pvSrc, (uint32_t)cbSrc, (uint32_t)cbSrc /* cbToProcess */, &cbProcessed);
     1310                rc2 = ichac97DoDMA(pThis, pStream, pvSrc, (uint32_t)cbSrc, (uint32_t)cbSrc /* cbToProcess */, &cbDMA);
    12781311                AssertRC(rc2);
    12791312            }
    12801313
    1281             RTCircBufReleaseReadBlock(pCircBuf, cbProcessed);
     1314            RTCircBufReleaseReadBlock(pCircBuf, cbDMA);
    12821315
    12831316            /* All DMA transfers done for now? */
    1284             if (!cbProcessed)
     1317            if (!cbDMA)
    12851318                fDone = true;
    12861319
     
    16161649    AssertPtrReturnVoid(pStream);
    16171650
    1618     LogFlowFunc(("[SD%RU8]\n", pStream->u8Strm));
     1651    LogFunc(("[SD%RU8] Reset\n", pStream->u8Strm));
    16191652
    16201653#ifdef VBOX_WITH_AUDIO_AC97_ASYNC_IO
     
    19842017                        uint32_t cbToProcess, uint32_t *pcbProcessed)
    19852018{
    1986     AssertPtrReturn(pThis,   VERR_INVALID_POINTER);
    1987     AssertPtrReturn(pStream, VERR_INVALID_POINTER);
     2019    AssertPtrReturn(pThis,             VERR_INVALID_POINTER);
     2020    AssertPtrReturn(pStream,           VERR_INVALID_POINTER);
     2021    AssertPtrReturn(pvBuf,             VERR_INVALID_POINTER);
     2022    AssertReturn(cbBuf >= cbToProcess, VERR_INVALID_PARAMETER);
    19882023    /* pcbProcessed is optional. */
    19892024
     
    21012136        {
    21022137            cbTotal     += cbChunk;
     2138            Assert(cbTotal <= cbToProcess);
    21032139            Assert(cbLeft >= cbChunk);
    21042140            cbLeft      -= cbChunk;
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