VirtualBox

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


Ignore:
Timestamp:
Dec 2, 2015 3:50:55 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
104466
Message:

HDA: Fixed playing cracks/overdrive, fixed recording assertions.

File:
1 edited

Legend:

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

    r58931 r58954  
    831831static void hdaStreamDestroy(PHDASTREAM pStrmSt);
    832832
    833 static int hdaTransfer(PHDASTATE pThis, ENMSOUNDSOURCE enmSrc, uint32_t *pcbProcessed);
     833static int hdaTransfer(PHDASTATE pThis, ENMSOUNDSOURCE enmSrc, uint32_t cbMax, uint32_t *pcbProcessed);
    834834
    835835#ifdef IN_RING3
     
    15181518    AssertPtrReturnVoid(pThis);
    15191519    AssertPtrReturnVoid(pStrmSt);
    1520     AssertReturnVoid(u8Strm <= 7); /** @todo Use a define for MAX_STRAEMS! */
     1520    AssertReturnVoid(u8Strm <= 7); /** @todo Use a define for MAX_STREAMS! */
    15211521
    15221522    /*
     
    23042304        return;
    23052305
    2306     for (int i = 0; i < 8; i++) /** @todo Use a define. */
     2306    for (int i = 0; i < 8; i++) /** @todo Use a define for MAX_STREAMS! */
    23072307    {
    23082308        uint32_t uDMACnt;
     
    23622362 * @return Number of bytes for the DMA engine to process.
    23632363 */
    2364 DECLINLINE(uint32_t) hdaStreamGetTransferSize(PHDASTATE pThis, PHDASTREAM pStrmSt)
     2364DECLINLINE(uint32_t) hdaStreamGetTransferSize(PHDASTATE pThis, PHDASTREAM pStrmSt, uint32_t cbMax)
    23652365{
    23662366    AssertPtrReturn(pThis, 0);
    23672367    AssertPtrReturn(pStrmSt, 0);
    23682368
     2369    if (!cbMax)
     2370        return 0;
     2371
    23692372    PHDABDLE pBDLE = hdaStreamGetCurrentBDLE(pThis, pStrmSt);
    23702373
     
    23772380        /* Make sure we only copy as much as the stream's FIFO can hold (SDFIFOS, 18.2.39). */
    23782381        cbFree = RT_MIN(cbFree, pStrmSt->u16FIFOS);
     2382
     2383        /* Make sure we only transfer as many bytes as requested. */
     2384        cbFree = RT_MIN(cbFree, cbMax);
    23792385
    23802386        if (pBDLE->State.cbBelowFIFOW)
     
    24472453     * the CBL limit or our internal DMA buffer is full. */
    24482454    bool fNeedsNextBDLE   = (   fCBLLimitReached
    2449                              || pBDLE->State.u32BufOff >= pBDLE->u32BufSize);
     2455                             || (   pBDLE->State.u32BufOff
     2456                                 && pBDLE->State.u32BufOff >= pBDLE->u32BufSize)
     2457                            );
    24502458
    24512459    Assert(u32LPIB                <= pStrmSt->u32CBL);
     
    25572565 *       but "reports bytes" when all conditions are met (FIFOW).
    25582566 */
    2559 static int hdaReadAudio(PHDASTATE pThis, PHDASTREAM pStrmSt, PAUDMIXSINK pSink, uint32_t *pcbRead)
     2567static int hdaReadAudio(PHDASTATE pThis, PHDASTREAM pStrmSt, PAUDMIXSINK pSink, uint32_t cbMax, uint32_t *pcbRead)
    25602568{
    25612569    AssertPtrReturn(pThis,   VERR_INVALID_POINTER);
     
    25682576    int rc;
    25692577    uint32_t cbRead = 0;
    2570     uint32_t cbBuf = hdaStreamGetTransferSize(pThis, pStrmSt);
     2578    uint32_t cbBuf  = hdaStreamGetTransferSize(pThis, pStrmSt, cbMax);
    25712579
    25722580    LogFlowFunc(("cbBuf=%RU32, %R[bdle]\n", cbBuf, pBDLE));
     
    25752583    {
    25762584        /* Nothing to write, bail out. */
    2577         rc = VERR_NO_DATA;
     2585        rc = VINF_EOF;
    25782586    }
    25792587    else
    25802588    {
    2581         uint32_t cbReadFromSink = 0;
    2582         rc = AudioMixerProcessSinkIn(pSink, AUDMIXOP_BLEND, pBDLE->State.au8FIFO, cbBuf, &cbReadFromSink);
     2589        rc = AudioMixerProcessSinkIn(pSink, AUDMIXOP_BLEND, pBDLE->State.au8FIFO, cbBuf, &cbRead);
    25832590        if (RT_SUCCESS(rc))
    25842591        {
    2585             Assert(cbReadFromSink);
    2586             Assert(cbReadFromSink == cbBuf);
    2587             Assert(cbReadFromSink <= pBDLE->u32BufSize - pBDLE->State.u32BufOff);
     2592            Assert(cbRead);
     2593            Assert(cbRead == cbBuf);
     2594            Assert(cbRead <= pBDLE->u32BufSize - pBDLE->State.u32BufOff);
    25882595
    25892596            /*
     
    25922599            rc = PDMDevHlpPCIPhysWrite(pThis->CTX_SUFF(pDevIns),
    25932600                                       pBDLE->u64BufAdr + pBDLE->State.u32BufOff,
    2594                                        pBDLE->State.au8FIFO, cbReadFromSink);
     2601                                       pBDLE->State.au8FIFO, cbRead);
    25952602            AssertRC(rc);
    25962603
    2597             if (pBDLE->State.cbBelowFIFOW + cbReadFromSink > hdaStreamGetFIFOW(pThis, pStrmSt))
     2604            if (pBDLE->State.cbBelowFIFOW + cbRead > hdaStreamGetFIFOW(pThis, pStrmSt))
    25982605            {
    2599                 pBDLE->State.u32BufOff    += cbReadFromSink;
     2606                pBDLE->State.u32BufOff    += cbRead;
    26002607                pBDLE->State.cbBelowFIFOW  = 0;
    26012608                //hdaBackendReadTransferReported(pBDLE, cbDMAData, cbRead, &cbRead, pcbAvail);
     
    26032610            else
    26042611            {
    2605                 pBDLE->State.u32BufOff    += cbReadFromSink;
    2606                 pBDLE->State.cbBelowFIFOW += cbReadFromSink;
     2612                pBDLE->State.u32BufOff    += cbRead;
     2613                pBDLE->State.cbBelowFIFOW += cbRead;
    26072614                Assert(pBDLE->State.cbBelowFIFOW <= hdaStreamGetFIFOW(pThis, pStrmSt));
    26082615                //hdaBackendTransferUnreported(pThis, pBDLE, pStreamDesc, cbRead, pcbAvail);
     
    26132620    }
    26142621
    2615     //Assert(cbRead <= (SDFIFOS(pThis, pStrmSt->u8Strm) + 1));
    2616 
    2617     LogFunc(("BDLE(off:%RU32, size:%RU32), cbTransferred=%RU32, rc=%Rrc\n",
    2618              pBDLE->State.u32BufOff, pBDLE->u32BufSize, cbRead, rc));
     2622    Assert(cbRead <= pStrmSt->u16FIFOS);
    26192623
    26202624    if (RT_SUCCESS(rc))
     
    26242628    }
    26252629
     2630    LogFunc(("Returning cbRead=%RU32, rc=%Rrc\n", cbRead, rc));
    26262631    return rc;
    26272632}
    26282633
    2629 static int hdaWriteAudio(PHDASTATE pThis, PHDASTREAM pStrmSt, uint32_t *pcbWritten)
     2634static int hdaWriteAudio(PHDASTATE pThis, PHDASTREAM pStrmSt, uint32_t cbMax, uint32_t *pcbWritten)
    26302635{
    26312636    AssertPtrReturn(pThis,      VERR_INVALID_POINTER);
     
    26382643
    26392644    uint32_t cbWritten = 0;
    2640     uint32_t cbData    = hdaStreamGetTransferSize(pThis, pStrmSt);
     2645    uint32_t cbData    = hdaStreamGetTransferSize(pThis, pStrmSt, cbMax);
    26412646
    26422647    LogFlowFunc(("cbData=%RU32, %R[bdle]\n", cbData, pBDLE));
     
    29242929    {
    29252930        Assert(cbOutMin != UINT32_MAX);
    2926         hdaTransfer(pThis, PO_INDEX, NULL /* pcbProcessed */); /** @todo Add rc! */
     2931        hdaTransfer(pThis, PO_INDEX, cbOutMin /* cbMax */, NULL /* pcbProcessed */); /** @todo Add rc! */
    29272932    }
    29282933
     
    29312936     */
    29322937    if (cbInMax)
    2933         hdaTransfer(pThis, PI_INDEX, NULL /* pcbProcessed */); /** @todo Add rc! */
     2938        hdaTransfer(pThis, PI_INDEX, cbInMax /* cbMax */, NULL /* pcbProcessed */); /** @todo Add rc! */
    29342939
    29352940    TMTimerSet(pThis->pTimer, TMTimerGet(pThis->pTimer) + pThis->uTicks);
     
    29542959    AssertReturn(cbUser == sizeof(PDMAUDIOCALLBACKDATAIN), VERR_INVALID_PARAMETER);
    29552960
    2956     return hdaTransfer(pCtx->pThis, PI_INDEX, &pData->cbOutRead);
     2961    return hdaTransfer(pCtx->pThis, PI_INDEX, UINT32_MAX, &pData->cbOutRead);
    29572962}
    29582963
     
    29732978    PHDASTATE pThis = pCtx->pThis;
    29742979
    2975     int rc = hdaTransfer(pCtx->pThis, PO_INDEX, &pData->cbOutWritten);
     2980    int rc = hdaTransfer(pCtx->pThis, PO_INDEX, UINT32_MAX, &pData->cbOutWritten);
    29762981    if (   RT_SUCCESS(rc)
    29772982        && pData->cbOutWritten)
     
    29882993#endif /* VBOX_WITH_AUDIO_CALLBACKS */
    29892994
    2990 static int hdaTransfer(PHDASTATE pThis, ENMSOUNDSOURCE enmSrc, uint32_t *pcbProcessed)
     2995static int hdaTransfer(PHDASTATE pThis, ENMSOUNDSOURCE enmSrc, uint32_t cbMax, uint32_t *pcbProcessed)
    29912996{
    29922997    AssertPtrReturn(pThis, VERR_INVALID_POINTER);
    29932998    /* pcbProcessed is optional. */
    29942999
    2995     LogFlowFunc(("enmSrc=%RU32\n", enmSrc));
     3000    LogFlowFunc(("enmSrc=%RU32, cbMax=%RU32\n", enmSrc, cbMax));
    29963001
    29973002    PHDASTREAM pStrmSt;
     
    30453050    }
    30463051
    3047     Assert(pStrmSt->u8Strm <= 7); /** @todo Use a define for MAX_STRAEMS! */
     3052    Assert(pStrmSt->u8Strm <= 7); /** @todo Use a define for MAX_STREAMS! */
    30483053    Assert(pStrmSt->u64BaseDMA);
    30493054    Assert(pStrmSt->u32CBL);
    30503055
    30513056    int      rc;
     3057    uint32_t cbToProcess      = cbMax;
    30523058    uint32_t cbProcessedTotal = 0;
    30533059    bool     fIsComplete      = false;
    30543060
    3055     do
     3061    while (cbToProcess)
    30563062    {
    30573063        /* Do we need to fetch the next Buffer Descriptor Entry (BDLE)? */
     
    30663072        {
    30673073            case PI_INDEX:
    3068                 rc = hdaReadAudio(pThis, pStrmSt, pThis->pSinkLineIn, &cbProcessed);
     3074                rc = hdaReadAudio(pThis, pStrmSt, pThis->pSinkLineIn, cbToProcess, &cbProcessed);
    30693075                break;
    30703076            case PO_INDEX:
    3071                 rc = hdaWriteAudio(pThis, pStrmSt, &cbProcessed);
     3077                rc = hdaWriteAudio(pThis, pStrmSt, cbToProcess, &cbProcessed);
    30723078                break;
    30733079#ifdef VBOX_WITH_HDA_MIC_IN
    30743080            case MC_INDEX:
    3075                 rc = hdaReadAudio(pThis, pStrmSt, pThis->pSinkMicIn, &cbProcessed);
     3081                rc = hdaReadAudio(pThis, pStrmSt, pThis->pSinkMicIn, cbToProcess, &cbProcessed);
    30763082                break;
    30773083#endif
     
    30903096        hdaStreamTransferUpdate(pThis, pStrmSt, cbProcessed);
    30913097
     3098        cbToProcess      -= RT_MIN(cbToProcess,  cbProcessed);
    30923099        cbProcessedTotal += cbProcessed;
    30933100
    3094         LogFlowFunc(("cbProcessed=%RU32, cbProcessedTotal=%RU32, rc=%Rrc\n", cbProcessed, cbProcessedTotal, rc));
     3101        LogFlowFunc(("cbProcessed=%RU32, cbToProcess=%RU32, cbProcessedTotal=%RU32, rc=%Rrc\n",
     3102                     cbProcessed, cbToProcess, cbProcessedTotal, rc));
    30953103
    30963104        if (rc == VINF_EOF)
     
    31003108            fIsComplete = hdaStreamTransferIsComplete(pThis, pStrmSt);
    31013109
    3102     } while (!fIsComplete);
     3110        if (fIsComplete)
     3111            break;
     3112    }
    31033113
    31043114    if (RT_SUCCESS(rc))
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