Changeset 91632 in vbox for trunk/src/VBox/ValidationKit/utils/audio/vkatCommon.cpp
- Timestamp:
- Oct 8, 2021 6:59:29 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 147357
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/utils/audio/vkatCommon.cpp
r91619 r91632 80 80 * Internal Functions * 81 81 *********************************************************************************************************************************/ 82 static int audioTestStreamInit(PAUDIOTESTDRVSTACK pDrvStack, PAUDIOTESTSTREAM pStream, PDMAUDIODIR enmDir, P CPDMAUDIOPCMPROPS pProps, bool fWithMixer, uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint);82 static int audioTestStreamInit(PAUDIOTESTDRVSTACK pDrvStack, PAUDIOTESTSTREAM pStream, PDMAUDIODIR enmDir, PAUDIOTESTIOOPTS pPlayOpt); 83 83 static int audioTestStreamDestroy(PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream); 84 84 … … 334 334 335 335 static 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) 338 337 { 339 338 int rc; 340 339 341 340 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); 344 343 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); 347 346 else 348 347 rc = VERR_NOT_SUPPORTED; … … 360 359 * Automatically enable the mixer if the PCM properties don't match. 361 360 */ 362 if ( ! fWithMixer363 && !PDMAudioPropsAreEqual( pProps, &pStream->Cfg.Props))361 if ( !pIoOpts->fWithMixer 362 && !PDMAudioPropsAreEqual(&pIoOpts->Props, &pStream->Cfg.Props)) 364 363 { 365 364 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Enabling stream mixer\n"); 366 fWithMixer = true;365 pIoOpts->fWithMixer = true; 367 366 } 368 367 369 368 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? */ 371 370 } 372 371 … … 405 404 * Test Primitives * 406 405 *********************************************************************************************************************************/ 406 407 /** 408 * Initializes test tone parameters (partly with random values). 409 410 * @param pToneParms Test tone parameters to initialize. 411 */ 412 void 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 */ 432 void 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 } 407 445 408 446 #if 0 /* Unused */ … … 430 468 * 431 469 * @returns VBox status code. 470 * @param pIoOpts I/O options to use. 432 471 * @param pTstEnv Test environment to use for running the test. 433 472 * Optional and can be NULL (for simple playback only). … … 437 476 * @note Blocking function. 438 477 */ 439 int audioTestPlayTone(PAUDIOTEST ENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms)478 int audioTestPlayTone(PAUDIOTESTIOOPTS pIoOpts, PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms) 440 479 { 441 480 AUDIOTESTTONE TstTone; … … 446 485 pcszPathOut = pTstEnv->Set.szPathAbs; 447 486 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); 449 489 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Using %RU32ms stream scheduling hint\n", pStream->Cfg.Device.cMsSchedulingHint); 450 490 if (pcszPathOut) … … 462 502 } 463 503 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; 467 505 int rc2 = audioTestSetMasterVolume(uVolPercent); 468 506 if (RT_FAILURE(rc2)) … … 666 704 * 667 705 * @returns VBox status code. 706 * @param pIoOpts I/O options to use. 668 707 * @param pTstEnv Test environment to use for running the test. 669 708 * @param pStream Stream to use for recording the tone. … … 672 711 * @note Blocking function. 673 712 */ 674 static int audioTestRecordTone(PAUDIOTEST ENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms)713 static int audioTestRecordTone(PAUDIOTESTIOOPTS pIoOpts, PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms) 675 714 { 676 715 const char *pcszPathOut = pTstEnv->Set.szPathAbs; … … 694 733 695 734 AudioTestObjAddMetadataStr(Obj, "stream_to_record_bytes=%RU32\n", cbToRecTotal); 696 AudioTestObjAddMetadataStr(Obj, "stream_buffer_size_ms=%RU32\n", p TstEnv->cMsBufferSize);697 AudioTestObjAddMetadataStr(Obj, "stream_prebuf_size_ms=%RU32\n", p TstEnv->cMsPreBuffer);735 AudioTestObjAddMetadataStr(Obj, "stream_buffer_size_ms=%RU32\n", pIoOpts->cMsBufferSize); 736 AudioTestObjAddMetadataStr(Obj, "stream_prebuf_size_ms=%RU32\n", pIoOpts->cMsPreBuffer); 698 737 /* Note: This mostly is provided by backend (e.g. PulseAudio / ALSA / ++) and 699 738 * has nothing to do with the device emulation scheduling hint. */ 700 AudioTestObjAddMetadataStr(Obj, "device_scheduling_hint_ms=%RU32\n", p TstEnv->cMsSchedulingHint);739 AudioTestObjAddMetadataStr(Obj, "device_scheduling_hint_ms=%RU32\n", pIoOpts->cMsSchedulingHint); 701 740 702 741 uint8_t abSamples[16384]; … … 862 901 static DECLCALLBACK(int) audioTestGstAtsTonePlayCallback(void const *pvUser, PAUDIOTESTTONEPARMS pToneParms) 863 902 { 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; 866 906 867 907 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Got request for playing test tone #%RU32 (%RU16Hz, %RU32ms) ...\n", … … 874 914 const PAUDIOTESTSTREAM pTstStream = &pTstEnv->aStreams[0]; /** @todo Make this dynamic. */ 875 915 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); 878 917 if (RT_SUCCESS(rc)) 879 918 { … … 888 927 if (RT_SUCCESS(rc)) 889 928 { 890 rc = audioTestPlayTone( pTstEnv, pTstStream, pToneParms);929 rc = audioTestPlayTone(&pTstEnv->IoOpts, pTstEnv, pTstStream, pToneParms); 891 930 if (RT_SUCCESS(rc)) 892 931 { … … 910 949 static DECLCALLBACK(int) audioTestGstAtsToneRecordCallback(void const *pvUser, PAUDIOTESTTONEPARMS pToneParms) 911 950 { 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; 914 954 915 955 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Got request for recording test tone #%RU32 (%RU32ms) ...\n", … … 922 962 const PAUDIOTESTSTREAM pTstStream = &pTstEnv->aStreams[0]; /** @todo Make this dynamic. */ 923 963 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); 926 965 if (RT_SUCCESS(rc)) 927 966 { … … 930 969 TstParms.enmType = AUDIOTESTTYPE_TESTTONE_RECORD; 931 970 TstParms.enmDir = PDMAUDIODIR_IN; 932 TstParms.Props = pToneParms->Props;933 971 TstParms.TestTone = *pToneParms; 934 972 … … 937 975 if (RT_SUCCESS(rc)) 938 976 { 939 rc = audioTestRecordTone(p TstEnv, pTstStream, pToneParms);977 rc = audioTestRecordTone(pIoOpts, pTstEnv, pTstStream, pToneParms); 940 978 if (RT_SUCCESS(rc)) 941 979 { … … 1175 1213 * Initializes an audio test environment. 1176 1214 * 1215 * @param pTstEnv Audio test environment to initialize. 1216 */ 1217 void 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 * 1177 1228 * @returns VBox status code. 1178 * @param pTstEnv Audio test environment to initialize.1229 * @param pTstEnv Audio test environment to create. 1179 1230 * @param pDrvStack Driver stack to use. 1180 1231 */ 1181 int audioTestEnvInit(PAUDIOTESTENV pTstEnv, PAUDIOTESTDRVSTACK pDrvStack) 1182 { 1232 int audioTestEnvCreate(PAUDIOTESTENV pTstEnv, PAUDIOTESTDRVSTACK pDrvStack) 1233 { 1234 AssertReturn(PDMAudioPropsAreValid(&pTstEnv->IoOpts.Props), VERR_WRONG_ORDER); 1235 1183 1236 int rc = VINF_SUCCESS; 1184 1237 … … 1210 1263 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Output directory is '%s'\n", pTstEnv->szPathOut); 1211 1264 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;1219 1265 1220 1266 char szPathTemp[RTPATH_MAX];
Note:
See TracChangeset
for help on using the changeset viewer.