VirtualBox

Changeset 89612 in vbox


Ignore:
Timestamp:
Jun 10, 2021 11:04:58 PM (3 years ago)
Author:
vboxsync
Message:

DevIchAc97: Added ac97bdl and ac97stream debug info items. bugref:9890

File:
1 edited

Legend:

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

    r89379 r89612  
    661661DECLINLINE(PDMAUDIODIR)   ichac97GetDirFromSD(uint8_t uSD);
    662662DECLINLINE(void)          ichac97R3TimerSet(PPDMDEVINS pDevIns, PAC97STREAM pStream, uint64_t cTicksToDeadline);
     663
     664static void               ichac97R3DbgPrintBdl(PPDMDEVINS pDevIns, PAC97STATE pThis, PAC97STREAM pStream,
     665                                               PCDBGFINFOHLP pHlp, const char *pszPrefix);
    663666#endif /* IN_RING3 */
    664667
     
    12271230
    12281231
    1229 # ifdef LOG_ENABLED
    1230 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_ENDIAN
    1243 #  error "Please adapt the code (audio buffers are little endian)!"
    1244 # else
    1245         BDLE.addr    = RT_H2LE_U32(BDLE.addr & ~3);
    1246         BDLE.ctl_len = RT_H2LE_U32(BDLE.ctl_len);
    1247 #endif
    1248         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 
    12621232/**
    12631233 * Updates an AC'97 stream by doing its DMA transfers.
     
    16891659        return 0;
    16901660
     1661    /** @todo r=bird: Why use microseconds when the timer clock has been using
     1662     *        nanosecond resolution since early 2005? */
    16911663    const uint64_t usBytes        = PDMAudioPropsBytesToMicro(&pStreamCC->State.Cfg.Props, cbBytes);
    16921664    const uint64_t cTransferTicks = PDMDevHlpTimerFromMicro(pDevIns, pStream->hTimer, usBytes);
     
    17201692    Assert(pStreamCC->State.cTransferTicks); /* Paranoia. */
    17211693}
     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 */
     1703DECLINLINE(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 */
     1730DECLINLINE(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
    17221736
    17231737/**
     
    17391753                               PAC97STREAMR3 pStreamCC, bool fForce)
    17401754{
    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
    17421762    PAUDMIXSINK         pMixSink;
    1743     PDMAUDIOSTREAMCFG   Cfg;
    1744     RT_ZERO(Cfg);
    17451763    switch (pStream->u8SD)
    17461764    {
    17471765        case AC97SOUNDSOURCE_PI_INDEX:
    1748         {
    1749             PDMAudioPropsInit(&Cfg.Props, 2 /*16-bit*/, true /*signed*/, 2 /*stereo*/,
    1750                               ichac97MixerGet(pThis, AC97_PCM_LR_ADC_Rate));
    17511766            Cfg.enmDir      = PDMAUDIODIR_IN;
    17521767            Cfg.enmPath     = PDMAUDIOPATH_IN_LINE;
     
    17551770            pMixSink        = pThisCC->pSinkLineIn;
    17561771            break;
    1757         }
    17581772
    17591773        case AC97SOUNDSOURCE_MC_INDEX:
    1760         {
    1761             PDMAudioPropsInit(&Cfg.Props, 2 /*16-bit*/, true /*signed*/, 2 /*stereo*/,
    1762                               ichac97MixerGet(pThis, AC97_MIC_ADC_Rate));
    17631774            Cfg.enmDir      = PDMAUDIODIR_IN;
    17641775            Cfg.enmPath     = PDMAUDIOPATH_IN_MIC;
     
    17671778            pMixSink        = pThisCC->pSinkMicIn;
    17681779            break;
    1769         }
    17701780
    17711781        case AC97SOUNDSOURCE_PO_INDEX:
    1772         {
    1773             PDMAudioPropsInit(&Cfg.Props, 2 /*16-bit*/, true /*signed*/, 2 /*stereo*/,
    1774                               ichac97MixerGet(pThis, AC97_PCM_Front_DAC_Rate));
    17751782            Cfg.enmDir      = PDMAUDIODIR_OUT;
    17761783            Cfg.enmPath     = PDMAUDIOPATH_OUT_FRONT;
     
    17791786            pMixSink        = pThisCC->pSinkOut;
    17801787            break;
    1781         }
    17821788
    17831789        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)
    17951807        {
    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 */
    18021814            {
    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. */
    18161818                    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);
    18291840                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);
    18381842            }
    18391843        }
    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));
    18451848    return rc;
    18461849}
     
    28722875                                ichac97R3StreamFetchBDLE(pDevIns, pStream);
    28732876# ifdef LOG_ENABLED
    2874                                 ichac97R3BDLEDumpAll(pDevIns, pStream->Regs.bdbar, pStream->Regs.lvi + 1);
     2877                                if (LogIsFlowEnabled())
     2878                                    ichac97R3DbgPrintBdl(pDevIns, pThis, pStream, DBGFR3InfoLogHlp(), "ichac97IoPortNabmWrite: ");
    28752879# endif
    28762880                                ichac97R3StreamEnable(pDevIns, pThis, pThisCC, pStream, pStreamCC, true /* fEnable */);
    28772881
    28782882                                /* Arm the timer for this stream. */
    2879                                 /** @todo r=bird: This function returns bool, not VBox status! */
    28802883                                ichac97R3TimerSet(pDevIns, pStream, pStreamCC->State.cTransferTicks);
    28812884                            }
     
    32553258#ifdef IN_RING3
    32563259
     3260
     3261/*********************************************************************************************************************************
     3262*   State Saving & Loading                                                                                                       *
     3263*********************************************************************************************************************************/
     3264
    32573265/**
    32583266 * Saves (serializes) an AC'97 stream using SSM.
     
    34253433
    34263434
     3435/*********************************************************************************************************************************
     3436*   Debug Info Items                                                                                                             *
     3437*********************************************************************************************************************************/
     3438
     3439/** Used by ichac97R3DbgInfoStream and ichac97R3DbgInfoBDL. */
     3440static 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 */
     3457static 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 */
     3505static 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.    */
     3518static 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 */
     3548static 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
    34273565/**
    34283566 * @interface_method_impl{PDMIBASE,pfnQueryInterface}
     
    34353573}
    34363574
     3575
     3576/*********************************************************************************************************************************
     3577*   PDMDEVREG                                                                                                                    *
     3578*********************************************************************************************************************************/
    34373579
    34383580/**
     
    38824024
    38834025    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);
    38844035
    38854036    /*
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