VirtualBox

Changeset 89265 in vbox for trunk/src/VBox/ValidationKit


Ignore:
Timestamp:
May 25, 2021 11:10:40 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
144608
Message:

ValKit/AudioTest: Use the driver stack functions for creating and destroying streams. The other ones doesn't work for the WasAPI backend (pfnStreamInitAsync). bugref:10008

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/utils/audio/vkat.cpp

    r89261 r89265  
    177177
    178178/**
     179 * Structure for keeping an audio test audio stream.
     180 */
     181typedef struct AUDIOTESTSTREAM
     182{
     183    /** The PDM stream. */
     184    PPDMAUDIOSTREAM         pStream;
     185    /** The backend stream. */
     186    PPDMAUDIOBACKENDSTREAM  pBackend;
     187    /** The stream config. */
     188    PDMAUDIOSTREAMCFG       Cfg;
     189} AUDIOTESTSTREAM;
     190/** Pointer to audio test stream. */
     191typedef AUDIOTESTSTREAM *PAUDIOTESTSTREAM;
     192
     193/**
    179194 * Audio test environment parameters.
    180195 * Not necessarily bound to a specific test (can be reused).
     
    183198{
    184199    /** Output path for storing the test environment's final test files. */
    185     char                  szPathOut[RTPATH_MAX];
     200    char                    szPathOut[RTPATH_MAX];
    186201    /** Temporary path for this test environment. */
    187     char                  szPathTemp[RTPATH_MAX];
     202    char                    szPathTemp[RTPATH_MAX];
    188203    /** The audio test driver stack. */
    189     AUDIOTESTDRVSTACK     DrvStack;
     204    AUDIOTESTDRVSTACK       DrvStack;
    190205    /** The current (last) audio device enumeration to use. */
    191     PDMAUDIOHOSTENUM      DevEnum;
     206    PDMAUDIOHOSTENUM        DevEnum;
    192207    /** Audio stream. */
    193     AUDIOTESTSTREAM       aStreams[AUDIOTESTENV_MAX_STREAMS];
     208    AUDIOTESTSTREAM         aStreams[AUDIOTESTENV_MAX_STREAMS];
    194209    /** The audio test set to use. */
    195     AUDIOTESTSET          Set;
     210    AUDIOTESTSET            Set;
    196211} AUDIOTESTENV;
    197212
     
    849864
    850865/**
    851  * Creates an output stream.
     866 * Common stream creation code.
    852867 *
    853868 * @returns VBox status code.
    854869 * @param   pDrvStack           The audio driver stack to create it via.
    855  * @param   pProps              The audio properties to use.
    856  * @param   cMsBufferSize       The buffer size in milliseconds.
    857  * @param   cMsPreBuffer        The pre-buffering amount in milliseconds.
    858  * @param   cMsSchedulingHint   The scheduling hint in milliseconds.
     870 * @param   pCfgReq             The requested config.
    859871 * @param   ppStream            Where to return the stream pointer on success.
    860872 * @param   pCfgAcq             Where to return the actual (well, not
     
    863875 *                              input).
    864876 */
    865 static int audioTestDriverStackStreamCreateOutput(PAUDIOTESTDRVSTACK pDrvStack, PCPDMAUDIOPCMPROPS pProps,
    866                                                   uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint,
    867                                                   PPDMAUDIOSTREAM *ppStream, PPDMAUDIOSTREAMCFG pCfgAcq)
     877static int audioTestDriverStackStreamCreate(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAMCFG pCfgReq,
     878                                            PPDMAUDIOSTREAM *ppStream, PPDMAUDIOSTREAMCFG pCfgAcq)
    868879{
    869880    char szTmp[PDMAUDIOSTRMCFGTOSTRING_MAX + 16];
     881    int  rc;
    870882    *ppStream = NULL;
    871 
    872     /*
    873      * Calculate the stream config.
    874      */
    875     PDMAUDIOSTREAMCFG CfgReq;
    876     int rc = PDMAudioStrmCfgInitWithProps(&CfgReq, pProps);
    877     AssertRC(rc);
    878     CfgReq.enmDir                       = PDMAUDIODIR_OUT;
    879     CfgReq.enmPath                      = PDMAUDIOPATH_OUT_FRONT;
    880     CfgReq.enmLayout                    = PDMAUDIOSTREAMLAYOUT_INTERLEAVED;
    881     CfgReq.Device.cMsSchedulingHint     = cMsSchedulingHint == UINT32_MAX || cMsSchedulingHint == 0
    882                                         ? 10 : cMsSchedulingHint;
    883     if (pDrvStack->pIAudioConnector && (cMsBufferSize == UINT32_MAX || cMsBufferSize == 0))
    884         CfgReq.Backend.cFramesBufferSize = 0; /* DrvAudio picks the default */
    885     else
    886         CfgReq.Backend.cFramesBufferSize = PDMAudioPropsMilliToFrames(pProps,
    887                                                                       cMsBufferSize == UINT32_MAX || cMsBufferSize == 0
    888                                                                       ? 300 : cMsBufferSize);
    889     if (cMsPreBuffer == UINT32_MAX)
    890         CfgReq.Backend.cFramesPreBuffering = pDrvStack->pIAudioConnector ? UINT32_MAX /*DrvAudo picks the default */
    891                                            : CfgReq.Backend.cFramesBufferSize * 2 / 3;
    892     else
    893         CfgReq.Backend.cFramesPreBuffering = PDMAudioPropsMilliToFrames(pProps, cMsPreBuffer);
    894     if (   CfgReq.Backend.cFramesPreBuffering >= CfgReq.Backend.cFramesBufferSize + 16
    895         && !pDrvStack->pIAudioConnector /*DrvAudio deals with it*/ )
    896     {
    897         RTMsgWarning("Cannot pre-buffer %#x frames with only %#x frames of buffer!",
    898                      CfgReq.Backend.cFramesPreBuffering, CfgReq.Backend.cFramesBufferSize);
    899         CfgReq.Backend.cFramesPreBuffering = CfgReq.Backend.cFramesBufferSize > 16
    900             ? CfgReq.Backend.cFramesBufferSize - 16 : 0;
    901     }
    902 
    903     static uint32_t s_idxStream = 0;
    904     uint32_t const idxStream = s_idxStream++;
    905     RTStrPrintf(CfgReq.szName, sizeof(CfgReq.szName), "out-%u", idxStream);
    906883
    907884    if (pDrvStack->pIAudioConnector)
     
    910887         * DrvAudio does most of the work here.
    911888         */
    912         PDMAUDIOSTREAMCFG CfgGst = CfgReq;
     889        PDMAUDIOSTREAMCFG CfgGst = *pCfgReq;
    913890        rc = pDrvStack->pIAudioConnector->pfnStreamCreate(pDrvStack->pIAudioConnector, PDMAUDIOSTREAM_CREATE_F_NO_MIXBUF,
    914                                                           &CfgReq, &CfgGst, ppStream);
     891                                                          pCfgReq, &CfgGst, ppStream);
    915892        if (RT_SUCCESS(rc))
    916893        {
    917             *pCfgAcq = CfgReq; /** @todo PDMIAUDIOCONNECTOR::pfnStreamCreate only does one utterly pointless change to the two configs (enmLayout) from what I can tell... */
     894            *pCfgAcq = *pCfgReq; /** @todo PDMIAUDIOCONNECTOR::pfnStreamCreate only does one utterly pointless change to the two configs (enmLayout) from what I can tell... */
    918895            pCfgAcq->Props = (*ppStream)->Props;
    919             RTMsgInfo("Created backend stream: %s\n", PDMAudioStrmCfgToString(&CfgReq, szTmp, sizeof(szTmp)));
     896            RTMsgInfo("Created backend stream: %s\n", PDMAudioStrmCfgToString(pCfgReq, szTmp, sizeof(szTmp)));
    920897            return rc;
    921898        }
     
    944921                    pStreamAt->Core.enmDir     = PDMAUDIODIR_OUT;
    945922                    pStreamAt->Core.cbBackend  = cbStream;
    946                     pStreamAt->Core.Props      = CfgReq.Props;
    947                     RTStrPrintf(pStreamAt->Core.szName, sizeof(pStreamAt->Core.szName), "out-%u", idxStream);
     923                    pStreamAt->Core.Props      = pCfgReq->Props;
     924                    RTStrPrintf(pStreamAt->Core.szName, sizeof(pStreamAt->Core.szName), pCfgReq->szName);
    948925
    949926                    pStreamAt->Backend.uMagic  = PDMAUDIOBACKENDSTREAM_MAGIC;
     
    953930                     * Call the backend to create the stream.
    954931                     */
    955                     pStreamAt->Cfg = CfgReq;
     932                    pStreamAt->Cfg = *pCfgReq;
    956933
    957934                    rc = pDrvStack->pIHostAudio->pfnStreamCreate(pDrvStack->pIHostAudio, &pStreamAt->Backend,
    958                                                                  &CfgReq, &pStreamAt->Cfg);
     935                                                                 pCfgReq, &pStreamAt->Cfg);
    959936                    if (RT_SUCCESS(rc))
    960937                    {
     
    1013990    }
    1014991    return rc;
     992}
     993
     994/**
     995 * Creates an output stream.
     996 *
     997 * @returns VBox status code.
     998 * @param   pDrvStack           The audio driver stack to create it via.
     999 * @param   pProps              The audio properties to use.
     1000 * @param   cMsBufferSize       The buffer size in milliseconds.
     1001 * @param   cMsPreBuffer        The pre-buffering amount in milliseconds.
     1002 * @param   cMsSchedulingHint   The scheduling hint in milliseconds.
     1003 * @param   ppStream            Where to return the stream pointer on success.
     1004 * @param   pCfgAcq             Where to return the actual (well, not
     1005 *                              necessarily when using DrvAudio, but probably
     1006 *                              the same) stream config on success (not used as
     1007 *                              input).
     1008 */
     1009static int audioTestDriverStackStreamCreateOutput(PAUDIOTESTDRVSTACK pDrvStack, PCPDMAUDIOPCMPROPS pProps,
     1010                                                  uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint,
     1011                                                  PPDMAUDIOSTREAM *ppStream, PPDMAUDIOSTREAMCFG pCfgAcq)
     1012{
     1013    /*
     1014     * Calculate the stream config.
     1015     */
     1016    PDMAUDIOSTREAMCFG CfgReq;
     1017    int rc = PDMAudioStrmCfgInitWithProps(&CfgReq, pProps);
     1018    AssertRC(rc);
     1019    CfgReq.enmDir                       = PDMAUDIODIR_OUT;
     1020    CfgReq.enmPath                      = PDMAUDIOPATH_OUT_FRONT;
     1021    CfgReq.enmLayout                    = PDMAUDIOSTREAMLAYOUT_INTERLEAVED;
     1022    CfgReq.Device.cMsSchedulingHint     = cMsSchedulingHint == UINT32_MAX || cMsSchedulingHint == 0
     1023                                        ? 10 : cMsSchedulingHint;
     1024    if (pDrvStack->pIAudioConnector && (cMsBufferSize == UINT32_MAX || cMsBufferSize == 0))
     1025        CfgReq.Backend.cFramesBufferSize = 0; /* DrvAudio picks the default */
     1026    else
     1027        CfgReq.Backend.cFramesBufferSize = PDMAudioPropsMilliToFrames(pProps,
     1028                                                                      cMsBufferSize == UINT32_MAX || cMsBufferSize == 0
     1029                                                                      ? 300 : cMsBufferSize);
     1030    if (cMsPreBuffer == UINT32_MAX)
     1031        CfgReq.Backend.cFramesPreBuffering = pDrvStack->pIAudioConnector ? UINT32_MAX /*DrvAudo picks the default */
     1032                                           : CfgReq.Backend.cFramesBufferSize * 2 / 3;
     1033    else
     1034        CfgReq.Backend.cFramesPreBuffering = PDMAudioPropsMilliToFrames(pProps, cMsPreBuffer);
     1035    if (   CfgReq.Backend.cFramesPreBuffering >= CfgReq.Backend.cFramesBufferSize + 16
     1036        && !pDrvStack->pIAudioConnector /*DrvAudio deals with it*/ )
     1037    {
     1038        RTMsgWarning("Cannot pre-buffer %#x frames with only %#x frames of buffer!",
     1039                     CfgReq.Backend.cFramesPreBuffering, CfgReq.Backend.cFramesBufferSize);
     1040        CfgReq.Backend.cFramesPreBuffering = CfgReq.Backend.cFramesBufferSize > 16
     1041            ? CfgReq.Backend.cFramesBufferSize - 16 : 0;
     1042    }
     1043
     1044    static uint32_t s_idxStream = 0;
     1045    uint32_t const idxStream = s_idxStream++;
     1046    RTStrPrintf(CfgReq.szName, sizeof(CfgReq.szName), "out-%u", idxStream);
     1047
     1048    /*
     1049     * Call common code to do the actual work.
     1050     */
     1051    return audioTestDriverStackStreamCreate(pDrvStack, &CfgReq, ppStream, pCfgAcq);
     1052}
     1053
     1054/**
     1055 * Creates an input stream.
     1056 *
     1057 * @returns VBox status code.
     1058 * @param   pDrvStack           The audio driver stack to create it via.
     1059 * @param   pProps              The audio properties to use.
     1060 * @param   cMsBufferSize       The buffer size in milliseconds.
     1061 * @param   cMsPreBuffer        The pre-buffering amount in milliseconds.
     1062 * @param   cMsSchedulingHint   The scheduling hint in milliseconds.
     1063 * @param   ppStream            Where to return the stream pointer on success.
     1064 * @param   pCfgAcq             Where to return the actual (well, not
     1065 *                              necessarily when using DrvAudio, but probably
     1066 *                              the same) stream config on success (not used as
     1067 *                              input).
     1068 */
     1069static int audioTestDriverStackStreamCreateInput(PAUDIOTESTDRVSTACK pDrvStack, PCPDMAUDIOPCMPROPS pProps,
     1070                                                 uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint,
     1071                                                 PPDMAUDIOSTREAM *ppStream, PPDMAUDIOSTREAMCFG pCfgAcq)
     1072{
     1073    /*
     1074     * Calculate the stream config.
     1075     */
     1076    PDMAUDIOSTREAMCFG CfgReq;
     1077    int rc = PDMAudioStrmCfgInitWithProps(&CfgReq, pProps);
     1078    AssertRC(rc);
     1079    CfgReq.enmDir                       = PDMAUDIODIR_IN;
     1080    CfgReq.enmPath                      = PDMAUDIOPATH_IN_LINE;
     1081    CfgReq.enmLayout                    = PDMAUDIOSTREAMLAYOUT_INTERLEAVED;
     1082    CfgReq.Device.cMsSchedulingHint     = cMsSchedulingHint == UINT32_MAX || cMsSchedulingHint == 0
     1083                                        ? 10 : cMsSchedulingHint;
     1084    if (pDrvStack->pIAudioConnector && (cMsBufferSize == UINT32_MAX || cMsBufferSize == 0))
     1085        CfgReq.Backend.cFramesBufferSize = 0; /* DrvAudio picks the default */
     1086    else
     1087        CfgReq.Backend.cFramesBufferSize = PDMAudioPropsMilliToFrames(pProps,
     1088                                                                      cMsBufferSize == UINT32_MAX || cMsBufferSize == 0
     1089                                                                      ? 300 : cMsBufferSize);
     1090    if (cMsPreBuffer == UINT32_MAX)
     1091        CfgReq.Backend.cFramesPreBuffering = pDrvStack->pIAudioConnector ? UINT32_MAX /*DrvAudio picks the default */
     1092                                           : CfgReq.Backend.cFramesBufferSize / 2;
     1093    else
     1094        CfgReq.Backend.cFramesPreBuffering = PDMAudioPropsMilliToFrames(pProps, cMsPreBuffer);
     1095    if (   CfgReq.Backend.cFramesPreBuffering >= CfgReq.Backend.cFramesBufferSize + 16 /** @todo way to little */
     1096        && !pDrvStack->pIAudioConnector /*DrvAudio deals with it*/ )
     1097    {
     1098        RTMsgWarning("Cannot pre-buffer %#x frames with only %#x frames of buffer!",
     1099                     CfgReq.Backend.cFramesPreBuffering, CfgReq.Backend.cFramesBufferSize);
     1100        CfgReq.Backend.cFramesPreBuffering = CfgReq.Backend.cFramesBufferSize > 16
     1101            ? CfgReq.Backend.cFramesBufferSize - 16 : 0;
     1102    }
     1103
     1104    static uint32_t s_idxStream = 0;
     1105    uint32_t const idxStream = s_idxStream++;
     1106    RTStrPrintf(CfgReq.szName, sizeof(CfgReq.szName), "in-%u", idxStream);
     1107
     1108    /*
     1109     * Call common code to do the actual work.
     1110     */
     1111    return audioTestDriverStackStreamCreate(pDrvStack, &CfgReq, ppStream, pCfgAcq);
    10151112}
    10161113
     
    14451542
    14461543/**
    1447  * Creates an audio test stream.
    1448  *
    1449  * @returns VBox status code.
    1450  * @param   pTstEnv             Test environment to use for creating the stream.
    1451  * @param   pStream             Audio stream to create.
    1452  * @param   pCfg                Stream configuration to use for creation.
    1453  */
    1454 static int audioTestStreamCreate(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PPDMAUDIOSTREAMCFG pCfg)
    1455 {
    1456     PDMAUDIOSTREAMCFG CfgAcq;
    1457 
    1458     int rc = PDMAudioStrmCfgCopy(&CfgAcq, pCfg);
    1459     AssertRC(rc); /* Cannot fail. */
    1460 
    1461     rc = pTstEnv->DrvStack.pIHostAudio->pfnStreamCreate(pTstEnv->DrvStack.pIHostAudio, &pStream->Backend, pCfg, &CfgAcq);
    1462     if (RT_FAILURE(rc))
    1463         return rc;
    1464 
    1465     /* Do the async init in a synchronous way for now here. */
    1466     if (rc == VINF_AUDIO_STREAM_ASYNC_INIT_NEEDED)
    1467         rc = pTstEnv->DrvStack.pIHostAudio->pfnStreamInitAsync(pTstEnv->DrvStack.pIHostAudio, &pStream->Backend, false /* fDestroyed */);
    1468 
    1469     if (RT_SUCCESS(rc))
    1470         pStream->fCreated = true;
    1471 
    1472     return rc;
    1473 }
    1474 
    1475 /**
    14761544 * Destroys an audio test stream.
    14771545 *
     
    14821550static int audioTestStreamDestroy(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream)
    14831551{
    1484     if (!pStream)
    1485         return VINF_SUCCESS;
    1486 
    1487     if (!pStream->fCreated)
    1488         return VINF_SUCCESS;
    1489 
    1490     /** @todo Anything else to do here, e.g. test if there are left over samples or some such? */
    1491 
    1492     int rc = pTstEnv->DrvStack.pIHostAudio->pfnStreamDestroy(pTstEnv->DrvStack.pIHostAudio, &pStream->Backend, true /*fImmediate*/);
    1493     if (RT_SUCCESS(rc))
    1494         RT_BZERO(pStream, sizeof(PDMAUDIOBACKENDSTREAM));
     1552    int rc = VINF_SUCCESS;
     1553    if (pStream && pStream->pStream)
     1554    {
     1555        /** @todo Anything else to do here, e.g. test if there are left over samples or some such? */
     1556
     1557        audioTestDriverStackStreamDestroy(&pTstEnv->DrvStack, pStream->pStream);
     1558        pStream->pStream  = NULL;
     1559        pStream->pBackend = NULL;
     1560    }
    14951561
    14961562    return rc;
     
    15081574static int audioTestCreateStreamDefaultIn(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PPDMAUDIOPCMPROPS pProps)
    15091575{
    1510     PDMAUDIOSTREAMCFG Cfg;
    1511     int rc = PDMAudioStrmCfgInitWithProps(&Cfg, pProps);
    1512     AssertRC(rc); /* Cannot fail. */
    1513 
    1514     Cfg.enmDir      = PDMAUDIODIR_IN;
    1515     Cfg.enmPath     = PDMAUDIOPATH_IN_LINE; /* Note: HDA does not have a separate Mic-In enabled yet, so go for Line-In here. */
    1516     Cfg.enmLayout   = PDMAUDIOSTREAMLAYOUT_NON_INTERLEAVED;
    1517 
    1518     Cfg.Backend.cFramesBufferSize   = PDMAudioPropsMilliToFrames(pProps, 300);
    1519     Cfg.Backend.cFramesPreBuffering = PDMAudioPropsMilliToFrames(pProps, 200);
    1520     Cfg.Backend.cFramesPeriod       = PDMAudioPropsMilliToFrames(pProps, 10);
    1521     Cfg.Device.cMsSchedulingHint    = 10;
    1522 
    1523     return audioTestStreamCreate(pTstEnv, pStream, &Cfg);
     1576    pStream->pBackend = NULL;
     1577    int rc = audioTestDriverStackStreamCreateInput(&pTstEnv->DrvStack, pProps, 300 /*cMsBufferSize*/, 150 /*cMsPreBuffer*/,
     1578                                                   10 /*cMsSchedulingHint*/, &pStream->pStream, &pStream->Cfg);
     1579    if (RT_SUCCESS(rc) && !pTstEnv->DrvStack.pIAudioConnector)
     1580        pStream->pBackend = &((PAUDIOTESTDRVSTACKSTREAM)pStream->pStream)->Backend;
     1581    return rc;
    15241582}
    15251583
     
    15461604    AssertRCReturn(rc, rc);
    15471605
    1548     PDMHOSTAUDIOSTREAMSTATE enmState = pTstEnv->DrvStack.pIHostAudio->pfnStreamGetState(pTstEnv->DrvStack.pIHostAudio, &pStream->Backend);
     1606    PDMHOSTAUDIOSTREAMSTATE enmState = pTstEnv->DrvStack.pIHostAudio->pfnStreamGetState(pTstEnv->DrvStack.pIHostAudio,
     1607                                                                                        pStream->pBackend);
    15491608    if (enmState == PDMHOSTAUDIOSTREAMSTATE_OKAY)
    15501609    {
     
    15571616        {
    15581617            uint32_t cbRead = 0;
    1559             rc = pTstEnv->DrvStack.pIHostAudio->pfnStreamCapture(pTstEnv->DrvStack.pIHostAudio, &pStream->Backend, abBuf, sizeof(abBuf), &cbRead);
     1618            rc = pTstEnv->DrvStack.pIHostAudio->pfnStreamCapture(pTstEnv->DrvStack.pIHostAudio, pStream->pBackend, abBuf,
     1619                                                                 sizeof(abBuf), &cbRead);
    15601620            if (RT_SUCCESS(rc))
    15611621                rc = AudioTestSetObjWrite(pObj, abBuf, cbRead);
     
    15921652static int audioTestCreateStreamDefaultOut(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PPDMAUDIOPCMPROPS pProps)
    15931653{
    1594     PDMAUDIOSTREAMCFG Cfg;
    1595     int rc = PDMAudioStrmCfgInitWithProps(&Cfg, pProps);
    1596     AssertRC(rc); /* Cannot fail. */
    1597 
    1598     Cfg.enmDir      = PDMAUDIODIR_OUT;
    1599     Cfg.enmPath     = PDMAUDIOPATH_OUT_FRONT;
    1600     Cfg.enmLayout   = PDMAUDIOSTREAMLAYOUT_NON_INTERLEAVED;
    1601 
    1602     Cfg.Backend.cFramesBufferSize   = PDMAudioPropsMilliToFrames(pProps, 300);
    1603     Cfg.Backend.cFramesPreBuffering = PDMAudioPropsMilliToFrames(pProps, 200);
    1604     Cfg.Backend.cFramesPeriod       = PDMAudioPropsMilliToFrames(pProps, 10);
    1605     Cfg.Device.cMsSchedulingHint    = 10;
    1606 
    1607     return audioTestStreamCreate(pTstEnv, pStream, &Cfg);
     1654    pStream->pBackend = NULL;
     1655    int rc = audioTestDriverStackStreamCreateInput(&pTstEnv->DrvStack, pProps, 300 /*cMsBufferSize*/, 200 /*cMsPreBuffer*/,
     1656                                                   10 /*cMsSchedulingHint*/, &pStream->pStream, &pStream->Cfg);
     1657    if (RT_SUCCESS(rc) && !pTstEnv->DrvStack.pIAudioConnector)
     1658        pStream->pBackend = &((PAUDIOTESTDRVSTACKSTREAM)pStream->pStream)->Backend;
     1659    return rc;
    16081660}
    16091661
     
    16331685    AssertRCReturn(rc, rc);
    16341686
    1635     PDMHOSTAUDIOSTREAMSTATE enmState = pTstEnv->DrvStack.pIHostAudio->pfnStreamGetState(pTstEnv->DrvStack.pIHostAudio, &pStream->Backend);
     1687    PDMHOSTAUDIOSTREAMSTATE enmState = pTstEnv->DrvStack.pIHostAudio->pfnStreamGetState(pTstEnv->DrvStack.pIHostAudio,
     1688                                                                                        pStream->pBackend);
    16361689    if (enmState == PDMHOSTAUDIOSTREAMSTATE_OKAY)
    16371690    {
     
    16531706                {
    16541707                    uint32_t cbWritten;
    1655                     rc = pTstEnv->DrvStack.pIHostAudio->pfnStreamPlay(pTstEnv->DrvStack.pIHostAudio, &pStream->Backend, abBuf, cbBuf, &cbWritten);
     1708                    rc = pTstEnv->DrvStack.pIHostAudio->pfnStreamPlay(pTstEnv->DrvStack.pIHostAudio, pStream->pBackend,
     1709                                                                      abBuf, cbBuf, &cbWritten);
    16561710                }
    16571711            }
     
    21092163#ifndef DEBUG_andy
    21102164        /* Clean up. */
     2165        AudioTestSetClose(&TstEnv.Set); /* wipe fails on windows if the manifest file is open*/
     2166
    21112167        int rc2 = AudioTestSetWipe(&TstEnv.Set);
    21122168        AssertRC(rc2); /* Annoying, but not test-critical. */
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette