Changeset 89431 in vbox for trunk/src/VBox/Devices/Audio
- Timestamp:
- Jun 1, 2021 12:57:36 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 144785
- Location:
- trunk/src/VBox/Devices/Audio
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/AudioTest.cpp
r89389 r89431 546 546 { 547 547 PAUDIOTESTERRORENTRY pEntry = (PAUDIOTESTERRORENTRY)RTMemAlloc(sizeof(AUDIOTESTERRORENTRY)); 548 Assert Return(pEntry, VERR_NO_MEMORY);548 AssertPtrReturn(pEntry, VERR_NO_MEMORY); 549 549 550 550 if (RTStrPrintf2V(pEntry->szDesc, sizeof(pEntry->szDesc), pszDesc, args) < 0) … … 633 633 { 634 634 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 */ 643 const char *AudioTestSetGetTag(PAUDIOTESTSET pSet) 644 { 645 return pSet->szTag; 635 646 } 636 647 … … 746 757 if (RT_SUCCESS(rc)) 747 758 { 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 748 779 RTListNodeRemove(&pObj->Node); 749 780 RTMemFree(pObj); … … 870 901 rc = audioTestManifestWrite(pSet, "obj_name=%s\n", pObj->szName); 871 902 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 } 872 938 } 873 939 … … 938 1004 AssertPtrReturn(pObj, VERR_NO_MEMORY); 939 1005 1006 RTListInit(&pObj->lstMeta); 1007 940 1008 if (RTStrPrintf2(pObj->szName, sizeof(pObj->szName), "%04RU32-%s", pSet->cObj, pszName) <= 0) 941 1009 AssertFailedReturn(VERR_BUFFER_OVERFLOW); … … 996 1064 997 1065 /** 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 */ 1073 static 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 */ 1097 int 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 /** 998 1109 * Closes an opened audio test object. 999 1110 * … … 1013 1124 if (RTFileIsValid(pObj->File.hFile)) 1014 1125 { 1126 pObj->File.cbSize = RTFileTell(pObj->File.hFile); 1127 1015 1128 rc = RTFileClose(pObj->File.hFile); 1016 1129 pObj->File.hFile = NIL_RTFILE; … … 1020 1133 } 1021 1134 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 */ 1022 1144 int AudioTestSetTestBegin(PAUDIOTESTSET pSet, const char *pszDesc, PAUDIOTESTPARMS pParms, PAUDIOTESTENTRY *ppEntry) 1023 1145 { … … 1095 1217 } 1096 1218 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 */ 1097 1227 int AudioTestSetTestFailed(PAUDIOTESTENTRY pEntry, int rc, const char *pszErr) 1098 1228 { … … 1113 1243 } 1114 1244 1245 /** 1246 * Marks a running test as successfully done. 1247 * 1248 * @returns VBox status code. 1249 * @param pEntry Test to mark. 1250 */ 1115 1251 int AudioTestSetTestDone(PAUDIOTESTENTRY pEntry) 1116 1252 { … … 1143 1279 /** @todo Check and deny if \a pszOutDir is part of the set's path. */ 1144 1280 1281 int rc = RTDirCreateFullPath(pszOutDir, 0755); 1282 if (RT_FAILURE(rc)) 1283 return rc; 1284 1145 1285 char szOutName[RT_ELEMENTS(AUDIOTEST_PATH_PREFIX_STR) + AUDIOTEST_TAG_MAX + 16]; 1146 1286 if (RTStrPrintf2(szOutName, sizeof(szOutName), "%s-%s%s", … … 1149 1289 1150 1290 char szOutPath[RTPATH_MAX]; 1151 intrc = RTPathJoin(szOutPath, sizeof(szOutPath), pszOutDir, szOutName);1291 rc = RTPathJoin(szOutPath, sizeof(szOutPath), pszOutDir, szOutName); 1152 1292 AssertRCReturn(rc, rc); 1153 1293 … … 1155 1295 unsigned cArgs = 0; 1156 1296 1157 apszArgs[cArgs++] = " AudioTest";1297 apszArgs[cArgs++] = "vkat"; 1158 1298 apszArgs[cArgs++] = "--create"; 1159 1299 apszArgs[cArgs++] = "--gzip"; … … 1214 1354 unsigned cArgs = 0; 1215 1355 1216 apszArgs[cArgs++] = " AudioTest";1356 apszArgs[cArgs++] = "vkat"; 1217 1357 apszArgs[cArgs++] = "--extract"; 1218 1358 apszArgs[cArgs++] = "--gunzip"; -
trunk/src/VBox/Devices/Audio/AudioTest.h
r89387 r89431 170 170 typedef struct AUDIOTESTOBJFILE 171 171 { 172 RTFILE hFile; 172 /** File handle. */ 173 RTFILE hFile; 174 /** Total size (in bytes). */ 175 size_t cbSize; 173 176 } AUDIOTESTOBJFILE; 174 177 /** Pointer to an audio test object file. */ 175 178 typedef AUDIOTESTOBJFILE *PAUDIOTESTOBJFILE; 179 180 /** 181 * Enumeration for an audio test object meta data type. 182 */ 183 typedef 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 */ 196 typedef 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. */ 208 typedef AUDIOTESTOBJMETA *PAUDIOTESTOBJMETA; 176 209 177 210 /** … … 193 226 /** The object type. */ 194 227 AUDIOTESTOBJTYPE enmType; 228 /** Meta data list. */ 229 RTLISTANCHOR lstMeta; 195 230 /** Union for holding the object type-specific data. */ 196 231 union … … 323 358 int AudioTestSetObjCreateAndRegister(PAUDIOTESTSET pSet, const char *pszName, PAUDIOTESTOBJ *ppObj); 324 359 int AudioTestSetObjWrite(PAUDIOTESTOBJ pObj, void *pvBuf, size_t cbBuf); 360 int AudioTestSetObjAddMetadataStr(PAUDIOTESTOBJ pObj, const char *pszFormat, ...); 325 361 int AudioTestSetObjClose(PAUDIOTESTOBJ pObj); 326 362 … … 334 370 int AudioTestSetClose(PAUDIOTESTSET pSet); 335 371 int AudioTestSetWipe(PAUDIOTESTSET pSet); 372 const char *AudioTestSetGetTag(PAUDIOTESTSET pSet); 336 373 bool AudioTestSetIsPacked(const char *pszPath); 337 374 int AudioTestSetPack(PAUDIOTESTSET pSet, const char *pszOutDir, char *pszFileName, size_t cbFileName); -
trunk/src/VBox/Devices/Audio/AudioTestService.cpp
r89228 r89431 474 474 int rc; 475 475 if (pPktHdr->cb == sizeof(ATSPKTHDR)) 476 { 476 477 rc = atsReplyAck(pThis, pClient, pPktHdr); 478 } 477 479 else 478 480 rc = atsReplyBadSize(pThis, pClient, pPktHdr, sizeof(ATSPKTHDR)); … … 514 516 pClient->enmState = ATSCLIENTSTATE_READY; 515 517 } 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 */ 530 static 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 */ 564 static 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"); 516 585 517 586 return rc; … … 574 643 else if (atsIsSameOpcode(pPktHdr, ATSPKT_OPCODE_BYE)) 575 644 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); 576 650 /* Audio testing: */ 577 651 else if (atsIsSameOpcode(pPktHdr, ATSPKT_OPCODE_TONE_PLAY)) -
trunk/src/VBox/Devices/Audio/AudioTestService.h
r89399 r89431 33 33 typedef struct ATSCALLBACKS 34 34 { 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 35 53 /** 36 54 * Plays a test tone. … … 79 97 typedef ATSSERVER *PATSSERVER; 80 98 81 82 99 int AudioTestSvcInit(PATSSERVER pThis, PCATSCALLBACKS pCallbacks); 83 100 int AudioTestSvcDestroy(PATSSERVER pThis); -
trunk/src/VBox/Devices/Audio/AudioTestServiceClient.cpp
r89399 r89431 305 305 306 306 /** 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 */ 313 int 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 */ 336 int 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 /** 307 353 * Tells the server to play a (test) tone. 308 354 * -
trunk/src/VBox/Devices/Audio/AudioTestServiceClient.h
r89399 r89431 31 31 32 32 int AudioTestSvcClientConnect(PATSCLIENT pClient, const char *pszAddr, uint32_t uPort); 33 int AudioTestSvcClientTestSetBegin(PATSCLIENT pClient, const char *pszTag); 34 int AudioTestSvcClientTestSetEnd(PATSCLIENT pClient, const char *pszTag); 33 35 int AudioTestSvcClientTonePlay(PATSCLIENT pClient, PPDMAUDIOSTREAMCFG pStreamCfg, PAUDIOTESTTONEPARMS pToneParms); 34 36 int AudioTestSvcClientClose(PATSCLIENT pClient); -
trunk/src/VBox/Devices/Audio/AudioTestServiceProtocol.h
r89380 r89431 121 121 /* No additional structures for BYE. */ 122 122 123 #define ATSPKT_OPCODE_TESTSET_BEGIN "TSET BEG" 124 125 /** 126 * The TSET BEG request structure. 127 */ 128 typedef 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; 135 AssertCompileSizeAlignment(ATSPKTREQTSETBEG, ATSPKT_ALIGNMENT); 136 /** Pointer to a TSET BEG reply structure. */ 137 typedef ATSPKTREQTSETBEG *PATSPKTREQTSETBEG; 138 139 #define ATSPKT_OPCODE_TESTSET_END "TSET END" 140 141 /** 142 * The TSET END request structure. 143 */ 144 typedef 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; 151 AssertCompileSizeAlignment(ATSPKTREQTSETEND, ATSPKT_ALIGNMENT); 152 /** Pointer to a TSET STA reply structure. */ 153 typedef ATSPKTREQTSETEND *PATSPKTREQTSETEND; 154 123 155 #define ATSPKT_OPCODE_TONE_PLAY "TNPLY " 124 156
Note:
See TracChangeset
for help on using the changeset viewer.