VirtualBox

Changeset 34154 in vbox


Ignore:
Timestamp:
Nov 18, 2010 8:09:08 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67874
Message:

Audio/HDA: update pos buf routine. force underFifow reservation.

File:
1 edited

Legend:

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

    r34153 r34154  
    626626};
    627627
     628static void inline hdaUpdatePosBuf(INTELHDLinkState *pState, uint8_t u8Strm, uint32_t u32Value)
     629{
     630    if (pState->u64DPBase & DPBASE_ENABLED)
     631        PDMDevHlpPhysWrite(ICH6_HDASTATE_2_DEVINS(pState),
     632                       (pState->u64DPBase & DPBASE_ADDR_MASK) + u8Strm*8, &u32Value, sizeof(uint32_t));
     633}
    628634static uint32_t inline hdaFifoWToSz(INTELHDLinkState *pState, int iNum)
    629635{
     
    10361042        PHDABDLEDESC pBdle = NULL;
    10371043        uint32_t *pu32Lpib = NULL;
     1044        uint8_t u8Strm = 0;
    10381045        Log(("hda: guest has initiated exit of stream reset\n"));
    10391046        pState->u8StreamsInReset &= ~HDA_STREAM_BITMASK(offset);
     
    10451052                pu32Lpib = &SDLPIB(pState, 0);
    10461053                AUD_set_active_in(ISD0FMT_TO_AUDIO_SELECTOR(pState), 0);
     1054                u8Strm = 0;
    10471055                break;
    10481056            case ICH6_HDA_REG_SD4CTL:
     
    10521060                pBdle = &pState->stOutBdle;
    10531061                pu32Lpib = &SDLPIB(pState, 4);
     1062                u8Strm = 4;
    10541063                break;
    10551064            default:
     
    10611070            memset(pBdle, 0, sizeof(HDABDLEDESC));
    10621071            *pu32Lpib = 0;
     1072            hdaUpdatePosBuf(pState, u8Strm, 0);
    10631073        }
    10641074    }
     
    14371447            Assert((pBdle->u32BdleCviLen >= pBdle->u32BdleCviPos)); /* sanity */
    14381448            cb2Copy = pBdle->u32BdleCviLen - pBdle->u32BdleCviPos; /* align copy buffer to size of trailing space in BDLE buffer */
    1439             cb2Copy = RT_MIN(cb2Copy, SDFIFOS(pState, 4) + 1 - pBdle->cbUnderFifoW); /* we may increase the counter in range of [0, FIFOS(pState, 4) + 1] */
     1449            cb2Copy = RT_MIN(cb2Copy, SDFIFOS(pState, 4) + 1); /* we may increase the counter in range of [0, FIFOS(pState, 4) + 1] */
    14401450            cb2Copy = RT_MIN(cb2Copy, *pu32Avail); /* align copying buffer size up to size of back end buffer */
    14411451            cb2Copy = RT_MIN(cb2Copy, u32CblLimit); /* avoid LCBL overrun */
    14421452        }
    1443         if (   cb2Copy == 0
    1444             && pBdle->cbUnderFifoW < hdaFifoWToSz(pState, 4))
     1453        if (   (   cb2Copy == 0
     1454               && pBdle->cbUnderFifoW < hdaFifoWToSz(pState, 4))
     1455            || cb2Copy < pBdle->cbUnderFifoW)
    14451456        {
    14461457            Log(("hda:wa: amount of bytes to copy is zero and (cbUnderFifoW:%d < %d)\n", pBdle->cbUnderFifoW, hdaFifoWToSz(pState, 4)));
     
    14481459            return 0;
    14491460        }
     1461        cb2Copy -= pBdle->cbUnderFifoW; /* force reserve "Unreported bits" */
    14501462       
    14511463        /*
     
    15931605   
    15941606            /* Optionally write back the current DMA position. */
    1595             if (pState->u64DPBase & DPBASE_ENABLED)
    1596                 PDMDevHlpPhysWrite(ICH6_HDASTATE_2_DEVINS(pState),
    1597                                (pState->u64DPBase & DPBASE_ADDR_MASK) + u8Strm*8, pu32Lpib, sizeof(*pu32Lpib));
     1607            hdaUpdatePosBuf(pState, u8Strm, *pu32Lpib);
    15981608   
    15991609        }
     
    16111621            if (*pu32Lpib == u32Cbl)
    16121622                *pu32Lpib -= u32Cbl;
     1623            hdaUpdatePosBuf(pState, u8Strm, *pu32Lpib);
    16131624
    16141625            if (pBdle->u32BdleCviPos == pBdle->u32BdleCviLen)
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