VirtualBox

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


Ignore:
Timestamp:
May 14, 2021 6:58:11 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
144391
Message:

Audio/ValKit: More code for VKAT audio test set generation; initial implementation now can pack up tests sets as .tar.gz files. bugref:10008

File:
1 edited

Legend:

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

    r89016 r89051  
    100100typedef struct AUDIOTESTENV
    101101{
     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];
    102106    /** The host (backend) driver to use. */
    103107    PPDMIHOSTAUDIO        pDrvAudio;
     
    156160    VKAT_TEST_OPT_PCM_SIGNED,
    157161    VKAT_TEST_OPT_TAG,
     162    VKAT_TEST_OPT_TEMPDIR,
    158163    VKAT_TEST_OPT_VOL
    159164};
     
    194199    { "--pcm-signed",       VKAT_TEST_OPT_PCM_SIGNED,     RTGETOPT_REQ_BOOL    },
    195200    { "--tag",              VKAT_TEST_OPT_TAG,            RTGETOPT_REQ_STRING  },
     201    { "--tempdir",          VKAT_TEST_OPT_TEMPDIR,        RTGETOPT_REQ_STRING  },
    196202    { "--volume",           VKAT_TEST_OPT_VOL,            RTGETOPT_REQ_UINT8   }
    197203};
     
    223229 * @param   pDrvAudio           Audio driver to use.
    224230 * @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 */
     234static int audioTestEnvInit(PAUDIOTESTENV pTstEnv, PPDMIHOSTAUDIO pDrvAudio, const char *pszTag)
     235{
    231236    pTstEnv->pDrvAudio = pDrvAudio;
    232237    PDMAudioHostEnumInit(&pTstEnv->DevEnm);
    233238
    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;
    235265}
    236266
     
    585615    AudioTestToneInitRandom(&TstTone, &pParms->Props);
    586616
    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);
    590626
    591627    PDMHOSTAUDIOSTREAMSTATE enmState = pTstEnv->pDrvAudio->pfnStreamGetState(pTstEnv->pDrvAudio, &pStream->Backend);
     
    601637        do
    602638        {
    603             rc = AudioTestToneWrite(&TstTone, abBuf, RT_MIN(cbPerMs, sizeof(abBuf)), &cbBuf);
     639            rc = AudioTestToneGenerate(&TstTone, abBuf, RT_MIN(cbPerMs, sizeof(abBuf)), &cbBuf);
    604640            if (RT_SUCCESS(rc))
    605641            {
    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                }
    608649            }
    609650
    610651            if (RTTimeMilliTS() - tsStartMs >= pParms->msDuration)
     652                break;
     653
     654            if (RT_FAILURE(rc))
    611655                break;
    612656
     
    617661    else
    618662        rc = VERR_AUDIO_STREAM_NOT_READY;
     663
     664    int rc2 = AudioTestSetObjClose(pObj);
     665    if (RT_SUCCESS(rc))
     666        rc = rc2;
    619667
    620668    return rc;
     
    652700    PDMAudioPropsInit(&pTstParmsAcq->TestTone.Props, 16 /* bit */ / 8, true /* fSigned */, 2 /* Channels */, 44100 /* Hz */);
    653701
     702#ifdef DEBUG_andy
     703    pTstParmsAcq->cIterations = RTRandU32Ex(1, 1);
     704#endif
    654705    pTstParmsAcq->cIterations = RTRandU32Ex(1, 10);
     706    pTstParmsAcq->idxCurrent  = 0;
    655707
    656708    return VINF_SUCCESS;
     
    806858int audioTestMain(int argc, char **argv)
    807859{
    808     int rc;
     860    AUDIOTESTENV TstEnv;
     861    RT_ZERO(TstEnv);
    809862
    810863    AUDIOTESTPARMS TstCust;
     
    812865
    813866    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. */
    815867    char *pszTag     = NULL; /* Custom tag to use. Can be NULL if not being used. */
    816868
     
    820872    RTGETOPTUNION ValueUnion;
    821873    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 */);
    823875    AssertRCReturn(rc, RTEXITCODE_INIT);
    824876
     
    915967            case VKAT_TEST_OPT_OUTDIR:
    916968            {
    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);
    918972                break;
    919973            }
     
    9461000            {
    9471001                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);
    9481010                break;
    9491011            }
     
    9821044    {
    9831045        /* 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);
    9861047        if (RT_SUCCESS(rc))
    9871048        {
    988             RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Output directory is '%s'\n", TstEnv.Set.szPathAbs);
    989 
    9901049            PPDMAUDIOHOSTDEV pDev;
    9911050            rc = audioTestDevicesEnumerateAndCheck(&TstEnv, pszDevice, &pDev);
     
    9931052                audioTestWorker(&TstEnv, &TstCust);
    9941053
     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
    9951064            audioTestEnvDestroy(&TstEnv);
    9961065        }
     
    10011070
    10021071    RTStrFree(pszDevice);
    1003     RTStrFree(pszPathOut);
    10041072    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);
    10051076
    10061077    /*
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