VirtualBox

Changeset 89890 in vbox for trunk/src/VBox/Devices/Audio


Ignore:
Timestamp:
Jun 24, 2021 3:56:05 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145348
Message:

Audio/ValKit: More code for audio verification. bugref:10008

Location:
trunk/src/VBox/Devices/Audio
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/AudioTest.cpp

    r89889 r89890  
    128128
    129129/**
    130  * Returns a random test tone frequency.
    131  */
    132 DECLINLINE(double) audioTestToneGetRandomFreq(void)
    133 {
    134     return s_aAudioTestToneFreqsHz[RTRandU32Ex(0, RT_ELEMENTS(s_aAudioTestToneFreqsHz) - 1)];
    135 }
    136 
    137 /**
    138130 * Initializes a test tone with a specific frequency (in Hz).
    139131 *
     
    147139{
    148140    if (dbFreq == 0.0)
    149         dbFreq = audioTestToneGetRandomFreq();
     141        dbFreq = AudioTestToneGetRandomFreq();
    150142
    151143    pTone->rdFreqHz = dbFreq;
     
    290282
    291283/**
    292  * Initializes an audio test tone parameters struct with random values.
    293  * @param   pToneParams         Test tone parameters to initialize.
    294  * @param   pProps              PCM properties to use for the test tone.
    295  */
    296 int AudioTestToneParamsInitRandom(PAUDIOTESTTONEPARMS pToneParams, PPDMAUDIOPCMPROPS pProps)
    297 {
    298     AssertReturn(PDMAudioPropsAreValid(pProps), VERR_INVALID_PARAMETER);
    299 
    300     memcpy(&pToneParams->Props, pProps, sizeof(PDMAUDIOPCMPROPS));
    301 
    302     /** @todo Make this a bit more sophisticated later, e.g. muting and prequel/sequel are not very balanced. */
    303 
    304     pToneParams->dbFreqHz       = audioTestToneGetRandomFreq();
    305     pToneParams->msPrequel      = RTRandU32Ex(0, RT_MS_5SEC);
    306 #ifdef DEBUG_andy
    307     pToneParams->msDuration     = RTRandU32Ex(0, RT_MS_1SEC);
    308 #else
    309     pToneParams->msDuration     = RTRandU32Ex(0, RT_MS_10SEC); /** @todo Probably a bit too long, but let's see. */
    310 #endif
    311     pToneParams->msSequel       = RTRandU32Ex(0, RT_MS_5SEC);
    312     pToneParams->uVolumePercent = RTRandU32Ex(0, 100);
    313 
    314     return VINF_SUCCESS;
     284 * Returns a random test tone frequency.
     285 */
     286double AudioTestToneGetRandomFreq(void)
     287{
     288    return s_aAudioTestToneFreqsHz[RTRandU32Ex(0, RT_ELEMENTS(s_aAudioTestToneFreqsHz) - 1)];
    315289}
    316290
     
    14111385
    14121386/**
     1387 * Returns whether a test set has running (active) tests or not.
     1388 *
     1389 * @returns \c true if it has running tests, or \c false if not.
     1390 * @param   pSet                Test set to return status for.
     1391 */
     1392bool AudioTestSetIsRunning(PAUDIOTESTSET pSet)
     1393{
     1394    return (pSet->cTestsRunning > 0);
     1395}
     1396
     1397/**
    14131398 * Unpacks a formerly packed audio test set.
    14141399 *
     
    17131698    rc = RTFileQuerySize(pObjB->File.hFile, &cbSizeB);
    17141699    AssertRCReturn(rc, rc);
    1715     if (   cbSizeA != cbSizeB
    1716         || !audioTestFilesCompareBinary(pObjA->File.hFile, pObjB->File.hFile, cbSizeA))
     1700
     1701    if (!cbSizeA)
     1702    {
     1703        int rc2 = audioTestErrorDescAdd(pVerJob->pErr, pVerJob->idxTest, "File '%s' is empty\n", pObjA->szName);
     1704        AssertRC(rc2);
     1705    }
     1706
     1707    if (!cbSizeB)
     1708    {
     1709        int rc2 = audioTestErrorDescAdd(pVerJob->pErr, pVerJob->idxTest, "File '%s' is empty\n", pObjB->szName);
     1710        AssertRC(rc2);
     1711    }
     1712
     1713    if (cbSizeA != cbSizeB)
     1714    {
     1715        int rc2 = audioTestErrorDescAdd(pVerJob->pErr, pVerJob->idxTest, "File '%s' is %zu bytes %s than '%s'\n",
     1716                                        pObjA->szName,
     1717                                        cbSizeA > cbSizeB ? cbSizeA - cbSizeB : cbSizeB - cbSizeA,
     1718                                        cbSizeA > cbSizeB ? "bigger" : "smaller",
     1719                                        pObjB->szName);
     1720        AssertRC(rc2);
     1721    }
     1722    else if (audioTestFilesCompareBinary(pObjA->File.hFile, pObjB->File.hFile, cbSizeA))
    17171723    {
    17181724        /** @todo Add more sophisticated stuff here. */
    17191725
    1720         int rc2 = audioTestErrorDescAdd(pVerJob->pErr, pVerJob->idxTest, "Files '%s' and '%s' don't match\n", szObjA, szObjB);
     1726        int rc2 = audioTestErrorDescAdd(pVerJob->pErr, pVerJob->idxTest, "Files '%s' and '%s' have different content\n",
     1727                                        pObjA->szName, pObjB->szName);
    17211728        AssertRC(rc2);
    17221729    }
  • trunk/src/VBox/Devices/Audio/AudioTest.h

    r89889 r89890  
    340340double AudioTestToneInit(PAUDIOTESTTONE pTone, PPDMAUDIOPCMPROPS pProps, double dbFreq);
    341341double AudioTestToneInitRandom(PAUDIOTESTTONE pTone, PPDMAUDIOPCMPROPS pProps);
     342double AudioTestToneGetRandomFreq(void);
    342343int    AudioTestToneGenerate(PAUDIOTESTTONE pTone, void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten);
    343 
    344 int    AudioTestToneParamsInitRandom(PAUDIOTESTTONEPARMS pToneParams, PPDMAUDIOPCMPROPS pProps);
    345344
    346345int    AudioTestGenTag(char *pszTag, size_t cbTag);
     
    367366const char *AudioTestSetGetTag(PAUDIOTESTSET pSet);
    368367bool   AudioTestSetIsPacked(const char *pszPath);
     368bool   AudioTestSetIsRunning(PAUDIOTESTSET pSet);
    369369int    AudioTestSetPack(PAUDIOTESTSET pSet, const char *pszOutDir, char *pszFileName, size_t cbFileName);
    370370int    AudioTestSetUnpack(const char *pszFile, const char *pszOutDir);
  • trunk/src/VBox/Devices/Audio/DrvHostAudioValidationKit.cpp

    r89838 r89890  
    2525#include <iprt/mem.h>
    2626#include <iprt/path.h>
     27#include <iprt/semaphore.h>
    2728#include <iprt/stream.h>
    2829#include <iprt/uuid.h> /* For PDMIBASE_2_PDMDRV. */
     
    138139    /** Critical section for serializing access across threads. */
    139140    RTCRITSECT          CritSect;
     141    bool                fTestSetEnded;
     142    RTSEMEVENT          EventSemEnded;
    140143    /** The Audio Test Service (ATS) instance. */
    141144    ATSSERVER           Srv;
     
    173176    {
    174177        AssertPtrReturnVoid(pTst->pEntry);
    175         AudioTestSetTestDone(pTst->pEntry);
    176178        pTst->pEntry = NULL;
    177179    }
     
    218220static void drvHostValKitCleanup(PDRVHOSTVALKITAUDIO pThis)
    219221{
    220     LogRel(("Audio: Validation Kit: Cleaning up ...\n"));
     222    LogRel(("ValKit: Cleaning up ...\n"));
    221223
    222224    if (pThis->cTestsRec)
    223         LogRel(("Audio: Validation Kit: Warning: %RU32 guest recording tests still outstanding:\n", pThis->cTestsRec));
     225        LogRel(("ValKit: Warning: %RU32 guest recording tests still outstanding:\n", pThis->cTestsRec));
    224226
    225227    PVALKITTESTDATA pTst, pTstNext;
     
    228230        size_t const cbOutstanding = pTst->t.TestTone.u.Rec.cbToWrite - pTst->t.TestTone.u.Rec.cbWritten;
    229231        if (cbOutstanding)
    230             LogRel(("Audio: Validation Kit: \tRecording test #%RU32 has %RU64 bytes (%RU32ms) outstanding\n",
     232            LogRel(("ValKit: \tRecording test #%RU32 has %RU64 bytes (%RU32ms) outstanding\n",
    231233                    pTst->idxTest, cbOutstanding, PDMAudioPropsBytesToMilli(&pTst->t.TestTone.Parms.Props, (uint32_t)cbOutstanding)));
    232234        drvHostValKiUnregisterRecTest(pThis, pTst);
     
    234236
    235237    if (pThis->cTestsPlay)
    236         LogRel(("Audio: Validation Kit: Warning: %RU32 guest playback tests still outstanding:\n", pThis->cTestsPlay));
     238        LogRel(("ValKit: Warning: %RU32 guest playback tests still outstanding:\n", pThis->cTestsPlay));
    237239
    238240    RTListForEachSafe(&pThis->lstTestsPlay, pTst, pTstNext, VALKITTESTDATA, Node)
     
    240242        size_t const cbOutstanding = pTst->t.TestTone.u.Play.cbToRead - pTst->t.TestTone.u.Play.cbRead;
    241243        if (cbOutstanding)
    242             LogRel(("Audio: Validation Kit: \tPlayback test #%RU32 has %RU64 bytes (%RU32ms) outstanding\n",
     244            LogRel(("ValKit: \tPlayback test #%RU32 has %RU64 bytes (%RU32ms) outstanding\n",
    243245                    pTst->idxTest, cbOutstanding, PDMAudioPropsBytesToMilli(&pTst->t.TestTone.Parms.Props, (uint32_t)cbOutstanding)));
    244246        drvHostValKiUnregisterPlayTest(pThis, pTst);
     
    259261    PDRVHOSTVALKITAUDIO pThis = (PDRVHOSTVALKITAUDIO)pvUser;
    260262
    261     LogRel(("Audio: Validation Kit: Beginning test set '%s'\n", pszTag));
    262     return AudioTestSetCreate(&pThis->Set, pThis->szPathTemp, pszTag);
     263    int rc = RTCritSectEnter(&pThis->CritSect);
     264    if (RT_SUCCESS(rc))
     265    {
     266
     267        LogRel(("ValKit: Beginning test set '%s'\n", pszTag));
     268        rc = AudioTestSetCreate(&pThis->Set, pThis->szPathTemp, pszTag);
     269
     270        int rc2 = RTCritSectLeave(&pThis->CritSect);
     271        if (RT_SUCCESS(rc))
     272            rc = rc2;
     273    }
     274
     275    if (RT_FAILURE(rc))
     276        LogRel(("ValKit: Beginning test set failed with %Rrc\n", rc));
     277
     278    return rc;
    263279}
    264280
     
    268284    PDRVHOSTVALKITAUDIO pThis = (PDRVHOSTVALKITAUDIO)pvUser;
    269285
    270     const PAUDIOTESTSET pSet  = &pThis->Set;
    271 
    272     LogRel(("Audio: Validation Kit: Ending test set '%s'\n", pszTag));
    273 
    274     /* Close the test set first. */
    275     AudioTestSetClose(pSet);
    276 
    277     /* Before destroying the test environment, pack up the test set so
    278      * that it's ready for transmission. */
    279     int rc = AudioTestSetPack(pSet, pThis->szPathOut, pThis->szTestSetArchive, sizeof(pThis->szTestSetArchive));
    280     if (RT_SUCCESS(rc))
    281         LogRel(("Audio: Validation Kit: Packed up to '%s'\n", pThis->szTestSetArchive));
    282 
    283     /* Do some internal housekeeping. */
    284     drvHostValKitCleanup(pThis);
    285 
    286     int rc2 = AudioTestSetWipe(pSet);
    287     if (RT_SUCCESS(rc))
    288         rc = rc2;
    289 
    290     AudioTestSetDestroy(pSet);
     286    int rc = RTCritSectEnter(&pThis->CritSect);
     287    if (RT_SUCCESS(rc))
     288    {
     289        const PAUDIOTESTSET pSet  = &pThis->Set;
     290
     291        if (AudioTestSetIsRunning(pSet))
     292        {
     293            pThis->fTestSetEnded = true;
     294
     295            rc = RTCritSectLeave(&pThis->CritSect);
     296            if (RT_SUCCESS(rc))
     297            {
     298                LogRel(("ValKit: Waiting for runnig test set '%s' to end ...\n", pszTag));
     299                rc = RTSemEventWait(pThis->EventSemEnded, RT_MS_30SEC);
     300
     301                int rc2 = RTCritSectEnter(&pThis->CritSect);
     302                if (RT_SUCCESS(rc))
     303                    rc = rc2;
     304            }
     305        }
     306
     307        if (RT_SUCCESS(rc))
     308        {
     309            LogRel(("ValKit: Ending test set '%s'\n", pszTag));
     310
     311            /* Close the test set first. */
     312            rc = AudioTestSetClose(pSet);
     313            if (RT_SUCCESS(rc))
     314            {
     315                /* Before destroying the test environment, pack up the test set so
     316                 * that it's ready for transmission. */
     317                rc = AudioTestSetPack(pSet, pThis->szPathOut, pThis->szTestSetArchive, sizeof(pThis->szTestSetArchive));
     318                if (RT_SUCCESS(rc))
     319                    LogRel(("ValKit: Packed up to '%s'\n", pThis->szTestSetArchive));
     320
     321                /* Do some internal housekeeping. */
     322                drvHostValKitCleanup(pThis);
     323
     324#ifndef DEBUG_andy
     325                int rc2 = AudioTestSetWipe(pSet);
     326                if (RT_SUCCESS(rc))
     327                    rc = rc2;
     328#endif
     329            }
     330
     331            AudioTestSetDestroy(pSet);
     332        }
     333
     334        int rc2 = RTCritSectLeave(&pThis->CritSect);
     335        if (RT_SUCCESS(rc))
     336            rc = rc2;
     337    }
    291338
    292339    if (RT_FAILURE(rc))
    293         LogRel(("Audio: Validation Kit: Ending test set failed with %Rrc\n", rc));
     340        LogRel(("ValKit: Ending test set failed with %Rrc\n", rc));
    294341
    295342    return rc;
     
    310357    memcpy(&pTestData->t.TestTone.Parms, pToneParms, sizeof(AUDIOTESTTONEPARMS));
    311358
    312     AudioTestToneInit(&pTestData->t.TestTone.Tone, &pToneParms->Props, pTestData->t.TestTone.Parms.dbFreqHz);
    313 
    314     pTestData->t.TestTone.u.Rec.cbToWrite = PDMAudioPropsMilliToBytes(&pToneParms->Props,
     359    AssertReturn(pTestData->t.TestTone.Parms.msDuration, VERR_INVALID_PARAMETER);
     360    AssertReturn(PDMAudioPropsAreValid(&pTestData->t.TestTone.Parms.Props), VERR_INVALID_PARAMETER);
     361
     362    AudioTestToneInit(&pTestData->t.TestTone.Tone, &pTestData->t.TestTone.Parms.Props, pTestData->t.TestTone.Parms.dbFreqHz);
     363
     364    pTestData->t.TestTone.u.Rec.cbToWrite = PDMAudioPropsMilliToBytes(&pTestData->t.TestTone.Parms.Props,
    315365                                                                      pTestData->t.TestTone.Parms.msDuration);
    316366    int rc = RTCritSectEnter(&pThis->CritSect);
    317367    if (RT_SUCCESS(rc))
    318368    {
    319         LogRel(("Audio: Validation Kit: Registered guest recording test #%RU32 (%RU32ms, %RU64 bytes)\n",
     369        LogRel(("ValKit: Registered guest recording test #%RU32 (%RU32ms, %RU64 bytes)\n",
    320370                pThis->cTestsTotal, pTestData->t.TestTone.Parms.msDuration, pTestData->t.TestTone.u.Rec.cbToWrite));
    321371
     
    347397    memcpy(&pTestData->t.TestTone.Parms, pToneParms, sizeof(AUDIOTESTTONEPARMS));
    348398
    349     pTestData->t.TestTone.u.Play.cbToRead = PDMAudioPropsMilliToBytes(&pToneParms->Props,
     399    AssertReturn(pTestData->t.TestTone.Parms.msDuration, VERR_INVALID_PARAMETER);
     400    AssertReturn(PDMAudioPropsAreValid(&pTestData->t.TestTone.Parms.Props), VERR_INVALID_PARAMETER);
     401
     402    pTestData->t.TestTone.u.Play.cbToRead = PDMAudioPropsMilliToBytes(&pTestData->t.TestTone.Parms.Props,
    350403                                                                      pTestData->t.TestTone.Parms.msDuration);
    351404    int rc = RTCritSectEnter(&pThis->CritSect);
    352405    if (RT_SUCCESS(rc))
    353406    {
    354         LogRel(("Audio: Validation Kit: Registered guest playback test #%RU32 (%RU32ms, %RU64 bytes)\n",
     407        LogRel(("ValKit: Registered guest playback test #%RU32 (%RU32ms, %RU64 bytes)\n",
    355408                pThis->cTestsTotal, pTestData->t.TestTone.Parms.msDuration, pTestData->t.TestTone.u.Play.cbToRead));
    356409
     
    375428    PDRVHOSTVALKITAUDIO pThis = (PDRVHOSTVALKITAUDIO)pvUser;
    376429
    377     if (!RTFileExists(pThis->szTestSetArchive)) /* Has the archive successfully been created yet? */
    378         return VERR_WRONG_ORDER;
    379 
    380     int rc = RTFileOpen(&pThis->hTestSetArchive, pThis->szTestSetArchive, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
    381     if (RT_SUCCESS(rc))
    382     {
    383         uint64_t uSize;
    384         rc = RTFileQuerySize(pThis->hTestSetArchive, &uSize);
    385         if (RT_SUCCESS(rc))
    386             LogRel(("Audio: Validation Kit: Sending test set '%s' (%zu bytes)\n", pThis->szTestSetArchive, uSize));
    387     }
     430    int rc = RTCritSectEnter(&pThis->CritSect);
     431    if (RT_SUCCESS(rc))
     432    {
     433        if (RTFileExists(pThis->szTestSetArchive)) /* Has the archive successfully been created yet? */
     434        {
     435            rc = RTFileOpen(&pThis->hTestSetArchive, pThis->szTestSetArchive, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
     436            if (RT_SUCCESS(rc))
     437            {
     438                uint64_t uSize;
     439                rc = RTFileQuerySize(pThis->hTestSetArchive, &uSize);
     440                if (RT_SUCCESS(rc))
     441                    LogRel(("ValKit: Sending test set '%s' (%zu bytes)\n", pThis->szTestSetArchive, uSize));
     442            }
     443        }
     444        else
     445            rc = VERR_FILE_NOT_FOUND;
     446
     447        int rc2 = RTCritSectLeave(&pThis->CritSect);
     448        if (RT_SUCCESS(rc))
     449            rc = rc2;
     450    }
     451
     452    if (RT_FAILURE(rc))
     453        LogRel(("ValKit: Beginning to send test set failed with %Rrc\n", rc));
    388454
    389455    return rc;
     
    398464    PDRVHOSTVALKITAUDIO pThis = (PDRVHOSTVALKITAUDIO)pvUser;
    399465
    400     return RTFileRead(pThis->hTestSetArchive, pvBuf, cbBuf, pcbRead);
     466    int rc = RTCritSectEnter(&pThis->CritSect);
     467    if (RT_SUCCESS(rc))
     468    {
     469        if (RTFileIsValid(pThis->hTestSetArchive))
     470        {
     471            rc =  RTFileRead(pThis->hTestSetArchive, pvBuf, cbBuf, pcbRead);
     472        }
     473        else
     474            rc = VERR_WRONG_ORDER;
     475
     476        int rc2 = RTCritSectLeave(&pThis->CritSect);
     477        if (RT_SUCCESS(rc))
     478            rc = rc2;
     479    }
     480
     481    if (RT_FAILURE(rc))
     482        LogRel(("ValKit: Reading from test set failed with %Rrc\n", rc));
     483
     484    return rc;
    401485}
    402486
     
    408492    PDRVHOSTVALKITAUDIO pThis = (PDRVHOSTVALKITAUDIO)pvUser;
    409493
    410     int rc = RTFileClose(pThis->hTestSetArchive);
    411     if (RT_SUCCESS(rc))
    412     {
    413         pThis->hTestSetArchive = NIL_RTFILE;
    414     }
     494    int rc = RTCritSectEnter(&pThis->CritSect);
     495    if (RT_SUCCESS(rc))
     496    {
     497        if (RTFileIsValid(pThis->hTestSetArchive))
     498        {
     499            rc = RTFileClose(pThis->hTestSetArchive);
     500            if (RT_SUCCESS(rc))
     501                pThis->hTestSetArchive = NIL_RTFILE;
     502        }
     503
     504        int rc2 = RTCritSectLeave(&pThis->CritSect);
     505        if (RT_SUCCESS(rc))
     506            rc = rc2;
     507    }
     508
     509    if (RT_FAILURE(rc))
     510        LogRel(("ValKit: Ending to send test set failed with %Rrc\n", rc));
    415511
    416512    return rc;
     
    532628static DECLCALLBACK(int) drvHostValKitAudioHA_StreamDrain(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    533629{
    534     RT_NOREF(pInterface, pStream);
     630    RT_NOREF(pStream);
     631
     632    PDRVHOSTVALKITAUDIO pThis = RT_FROM_MEMBER(pInterface, DRVHOSTVALKITAUDIO, IHostAudio);
     633
     634    int rc = RTCritSectEnter(&pThis->CritSect);
     635    if (RT_SUCCESS(rc))
     636    {
     637        PVALKITTESTDATA pTst = pThis->pTestCur;
     638
     639        if (pTst)
     640        {
     641            LogRel(("ValKit: Test #%RU32: Recording audio data ended (took %RU32ms)\n",
     642                pTst->idxTest, RTTimeMilliTS() - pTst->msStartedTS));
     643
     644            if (pTst->t.TestTone.u.Play.cbRead > pTst->t.TestTone.u.Play.cbToRead)
     645                LogRel(("ValKit: Warning: Test #%RU32 read %RU32 bytes more than announced\n",
     646                        pTst->idxTest, pTst->t.TestTone.u.Play.cbRead - pTst->t.TestTone.u.Play.cbToRead));
     647
     648            AudioTestSetTestDone(pTst->pEntry);
     649
     650            pThis->pTestCur = NULL;
     651            pTst            = NULL;
     652
     653            if (pThis->fTestSetEnded)
     654                rc = RTSemEventSignal(pThis->EventSemEnded);
     655        }
     656
     657        int rc2 = RTCritSectLeave(&pThis->CritSect);
     658        AssertRC(rc2);
     659    }
     660
    535661    return VINF_SUCCESS;
    536662}
     
    595721    RT_NOREF(pStream);
    596722
     723    if (cbBuf == 0)
     724    {
     725        /* Fend off draining calls. */
     726        *pcbWritten = 0;
     727        return VINF_SUCCESS;
     728    }
     729
    597730    PDRVHOSTVALKITAUDIO pThis = RT_FROM_MEMBER(pInterface, DRVHOSTVALKITAUDIO, IHostAudio);
    598731
     732    PVALKITTESTDATA pTst = NULL;
     733
    599734    int rc = RTCritSectEnter(&pThis->CritSect);
    600735    if (RT_SUCCESS(rc))
    601736    {
    602         pThis->pTestCur = RTListGetFirst(&pThis->lstTestsPlay, VALKITTESTDATA, Node);
     737        if (pThis->pTestCur == NULL)
     738            pThis->pTestCur = RTListGetFirst(&pThis->lstTestsPlay, VALKITTESTDATA, Node);
     739
     740        pTst = pThis->pTestCur;
    603741
    604742        int rc2 = RTCritSectLeave(&pThis->CritSect);
     
    606744    }
    607745
    608     if (pThis->pTestCur == NULL) /* Empty list? */
    609     {
    610         LogRelMax(64, ("Audio: Validation Kit: Warning: Guest is playing back data when no playback test is active\n"));
     746    if (pTst == NULL) /* Empty list? */
     747    {
     748        LogRel(("ValKit: Warning: Guest is playing back data when no playback test is active\n"));
    611749
    612750        *pcbWritten = cbBuf;
     
    614752    }
    615753
    616     PVALKITTESTDATA pTst = pThis->pTestCur;
     754#if 1
     755    if (PDMAudioPropsIsBufferSilence(&pStream->pStream->Cfg.Props, pvBuf, cbBuf))
     756    {
     757        LogRel(("ValKit: Skipping %RU32 bytes of silence\n", cbBuf));
     758
     759        *pcbWritten = cbBuf;
     760        return VINF_SUCCESS;
     761    }
     762#endif
    617763
    618764    if (pTst->t.TestTone.u.Play.cbRead == 0)
     
    633779        {
    634780            pTst->msStartedTS = RTTimeMilliTS();
    635             LogRel(("Audio: Validation Kit: Recording audio data (%RU16Hz, %RU32ms) started\n",
    636                     (uint16_t)Parms.TestTone.dbFreqHz, Parms.TestTone.msDuration));
     781            LogRel(("ValKit: Test #%RU32: Recording audio data (%RU16Hz, %RU32ms) started\n",
     782                    pTst->idxTest, (uint16_t)Parms.TestTone.dbFreqHz, Parms.TestTone.msDuration));
    637783        }
    638784    }
     
    642788    if (RT_SUCCESS(rc))
    643789    {
    644         uint32_t cbToRead = RT_MIN(cbBuf,
    645                                    pTst->t.TestTone.u.Play.cbToRead - pTst->t.TestTone.u.Play.cbRead);
    646 
    647         rc = AudioTestSetObjWrite(pTst->pObj, pvBuf, cbToRead);
    648         if (RT_SUCCESS(rc))
    649         {
    650             pTst->t.TestTone.u.Play.cbRead += cbToRead;
    651             Assert(pTst->t.TestTone.u.Play.cbRead <= pTst->t.TestTone.u.Play.cbToRead);
    652 
    653             const bool fComplete = pTst->t.TestTone.u.Play.cbToRead == pTst->t.TestTone.u.Play.cbRead;
    654 
     790        rc = AudioTestSetObjWrite(pTst->pObj, pvBuf, cbBuf);
     791        if (RT_SUCCESS(rc))
     792        {
     793            pTst->t.TestTone.u.Play.cbRead += cbBuf;
     794
     795        #if 0
     796            const bool fComplete = pTst->t.TestTone.u.Play.cbRead >= pTst->t.TestTone.u.Play.cbToRead;
    655797            if (fComplete)
    656798            {
    657                 LogRel(("Audio: Validation Kit: Recording audio data done (took %RU32ms)\n",
    658                         RTTimeMilliTS() - pTst->msStartedTS));
     799                LogRel(("ValKit: Test #%RU32: Recording audio data ended (took %RU32ms)\n",
     800                        pTst->idxTest, RTTimeMilliTS() - pTst->msStartedTS));
     801
     802                if (pTst->t.TestTone.u.Play.cbRead > pTst->t.TestTone.u.Play.cbToRead)
     803                    LogRel(("ValKit: Warning: Test #%RU32 read %RU32 bytes more than announced\n",
     804                            pTst->idxTest, pTst->t.TestTone.u.Play.cbRead - pTst->t.TestTone.u.Play.cbToRead));
    659805
    660806                rc = RTCritSectEnter(&pThis->CritSect);
    661807                if (RT_SUCCESS(rc))
    662808                {
    663                     drvHostValKiUnregisterPlayTest(pThis, pTst);
     809                    AudioTestSetTestDone(pTst->pEntry);
    664810
    665811                    pThis->pTestCur = NULL;
     812                    pTst            = NULL;
     813
     814                    if (pThis->fTestSetEnded)
     815                        rc = RTSemEventSignal(pThis->EventSemEnded);
    666816
    667817                    int rc2 = RTCritSectLeave(&pThis->CritSect);
    668                     AssertRC(rc2);
     818                    if (RT_SUCCESS(rc))
     819                        rc = rc2;
    669820                }
    670821            }
    671 
    672             cbWritten = cbToRead;
     822        #endif
     823
     824            cbWritten = cbBuf;
    673825        }
    674826    }
     
    676828    if (RT_FAILURE(rc))
    677829    {
    678         if (pTst->pEntry)
     830        if (   pTst
     831            && pTst->pEntry)
    679832            AudioTestSetTestFailed(pTst->pEntry, rc, "Recording audio data failed");
    680         LogRel(("Audio: Validation Kit: Recording audio data failed with %Rrc\n", rc));
     833        LogRel(("ValKit: Recording audio data failed with %Rrc\n", rc));
    681834    }
    682835
     
    700853    if (RT_SUCCESS(rc))
    701854    {
    702         pThis->pTestCur = RTListGetFirst(&pThis->lstTestsRec, VALKITTESTDATA, Node);
     855        if (pThis->pTestCur == NULL)
     856            pThis->pTestCur = RTListGetFirst(&pThis->lstTestsRec, VALKITTESTDATA, Node);
    703857
    704858        int rc2 = RTCritSectLeave(&pThis->CritSect);
     
    708862    if (pThis->pTestCur == NULL) /* Empty list? */
    709863    {
    710         LogRelMax(64, ("Audio: Validation Kit: Warning: Guest is recording audio data when no recording test is active\n"));
     864        LogRelMax(64, ("ValKit: Warning: Guest is recording audio data when no recording test is active\n"));
    711865
    712866        *pcbRead = 0;
     
    733887        {
    734888            pTst->msStartedTS = RTTimeMilliTS();
    735             LogRel(("Audio: Validation Kit: Injecting audio input data (%RU16Hz, %RU32ms) started\n",
     889            LogRel(("ValKit: Injecting audio input data (%RU16Hz, %RU32ms) started\n",
    736890                    (uint16_t)pTst->t.TestTone.Tone.rdFreqHz,
    737891                    pTst->t.TestTone.Parms.msDuration));
     
    759913                if (fComplete)
    760914                {
    761                     LogRel(("Audio: Validation Kit: Injecting audio input data done (took %RU32ms)\n",
     915                    LogRel(("ValKit: Injecting audio input data done (took %RU32ms)\n",
    762916                            RTTimeMilliTS() - pTst->msStartedTS));
    763917
     
    768922
    769923                        pThis->pTestCur = NULL;
     924                        pTst            = NULL;
    770925
    771926                        int rc2 = RTCritSectLeave(&pThis->CritSect);
     
    779934    if (RT_FAILURE(rc))
    780935    {
    781         if (pTst->pEntry)
     936        if (   pTst
     937            && pTst->pEntry)
    782938            AudioTestSetTestFailed(pTst->pEntry, rc, "Injecting audio input data failed");
    783         LogRel(("Audio: Validation Kit: Injecting audio input data failed with %Rrc\n", rc));
     939        LogRel(("ValKit: Injecting audio input data failed with %Rrc\n", rc));
    784940    }
    785941
     
    8441000    pThis->IHostAudio.pfnStreamCapture              = drvHostValKitAudioHA_StreamCapture;
    8451001
     1002    int rc = RTCritSectInit(&pThis->CritSect);
     1003    AssertRCReturn(rc, rc);
     1004    rc = RTSemEventCreate(&pThis->EventSemEnded);
     1005    AssertRCReturn(rc, rc);
     1006
     1007    pThis->fTestSetEnded = false;
     1008
    8461009    RTListInit(&pThis->lstTestsRec);
    8471010    pThis->cTestsRec  = 0;
     
    8641027       uint32_t uTcpPort   = ATS_TCP_HOST_DEFAULT_PORT;
    8651028
    866     LogRel(("Audio: Validation Kit: Starting Audio Test Service (ATS) at %s:%RU32...\n",
     1029    LogRel(("ValKit: Starting Audio Test Service (ATS) at %s:%RU32...\n",
    8671030            pszTcpAddr, uTcpPort));
    8681031
    869     int rc = AudioTestSvcInit(&pThis->Srv,
    870                               /* We only allow connections from localhost for now. */
    871                               pszTcpAddr, uTcpPort, &Callbacks);
     1032    rc = AudioTestSvcInit(&pThis->Srv,
     1033                          /* We only allow connections from localhost for now. */
     1034                          pszTcpAddr, uTcpPort, &Callbacks);
    8721035    if (RT_SUCCESS(rc))
    8731036        rc = AudioTestSvcStart(&pThis->Srv);
     
    8751038    if (RT_SUCCESS(rc))
    8761039    {
    877         LogRel(("Audio: Validation Kit: Audio Test Service (ATS) running\n"));
     1040        LogRel(("ValKit: Audio Test Service (ATS) running\n"));
    8781041
    8791042        /** @todo Let the following be customizable by CFGM later. */
     
    8811044        if (RT_SUCCESS(rc))
    8821045        {
    883             LogRel(("Audio: Validation Kit: Using temp dir '%s'\n", pThis->szPathTemp));
     1046            LogRel(("ValKit: Using temp dir '%s'\n", pThis->szPathTemp));
    8841047            rc = AudioTestPathGetTemp(pThis->szPathOut, sizeof(pThis->szPathOut));
    8851048            if (RT_SUCCESS(rc))
    886                 LogRel(("Audio: Validation Kit: Using output dir '%s'\n", pThis->szPathOut));
     1049                LogRel(("ValKit: Using output dir '%s'\n", pThis->szPathOut));
    8871050        }
    8881051    }
    8891052
    890     if (RT_SUCCESS(rc))
    891         rc = RTCritSectInit(&pThis->CritSect);
    892 
    8931053    if (RT_FAILURE(rc))
    894         LogRel(("Audio: Validation Kit: Initialization failed, rc=%Rrc\n", rc));
     1054        LogRel(("ValKit: Initialization failed, rc=%Rrc\n", rc));
    8951055
    8961056    return rc;
     
    9021062    PDRVHOSTVALKITAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTVALKITAUDIO);
    9031063
    904     LogRel(("Audio: Validation Kit: Shutting down Audio Test Service (ATS) ...\n"));
     1064    LogRel(("ValKit: Shutting down Audio Test Service (ATS) ...\n"));
    9051065
    9061066    int rc = AudioTestSvcShutdown(&pThis->Srv);
     
    9101070    if (RT_SUCCESS(rc))
    9111071    {
    912         LogRel(("Audio: Validation Kit: Shutdown of Audio Test Service (ATS) complete\n"));
     1072        LogRel(("ValKit: Shutdown of Audio Test Service (ATS) complete\n"));
    9131073        drvHostValKitCleanup(pThis);
    9141074    }
    9151075    else
    916         LogRel(("Audio: Validation Kit: Shutdown of Audio Test Service (ATS) failed, rc=%Rrc\n", rc));
     1076        LogRel(("ValKit: Shutdown of Audio Test Service (ATS) failed, rc=%Rrc\n", rc));
    9171077
    9181078    /* Try cleaning up a bit. */
     
    9201080    RTDirRemove(pThis->szPathOut);
    9211081
     1082    RTSemEventDestroy(pThis->EventSemEnded);
     1083
    9221084    if (RTCritSectIsInitialized(&pThis->CritSect))
    9231085    {
     
    9281090
    9291091    if (RT_FAILURE(rc))
    930         LogRel(("Audio: Validation Kit: Destruction failed, rc=%Rrc\n", rc));
     1092        LogRel(("ValKit: Destruction failed, rc=%Rrc\n", rc));
    9311093}
    9321094
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