Changeset 89051 in vbox for trunk/src/VBox/ValidationKit
- Timestamp:
- May 14, 2021 6:58:11 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 144391
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/utils/audio/vkat.cpp
r89016 r89051 100 100 typedef struct AUDIOTESTENV 101 101 { 102 /** Output path for storing the test environment's final test files. */ 103 char szPathOut[RTPATH_MAX]; 104 /** Temporary path for this test environment. */ 105 char szPathTemp[RTPATH_MAX]; 102 106 /** The host (backend) driver to use. */ 103 107 PPDMIHOSTAUDIO pDrvAudio; … … 156 160 VKAT_TEST_OPT_PCM_SIGNED, 157 161 VKAT_TEST_OPT_TAG, 162 VKAT_TEST_OPT_TEMPDIR, 158 163 VKAT_TEST_OPT_VOL 159 164 }; … … 194 199 { "--pcm-signed", VKAT_TEST_OPT_PCM_SIGNED, RTGETOPT_REQ_BOOL }, 195 200 { "--tag", VKAT_TEST_OPT_TAG, RTGETOPT_REQ_STRING }, 201 { "--tempdir", VKAT_TEST_OPT_TEMPDIR, RTGETOPT_REQ_STRING }, 196 202 { "--volume", VKAT_TEST_OPT_VOL, RTGETOPT_REQ_UINT8 } 197 203 }; … … 223 229 * @param pDrvAudio Audio driver to use. 224 230 * @param pszPathOut Output path to use. If NULL, the system's temp directory will be used. 225 * @þaram pszTag Tag name to use. If NULL, a generated UUID will be used. 226 */ 227 static int audioTestEnvInit(PAUDIOTESTENV pTstEnv, PPDMIHOSTAUDIO pDrvAudio, const char *pszPathOut, const char *pszTag) 228 { 229 RT_BZERO(pTstEnv, sizeof(AUDIOTESTENV)); 230 231 * @param pszPathTemp Temporary path to use. If NULL, the system's temp directory will be used. 232 * @param pszTag Tag name to use. If NULL, a generated UUID will be used. 233 */ 234 static int audioTestEnvInit(PAUDIOTESTENV pTstEnv, PPDMIHOSTAUDIO pDrvAudio, const char *pszTag) 235 { 231 236 pTstEnv->pDrvAudio = pDrvAudio; 232 237 PDMAudioHostEnumInit(&pTstEnv->DevEnm); 233 238 234 return AudioTestSetCreate(&pTstEnv->Set, pszPathOut, pszTag); 239 int rc = VINF_SUCCESS; 240 241 char szPathTemp[RTPATH_MAX]; 242 if ( !strlen(pTstEnv->szPathTemp) 243 || !strlen(pTstEnv->szPathOut)) 244 rc = RTPathTemp(szPathTemp, sizeof(szPathTemp)); 245 246 if ( RT_SUCCESS(rc) 247 && !strlen(pTstEnv->szPathTemp)) 248 rc = RTPathJoin(pTstEnv->szPathTemp, sizeof(pTstEnv->szPathTemp), szPathTemp, "vkat-temp"); 249 250 if ( RT_SUCCESS(rc) 251 && !strlen(pTstEnv->szPathOut)) 252 rc = RTPathJoin(pTstEnv->szPathOut, sizeof(pTstEnv->szPathOut), szPathTemp, "vkat"); 253 254 if (RT_SUCCESS(rc)) 255 rc = AudioTestSetCreate(&pTstEnv->Set, pTstEnv->szPathTemp, pszTag); 256 257 if (RT_SUCCESS(rc)) 258 { 259 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Using tag '%s'\n", pszTag); 260 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Output directory is '%s'\n", pTstEnv->szPathOut); 261 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Temp directory is '%s'\n", pTstEnv->szPathTemp); 262 } 263 264 return rc; 235 265 } 236 266 … … 585 615 AudioTestToneInitRandom(&TstTone, &pParms->Props); 586 616 587 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Playing test tone (freq %RU16, %RU32ms)\n", TstTone.rdFreqHz, pParms->msDuration); 588 589 int rc; 617 const char *pcszPathOut = pTstEnv->Set.szPathAbs; 618 619 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Playing test tone (tone frequency is %RU16Hz, %RU32ms)\n", TstTone.rdFreqHz, pParms->msDuration); 620 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Writing to '%s'\n", pcszPathOut); 621 622 /** @todo Use .WAV here? */ 623 PAUDIOTESTOBJ pObj; 624 int rc = AudioTestSetObjCreateAndRegister(&pTstEnv->Set, "tone.pcm", &pObj); 625 AssertRCReturn(rc, rc); 590 626 591 627 PDMHOSTAUDIOSTREAMSTATE enmState = pTstEnv->pDrvAudio->pfnStreamGetState(pTstEnv->pDrvAudio, &pStream->Backend); … … 601 637 do 602 638 { 603 rc = AudioTestTone Write(&TstTone, abBuf, RT_MIN(cbPerMs, sizeof(abBuf)), &cbBuf);639 rc = AudioTestToneGenerate(&TstTone, abBuf, RT_MIN(cbPerMs, sizeof(abBuf)), &cbBuf); 604 640 if (RT_SUCCESS(rc)) 605 641 { 606 uint32_t cbWritten; 607 rc = pTstEnv->pDrvAudio->pfnStreamPlay(pTstEnv->pDrvAudio, &pStream->Backend, abBuf, cbBuf, &cbWritten); 642 /* Write stuff to disk before trying to play it. Help analysis later. */ 643 rc = AudioTestSetObjWrite(pObj, abBuf, cbBuf); 644 if (RT_SUCCESS(rc)) 645 { 646 uint32_t cbWritten; 647 rc = pTstEnv->pDrvAudio->pfnStreamPlay(pTstEnv->pDrvAudio, &pStream->Backend, abBuf, cbBuf, &cbWritten); 648 } 608 649 } 609 650 610 651 if (RTTimeMilliTS() - tsStartMs >= pParms->msDuration) 652 break; 653 654 if (RT_FAILURE(rc)) 611 655 break; 612 656 … … 617 661 else 618 662 rc = VERR_AUDIO_STREAM_NOT_READY; 663 664 int rc2 = AudioTestSetObjClose(pObj); 665 if (RT_SUCCESS(rc)) 666 rc = rc2; 619 667 620 668 return rc; … … 652 700 PDMAudioPropsInit(&pTstParmsAcq->TestTone.Props, 16 /* bit */ / 8, true /* fSigned */, 2 /* Channels */, 44100 /* Hz */); 653 701 702 #ifdef DEBUG_andy 703 pTstParmsAcq->cIterations = RTRandU32Ex(1, 1); 704 #endif 654 705 pTstParmsAcq->cIterations = RTRandU32Ex(1, 10); 706 pTstParmsAcq->idxCurrent = 0; 655 707 656 708 return VINF_SUCCESS; … … 806 858 int audioTestMain(int argc, char **argv) 807 859 { 808 int rc; 860 AUDIOTESTENV TstEnv; 861 RT_ZERO(TstEnv); 809 862 810 863 AUDIOTESTPARMS TstCust; … … 812 865 813 866 char *pszDevice = NULL; /* Custom device to use. Can be NULL if not being used. */ 814 char *pszPathOut = NULL; /* Custom output path to use. Can be NULL if not being used. */815 867 char *pszTag = NULL; /* Custom tag to use. Can be NULL if not being used. */ 816 868 … … 820 872 RTGETOPTUNION ValueUnion; 821 873 RTGETOPTSTATE GetState; 822 rc = RTGetOptInit(&GetState, argc, argv, g_aCmdTestOptions, RT_ELEMENTS(g_aCmdTestOptions), 0, 0 /* fFlags */);874 int rc = RTGetOptInit(&GetState, argc, argv, g_aCmdTestOptions, RT_ELEMENTS(g_aCmdTestOptions), 0, 0 /* fFlags */); 823 875 AssertRCReturn(rc, RTEXITCODE_INIT); 824 876 … … 915 967 case VKAT_TEST_OPT_OUTDIR: 916 968 { 917 pszPathOut = RTStrDup(ValueUnion.psz); 969 rc = RTStrCopy(TstEnv.szPathOut, sizeof(TstEnv.szPathOut), ValueUnion.psz); 970 if (RT_FAILURE(rc)) 971 return RTMsgErrorExit(RTEXITCODE_FAILURE, "Out dir invalid, rc=%Rrc\n", rc); 918 972 break; 919 973 } … … 946 1000 { 947 1001 pszTag = RTStrDup(ValueUnion.psz); 1002 break; 1003 } 1004 1005 case VKAT_TEST_OPT_TEMPDIR: 1006 { 1007 rc = RTStrCopy(TstEnv.szPathTemp, sizeof(TstEnv.szPathTemp), ValueUnion.psz); 1008 if (RT_FAILURE(rc)) 1009 return RTMsgErrorExit(RTEXITCODE_FAILURE, "Temp dir invalid, rc=%Rrc\n", rc); 948 1010 break; 949 1011 } … … 982 1044 { 983 1045 /* For now all tests have the same test environment. */ 984 AUDIOTESTENV TstEnv; 985 rc = audioTestEnvInit(&TstEnv, pDrvAudio, pszPathOut, pszTag); 1046 rc = audioTestEnvInit(&TstEnv, pDrvAudio, pszTag); 986 1047 if (RT_SUCCESS(rc)) 987 1048 { 988 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Output directory is '%s'\n", TstEnv.Set.szPathAbs);989 990 1049 PPDMAUDIOHOSTDEV pDev; 991 1050 rc = audioTestDevicesEnumerateAndCheck(&TstEnv, pszDevice, &pDev); … … 993 1052 audioTestWorker(&TstEnv, &TstCust); 994 1053 1054 /* Before destroying the test environment, pack up the test set so 1055 * that it's ready for transmission. */ 1056 char szFileOut[RTPATH_MAX]; 1057 rc = AudioTestSetPack(&TstEnv.Set, TstEnv.szPathOut, szFileOut, sizeof(szFileOut)); 1058 if (RT_SUCCESS(rc)) 1059 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Test set packed up to '%s'\n", szFileOut); 1060 1061 /* Clean up. */ 1062 AudioTestSetWipe(&TstEnv.Set); 1063 995 1064 audioTestEnvDestroy(&TstEnv); 996 1065 } … … 1001 1070 1002 1071 RTStrFree(pszDevice); 1003 RTStrFree(pszPathOut);1004 1072 RTStrFree(pszTag); 1073 1074 if (RT_FAILURE(rc)) /* Let us know that something went wrong in case we forgot to mention it. */ 1075 RTTestFailed(g_hTest, "Tested failed with %Rrc\n", rc); 1005 1076 1006 1077 /*
Note:
See TracChangeset
for help on using the changeset viewer.