Changeset 89265 in vbox for trunk/src/VBox/ValidationKit/utils
- Timestamp:
- May 25, 2021 11:10:40 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 144608
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/utils/audio/vkat.cpp
r89261 r89265 177 177 178 178 /** 179 * Structure for keeping an audio test audio stream. 180 */ 181 typedef 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. */ 191 typedef AUDIOTESTSTREAM *PAUDIOTESTSTREAM; 192 193 /** 179 194 * Audio test environment parameters. 180 195 * Not necessarily bound to a specific test (can be reused). … … 183 198 { 184 199 /** Output path for storing the test environment's final test files. */ 185 char szPathOut[RTPATH_MAX];200 char szPathOut[RTPATH_MAX]; 186 201 /** Temporary path for this test environment. */ 187 char szPathTemp[RTPATH_MAX];202 char szPathTemp[RTPATH_MAX]; 188 203 /** The audio test driver stack. */ 189 AUDIOTESTDRVSTACK DrvStack;204 AUDIOTESTDRVSTACK DrvStack; 190 205 /** The current (last) audio device enumeration to use. */ 191 PDMAUDIOHOSTENUM DevEnum;206 PDMAUDIOHOSTENUM DevEnum; 192 207 /** Audio stream. */ 193 AUDIOTESTSTREAM aStreams[AUDIOTESTENV_MAX_STREAMS];208 AUDIOTESTSTREAM aStreams[AUDIOTESTENV_MAX_STREAMS]; 194 209 /** The audio test set to use. */ 195 AUDIOTESTSET Set;210 AUDIOTESTSET Set; 196 211 } AUDIOTESTENV; 197 212 … … 849 864 850 865 /** 851 * C reates an output stream.866 * Common stream creation code. 852 867 * 853 868 * @returns VBox status code. 854 869 * @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. 859 871 * @param ppStream Where to return the stream pointer on success. 860 872 * @param pCfgAcq Where to return the actual (well, not … … 863 875 * input). 864 876 */ 865 static int audioTestDriverStackStreamCreateOutput(PAUDIOTESTDRVSTACK pDrvStack, PCPDMAUDIOPCMPROPS pProps, 866 uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint, 867 PPDMAUDIOSTREAM *ppStream, PPDMAUDIOSTREAMCFG pCfgAcq) 877 static int audioTestDriverStackStreamCreate(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAMCFG pCfgReq, 878 PPDMAUDIOSTREAM *ppStream, PPDMAUDIOSTREAMCFG pCfgAcq) 868 879 { 869 880 char szTmp[PDMAUDIOSTRMCFGTOSTRING_MAX + 16]; 881 int rc; 870 882 *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 == 0882 ? 10 : cMsSchedulingHint;883 if (pDrvStack->pIAudioConnector && (cMsBufferSize == UINT32_MAX || cMsBufferSize == 0))884 CfgReq.Backend.cFramesBufferSize = 0; /* DrvAudio picks the default */885 else886 CfgReq.Backend.cFramesBufferSize = PDMAudioPropsMilliToFrames(pProps,887 cMsBufferSize == UINT32_MAX || cMsBufferSize == 0888 ? 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 else893 CfgReq.Backend.cFramesPreBuffering = PDMAudioPropsMilliToFrames(pProps, cMsPreBuffer);894 if ( CfgReq.Backend.cFramesPreBuffering >= CfgReq.Backend.cFramesBufferSize + 16895 && !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 > 16900 ? 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);906 883 907 884 if (pDrvStack->pIAudioConnector) … … 910 887 * DrvAudio does most of the work here. 911 888 */ 912 PDMAUDIOSTREAMCFG CfgGst = CfgReq;889 PDMAUDIOSTREAMCFG CfgGst = *pCfgReq; 913 890 rc = pDrvStack->pIAudioConnector->pfnStreamCreate(pDrvStack->pIAudioConnector, PDMAUDIOSTREAM_CREATE_F_NO_MIXBUF, 914 &CfgReq, &CfgGst, ppStream);891 pCfgReq, &CfgGst, ppStream); 915 892 if (RT_SUCCESS(rc)) 916 893 { 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... */ 918 895 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))); 920 897 return rc; 921 898 } … … 944 921 pStreamAt->Core.enmDir = PDMAUDIODIR_OUT; 945 922 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); 948 925 949 926 pStreamAt->Backend.uMagic = PDMAUDIOBACKENDSTREAM_MAGIC; … … 953 930 * Call the backend to create the stream. 954 931 */ 955 pStreamAt->Cfg = CfgReq;932 pStreamAt->Cfg = *pCfgReq; 956 933 957 934 rc = pDrvStack->pIHostAudio->pfnStreamCreate(pDrvStack->pIHostAudio, &pStreamAt->Backend, 958 &CfgReq, &pStreamAt->Cfg);935 pCfgReq, &pStreamAt->Cfg); 959 936 if (RT_SUCCESS(rc)) 960 937 { … … 1013 990 } 1014 991 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 */ 1009 static 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 */ 1069 static 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); 1015 1112 } 1016 1113 … … 1445 1542 1446 1543 /** 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 /**1476 1544 * Destroys an audio test stream. 1477 1545 * … … 1482 1550 static int audioTestStreamDestroy(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream) 1483 1551 { 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 } 1495 1561 1496 1562 return rc; … … 1508 1574 static int audioTestCreateStreamDefaultIn(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PPDMAUDIOPCMPROPS pProps) 1509 1575 { 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; 1524 1582 } 1525 1583 … … 1546 1604 AssertRCReturn(rc, rc); 1547 1605 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); 1549 1608 if (enmState == PDMHOSTAUDIOSTREAMSTATE_OKAY) 1550 1609 { … … 1557 1616 { 1558 1617 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); 1560 1620 if (RT_SUCCESS(rc)) 1561 1621 rc = AudioTestSetObjWrite(pObj, abBuf, cbRead); … … 1592 1652 static int audioTestCreateStreamDefaultOut(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PPDMAUDIOPCMPROPS pProps) 1593 1653 { 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; 1608 1660 } 1609 1661 … … 1633 1685 AssertRCReturn(rc, rc); 1634 1686 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); 1636 1689 if (enmState == PDMHOSTAUDIOSTREAMSTATE_OKAY) 1637 1690 { … … 1653 1706 { 1654 1707 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); 1656 1710 } 1657 1711 } … … 2109 2163 #ifndef DEBUG_andy 2110 2164 /* Clean up. */ 2165 AudioTestSetClose(&TstEnv.Set); /* wipe fails on windows if the manifest file is open*/ 2166 2111 2167 int rc2 = AudioTestSetWipe(&TstEnv.Set); 2112 2168 AssertRC(rc2); /* Annoying, but not test-critical. */
Note:
See TracChangeset
for help on using the changeset viewer.