VirtualBox

Ignore:
Timestamp:
Oct 8, 2021 6:59:29 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
147357
Message:

Audio/Validation Kit: Factored out general I/O options into AUDIOTESTIOOPTS to also support setting the master volume besides the test tone volume, as function parameter lists already were too big. Also uniformed the command line volume arguments a little ("--vol vs. --volume" everywhere). ​bugref:10008

File:
1 edited

Legend:

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

    r91619 r91632  
    8080*   Internal Functions                                                                                                           *
    8181*********************************************************************************************************************************/
    82 static int audioTestStreamInit(PAUDIOTESTDRVSTACK pDrvStack, PAUDIOTESTSTREAM pStream, PDMAUDIODIR enmDir, PCPDMAUDIOPCMPROPS pProps, bool fWithMixer, uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint);
     82static int audioTestStreamInit(PAUDIOTESTDRVSTACK pDrvStack, PAUDIOTESTSTREAM pStream, PDMAUDIODIR enmDir, PAUDIOTESTIOOPTS pPlayOpt);
    8383static int audioTestStreamDestroy(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream);
    8484
     
    334334
    335335static int audioTestStreamInit(PAUDIOTESTDRVSTACK pDrvStack, PAUDIOTESTSTREAM pStream,
    336                                PDMAUDIODIR enmDir, PCPDMAUDIOPCMPROPS pProps, bool fWithMixer,
    337                                uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint)
     336                               PDMAUDIODIR enmDir, PAUDIOTESTIOOPTS pIoOpts)
    338337{
    339338    int rc;
    340339
    341340    if (enmDir == PDMAUDIODIR_IN)
    342         rc = audioTestDriverStackStreamCreateInput(pDrvStack, pProps, cMsBufferSize,
    343                                                    cMsPreBuffer, cMsSchedulingHint, &pStream->pStream, &pStream->Cfg);
     341        rc = audioTestDriverStackStreamCreateInput(pDrvStack, &pIoOpts->Props, pIoOpts->cMsBufferSize,
     342                                                   pIoOpts->cMsPreBuffer, pIoOpts->cMsSchedulingHint, &pStream->pStream, &pStream->Cfg);
    344343    else if (enmDir == PDMAUDIODIR_OUT)
    345         rc = audioTestDriverStackStreamCreateOutput(pDrvStack, pProps, cMsBufferSize,
    346                                                     cMsPreBuffer, cMsSchedulingHint, &pStream->pStream, &pStream->Cfg);
     344        rc = audioTestDriverStackStreamCreateOutput(pDrvStack, &pIoOpts->Props, pIoOpts->cMsBufferSize,
     345                                                    pIoOpts->cMsPreBuffer, pIoOpts->cMsSchedulingHint, &pStream->pStream, &pStream->Cfg);
    347346    else
    348347        rc = VERR_NOT_SUPPORTED;
     
    360359         * Automatically enable the mixer if the PCM properties don't match.
    361360         */
    362         if (   !fWithMixer
    363             && !PDMAudioPropsAreEqual(pProps, &pStream->Cfg.Props))
     361        if (   !pIoOpts->fWithMixer
     362            && !PDMAudioPropsAreEqual(&pIoOpts->Props, &pStream->Cfg.Props))
    364363        {
    365364            RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS,  "Enabling stream mixer\n");
    366             fWithMixer = true;
     365            pIoOpts->fWithMixer = true;
    367366        }
    368367
    369368        rc = AudioTestMixStreamInit(&pStream->Mix, pDrvStack, pStream->pStream,
    370                                     fWithMixer ? pProps : NULL, 100 /* ms */); /** @todo Configure mixer buffer? */
     369                                    pIoOpts->fWithMixer ? &pIoOpts->Props : NULL, 100 /* ms */); /** @todo Configure mixer buffer? */
    371370    }
    372371
     
    405404*   Test Primitives                                                                                                              *
    406405*********************************************************************************************************************************/
     406
     407/**
     408 * Initializes test tone parameters (partly with random values).
     409
     410 * @param   pToneParms          Test tone parameters to initialize.
     411 */
     412void audioTestToneParmsInit(PAUDIOTESTTONEPARMS pToneParms)
     413{
     414    RT_BZERO(pToneParms, sizeof(AUDIOTESTTONEPARMS));
     415
     416    /**
     417     * Set default (randomized) test tone parameters if not set explicitly.
     418     */
     419    pToneParms->dbFreqHz       = AudioTestToneGetRandomFreq();
     420    pToneParms->msDuration     = RTRandU32Ex(200, RT_MS_30SEC);
     421    pToneParms->uVolumePercent = 100; /* We always go with maximum volume for now. */
     422
     423    PDMAudioPropsInit(&pToneParms->Props,
     424                      2 /* 16-bit */, true /* fPcmSigned */, 2 /* cPcmChannels */, 44100 /* uPcmHz */);
     425}
     426
     427/**
     428 * Initializes I/O options with some sane default values.
     429 *
     430 * @param   pIoOpts             I/O options to initialize.
     431 */
     432void audioTestIoOptsInitDefaults(PAUDIOTESTIOOPTS pIoOpts)
     433{
     434    RT_BZERO(pIoOpts, sizeof(AUDIOTESTIOOPTS));
     435
     436    /* Initialize the PCM properties to some sane values. */
     437    PDMAudioPropsInit(&pIoOpts->Props,
     438                      2 /* 16-bit */, true /* fPcmSigned */, 2 /* cPcmChannels */, 44100 /* uPcmHz */);
     439
     440    pIoOpts->cMsBufferSize     = UINT32_MAX;
     441    pIoOpts->cMsPreBuffer      = UINT32_MAX;
     442    pIoOpts->cMsSchedulingHint = UINT32_MAX;
     443    pIoOpts->uVolumePercent    = 100; /* Use maximum volume by default. */
     444}
    407445
    408446#if 0 /* Unused */
     
    430468 *
    431469 * @returns VBox status code.
     470 * @param   pIoOpts             I/O options to use.
    432471 * @param   pTstEnv             Test environment to use for running the test.
    433472 *                              Optional and can be NULL (for simple playback only).
     
    437476 * @note    Blocking function.
    438477 */
    439 int audioTestPlayTone(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms)
     478int audioTestPlayTone(PAUDIOTESTIOOPTS pIoOpts, PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms)
    440479{
    441480    AUDIOTESTTONE TstTone;
     
    446485        pcszPathOut = pTstEnv->Set.szPathAbs;
    447486
    448     RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Playing test tone (tone frequency is %RU16Hz, %RU32ms)\n", (uint16_t)pParms->dbFreqHz, pParms->msDuration);
     487    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Playing test tone (tone frequency is %RU16Hz, %RU32ms, %RU8%% volume)\n",
     488                 (uint16_t)pParms->dbFreqHz, pParms->msDuration, pParms->uVolumePercent);
    449489    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Using %RU32ms stream scheduling hint\n", pStream->Cfg.Device.cMsSchedulingHint);
    450490    if (pcszPathOut)
     
    462502    }
    463503
    464     /* Try to crank up the system's master volume up to 100% so that we (hopefully) play the test tone always at the same leve.
    465      * Not supported on all platforms yet, therefore not critical for overall testing (yet). */
    466     unsigned const uVolPercent = 100;
     504    uint8_t const uVolPercent = pIoOpts->uVolumePercent;
    467505    int rc2 = audioTestSetMasterVolume(uVolPercent);
    468506    if (RT_FAILURE(rc2))
     
    666704 *
    667705 * @returns VBox status code.
     706 * @param   pIoOpts             I/O options to use.
    668707 * @param   pTstEnv             Test environment to use for running the test.
    669708 * @param   pStream             Stream to use for recording the tone.
     
    672711 * @note    Blocking function.
    673712 */
    674 static int audioTestRecordTone(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms)
     713static int audioTestRecordTone(PAUDIOTESTIOOPTS pIoOpts, PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms)
    675714{
    676715    const char *pcszPathOut = pTstEnv->Set.szPathAbs;
     
    694733
    695734        AudioTestObjAddMetadataStr(Obj, "stream_to_record_bytes=%RU32\n", cbToRecTotal);
    696         AudioTestObjAddMetadataStr(Obj, "stream_buffer_size_ms=%RU32\n", pTstEnv->cMsBufferSize);
    697         AudioTestObjAddMetadataStr(Obj, "stream_prebuf_size_ms=%RU32\n", pTstEnv->cMsPreBuffer);
     735        AudioTestObjAddMetadataStr(Obj, "stream_buffer_size_ms=%RU32\n", pIoOpts->cMsBufferSize);
     736        AudioTestObjAddMetadataStr(Obj, "stream_prebuf_size_ms=%RU32\n", pIoOpts->cMsPreBuffer);
    698737        /* Note: This mostly is provided by backend (e.g. PulseAudio / ALSA / ++) and
    699738         *       has nothing to do with the device emulation scheduling hint. */
    700         AudioTestObjAddMetadataStr(Obj, "device_scheduling_hint_ms=%RU32\n", pTstEnv->cMsSchedulingHint);
     739        AudioTestObjAddMetadataStr(Obj, "device_scheduling_hint_ms=%RU32\n", pIoOpts->cMsSchedulingHint);
    701740
    702741        uint8_t         abSamples[16384];
     
    862901static DECLCALLBACK(int) audioTestGstAtsTonePlayCallback(void const *pvUser, PAUDIOTESTTONEPARMS pToneParms)
    863902{
    864     PATSCALLBACKCTX pCtx    = (PATSCALLBACKCTX)pvUser;
    865     PAUDIOTESTENV   pTstEnv = pCtx->pTstEnv;
     903    PATSCALLBACKCTX  pCtx    = (PATSCALLBACKCTX)pvUser;
     904    PAUDIOTESTENV    pTstEnv = pCtx->pTstEnv;
     905    PAUDIOTESTIOOPTS pIoOpts = &pTstEnv->IoOpts;
    866906
    867907    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Got request for playing test tone #%RU32 (%RU16Hz, %RU32ms) ...\n",
     
    874914    const PAUDIOTESTSTREAM pTstStream = &pTstEnv->aStreams[0]; /** @todo Make this dynamic. */
    875915
    876     int rc = audioTestStreamInit(pTstEnv->pDrvStack, pTstStream, PDMAUDIODIR_OUT, &pTstEnv->Props, false /* fWithMixer */,
    877                                  pTstEnv->cMsBufferSize, pTstEnv->cMsPreBuffer, pTstEnv->cMsSchedulingHint);
     916    int rc = audioTestStreamInit(pTstEnv->pDrvStack, pTstStream, PDMAUDIODIR_OUT, pIoOpts);
    878917    if (RT_SUCCESS(rc))
    879918    {
     
    888927        if (RT_SUCCESS(rc))
    889928        {
    890             rc = audioTestPlayTone(pTstEnv, pTstStream, pToneParms);
     929            rc = audioTestPlayTone(&pTstEnv->IoOpts, pTstEnv, pTstStream, pToneParms);
    891930            if (RT_SUCCESS(rc))
    892931            {
     
    910949static DECLCALLBACK(int) audioTestGstAtsToneRecordCallback(void const *pvUser, PAUDIOTESTTONEPARMS pToneParms)
    911950{
    912     PATSCALLBACKCTX pCtx    = (PATSCALLBACKCTX)pvUser;
    913     PAUDIOTESTENV   pTstEnv = pCtx->pTstEnv;
     951    PATSCALLBACKCTX  pCtx    = (PATSCALLBACKCTX)pvUser;
     952    PAUDIOTESTENV    pTstEnv = pCtx->pTstEnv;
     953    PAUDIOTESTIOOPTS pIoOpts = &pTstEnv->IoOpts;
    914954
    915955    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Got request for recording test tone #%RU32 (%RU32ms) ...\n",
     
    922962    const PAUDIOTESTSTREAM pTstStream = &pTstEnv->aStreams[0]; /** @todo Make this dynamic. */
    923963
    924     int rc = audioTestStreamInit(pTstEnv->pDrvStack, pTstStream, PDMAUDIODIR_IN, &pTstEnv->Props, false /* fWithMixer */,
    925                                  pTstEnv->cMsBufferSize, pTstEnv->cMsPreBuffer, pTstEnv->cMsSchedulingHint);
     964    int rc = audioTestStreamInit(pTstEnv->pDrvStack, pTstStream, PDMAUDIODIR_IN, pIoOpts);
    926965    if (RT_SUCCESS(rc))
    927966    {
     
    930969        TstParms.enmType  = AUDIOTESTTYPE_TESTTONE_RECORD;
    931970        TstParms.enmDir   = PDMAUDIODIR_IN;
    932         TstParms.Props    = pToneParms->Props;
    933971        TstParms.TestTone = *pToneParms;
    934972
     
    937975        if (RT_SUCCESS(rc))
    938976        {
    939             rc = audioTestRecordTone(pTstEnv, pTstStream, pToneParms);
     977            rc = audioTestRecordTone(pIoOpts, pTstEnv, pTstStream, pToneParms);
    940978            if (RT_SUCCESS(rc))
    941979            {
     
    11751213 * Initializes an audio test environment.
    11761214 *
     1215 * @param   pTstEnv             Audio test environment to initialize.
     1216 */
     1217void audioTestEnvInit(PAUDIOTESTENV pTstEnv)
     1218{
     1219    RT_BZERO(pTstEnv, sizeof(AUDIOTESTENV));
     1220
     1221    audioTestIoOptsInitDefaults(&pTstEnv->IoOpts);
     1222    audioTestToneParmsInit(&pTstEnv->ToneParms);
     1223}
     1224
     1225/**
     1226 * Creates an audio test environment.
     1227 *
    11771228 * @returns VBox status code.
    1178  * @param   pTstEnv             Audio test environment to initialize.
     1229 * @param   pTstEnv             Audio test environment to create.
    11791230 * @param   pDrvStack           Driver stack to use.
    11801231 */
    1181 int audioTestEnvInit(PAUDIOTESTENV pTstEnv, PAUDIOTESTDRVSTACK pDrvStack)
    1182 {
     1232int audioTestEnvCreate(PAUDIOTESTENV pTstEnv, PAUDIOTESTDRVSTACK pDrvStack)
     1233{
     1234    AssertReturn(PDMAudioPropsAreValid(&pTstEnv->IoOpts.Props), VERR_WRONG_ORDER);
     1235
    11831236    int rc = VINF_SUCCESS;
    11841237
     
    12101263    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Output directory is '%s'\n", pTstEnv->szPathOut);
    12111264    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Temp directory is '%s'\n", pTstEnv->szPathTemp);
    1212 
    1213     if (!pTstEnv->cMsBufferSize)
    1214         pTstEnv->cMsBufferSize     = UINT32_MAX;
    1215     if (!pTstEnv->cMsPreBuffer)
    1216         pTstEnv->cMsPreBuffer      = UINT32_MAX;
    1217     if (!pTstEnv->cMsSchedulingHint)
    1218         pTstEnv->cMsSchedulingHint = UINT32_MAX;
    12191265
    12201266    char szPathTemp[RTPATH_MAX];
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