Changeset 82323 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Dec 2, 2019 2:33:12 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 135147
- Location:
- trunk/src/VBox/Devices/Audio
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevHDA.cpp
r82319 r82323 155 155 * Acquires the TM lock and HDA lock, returns on failure. 156 156 */ 157 #define DEVHDA_LOCK_BOTH_RETURN_VOID(a_pDevIns, a_pThis, a_SD) \158 do { \159 int rcLock = TMTimerLock((a_pThis)->pTimer[a_SD], VERR_IGNORED); \160 if (rcLock == VINF_SUCCESS) \161 { /* likely */ } \162 else \163 { \164 AssertRC(rcLock); \165 return; \166 } \167 rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, VERR_IGNORED); \168 if (rcLock == VINF_SUCCESS) \169 { /* likely */ } \170 else \171 { \172 AssertRC(rcLock); \173 TMTimerUnlock((a_pThis)->pTimer[a_SD]); \174 return; \175 } \176 } while (0)177 178 /**179 * Acquires the TM lock and HDA lock, returns on failure.180 */181 157 #define DEVHDA_LOCK_BOTH_RETURN(a_pDevIns, a_pThis, a_SD, a_rcBusy) \ 182 158 do { \ 183 159 int rcLock = TMTimerLock((a_pThis)->pTimer[a_SD], (a_rcBusy)); \ 184 160 if (rcLock == VINF_SUCCESS) \ 185 { /* likely */ } \186 else \187 161 { \ 188 AssertRC(rcLock); \ 189 return rcLock; \ 162 rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, (a_rcBusy)); \ 163 if (rcLock == VINF_SUCCESS) \ 164 break; \ 165 TMTimerUnlock((a_pThis)->pTimer[a_SD]); \ 190 166 } \ 191 rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, (a_rcBusy)); \ 192 if (rcLock == VINF_SUCCESS) \ 193 { /* likely */ } \ 194 else \ 195 { \ 196 AssertRC(rcLock); \ 197 TMTimerUnlock((a_pThis)->pTimer[a_SD]); \ 198 return rcLock; \ 199 } \ 167 AssertRC(rcLock); \ 168 return rcLock; \ 200 169 } while (0) 201 170 … … 1312 1281 const uint8_t uSD = HDA_SD_NUM_FROM_REG(pThis, CTL, iReg); 1313 1282 1314 DEVHDA_LOCK_BOTH_RETURN(pDevIns, pThis, uSD, VINF_IOM_R3_MMIO_WRITE);1315 1316 1283 /* 1317 1284 * Some guests write too much (that is, 32-bit with the top 8 bit being junk) … … 1319 1286 */ 1320 1287 u32Value &= 0x00ffffff; 1321 1322 const bool fRun = RT_BOOL(u32Value & HDA_SDCTL_RUN);1323 const bool fInRun = RT_BOOL(HDA_REG_IND(pThis, iReg) & HDA_SDCTL_RUN);1324 1325 const bool fReset = RT_BOOL(u32Value & HDA_SDCTL_SRST);1326 const bool fInReset = RT_BOOL(HDA_REG_IND(pThis, iReg) & HDA_SDCTL_SRST);1327 1328 /*LogFunc(("[SD%RU8] fRun=%RTbool, fInRun=%RTbool, fReset=%RTbool, fInReset=%RTbool, %R[sdctl]\n",1329 uSD, fRun, fInRun, fReset, fInReset, u32Value));*/1330 1288 1331 1289 /* … … 1337 1295 */ 1338 1296 uint8_t uTag = (u32Value >> HDA_SDCTL_NUM_SHIFT) & HDA_SDCTL_NUM_MASK; 1339 if (uTag > HDA_MAX_TAGS) 1340 { 1341 LogFunc(("[SD%RU8] Warning: Invalid stream tag %RU8 specified!\n", uSD, uTag)); 1342 1343 DEVHDA_UNLOCK_BOTH(pDevIns, pThis, uSD); 1344 return VINF_SUCCESS; /* Always return success to the MMIO handler. */ 1345 } 1297 ASSERT_GUEST_MSG_RETURN(uTag < RT_ELEMENTS(pThis->aTags), 1298 ("SD%RU8: Invalid stream tag %RU8 (u32Value=%#x)!\n", uSD, uTag, u32Value), 1299 VINF_SUCCESS /* Always return success to the MMIO handler. */); 1346 1300 1347 1301 PHDASTREAM pStream = hdaGetStreamFromSD(pThis, uSD); 1348 if (!pStream) 1349 { 1350 ASSERT_GUEST_LOGREL_MSG_FAILED(("Guest tried writing SDCTL (0x%x) to unhandled stream #%RU8\n", u32Value, uSD)); 1351 1352 DEVHDA_UNLOCK_BOTH(pDevIns, pThis, uSD); 1353 return VINF_SUCCESS; /* Always return success to the MMIO handler. */ 1354 } 1355 1302 ASSERT_GUEST_LOGREL_MSG_RETURN(pStream, ("Guest tried writing SDCTL (0x%x) to unhandled stream #%RU8\n", u32Value, uSD), 1303 VINF_SUCCESS /* Always return success to the MMIO handler. */); 1304 1305 const bool fRun = RT_BOOL(u32Value & HDA_SDCTL_RUN); 1306 const bool fReset = RT_BOOL(u32Value & HDA_SDCTL_SRST); 1307 1308 /** 1309 * @todo r=bird: Must reduce the time we holding the virtual sync 1310 * clock lock here! 1311 */ 1312 DEVHDA_LOCK_BOTH_RETURN(pDevIns, pThis, uSD, VINF_IOM_R3_MMIO_WRITE); 1313 1314 const bool fInRun = RT_BOOL(HDA_REG_IND(pThis, iReg) & HDA_SDCTL_RUN); 1315 const bool fInReset = RT_BOOL(HDA_REG_IND(pThis, iReg) & HDA_SDCTL_SRST); 1316 1317 /*LogFunc(("[SD%RU8] fRun=%RTbool, fInRun=%RTbool, fReset=%RTbool, fInReset=%RTbool, %R[sdctl]\n", 1318 uSD, fRun, fInRun, fReset, fInReset, u32Value));*/ 1356 1319 if (fInReset) 1357 1320 { … … 1514 1477 #ifdef IN_RING3 1515 1478 const uint8_t uSD = HDA_SD_NUM_FROM_REG(pThis, STS, iReg); 1516 1479 PHDASTREAM pStream = hdaGetStreamFromSD(pThis, uSD); 1480 ASSERT_GUEST_LOGREL_MSG_RETURN(pStream, ("Guest tried writing SDSTS (0x%x) to unhandled stream #%RU8\n", u32Value, uSD), 1481 VINF_SUCCESS); 1482 1483 /** 1484 * @todo r=bird: Must reduce the time we holding the virtual sync 1485 * clock lock here! 1486 */ 1517 1487 DEVHDA_LOCK_BOTH_RETURN(pDevIns, pThis, uSD, VINF_IOM_R3_MMIO_WRITE); 1518 1519 PHDASTREAM pStream = hdaGetStreamFromSD(pThis, uSD);1520 if (!pStream)1521 {1522 ASSERT_GUEST_LOGREL_MSG_FAILED(("Guest tried writing SDSTS (0x%x) to unhandled stream #%RU8\n", u32Value, uSD));1523 DEVHDA_UNLOCK_BOTH(pDevIns, pThis, uSD);1524 return VINF_SUCCESS; /* Always return success to the MMIO handler. */1525 }1526 1488 1527 1489 hdaR3StreamLock(pStream); … … 2891 2853 static DECLCALLBACK(void) hdaR3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 2892 2854 { 2855 PHDASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PHDASTATE); 2856 PHDASTREAM pStream = (PHDASTREAM)pvUser; 2893 2857 RT_NOREF(pTimer); 2894 2858 2895 PHDASTREAM pStream = (PHDASTREAM)pvUser;2896 2859 AssertPtr(pStream); 2897 2898 PHDASTATE pThis = pStream->pHDAState; 2899 2900 DEVHDA_LOCK_BOTH_RETURN_VOID(pDevIns, pStream->pHDAState, pStream->u8SD); 2860 Assert(PDMDevHlpCritSectIsOwner(pDevIns, &pThis->CritSect)); 2861 Assert(TMTimerIsLockOwner(pStream->pTimer)); 2901 2862 2902 2863 hdaR3StreamUpdate(pStream, true /* fInTimer */); … … 2919 2880 else 2920 2881 Log3Func(("fSinksActive=%RTbool\n", fSinkActive)); 2921 2922 DEVHDA_UNLOCK_BOTH(pDevIns, pThis, pStream->u8SD);2923 2882 } 2924 2883 … … 5236 5195 PHDASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PHDASTATE); 5237 5196 5238 int rc = PDMDevHlpMmioSetUpContext(pDevIns, pThis->hMmio, hdaMMIOWrite, hdaMMIORead, NULL /*pvUser*/); 5197 int rc = PDMDevHlpSetDeviceCritSect(pDevIns, PDMDevHlpCritSectGetNop(pDevIns)); 5198 AssertRCReturn(rc, rc); 5199 5200 rc = PDMDevHlpMmioSetUpContext(pDevIns, pThis->hMmio, hdaMMIOWrite, hdaMMIORead, NULL /*pvUser*/); 5239 5201 AssertRCReturn(rc, rc); 5240 5202 -
trunk/src/VBox/Devices/Audio/DevHDACommon.cpp
r82252 r82323 256 256 PHDASTREAM hdaGetStreamFromSD(PHDASTATE pThis, uint8_t uSD) 257 257 { 258 AssertPtrReturn(pThis, NULL); 259 AssertReturn(uSD < HDA_MAX_STREAMS, NULL); 260 261 if (uSD >= HDA_MAX_STREAMS) 262 { 263 ASSERT_GUEST_LOGREL_MSG_FAILED(("Stream #%RU8 is invalid\n", uSD)); 264 return NULL; 265 } 266 258 AssertPtr(pThis); 259 ASSERT_GUEST_MSG_RETURN(uSD < HDA_MAX_STREAMS, ("uSD=%u (%#x)\n", uSD, uSD), NULL); 267 260 return &pThis->aStreams[uSD]; 268 261 } -
trunk/src/VBox/Devices/Audio/DevIchAc97.cpp
r82319 r82323 549 549 * Acquires the AC'97 lock. 550 550 */ 551 #define DEVAC97_LOCK(a_p This) \551 #define DEVAC97_LOCK(a_pDevIns, a_pThis) \ 552 552 do { \ 553 int rcLock = PDM CritSectEnter(&(a_pThis)->CritSect, VERR_IGNORED); \553 int rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, VERR_IGNORED); \ 554 554 AssertRC(rcLock); \ 555 555 } while (0) … … 558 558 * Acquires the AC'97 lock or returns. 559 559 */ 560 # define DEVAC97_LOCK_RETURN(a_p This, a_rcBusy) \560 # define DEVAC97_LOCK_RETURN(a_pDevIns, a_pThis, a_rcBusy) \ 561 561 do { \ 562 int rcLock = PDMCritSectEnter(&(a_pThis)->CritSect, a_rcBusy); \ 563 if (rcLock != VINF_SUCCESS) \ 564 { \ 565 AssertRC(rcLock); \ 566 return rcLock; \ 567 } \ 562 int rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, a_rcBusy); \ 563 if (rcLock == VINF_SUCCESS) \ 564 break; \ 565 AssertRC(rcLock); \ 566 return rcLock; \ 568 567 } while (0) 569 568 570 /**571 * Acquires the AC'97 lock or returns.572 */573 # define DEVAC97_LOCK_RETURN_VOID(a_pThis) \574 do { \575 int rcLock = PDMCritSectEnter(&(a_pThis)->CritSect, VERR_IGNORED); \576 if (rcLock != VINF_SUCCESS) \577 { \578 AssertRC(rcLock); \579 return; \580 } \581 } while (0)582 583 #ifdef IN_RC584 569 /** Retrieves an attribute from a specific audio stream in RC. */ 585 # define DEVAC97_CTX_SUFF_SD(a_Var, a_SD) a_Var##RC[a_SD] 586 #elif defined(IN_RING0) 587 /** Retrieves an attribute from a specific audio stream in R0. */ 588 # define DEVAC97_CTX_SUFF_SD(a_Var, a_SD) a_Var##R0[a_SD] 589 #else 590 /** Retrieves an attribute from a specific audio stream in R3. */ 591 # define DEVAC97_CTX_SUFF_SD(a_Var, a_SD) a_Var##R3[a_SD] 592 #endif 570 #define DEVAC97_CTX_SUFF_SD(a_Var, a_SD) CTX_SUFF(a_Var)[a_SD] 593 571 594 572 /** 595 573 * Releases the AC'97 lock. 596 574 */ 597 #define DEVAC97_UNLOCK(a_p This) \598 do { PDM CritSectLeave(&(a_pThis)->CritSect); } while (0)575 #define DEVAC97_UNLOCK(a_pDevIns, a_pThis) \ 576 do { PDMDevHlpCritSectLeave((a_pDevIns), &(a_pThis)->CritSect); } while (0) 599 577 600 578 /** 601 579 * Acquires the TM lock and AC'97 lock, returns on failure. 602 580 */ 603 #define DEVAC97_LOCK_BOTH_RETURN_VOID(a_pThis, a_SD) \ 604 do { \ 605 int rcLock = TMTimerLock((a_pThis)->DEVAC97_CTX_SUFF_SD(pTimer, a_SD), VERR_IGNORED); \ 606 if (rcLock != VINF_SUCCESS) \ 607 { \ 608 AssertRC(rcLock); \ 609 return; \ 610 } \ 611 rcLock = PDMCritSectEnter(&(a_pThis)->CritSect, VERR_IGNORED); \ 612 if (rcLock != VINF_SUCCESS) \ 613 { \ 614 AssertRC(rcLock); \ 615 TMTimerUnlock((a_pThis)->DEVAC97_CTX_SUFF_SD(pTimer, a_SD)); \ 616 return; \ 617 } \ 618 } while (0) 619 620 /** 621 * Acquires the TM lock and AC'97 lock, returns on failure. 622 */ 623 #define DEVAC97_LOCK_BOTH_RETURN(a_pThis, a_SD, a_rcBusy) \ 581 #define DEVAC97_LOCK_BOTH_RETURN(a_pDevIns, a_pThis, a_SD, a_rcBusy) \ 624 582 do { \ 625 583 int rcLock = TMTimerLock((a_pThis)->DEVAC97_CTX_SUFF_SD(pTimer, a_SD), (a_rcBusy)); \ 626 if (rcLock != VINF_SUCCESS) \ 627 return rcLock; \ 628 rcLock = PDMCritSectEnter(&(a_pThis)->CritSect, (a_rcBusy)); \ 629 if (rcLock != VINF_SUCCESS) \ 584 if (rcLock == VINF_SUCCESS) \ 630 585 { \ 631 AssertRC(rcLock); \ 586 rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, (a_rcBusy)); \ 587 if (rcLock == VINF_SUCCESS) \ 588 break; \ 632 589 TMTimerUnlock((a_pThis)->DEVAC97_CTX_SUFF_SD(pTimer, a_SD)); \ 633 return rcLock; \634 590 } \ 591 AssertRC(rcLock); \ 592 return rcLock; \ 635 593 } while (0) 636 594 … … 638 596 * Releases the AC'97 lock and TM lock. 639 597 */ 640 #define DEVAC97_UNLOCK_BOTH(a_p This, a_SD) \598 #define DEVAC97_UNLOCK_BOTH(a_pDevIns, a_pThis, a_SD) \ 641 599 do { \ 642 PDM CritSectLeave(&(a_pThis)->CritSect); \600 PDMDevHlpCritSectLeave((a_pDevIns), &(a_pThis)->CritSect); \ 643 601 TMTimerUnlock((a_pThis)->DEVAC97_CTX_SUFF_SD(pTimer, a_SD)); \ 644 602 } while (0) … … 2629 2587 2630 2588 /** 2631 * Timer callback which handles the audio data transfers on a periodic basis. 2632 * 2633 * @param pDevIns Device instance. 2634 * @param pTimer Timer which was used when calling this. 2635 * @param pvUser User argument as PAC97STATE. 2589 * @callback_method_impl{FNTMTIMERDEV, 2590 * Timer callback which handles the audio data transfers on a periodic basis.} 2636 2591 */ 2637 2592 static DECLCALLBACK(void) ichac97R3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 2638 2593 { 2639 RT_NOREF(pDevIns, pTimer);2640 2594 PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE); 2595 STAM_PROFILE_START(&pThis->StatTimer, a); 2641 2596 PAC97STREAM pStream = (PAC97STREAM)pvUser; 2597 RT_NOREF(pTimer); 2598 2642 2599 AssertPtr(pStream); 2643 2644 PAC97STATE pThis = pStream->pAC97State; 2645 AssertPtr(pThis); 2646 2647 STAM_PROFILE_START(&pThis->StatTimer, a); 2648 2649 DEVAC97_LOCK_BOTH_RETURN_VOID(pThis, pStream->u8SD); 2600 Assert(PDMDevHlpCritSectIsOwner(pDevIns, &pThis->CritSect)); 2601 Assert(TMTimerIsLockOwner((pThis)->DEVAC97_CTX_SUFF_SD(pTimer, pStream->u8SD))); 2650 2602 2651 2603 ichac97R3StreamUpdate(pThis, pStream, true /* fInTimer */); 2652 2604 2653 2605 PAUDMIXSINK pSink = ichac97R3IndexToSink(pThis, pStream->u8SD); 2654 2655 bool fSinkActive = false; 2656 if (pSink) 2657 fSinkActive = AudioMixerSinkIsActive(pSink); 2658 2659 if (fSinkActive) 2606 if (pSink && AudioMixerSinkIsActive(pSink)) 2660 2607 { 2661 2608 ichac97R3StreamTransferUpdate(pThis, pStream, pStream->Regs.picb << 1); /** @todo r=andy Assumes 16-bit samples. */ 2662 2609 2663 ichac97TimerSet(pThis, pStream,2610 ichac97TimerSet(pThis, pStream, 2664 2611 TMTimerGet((pThis)->DEVAC97_CTX_SUFF_SD(pTimer, pStream->u8SD)) + pStream->State.cTransferTicks, 2665 2612 false /* fForce */); 2666 2613 } 2667 2614 2668 DEVAC97_UNLOCK_BOTH(pThis, pStream->u8SD);2669 2670 2615 STAM_PROFILE_STOP(&pThis->StatTimer, a); 2671 2616 } 2617 2672 2618 #endif /* IN_RING3 */ 2673 2619 … … 2940 2886 RT_NOREF(pvUser); 2941 2887 2942 DEVAC97_LOCK_RETURN(p This, VINF_IOM_R3_IOPORT_READ);2888 DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_READ); 2943 2889 2944 2890 /* Get the index of the NABMBAR port. */ … … 3091 3037 } 3092 3038 3093 DEVAC97_UNLOCK(p This);3039 DEVAC97_UNLOCK(pDevIns, pThis); 3094 3040 3095 3041 return rc; … … 3113 3059 pRegs = &pStream->Regs; 3114 3060 3115 DEVAC97_LOCK_BOTH_RETURN(p This, pStream->u8SD, VINF_IOM_R3_IOPORT_WRITE);3061 DEVAC97_LOCK_BOTH_RETURN(pDevIns, pThis, pStream->u8SD, VINF_IOM_R3_IOPORT_WRITE); 3116 3062 } 3117 3063 … … 3288 3234 3289 3235 if (pStream) 3290 DEVAC97_UNLOCK_BOTH(p This, pStream->u8SD);3236 DEVAC97_UNLOCK_BOTH(pDevIns, pThis, pStream->u8SD); 3291 3237 3292 3238 return rc; … … 3301 3247 PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE); 3302 3248 RT_NOREF(pvUser); 3303 3304 DEVAC97_LOCK_RETURN(pThis, VINF_IOM_R3_IOPORT_READ); 3249 Assert(offPort < 256); 3250 3251 DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_READ); 3305 3252 3306 3253 VBOXSTRICTRC rc = VINF_SUCCESS; 3307 3308 Assert(offPort < 256);3309 3310 3254 switch (cb) 3311 3255 { … … 3340 3284 } 3341 3285 3342 DEVAC97_UNLOCK(p This);3286 DEVAC97_UNLOCK(pDevIns, pThis); 3343 3287 return rc; 3344 3288 } … … 3353 3297 RT_NOREF(pvUser); 3354 3298 3355 DEVAC97_LOCK_RETURN(p This, VINF_IOM_R3_IOPORT_WRITE);3299 DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_WRITE); 3356 3300 3357 3301 VBOXSTRICTRC rc = VINF_SUCCESS; … … 3548 3492 } 3549 3493 3550 DEVAC97_UNLOCK(p This);3494 DEVAC97_UNLOCK(pDevIns, pThis); 3551 3495 return rc; 3552 3496 } … … 3935 3879 LogFunc(("iLUN=%u, fFlags=0x%x\n", iLUN, fFlags)); 3936 3880 3937 DEVAC97_LOCK(p This);3881 DEVAC97_LOCK(pDevIns, pThis); 3938 3882 3939 3883 PAC97DRIVER pDrv; … … 3945 3889 LogFunc(("Failed with %Rrc\n", rc2)); 3946 3890 3947 DEVAC97_UNLOCK(p This);3891 DEVAC97_UNLOCK(pDevIns, pThis); 3948 3892 3949 3893 return VINF_SUCCESS; … … 3959 3903 LogFunc(("iLUN=%u, fFlags=0x%x\n", iLUN, fFlags)); 3960 3904 3961 DEVAC97_LOCK(p This);3905 DEVAC97_LOCK(pDevIns, pThis); 3962 3906 3963 3907 PAC97DRIVER pDrv, pDrvNext; … … 3978 3922 } 3979 3923 3980 DEVAC97_UNLOCK(p This);3924 DEVAC97_UNLOCK(pDevIns, pThis); 3981 3925 } 3982 3926 … … 4372 4316 PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE); 4373 4317 4374 int rc = PDMDevHlpIoPortSetUpContext(pDevIns, pThis->hIoPortsNam, ichac97IoPortNamWrite, ichac97IoPortNamRead, NULL /*pvUser*/); 4318 int rc = PDMDevHlpSetDeviceCritSect(pDevIns, PDMDevHlpCritSectGetNop(pDevIns)); 4319 AssertRCReturn(rc, rc); 4320 4321 rc = PDMDevHlpIoPortSetUpContext(pDevIns, pThis->hIoPortsNam, ichac97IoPortNamWrite, ichac97IoPortNamRead, NULL /*pvUser*/); 4375 4322 AssertRCReturn(rc, rc); 4376 4323 rc = PDMDevHlpIoPortSetUpContext(pDevIns, pThis->hIoPortsNabm, ichac97IoPortNabmWrite, ichac97IoPortNabmRead, NULL /*pvUser*/); -
trunk/src/VBox/Devices/Audio/HDAStream.cpp
r82255 r82323 1375 1375 Log3Func(("[SD%RU8] Scheduling timer\n", pStream->u8SD)); 1376 1376 1377 TMTimerUnlock(pStream->pTimer);1378 1379 1377 LogFunc(("Timer set SD%RU8\n", pStream->u8SD)); 1380 1378 hdaR3TimerSet(pStream->pHDAState, pStream, tsTransferNext, false /* fForce */); 1381 1382 TMTimerLock(pStream->pTimer, VINF_SUCCESS);1383 1379 1384 1380 pStream->State.tsTransferNext = tsTransferNext;
Note:
See TracChangeset
for help on using the changeset viewer.