Changeset 34154 in vbox
- Timestamp:
- Nov 18, 2010 8:09:08 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 67874
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp
r34153 r34154 626 626 }; 627 627 628 static 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 } 628 634 static uint32_t inline hdaFifoWToSz(INTELHDLinkState *pState, int iNum) 629 635 { … … 1036 1042 PHDABDLEDESC pBdle = NULL; 1037 1043 uint32_t *pu32Lpib = NULL; 1044 uint8_t u8Strm = 0; 1038 1045 Log(("hda: guest has initiated exit of stream reset\n")); 1039 1046 pState->u8StreamsInReset &= ~HDA_STREAM_BITMASK(offset); … … 1045 1052 pu32Lpib = &SDLPIB(pState, 0); 1046 1053 AUD_set_active_in(ISD0FMT_TO_AUDIO_SELECTOR(pState), 0); 1054 u8Strm = 0; 1047 1055 break; 1048 1056 case ICH6_HDA_REG_SD4CTL: … … 1052 1060 pBdle = &pState->stOutBdle; 1053 1061 pu32Lpib = &SDLPIB(pState, 4); 1062 u8Strm = 4; 1054 1063 break; 1055 1064 default: … … 1061 1070 memset(pBdle, 0, sizeof(HDABDLEDESC)); 1062 1071 *pu32Lpib = 0; 1072 hdaUpdatePosBuf(pState, u8Strm, 0); 1063 1073 } 1064 1074 } … … 1437 1447 Assert((pBdle->u32BdleCviLen >= pBdle->u32BdleCviPos)); /* sanity */ 1438 1448 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] */ 1440 1450 cb2Copy = RT_MIN(cb2Copy, *pu32Avail); /* align copying buffer size up to size of back end buffer */ 1441 1451 cb2Copy = RT_MIN(cb2Copy, u32CblLimit); /* avoid LCBL overrun */ 1442 1452 } 1443 if ( cb2Copy == 0 1444 && pBdle->cbUnderFifoW < hdaFifoWToSz(pState, 4)) 1453 if ( ( cb2Copy == 0 1454 && pBdle->cbUnderFifoW < hdaFifoWToSz(pState, 4)) 1455 || cb2Copy < pBdle->cbUnderFifoW) 1445 1456 { 1446 1457 Log(("hda:wa: amount of bytes to copy is zero and (cbUnderFifoW:%d < %d)\n", pBdle->cbUnderFifoW, hdaFifoWToSz(pState, 4))); … … 1448 1459 return 0; 1449 1460 } 1461 cb2Copy -= pBdle->cbUnderFifoW; /* force reserve "Unreported bits" */ 1450 1462 1451 1463 /* … … 1593 1605 1594 1606 /* 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); 1598 1608 1599 1609 } … … 1611 1621 if (*pu32Lpib == u32Cbl) 1612 1622 *pu32Lpib -= u32Cbl; 1623 hdaUpdatePosBuf(pState, u8Strm, *pu32Lpib); 1613 1624 1614 1625 if (pBdle->u32BdleCviPos == pBdle->u32BdleCviLen)
Note:
See TracChangeset
for help on using the changeset viewer.