VirtualBox

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


Ignore:
Timestamp:
Jun 1, 2021 12:57:36 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
144785
Message:

Audio/ValKit: More infrastructure code. bugref:10008

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

Legend:

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

    r89389 r89431  
    546546{
    547547    PAUDIOTESTERRORENTRY pEntry = (PAUDIOTESTERRORENTRY)RTMemAlloc(sizeof(AUDIOTESTERRORENTRY));
    548     AssertReturn(pEntry, VERR_NO_MEMORY);
     548    AssertPtrReturn(pEntry, VERR_NO_MEMORY);
    549549
    550550    if (RTStrPrintf2V(pEntry->szDesc, sizeof(pEntry->szDesc), pszDesc, args) < 0)
     
    633633{
    634634    return RTPathJoin(pszPathAbs, cbPathAbs, pSet->szPathAbs, pszObjName);
     635}
     636
     637/**
     638 * Returns the tag of a test set.
     639 *
     640 * @returns Test set tag.
     641 * @param   pSet                Test set to return tag for.
     642 */
     643const char *AudioTestSetGetTag(PAUDIOTESTSET pSet)
     644{
     645    return pSet->szTag;
    635646}
    636647
     
    746757        if (RT_SUCCESS(rc))
    747758        {
     759            PAUDIOTESTOBJMETA pMeta, pMetaNext;
     760            RTListForEachSafe(&pObj->lstMeta, pMeta, pMetaNext, AUDIOTESTOBJMETA, Node)
     761            {
     762                switch (pMeta->enmType)
     763                {
     764                    case AUDIOTESTOBJMETADATATYPE_STRING:
     765                    {
     766                        RTStrFree((char *)pMeta->pvMeta);
     767                        break;
     768                    }
     769
     770                    default:
     771                        AssertFailed();
     772                        break;
     773                }
     774
     775                RTListNodeRemove(&pMeta->Node);
     776                RTMemFree(pMeta);
     777            }
     778
    748779            RTListNodeRemove(&pObj->Node);
    749780            RTMemFree(pObj);
     
    870901        rc = audioTestManifestWrite(pSet, "obj_name=%s\n", pObj->szName);
    871902        AssertRCReturn(rc, rc);
     903
     904        switch (pObj->enmType)
     905        {
     906            case AUDIOTESTOBJTYPE_FILE:
     907            {
     908                rc = audioTestManifestWrite(pSet, "obj_size=%RU64\n", pObj->File.cbSize);
     909                AssertRCReturn(rc, rc);
     910                break;
     911            }
     912
     913            default:
     914                AssertFailed();
     915                break;
     916        }
     917
     918        /*
     919         * Write all meta data.
     920         */
     921        PAUDIOTESTOBJMETA pMeta;
     922        RTListForEach(&pObj->lstMeta, pMeta, AUDIOTESTOBJMETA, Node)
     923        {
     924            switch (pMeta->enmType)
     925            {
     926                case AUDIOTESTOBJMETADATATYPE_STRING:
     927                {
     928                    rc = audioTestManifestWrite(pSet, (const char *)pMeta->pvMeta);
     929                    AssertRCReturn(rc, rc);
     930                    break;
     931                }
     932
     933                default:
     934                    AssertFailed();
     935                    break;
     936            }
     937        }
    872938    }
    873939
     
    9381004    AssertPtrReturn(pObj, VERR_NO_MEMORY);
    9391005
     1006    RTListInit(&pObj->lstMeta);
     1007
    9401008    if (RTStrPrintf2(pObj->szName, sizeof(pObj->szName), "%04RU32-%s", pSet->cObj, pszName) <= 0)
    9411009        AssertFailedReturn(VERR_BUFFER_OVERFLOW);
     
    9961064
    9971065/**
     1066 * Adds meta data to a test object as a string, va_list version.
     1067 *
     1068 * @returns VBox status code.
     1069 * @param   pObj                Test object to add meta data for.
     1070 * @param   pszFormat           Format string to add.
     1071 * @param   va_list             Variable arguments list to use for the format string.
     1072 */
     1073static int audioTestSetObjAddMetadataStrV(PAUDIOTESTOBJ pObj, const char *pszFormat, va_list va)
     1074{
     1075    PAUDIOTESTOBJMETA pMeta = (PAUDIOTESTOBJMETA)RTMemAlloc(sizeof(AUDIOTESTOBJMETA));
     1076    AssertPtrReturn(pMeta, VERR_NO_MEMORY);
     1077
     1078    pMeta->pvMeta = RTStrAPrintf2V(pszFormat, va);
     1079    AssertPtrReturn(pMeta->pvMeta, VERR_BUFFER_OVERFLOW);
     1080    pMeta->cbMeta = RTStrNLen((const char *)pMeta->pvMeta, RTSTR_MAX);
     1081
     1082    pMeta->enmType = AUDIOTESTOBJMETADATATYPE_STRING;
     1083
     1084    RTListAppend(&pObj->lstMeta, &pMeta->Node);
     1085
     1086    return VINF_SUCCESS;
     1087}
     1088
     1089/**
     1090 * Adds meta data to a test object as a string.
     1091 *
     1092 * @returns VBox status code.
     1093 * @param   pObj                Test object to add meta data for.
     1094 * @param   pszFormat           Format string to add.
     1095 * @param   ...                 Variable arguments for the format string.
     1096 */
     1097int AudioTestSetObjAddMetadataStr(PAUDIOTESTOBJ pObj, const char *pszFormat, ...)
     1098{
     1099    va_list va;
     1100
     1101    va_start(va, pszFormat);
     1102    int rc = audioTestSetObjAddMetadataStrV(pObj, pszFormat, va);
     1103    va_end(va);
     1104
     1105    return rc;
     1106}
     1107
     1108/**
    9981109 * Closes an opened audio test object.
    9991110 *
     
    10131124    if (RTFileIsValid(pObj->File.hFile))
    10141125    {
     1126        pObj->File.cbSize = RTFileTell(pObj->File.hFile);
     1127
    10151128        rc = RTFileClose(pObj->File.hFile);
    10161129        pObj->File.hFile = NIL_RTFILE;
     
    10201133}
    10211134
     1135/**
     1136 * Begins a new test of a test set.
     1137 *
     1138 * @returns VBox status code.
     1139 * @param   pSet                Test set to begin new test for.
     1140 * @param   pszDesc             Test description.
     1141 * @param   pParms              Test parameters to use.
     1142 * @param   ppEntry             Where to return the new test handle.
     1143 */
    10221144int AudioTestSetTestBegin(PAUDIOTESTSET pSet, const char *pszDesc, PAUDIOTESTPARMS pParms, PAUDIOTESTENTRY *ppEntry)
    10231145{
     
    10951217}
    10961218
     1219/**
     1220 * Marks a running test as failed.
     1221 *
     1222 * @returns VBox status code.
     1223 * @param   pEntry              Test to mark.
     1224 * @param   rc                  Error code.
     1225 * @param   pszErr              Error description.
     1226 */
    10971227int AudioTestSetTestFailed(PAUDIOTESTENTRY pEntry, int rc, const char *pszErr)
    10981228{
     
    11131243}
    11141244
     1245/**
     1246 * Marks a running test as successfully done.
     1247 *
     1248 * @returns VBox status code.
     1249 * @param   pEntry              Test to mark.
     1250 */
    11151251int AudioTestSetTestDone(PAUDIOTESTENTRY pEntry)
    11161252{
     
    11431279    /** @todo Check and deny if \a pszOutDir is part of the set's path. */
    11441280
     1281    int rc = RTDirCreateFullPath(pszOutDir, 0755);
     1282    if (RT_FAILURE(rc))
     1283        return rc;
     1284
    11451285    char szOutName[RT_ELEMENTS(AUDIOTEST_PATH_PREFIX_STR) + AUDIOTEST_TAG_MAX + 16];
    11461286    if (RTStrPrintf2(szOutName, sizeof(szOutName), "%s-%s%s",
     
    11491289
    11501290    char szOutPath[RTPATH_MAX];
    1151     int rc = RTPathJoin(szOutPath, sizeof(szOutPath), pszOutDir, szOutName);
     1291    rc = RTPathJoin(szOutPath, sizeof(szOutPath), pszOutDir, szOutName);
    11521292    AssertRCReturn(rc, rc);
    11531293
     
    11551295    unsigned    cArgs = 0;
    11561296
    1157     apszArgs[cArgs++] = "AudioTest";
     1297    apszArgs[cArgs++] = "vkat";
    11581298    apszArgs[cArgs++] = "--create";
    11591299    apszArgs[cArgs++] = "--gzip";
     
    12141354    unsigned    cArgs = 0;
    12151355
    1216     apszArgs[cArgs++] = "AudioTest";
     1356    apszArgs[cArgs++] = "vkat";
    12171357    apszArgs[cArgs++] = "--extract";
    12181358    apszArgs[cArgs++] = "--gunzip";
  • trunk/src/VBox/Devices/Audio/AudioTest.h

    r89387 r89431  
    170170typedef struct AUDIOTESTOBJFILE
    171171{
    172     RTFILE hFile;
     172    /** File handle. */
     173    RTFILE              hFile;
     174    /** Total size (in bytes). */
     175    size_t              cbSize;
    173176} AUDIOTESTOBJFILE;
    174177/** Pointer to an audio test object file. */
    175178typedef AUDIOTESTOBJFILE *PAUDIOTESTOBJFILE;
     179
     180/**
     181 * Enumeration for an audio test object meta data type.
     182 */
     183typedef enum AUDIOTESTOBJMETADATATYPE
     184{
     185    /** Unknown / invalid, do not use. */
     186    AUDIOTESTOBJMETADATATYPE_INVALID = 0,
     187    /** Meta data is an UTF-8 string. */
     188    AUDIOTESTOBJMETADATATYPE_STRING,
     189    /** The usual 32-bit hack. */
     190    AUDIOTESTOBJMETADATATYPE_32BIT_HACK = 0x7fffffff
     191} AUDIOTESTOBJMETADATATYPE;
     192
     193/**
     194 * Structure for keeping a meta data block.
     195 */
     196typedef struct AUDIOTESTOBJMETA
     197{
     198    /** List node. */
     199    RTLISTNODE                Node;
     200    /** Meta data type. */
     201    AUDIOTESTOBJMETADATATYPE  enmType;
     202    /** Meta data block. */
     203    void                     *pvMeta;
     204    /** Size (in bytes) of \a pvMeta. */
     205    size_t                    cbMeta;
     206} AUDIOTESTOBJMETA;
     207/** Pointer to an audio test object file. */
     208typedef AUDIOTESTOBJMETA *PAUDIOTESTOBJMETA;
    176209
    177210/**
     
    193226    /** The object type. */
    194227    AUDIOTESTOBJTYPE     enmType;
     228    /** Meta data list. */
     229    RTLISTANCHOR         lstMeta;
    195230    /** Union for holding the object type-specific data. */
    196231    union
     
    323358int    AudioTestSetObjCreateAndRegister(PAUDIOTESTSET pSet, const char *pszName, PAUDIOTESTOBJ *ppObj);
    324359int    AudioTestSetObjWrite(PAUDIOTESTOBJ pObj, void *pvBuf, size_t cbBuf);
     360int    AudioTestSetObjAddMetadataStr(PAUDIOTESTOBJ pObj, const char *pszFormat, ...);
    325361int    AudioTestSetObjClose(PAUDIOTESTOBJ pObj);
    326362
     
    334370int    AudioTestSetClose(PAUDIOTESTSET pSet);
    335371int    AudioTestSetWipe(PAUDIOTESTSET pSet);
     372const char *AudioTestSetGetTag(PAUDIOTESTSET pSet);
    336373bool   AudioTestSetIsPacked(const char *pszPath);
    337374int    AudioTestSetPack(PAUDIOTESTSET pSet, const char *pszOutDir, char *pszFileName, size_t cbFileName);
  • trunk/src/VBox/Devices/Audio/AudioTestService.cpp

    r89228 r89431  
    474474    int rc;
    475475    if (pPktHdr->cb == sizeof(ATSPKTHDR))
     476    {
    476477        rc = atsReplyAck(pThis, pClient, pPktHdr);
     478    }
    477479    else
    478480        rc = atsReplyBadSize(pThis, pClient, pPktHdr, sizeof(ATSPKTHDR));
     
    514516        pClient->enmState = ATSCLIENTSTATE_READY;
    515517    }
     518
     519    return rc;
     520}
     521
     522/**
     523 * Verifies and acknowledges a "TSET BEG" request.
     524 *
     525 * @returns IPRT status code.
     526 * @param   pThis               The ATS instance.
     527 * @param   pClient             The ATS client structure.
     528 * @param   pPktHdr             The test set begin packet.
     529 */
     530static int atsDoTestSetBegin(PATSSERVER pThis, PATSCLIENTINST pClient, PCATSPKTHDR pPktHdr)
     531{
     532    if (pPktHdr->cb != sizeof(ATSPKTREQTSETBEG))
     533        return atsReplyBadSize(pThis, pClient, pPktHdr, sizeof(ATSPKTREQTSETBEG));
     534
     535    PATSPKTREQTSETBEG pReq = (PATSPKTREQTSETBEG)pPktHdr;
     536
     537    int rc = VINF_SUCCESS;
     538
     539    if (pThis->Callbacks.pfnTestSetBegin)
     540    {
     541        rc = pThis->Callbacks.pfnTestSetBegin(pThis->Callbacks.pvUser, pReq->szTag);
     542        if (RT_FAILURE(rc))
     543            return atsReplyRC(pThis, pClient, pPktHdr, rc, "Beginning test set '%s' failed", pReq->szTag);
     544    }
     545
     546    if (RT_SUCCESS(rc))
     547    {
     548        rc = atsReplyAck(pThis, pClient, pPktHdr);
     549    }
     550    else
     551        rc = atsReplyRC(pThis, pClient, pPktHdr, rc, "Beginning test set failed");
     552
     553    return rc;
     554}
     555
     556/**
     557 * Verifies and acknowledges a "TSET END" request.
     558 *
     559 * @returns IPRT status code.
     560 * @param   pThis               The ATS instance.
     561 * @param   pClient             The ATS client structure.
     562 * @param   pPktHdr             The test set end packet.
     563 */
     564static int atsDoTestSetEnd(PATSSERVER pThis, PATSCLIENTINST pClient, PCATSPKTHDR pPktHdr)
     565{
     566    if (pPktHdr->cb != sizeof(ATSPKTREQTSETEND))
     567        return atsReplyBadSize(pThis, pClient, pPktHdr, sizeof(ATSPKTREQTSETEND));
     568
     569    PATSPKTREQTSETEND pReq = (PATSPKTREQTSETEND)pPktHdr;
     570
     571    int rc = VINF_SUCCESS;
     572
     573    if (pThis->Callbacks.pfnTestSetEnd)
     574    {
     575        rc = pThis->Callbacks.pfnTestSetEnd(pThis->Callbacks.pvUser, pReq->szTag);
     576        if (RT_FAILURE(rc))
     577            return atsReplyRC(pThis, pClient, pPktHdr, rc, "Ending test set '%s' failed", pReq->szTag);
     578    }
     579    if (RT_SUCCESS(rc))
     580    {
     581        rc = atsReplyAck(pThis, pClient, pPktHdr);
     582    }
     583    else
     584        rc = atsReplyRC(pThis, pClient, pPktHdr, rc, "Ending test set failed");
    516585
    517586    return rc;
     
    574643    else if (atsIsSameOpcode(pPktHdr, ATSPKT_OPCODE_BYE))
    575644        rc = atsDoBye(pThis, pClient, pPktHdr);
     645    /* Test set handling: */
     646    else if (atsIsSameOpcode(pPktHdr, ATSPKT_OPCODE_TESTSET_BEGIN))
     647        rc = atsDoTestSetBegin(pThis, pClient, pPktHdr);
     648    else if (atsIsSameOpcode(pPktHdr, ATSPKT_OPCODE_TESTSET_END))
     649        rc = atsDoTestSetEnd(pThis, pClient, pPktHdr);
    576650    /* Audio testing: */
    577651    else if (atsIsSameOpcode(pPktHdr, ATSPKT_OPCODE_TONE_PLAY))
  • trunk/src/VBox/Devices/Audio/AudioTestService.h

    r89399 r89431  
    3333typedef struct ATSCALLBACKS
    3434{
     35    /**
     36     * Begins a test set. Optional.
     37     *
     38     * @returns VBox status code.
     39     * @param   pvUser          User-supplied pointer to context data. Optional.
     40     * @param   pszTag          Tag of test set to begin.
     41     */
     42    DECLR3CALLBACKMEMBER(int, pfnTestSetBegin, (void const *pvUser, const char *pszTag));
     43
     44    /**
     45     * Ends the current test set. Optional.
     46     *
     47     * @returns VBox status code.
     48     * @param   pvUser          User-supplied pointer to context data. Optional.
     49     * @param   pszTag          Tag of test set to end.
     50     */
     51    DECLR3CALLBACKMEMBER(int, pfnTestSetEnd,   (void const *pvUser, const char *pszTag));
     52
    3553    /**
    3654     * Plays a test tone.
     
    7997typedef ATSSERVER *PATSSERVER;
    8098
    81 
    8299int AudioTestSvcInit(PATSSERVER pThis, PCATSCALLBACKS pCallbacks);
    83100int AudioTestSvcDestroy(PATSSERVER pThis);
  • trunk/src/VBox/Devices/Audio/AudioTestServiceClient.cpp

    r89399 r89431  
    305305
    306306/**
     307 * Tells the server to begin a new test set.
     308 *
     309 * @returns VBox status code.
     310 * @param   pClient             Client to issue command for.
     311 * @param   pszTag              Tag to use for the test set to begin.
     312 */
     313int AudioTestSvcClientTestSetBegin(PATSCLIENT pClient, const char *pszTag)
     314{
     315    ATSPKTREQTSETBEG Req;
     316
     317    int rc = RTStrCopy(Req.szTag, sizeof(Req.szTag), pszTag);
     318    AssertRCReturn(rc, rc);
     319
     320    audioTestSvcClientReqHdrInit(&Req.Hdr, sizeof(Req), ATSPKT_OPCODE_TESTSET_BEGIN, 0);
     321
     322    rc = audioTestSvcClientSendMsg(pClient, &Req, sizeof(Req), NULL, 0);
     323    if (RT_SUCCESS(rc))
     324        rc = audioTestSvcClientRecvAck(pClient);
     325
     326    return rc;
     327}
     328
     329/**
     330 * Tells the server to end a runing test set.
     331 *
     332 * @returns VBox status code.
     333 * @param   pClient             Client to issue command for.
     334 * @param   pszTag              Tag of test set to end.
     335 */
     336int AudioTestSvcClientTestSetEnd(PATSCLIENT pClient, const char *pszTag)
     337{
     338    ATSPKTREQTSETEND Req;
     339
     340    int rc = RTStrCopy(Req.szTag, sizeof(Req.szTag), pszTag);
     341    AssertRCReturn(rc, rc);
     342
     343    audioTestSvcClientReqHdrInit(&Req.Hdr, sizeof(Req), ATSPKT_OPCODE_TESTSET_END, 0);
     344
     345    rc = audioTestSvcClientSendMsg(pClient, &Req, sizeof(Req), NULL, 0);
     346    if (RT_SUCCESS(rc))
     347        rc = audioTestSvcClientRecvAck(pClient);
     348
     349    return rc;
     350}
     351
     352/**
    307353 * Tells the server to play a (test) tone.
    308354 *
  • trunk/src/VBox/Devices/Audio/AudioTestServiceClient.h

    r89399 r89431  
    3131
    3232int AudioTestSvcClientConnect(PATSCLIENT pClient, const char *pszAddr, uint32_t uPort);
     33int AudioTestSvcClientTestSetBegin(PATSCLIENT pClient, const char *pszTag);
     34int AudioTestSvcClientTestSetEnd(PATSCLIENT pClient, const char *pszTag);
    3335int AudioTestSvcClientTonePlay(PATSCLIENT pClient, PPDMAUDIOSTREAMCFG pStreamCfg, PAUDIOTESTTONEPARMS pToneParms);
    3436int AudioTestSvcClientClose(PATSCLIENT pClient);
  • trunk/src/VBox/Devices/Audio/AudioTestServiceProtocol.h

    r89380 r89431  
    121121/* No additional structures for BYE. */
    122122
     123#define ATSPKT_OPCODE_TESTSET_BEGIN     "TSET BEG"
     124
     125/**
     126 * The TSET BEG request structure.
     127 */
     128typedef struct ATSPKTREQTSETBEG
     129{
     130    /** Embedded packet header. */
     131    ATSPKTHDR          Hdr;
     132    /** Audio test set tag to use. */
     133    char               szTag[AUDIOTEST_TAG_MAX];
     134} ATSPKTREQTSETBEG;
     135AssertCompileSizeAlignment(ATSPKTREQTSETBEG, ATSPKT_ALIGNMENT);
     136/** Pointer to a TSET BEG reply structure. */
     137typedef ATSPKTREQTSETBEG *PATSPKTREQTSETBEG;
     138
     139#define ATSPKT_OPCODE_TESTSET_END       "TSET END"
     140
     141/**
     142 * The TSET END request structure.
     143 */
     144typedef struct ATSPKTREQTSETEND
     145{
     146    /** Embedded packet header. */
     147    ATSPKTHDR          Hdr;
     148    /** Audio test set tag to use. */
     149    char               szTag[AUDIOTEST_TAG_MAX];
     150} ATSPKTREQTSETEND;
     151AssertCompileSizeAlignment(ATSPKTREQTSETEND, ATSPKT_ALIGNMENT);
     152/** Pointer to a TSET STA reply structure. */
     153typedef ATSPKTREQTSETEND *PATSPKTREQTSETEND;
     154
    123155#define ATSPKT_OPCODE_TONE_PLAY         "TNPLY   "
    124156
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