Changeset 89612 in vbox
- Timestamp:
- Jun 10, 2021 11:04:58 PM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevIchAc97.cpp
r89379 r89612 661 661 DECLINLINE(PDMAUDIODIR) ichac97GetDirFromSD(uint8_t uSD); 662 662 DECLINLINE(void) ichac97R3TimerSet(PPDMDEVINS pDevIns, PAC97STREAM pStream, uint64_t cTicksToDeadline); 663 664 static void ichac97R3DbgPrintBdl(PPDMDEVINS pDevIns, PAC97STATE pThis, PAC97STREAM pStream, 665 PCDBGFINFOHLP pHlp, const char *pszPrefix); 663 666 #endif /* IN_RING3 */ 664 667 … … 1227 1230 1228 1231 1229 # ifdef LOG_ENABLED1230 static void ichac97R3BDLEDumpAll(PPDMDEVINS pDevIns, uint64_t u64BDLBase, uint16_t cBDLE)1231 {1232 LogFlowFunc(("BDLEs @ 0x%x (%RU16):\n", u64BDLBase, cBDLE));1233 if (!u64BDLBase)1234 return;1235 1236 uint32_t cbBDLE = 0;1237 for (uint16_t i = 0; i < cBDLE; i++)1238 {1239 AC97BDLE BDLE;1240 PDMDevHlpPCIPhysRead(pDevIns, u64BDLBase + i * sizeof(AC97BDLE), &BDLE, sizeof(AC97BDLE));1241 1242 # ifndef RT_LITTLE_ENDIAN1243 # error "Please adapt the code (audio buffers are little endian)!"1244 # else1245 BDLE.addr = RT_H2LE_U32(BDLE.addr & ~3);1246 BDLE.ctl_len = RT_H2LE_U32(BDLE.ctl_len);1247 #endif1248 LogFunc(("\t#%03d BDLE(adr:0x%llx, size:%RU32 [%RU32 bytes], bup:%RTbool, ioc:%RTbool)\n",1249 i, BDLE.addr,1250 BDLE.ctl_len & AC97_BD_LEN_MASK,1251 (BDLE.ctl_len & AC97_BD_LEN_MASK) << 1, /** @todo r=andy Assumes 16bit samples. */1252 RT_BOOL(BDLE.ctl_len & AC97_BD_BUP),1253 RT_BOOL(BDLE.ctl_len & AC97_BD_IOC)));1254 1255 cbBDLE += (BDLE.ctl_len & AC97_BD_LEN_MASK) << 1; /** @todo r=andy Ditto. */1256 }1257 1258 LogFlowFunc(("Total: %RU32 bytes\n", cbBDLE));1259 }1260 # endif /* LOG_ENABLED */1261 1262 1232 /** 1263 1233 * Updates an AC'97 stream by doing its DMA transfers. … … 1689 1659 return 0; 1690 1660 1661 /** @todo r=bird: Why use microseconds when the timer clock has been using 1662 * nanosecond resolution since early 2005? */ 1691 1663 const uint64_t usBytes = PDMAudioPropsBytesToMicro(&pStreamCC->State.Cfg.Props, cbBytes); 1692 1664 const uint64_t cTransferTicks = PDMDevHlpTimerFromMicro(pDevIns, pStream->hTimer, usBytes); … … 1720 1692 Assert(pStreamCC->State.cTransferTicks); /* Paranoia. */ 1721 1693 } 1694 1695 1696 /** 1697 * Gets the frequency of a given stream. 1698 * 1699 * @returns The frequency. Zero if invalid stream index. 1700 * @param pThis The shared AC'97 device state. 1701 * @param idxStream The stream. 1702 */ 1703 DECLINLINE(uint32_t) ichach97R3CalcStreamHz(PAC97STATE pThis, uint8_t idxStream) 1704 { 1705 switch (idxStream) 1706 { 1707 case AC97SOUNDSOURCE_PI_INDEX: 1708 return ichac97MixerGet(pThis, AC97_PCM_LR_ADC_Rate); 1709 1710 case AC97SOUNDSOURCE_MC_INDEX: 1711 return ichac97MixerGet(pThis, AC97_MIC_ADC_Rate); 1712 1713 case AC97SOUNDSOURCE_PO_INDEX: 1714 return ichac97MixerGet(pThis, AC97_PCM_Front_DAC_Rate); 1715 1716 default: 1717 AssertMsgFailedReturn(("%d\n", idxStream), 0); 1718 } 1719 } 1720 1721 1722 /** 1723 * Gets the PCM properties for a given stream. 1724 * 1725 * @returns pProps. 1726 * @param pThis The shared AC'97 device state. 1727 * @param idxStream Which stream 1728 * @param pProps Where to return the stream properties. 1729 */ 1730 DECLINLINE(PPDMAUDIOPCMPROPS) ichach97R3CalcStreamProps(PAC97STATE pThis, uint8_t idxStream, PPDMAUDIOPCMPROPS pProps) 1731 { 1732 PDMAudioPropsInit(pProps, 2 /*16-bit*/, true /*signed*/, 2 /*stereo*/, ichach97R3CalcStreamHz(pThis, idxStream)); 1733 return pProps; 1734 } 1735 1722 1736 1723 1737 /** … … 1739 1753 PAC97STREAMR3 pStreamCC, bool fForce) 1740 1754 { 1741 int rc = VINF_SUCCESS; 1755 /* 1756 * Assemble the stream config and get the associate mixer sink. 1757 */ 1758 PDMAUDIOPCMPROPS PropsTmp; 1759 PDMAUDIOSTREAMCFG Cfg; 1760 PDMAudioStrmCfgInitWithProps(&Cfg, ichach97R3CalcStreamProps(pThis, pStream->u8SD, &PropsTmp)); 1761 1742 1762 PAUDMIXSINK pMixSink; 1743 PDMAUDIOSTREAMCFG Cfg;1744 RT_ZERO(Cfg);1745 1763 switch (pStream->u8SD) 1746 1764 { 1747 1765 case AC97SOUNDSOURCE_PI_INDEX: 1748 {1749 PDMAudioPropsInit(&Cfg.Props, 2 /*16-bit*/, true /*signed*/, 2 /*stereo*/,1750 ichac97MixerGet(pThis, AC97_PCM_LR_ADC_Rate));1751 1766 Cfg.enmDir = PDMAUDIODIR_IN; 1752 1767 Cfg.enmPath = PDMAUDIOPATH_IN_LINE; … … 1755 1770 pMixSink = pThisCC->pSinkLineIn; 1756 1771 break; 1757 }1758 1772 1759 1773 case AC97SOUNDSOURCE_MC_INDEX: 1760 {1761 PDMAudioPropsInit(&Cfg.Props, 2 /*16-bit*/, true /*signed*/, 2 /*stereo*/,1762 ichac97MixerGet(pThis, AC97_MIC_ADC_Rate));1763 1774 Cfg.enmDir = PDMAUDIODIR_IN; 1764 1775 Cfg.enmPath = PDMAUDIOPATH_IN_MIC; … … 1767 1778 pMixSink = pThisCC->pSinkMicIn; 1768 1779 break; 1769 }1770 1780 1771 1781 case AC97SOUNDSOURCE_PO_INDEX: 1772 {1773 PDMAudioPropsInit(&Cfg.Props, 2 /*16-bit*/, true /*signed*/, 2 /*stereo*/,1774 ichac97MixerGet(pThis, AC97_PCM_Front_DAC_Rate));1775 1782 Cfg.enmDir = PDMAUDIODIR_OUT; 1776 1783 Cfg.enmPath = PDMAUDIOPATH_OUT_FRONT; … … 1779 1786 pMixSink = pThisCC->pSinkOut; 1780 1787 break; 1781 }1782 1788 1783 1789 default: 1784 rc = VERR_NOT_SUPPORTED; 1785 pMixSink = NULL; 1786 break; 1787 } 1788 1789 if (RT_SUCCESS(rc)) 1790 { 1791 /* Only (re-)create the stream (and driver chain) if we really have to. 1792 * Otherwise avoid this and just reuse it, as this costs performance. */ 1793 if ( !PDMAudioStrmCfgMatchesProps(&Cfg, &pStreamCC->State.Cfg.Props) 1794 || fForce) 1790 AssertMsgFailedReturn(("u8SD=%d\n", pStream->u8SD), VERR_INTERNAL_ERROR_3); 1791 } 1792 1793 /* 1794 * Only (re-)create the stream (and driver chain) if we really have to. 1795 * Otherwise avoid this and just reuse it, as this costs performance. 1796 */ 1797 int rc = VINF_SUCCESS; 1798 if ( !PDMAudioStrmCfgMatchesProps(&Cfg, &pStreamCC->State.Cfg.Props) 1799 || fForce) 1800 { 1801 LogRel2(("AC97: (Re-)Opening stream '%s' (%RU32Hz, %RU8 channels, %s%RU8)\n", Cfg.szName, Cfg.Props.uHz, 1802 PDMAudioPropsChannels(&Cfg.Props), Cfg.Props.fSigned ? "S" : "U", PDMAudioPropsSampleBits(&Cfg.Props))); 1803 1804 LogFlowFunc(("[SD%RU8] uHz=%RU32\n", pStream->u8SD, Cfg.Props.uHz)); 1805 1806 if (Cfg.Props.uHz) 1795 1807 { 1796 LogRel2(("AC97: (Re-)Opening stream '%s' (%RU32Hz, %RU8 channels, %s%RU8)\n", Cfg.szName, Cfg.Props.uHz,1797 PDMAudioPropsChannels(&Cfg.Props), Cfg.Props.fSigned ? "S" : "U", PDMAudioPropsSampleBits(&Cfg.Props))); 1798 1799 LogFlowFunc(("[SD%RU8] uHz=%RU32\n", pStream->u8SD, Cfg.Props.uHz));1800 1801 if ( Cfg.Props.uHz)1808 Assert(Cfg.enmDir != PDMAUDIODIR_UNKNOWN); 1809 1810 /* 1811 * Set the stream's timer Hz rate, based on the PCM properties Hz rate. 1812 */ 1813 if (pThis->uTimerHz == AC97_TIMER_HZ_DEFAULT) /* Make sure that we don't have any custom Hz rate set we want to enforce */ 1802 1814 { 1803 Assert(Cfg.enmDir != PDMAUDIODIR_UNKNOWN); 1804 1805 /* 1806 * Set the stream's timer Hz rate, based on the PCM properties Hz rate. 1807 */ 1808 if (pThis->uTimerHz == AC97_TIMER_HZ_DEFAULT) /* Make sure that we don't have any custom Hz rate set we want to enforce */ 1809 { 1810 if (Cfg.Props.uHz > 44100) /* E.g. 48000 Hz. */ 1811 pStreamCC->State.uTimerHz = 200; 1812 else /* Just take the global Hz rate otherwise. */ 1813 pStreamCC->State.uTimerHz = pThis->uTimerHz; 1814 } 1815 else 1815 if (Cfg.Props.uHz > 44100) /* E.g. 48000 Hz. */ 1816 pStreamCC->State.uTimerHz = 200; 1817 else /* Just take the global Hz rate otherwise. */ 1816 1818 pStreamCC->State.uTimerHz = pThis->uTimerHz; 1817 1818 /* Set scheduling hint (if available). */ 1819 if (pStreamCC->State.uTimerHz) 1820 Cfg.Device.cMsSchedulingHint = 1000 /* ms */ / pStreamCC->State.uTimerHz; 1821 1822 if (pStreamCC->State.pCircBuf) 1823 { 1824 RTCircBufDestroy(pStreamCC->State.pCircBuf); 1825 pStreamCC->State.pCircBuf = NULL; 1826 } 1827 1828 rc = RTCircBufCreate(&pStreamCC->State.pCircBuf, PDMAudioPropsMilliToBytes(&Cfg.Props, 100 /*ms*/)); /** @todo Make this configurable. */ 1819 } 1820 else 1821 pStreamCC->State.uTimerHz = pThis->uTimerHz; 1822 1823 /* Set scheduling hint (if available). */ 1824 if (pStreamCC->State.uTimerHz) 1825 Cfg.Device.cMsSchedulingHint = 1000 /* ms */ / pStreamCC->State.uTimerHz; 1826 1827 if (pStreamCC->State.pCircBuf) 1828 { 1829 RTCircBufDestroy(pStreamCC->State.pCircBuf); 1830 pStreamCC->State.pCircBuf = NULL; 1831 } 1832 1833 rc = RTCircBufCreate(&pStreamCC->State.pCircBuf, PDMAudioPropsMilliToBytes(&Cfg.Props, 100 /*ms*/)); /** @todo Make this configurable. */ 1834 if (RT_SUCCESS(rc)) 1835 { 1836 pStreamCC->State.StatDmaBufSize = (uint32_t)RTCircBufSize(pStreamCC->State.pCircBuf); 1837 1838 ichac97R3MixerRemoveDrvStreams(pDevIns, pThisCC, pMixSink, Cfg.enmDir, Cfg.enmPath); 1839 rc = ichac97R3MixerAddDrvStreams(pDevIns, pThisCC, pMixSink, &Cfg); 1829 1840 if (RT_SUCCESS(rc)) 1830 { 1831 pStreamCC->State.StatDmaBufSize = (uint32_t)RTCircBufSize(pStreamCC->State.pCircBuf); 1832 1833 ichac97R3MixerRemoveDrvStreams(pDevIns, pThisCC, pMixSink, Cfg.enmDir, Cfg.enmPath); 1834 rc = ichac97R3MixerAddDrvStreams(pDevIns, pThisCC, pMixSink, &Cfg); 1835 if (RT_SUCCESS(rc)) 1836 rc = PDMAudioStrmCfgCopy(&pStreamCC->State.Cfg, &Cfg); 1837 } 1841 rc = PDMAudioStrmCfgCopy(&pStreamCC->State.Cfg, &Cfg); 1838 1842 } 1839 1843 } 1840 else 1841 LogFlowFunc(("[SD%RU8] Skipping (re-)creation\n", pStream->u8SD)); 1842 } 1843 1844 LogFlowFunc(("[SD%RU8] rc=%Rrc\n", pStream->u8SD, rc)); 1844 LogFlowFunc(("[SD%RU8] rc=%Rrc\n", pStream->u8SD, rc)); 1845 } 1846 else 1847 LogFlowFunc(("[SD%RU8] Skipping (re-)creation\n", pStream->u8SD)); 1845 1848 return rc; 1846 1849 } … … 2872 2875 ichac97R3StreamFetchBDLE(pDevIns, pStream); 2873 2876 # ifdef LOG_ENABLED 2874 ichac97R3BDLEDumpAll(pDevIns, pStream->Regs.bdbar, pStream->Regs.lvi + 1); 2877 if (LogIsFlowEnabled()) 2878 ichac97R3DbgPrintBdl(pDevIns, pThis, pStream, DBGFR3InfoLogHlp(), "ichac97IoPortNabmWrite: "); 2875 2879 # endif 2876 2880 ichac97R3StreamEnable(pDevIns, pThis, pThisCC, pStream, pStreamCC, true /* fEnable */); 2877 2881 2878 2882 /* Arm the timer for this stream. */ 2879 /** @todo r=bird: This function returns bool, not VBox status! */2880 2883 ichac97R3TimerSet(pDevIns, pStream, pStreamCC->State.cTransferTicks); 2881 2884 } … … 3255 3258 #ifdef IN_RING3 3256 3259 3260 3261 /********************************************************************************************************************************* 3262 * State Saving & Loading * 3263 *********************************************************************************************************************************/ 3264 3257 3265 /** 3258 3266 * Saves (serializes) an AC'97 stream using SSM. … … 3425 3433 3426 3434 3435 /********************************************************************************************************************************* 3436 * Debug Info Items * 3437 *********************************************************************************************************************************/ 3438 3439 /** Used by ichac97R3DbgInfoStream and ichac97R3DbgInfoBDL. */ 3440 static int ichac97R3DbgLookupStrmIdx(PCDBGFINFOHLP pHlp, const char *pszArgs) 3441 { 3442 if (pszArgs && *pszArgs) 3443 { 3444 int32_t idxStream; 3445 int rc = RTStrToInt32Full(pszArgs, 0, &idxStream); 3446 if (RT_SUCCESS(rc) && idxStream >= -1 && idxStream < AC97_MAX_STREAMS) 3447 return idxStream; 3448 pHlp->pfnPrintf(pHlp, "Argument '%s' is not a valid stream number!\n", pszArgs); 3449 } 3450 return -1; 3451 } 3452 3453 3454 /** 3455 * Generic buffer descriptor list dumper. 3456 */ 3457 static void ichac97R3DbgPrintBdl(PPDMDEVINS pDevIns, PAC97STATE pThis, PAC97STREAM pStream, 3458 PCDBGFINFOHLP pHlp, const char *pszPrefix) 3459 { 3460 unsigned const cEntries = pStream->Regs.lvi + 1; 3461 pHlp->pfnPrintf(pHlp, "%sBDL for stream #%u: @ %#RX32 L %#x:\n", pszPrefix, pStream->u8SD, pStream->Regs.bdbar, cEntries); 3462 if (pStream->Regs.bdbar != 0) 3463 { 3464 /* Read all in one go. */ 3465 AssertCompile(sizeof(pStream->Regs.lvi) == sizeof(uint8_t)); 3466 AC97BDLE aBdl[256]; 3467 RT_ZERO(aBdl); 3468 PDMDevHlpPCIPhysRead(pDevIns, pStream->Regs.bdbar, aBdl, sizeof(aBdl[0]) * cEntries); 3469 3470 /* Get the audio props for the stream so we can translate the sizes correctly. */ 3471 PDMAUDIOPCMPROPS Props; 3472 ichach97R3CalcStreamProps(pThis, pStream->u8SD, &Props); 3473 3474 /* Dump them. */ 3475 uint64_t cbTotal = 0; 3476 for (unsigned i = 0; i < cEntries; i++) 3477 { 3478 aBdl[i].addr = RT_LE2H_U32(aBdl[i].addr); 3479 aBdl[i].ctl_len = RT_LE2H_U32(aBdl[i].ctl_len); 3480 3481 uint32_t const cb = (aBdl[i].ctl_len & AC97_BD_LEN_MASK) * PDMAudioPropsSampleSize(&Props); /** @todo or frame size? OSDev says frame... */ 3482 cbTotal += cb; 3483 3484 char szFlags[64]; 3485 szFlags[0] = '\0'; 3486 if (aBdl[i].ctl_len & ~(AC97_BD_LEN_MASK | AC97_BD_IOC | AC97_BD_BUP)) 3487 RTStrPrintf(szFlags, sizeof(szFlags), " !!fFlags=%#x!!\n", aBdl[i].ctl_len & ~AC97_BD_LEN_MASK); 3488 3489 pHlp->pfnPrintf(pHlp, "%s BDLE%03u: %#010RX32 L %#06x / LB %#RX32 / %RU64ms%s%s%s\n", pszPrefix, i, aBdl[i].addr, 3490 aBdl[i].ctl_len & AC97_BD_LEN_MASK, cb, PDMAudioPropsBytesToMilli(&Props, cb), 3491 aBdl[i].ctl_len & AC97_BD_IOC ? " ioc" : "", 3492 aBdl[i].ctl_len & AC97_BD_BUP ? " bup" : "", 3493 szFlags, !(aBdl[i].addr & 3) ? "" : " !!Addr!!"); 3494 } 3495 3496 pHlp->pfnPrintf(pHlp, "%sTotal: %#RX64 bytes (%RU64), %RU64 ms\n", pszPrefix, cbTotal, cbTotal, 3497 PDMAudioPropsBytesToMilli(&Props, cbTotal)); 3498 } 3499 } 3500 3501 3502 /** 3503 * @callback_method_impl{FNDBGFHANDLERDEV, ac97bdl} 3504 */ 3505 static DECLCALLBACK(void) ichac97R3DbgInfoBDL(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 3506 { 3507 PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE); 3508 int idxStream = ichac97R3DbgLookupStrmIdx(pHlp, pszArgs); 3509 if (idxStream != -1) 3510 ichac97R3DbgPrintBdl(pDevIns, pThis, &pThis->aStreams[idxStream], pHlp, ""); 3511 else 3512 for (idxStream = 0; idxStream < AC97_MAX_STREAMS; ++idxStream) 3513 ichac97R3DbgPrintBdl(pDevIns, pThis, &pThis->aStreams[idxStream], pHlp, ""); 3514 } 3515 3516 3517 /** Worker for ichac97R3DbgInfoStream. */ 3518 static void ichac97R3DbgPrintStream(PCDBGFINFOHLP pHlp, PAC97STREAM pStream, PAC97STREAMR3 pStreamR3) 3519 { 3520 char szTmp[PDMAUDIOSTRMCFGTOSTRING_MAX]; 3521 pHlp->pfnPrintf(pHlp, "Stream #%d: %s\n", pStream->u8SD, 3522 PDMAudioStrmCfgToString(&pStreamR3->State.Cfg, szTmp, sizeof(szTmp))); 3523 pHlp->pfnPrintf(pHlp, " BDBAR %#010RX32\n", pStream->Regs.bdbar); 3524 pHlp->pfnPrintf(pHlp, " CIV %#04RX8\n", pStream->Regs.civ); 3525 pHlp->pfnPrintf(pHlp, " LVI %#04RX8\n", pStream->Regs.lvi); 3526 pHlp->pfnPrintf(pHlp, " SR %#06RX16\n", pStream->Regs.sr); 3527 pHlp->pfnPrintf(pHlp, " PICB %#06RX16\n", pStream->Regs.picb); 3528 pHlp->pfnPrintf(pHlp, " PIV %#04RX8\n", pStream->Regs.piv); 3529 pHlp->pfnPrintf(pHlp, " CR %#04RX8\n", pStream->Regs.cr); 3530 if (pStream->Regs.bd_valid) 3531 { 3532 pHlp->pfnPrintf(pHlp, " BD.ADDR %#010RX32\n", pStream->Regs.bd.addr); 3533 pHlp->pfnPrintf(pHlp, " BD.LEN %#04RX16\n", (uint16_t)pStream->Regs.bd.ctl_len); 3534 pHlp->pfnPrintf(pHlp, " BD.CTL %#04RX16\n", (uint16_t)(pStream->Regs.bd.ctl_len >> 16)); 3535 } 3536 3537 pHlp->pfnPrintf(pHlp, " offRead %#RX64\n", pStreamR3->State.offRead); 3538 pHlp->pfnPrintf(pHlp, " offWrite %#RX64\n", pStreamR3->State.offWrite); 3539 pHlp->pfnPrintf(pHlp, " uTimerHz %RU16\n", pStreamR3->State.uTimerHz); 3540 pHlp->pfnPrintf(pHlp, " cTransferTicks %RU64\n", pStreamR3->State.cTransferTicks); 3541 pHlp->pfnPrintf(pHlp, " cbTransferChunk %#RX32\n", pStreamR3->State.cbTransferChunk); 3542 } 3543 3544 3545 /** 3546 * @callback_method_impl{FNDBGFHANDLERDEV, ac97stream} 3547 */ 3548 static DECLCALLBACK(void) ichac97R3DbgInfoStream(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 3549 { 3550 PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE); 3551 PAC97STATER3 pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PAC97STATER3); 3552 int idxStream = ichac97R3DbgLookupStrmIdx(pHlp, pszArgs); 3553 if (idxStream != -1) 3554 ichac97R3DbgPrintStream(pHlp, &pThis->aStreams[idxStream], &pThisCC->aStreams[idxStream]); 3555 else 3556 for (idxStream = 0; idxStream < AC97_MAX_STREAMS; ++idxStream) 3557 ichac97R3DbgPrintStream(pHlp, &pThis->aStreams[idxStream], &pThisCC->aStreams[idxStream]); 3558 } 3559 3560 3561 /********************************************************************************************************************************* 3562 * PDMIBASE * 3563 *********************************************************************************************************************************/ 3564 3427 3565 /** 3428 3566 * @interface_method_impl{PDMIBASE,pfnQueryInterface} … … 3435 3573 } 3436 3574 3575 3576 /********************************************************************************************************************************* 3577 * PDMDEVREG * 3578 *********************************************************************************************************************************/ 3437 3579 3438 3580 /** … … 3882 4024 3883 4025 ichac97R3Reset(pDevIns); 4026 4027 /* 4028 * Info items. 4029 */ 4030 //PDMDevHlpDBGFInfoRegister(pDevIns, "ac97", "AC'97 registers. (ac97 [register case-insensitive])", ichac97R3DbgInfo); 4031 PDMDevHlpDBGFInfoRegister(pDevIns, "ac97bdl", "AC'97 buffer descriptor list (BDL). (ac97bdl [stream number])", 4032 ichac97R3DbgInfoBDL); 4033 PDMDevHlpDBGFInfoRegister(pDevIns, "ac97stream", "AC'97 stream info. (ac97stream [stream number])", ichac97R3DbgInfoStream); 4034 //PDMDevHlpDBGFInfoRegister(pDevIns, "ac97mixer", "AC'97 mixer state.", ichac97R3DbgInfoMixer); 3884 4035 3885 4036 /*
Note:
See TracChangeset
for help on using the changeset viewer.