VirtualBox

Changeset 32335 in vbox for trunk


Ignore:
Timestamp:
Sep 9, 2010 10:09:21 AM (14 years ago)
Author:
vboxsync
Message:

HDA: Fixed Vista playback.

File:
1 edited

Legend:

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

    r32293 r32335  
    217217#define ICH6_HDA_REG_DPUBASE  31 /* 0x74 */
    218218#define DPUBASE(pState) (HDA_REG((pState), DPUBASE))
     219#define DPBASE_ENABLED          1
     220#define DPBASE_ADDR_MASK        (~0x7f)
    219221
    220222#define HDA_STREAM_REG_DEF(name, num) (ICH6_HDA_REG_SD##num##name)
     
    11641166    for (i = 0; i < 8; ++i)
    11651167    {
    1166         PDMDevHlpPhysRead(ICH6_HDASTATE_2_DEVINS(pState), pState->u64DPBase + i*8, &counter, 4);
     1168        PDMDevHlpPhysRead(ICH6_HDASTATE_2_DEVINS(pState), (pState->u64DPBase & DPBASE_ADDR_MASK) + i*8, &counter, sizeof(&counter));
    11671169        Log(("hda: %s stream[%d] counter=%x\n", i == SDCTL_NUM(pState, 4) || i == SDCTL_NUM(pState, 0)? "[C]": "   ",
    11681170             i , counter));
     
    12641266    PHDABDLEDESC pBdle = NULL;
    12651267    INTELHDLinkState *pState = (INTELHDLinkState *)pCodecState->pHDAState;
    1266     uint32_t u32Counter;
    12671268    uint32_t nBytes;
    12681269    uint32_t u32Ctl;
     
    13061307        || !u64BaseDMA)
    13071308        return;
     1309    /* Fetch the Buffer Descriptor Entry (BDE). */
    13081310    fetch_bd(pState, pBdle, u64BaseDMA);
    1309     while(   avail
    1310           && !fStop)
    1311     {
    1312         PDMDevHlpPhysRead(ICH6_HDASTATE_2_DEVINS(pState), (pState->u64DPBase & ~0x1) + u8Strm*8, &u32Counter, 4);
     1311    while( avail && !fStop)
     1312    {
    13131313        switch (src)
    13141314        {
     
    13211321            default:
    13221322                nBytes = 0;
     1323                fStop  = true;
    13231324                AssertMsgFailed(("Unsupported"));
    13241325        }
    1325         if (   fStop
    1326             && pBdle->u32BdleCviLen != pBdle->u32BdleCviPos)
    1327             break;
     1326        /* Update the buffer position and handle Cyclic Buffer Length (CBL) wraparound. */
    13281327        *pu32Lpib += nBytes;
    13291328        avail -= nBytes;
    1330         u32Counter += nBytes;
    1331         PDMDevHlpPhysWrite(ICH6_HDASTATE_2_DEVINS(pState), (pState->u64DPBase & ~0x1) + u8Strm*8, &u32Counter, 4);
    1332         if (   pBdle->u32BdleCviPos == pBdle->u32BdleCviLen
    1333             || *pu32Lpib == u32Lcbl)
     1329        if (*pu32Lpib >= u32Lcbl)
     1330            *pu32Lpib  -= u32Lcbl;
     1331
     1332        /* Optionally write back the current DMA position. */
     1333        if (pState->u64DPBase & DPBASE_ENABLED)
     1334            PDMDevHlpPhysWrite(ICH6_HDASTATE_2_DEVINS(pState),
     1335                               (pState->u64DPBase & DPBASE_ADDR_MASK) + u8Strm*8, pu32Lpib, sizeof(*pu32Lpib));
     1336
     1337        /* Process end of buffer condition. */
     1338        if (pBdle->u32BdleCviPos == pBdle->u32BdleCviLen)
    13341339        {
    1335             if (   u32Ctl & HDA_REG_FIELD_FLAG_MASK(SDCTL, ICE)
    1336                 && (   (   pBdle->u32BdleCviPos == pBdle->u32BdleCviLen
    1337                         && pBdle->fBdleCviIoc )
    1338                     || *pu32Lpib == u32Lcbl))
     1340            if (pBdle->fBdleCviIoc)
    13391341            {
    13401342                *pu32Sts |= HDA_REG_FIELD_FLAG_MASK(SDSTS, BCIS);
    13411343                hdaProcessInterrupt(pState);
    1342                 if (*pu32Lpib == u32Lcbl)
    1343                 {
    1344                     *pu32Lpib = 0;
    1345                     u32Counter = 0;
    1346                     PDMDevHlpPhysWrite(ICH6_HDASTATE_2_DEVINS(pState), (pState->u64DPBase & ~0x1)  + u8Strm*8, &u32Counter, 4);
    1347                 }
    13481344            }
    1349             if (pBdle->u32BdleCviPos == pBdle->u32BdleCviLen)
    1350             {
    1351                 pBdle->u32BdleCviPos = 0;
    1352                 pBdle->u32BdleCvi++;
    1353                 if (pBdle->u32BdleCvi == pBdle->u32BdleMaxCvi + 1)
    1354                     pBdle->u32BdleCvi = 0;
    1355                 fStop = true;   /* Give the guest a chance to refill buffers. */
    1356             }
    1357             else
    1358                 fStop = false;
    1359             fetch_bd(pState, pBdle, u64BaseDMA);
     1345            pBdle->u32BdleCviPos = 0;
     1346            pBdle->u32BdleCvi++;
     1347            if (pBdle->u32BdleCvi == pBdle->u32BdleMaxCvi + 1)
     1348                pBdle->u32BdleCvi = 0;
     1349            fStop = true;   /* Give the guest a chance to refill (or empty) buffers. */
     1350
     1351            /* Read the next BDE unless we're exiting. */
     1352            if (!fStop)
     1353                fetch_bd(pState, pBdle, u64BaseDMA);
    13601354        }
    13611355    }
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