Changeset 89747 in vbox for trunk/src/VBox/Devices/Audio
- Timestamp:
- Jun 16, 2021 4:06:15 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 145198
- Location:
- trunk/src/VBox/Devices/Audio
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/AudioTest.cpp
r89711 r89747 26 26 27 27 #include <iprt/buildconfig.h> 28 #include <iprt/cdefs.h> 28 29 #include <iprt/dir.h> 29 30 #include <iprt/env.h> … … 34 35 #include <iprt/message.h> /** @todo Get rid of this once we have own log hooks. */ 35 36 #include <iprt/rand.h> 37 #include <iprt/stream.h> 36 38 #include <iprt/system.h> 37 39 #include <iprt/uuid.h> … … 67 69 * Structures and Typedefs * 68 70 *********************************************************************************************************************************/ 71 /** 72 * Structure for an internal object handle. 73 * 74 * As we only support .INI-style files for now, this only has the object's section name in it. 75 */ 76 typedef struct AUDIOTESTOBJHANDLE 77 { 78 char szSec[128]; 79 } AUDIOTESTOBJHANDLE; 80 /** Pointer to an audio test object handle. */ 81 typedef AUDIOTESTOBJHANDLE* PAUDIOTESTOBJHANDLE; 82 69 83 /** 70 84 * Structure for keeping an audio test verification job. … … 86 100 typedef AUDIOTESTVERIFYJOB *PAUDIOTESTVERIFYJOB; 87 101 102 103 /********************************************************************************************************************************* 104 * Prototypes * 105 *********************************************************************************************************************************/ 106 static int audioTestSetObjCloseInternal(PAUDIOTESTOBJ pObj); 107 static void audioTestSetObjFinalize(PAUDIOTESTOBJ pObj); 88 108 89 109 /********************************************************************************************************************************* … … 803 823 RTListForEachSafe(&pSet->lstObj, pObj, pObjNext, AUDIOTESTOBJ, Node) 804 824 { 805 rc = AudioTestSetObjClose(pObj);825 rc = audioTestSetObjCloseInternal(pObj); 806 826 if (RT_SUCCESS(rc)) 807 827 { … … 881 901 rc = RTIniFileCreateFromVfsFile(&pSet->f.hIniFile, hVfsFile, RTINIFILE_F_READONLY); 882 902 RTVfsFileRelease(hVfsFile); 903 AssertRCReturn(rc, rc); 904 905 rc = RTStrCopy(pSet->szPathAbs, sizeof(pSet->szPathAbs), pszPath); 883 906 AssertRCReturn(rc, rc); 884 907 … … 1009 1032 RTListForEach(&pSet->lstObj, pObj, AUDIOTESTOBJ, Node) 1010 1033 { 1011 int rc2 = AudioTestSetObjClose(pObj);1034 int rc2 = audioTestSetObjCloseInternal(pObj); 1012 1035 if (RT_SUCCESS(rc2)) 1013 1036 { … … 1166 1189 return VINF_SUCCESS; 1167 1190 1168 /** @todo Generalize this function more once we have more object types. */ 1169 AssertReturn(pObj->enmType == AUDIOTESTOBJTYPE_FILE, VERR_INVALID_PARAMETER); 1170 1171 int rc = VINF_SUCCESS; 1172 1173 if (RTFileIsValid(pObj->File.hFile)) 1174 { 1175 pObj->File.cbSize = RTFileTell(pObj->File.hFile); 1176 1177 rc = RTFileClose(pObj->File.hFile); 1178 pObj->File.hFile = NIL_RTFILE; 1179 } 1180 1181 return rc; 1191 audioTestSetObjFinalize(pObj); 1192 1193 return audioTestSetObjCloseInternal(pObj); 1182 1194 } 1183 1195 … … 1423 1435 * @returns VBox status code. 1424 1436 * @param pSet Test set to get value from. 1425 * @param p szSec Section to get value from.1437 * @param phObj Object handle to get value for. 1426 1438 * @param pszKey Key to get value from. 1427 1439 * @param pszVal Where to return the value on success. … … 1429 1441 */ 1430 1442 static int audioTestGetValueStr(PAUDIOTESTSET pSet, 1431 const char *pszSec, const char *pszKey, char *pszVal, size_t cbVal)1432 { 1433 return RTIniFileQueryValue(pSet->f.hIniFile, p szSec, pszKey, pszVal, cbVal, NULL);1443 PAUDIOTESTOBJHANDLE phObj, const char *pszKey, char *pszVal, size_t cbVal) 1444 { 1445 return RTIniFileQueryValue(pSet->f.hIniFile, phObj->szSec, pszKey, pszVal, cbVal, NULL); 1434 1446 } 1435 1447 … … 1439 1451 * @returns VBox status code. 1440 1452 * @param pSet Test set to get value from. 1441 * @param p szSec Section to get value from.1453 * @param phObj Object handle to get value for. 1442 1454 * @param pszKey Key to get value from. 1443 1455 * @param puVal Where to return the value on success. 1444 1456 */ 1445 1457 static int audioTestGetValueUInt32(PAUDIOTESTSET pSet, 1446 const char *pszSec, const char *pszKey, uint32_t *puVal)1458 PAUDIOTESTOBJHANDLE phObj, const char *pszKey, uint32_t *puVal) 1447 1459 { 1448 1460 char szVal[_1K]; 1449 int rc = audioTestGetValueStr(pSet, p szSec, pszKey, szVal, sizeof(szVal));1461 int rc = audioTestGetValueStr(pSet, phObj, pszKey, szVal, sizeof(szVal)); 1450 1462 if (RT_SUCCESS(rc)) 1451 1463 *puVal = RTStrToUInt32(szVal); … … 1460 1472 * @returns Error if the verification failed and test verification job has fKeepGoing not set. 1461 1473 * @param pVerify Verification job to verify value for. 1462 * @param p szSec Section of key / value to verify.1474 * @param phObj Object handle to verify value for. 1463 1475 * @param pszKey Key to verify. 1464 1476 * @param pszVal Value to verify. … … 1467 1479 */ 1468 1480 static int audioTestVerifyValue(PAUDIOTESTVERIFYJOB pVerify, 1469 const char *pszSec, const char *pszKey, const char *pszVal, const char *pszErrFmt, ...)1481 PAUDIOTESTOBJHANDLE phObj, const char *pszKey, const char *pszVal, const char *pszErrFmt, ...) 1470 1482 { 1471 1483 va_list va; … … 1473 1485 1474 1486 char szValA[_1K]; 1475 int rc = audioTestGetValueStr(pVerify->pSetA, p szSec, pszKey, szValA, sizeof(szValA));1487 int rc = audioTestGetValueStr(pVerify->pSetA, phObj, pszKey, szValA, sizeof(szValA)); 1476 1488 if (RT_SUCCESS(rc)) 1477 1489 { 1478 1490 char szValB[_1K]; 1479 rc = audioTestGetValueStr(pVerify->pSetB, p szSec, pszKey, szValB, sizeof(szValB));1491 rc = audioTestGetValueStr(pVerify->pSetB, phObj, pszKey, szValB, sizeof(szValB)); 1480 1492 if (RT_SUCCESS(rc)) 1481 1493 { … … 1503 1515 1504 1516 /** 1517 * Opens an existing audio test object. 1518 * 1519 * @returns VBox status code. 1520 * @param pSet Audio test set the object contains. 1521 * @param pszUUID UUID of object to open. 1522 * @param ppObj Where to return the pointer of the allocated and registered audio test object. 1523 */ 1524 static int audioTestSetObjOpen(PAUDIOTESTSET pSet, const char *pszUUID, PAUDIOTESTOBJ *ppObj) 1525 { 1526 AUDIOTESTOBJHANDLE hSec; 1527 if (RTStrPrintf2(hSec.szSec, sizeof(hSec.szSec), "obj_%s", pszUUID) <= 0) 1528 AssertFailedReturn(VERR_BUFFER_OVERFLOW); 1529 1530 PAUDIOTESTOBJ pObj = (PAUDIOTESTOBJ)RTMemAlloc(sizeof(AUDIOTESTOBJ)); 1531 AssertPtrReturn(pObj, VERR_NO_MEMORY); 1532 1533 char szFileName[128]; 1534 int rc = audioTestGetValueStr(pSet, &hSec, "obj_name", szFileName, sizeof(szFileName)); 1535 if (RT_SUCCESS(rc)) 1536 { 1537 char szFilePath[RTPATH_MAX]; 1538 rc = RTPathJoin(szFilePath, sizeof(szFilePath), pSet->szPathAbs, szFileName); 1539 if (RT_SUCCESS(rc)) 1540 { 1541 rc = RTFileOpen(&pObj->File.hFile, szFilePath, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE); 1542 if (RT_SUCCESS(rc)) 1543 { 1544 int rc2 = RTStrCopy(pObj->szName, sizeof(pObj->szName), szFileName); 1545 AssertRC(rc2); 1546 1547 pObj->enmType = AUDIOTESTOBJTYPE_FILE; 1548 pObj->cRefs = 1; /* Currently only 1:1 mapping. */ 1549 1550 RTListAppend(&pSet->lstObj, &pObj->Node); 1551 pSet->cObj++; 1552 1553 *ppObj = pObj; 1554 return VINF_SUCCESS; 1555 } 1556 } 1557 } 1558 1559 RTMemFree(pObj); 1560 return rc; 1561 } 1562 1563 /** 1564 * Closes an audio test set object. 1565 * 1566 * @returns VBox status code. 1567 * @param pObj Object to close. 1568 */ 1569 static int audioTestSetObjCloseInternal(PAUDIOTESTOBJ pObj) 1570 { 1571 int rc; 1572 1573 /** @todo Generalize this function more once we have more object types. */ 1574 AssertReturn(pObj->enmType == AUDIOTESTOBJTYPE_FILE, VERR_INVALID_PARAMETER); 1575 1576 if (RTFileIsValid(pObj->File.hFile)) 1577 { 1578 rc = RTFileClose(pObj->File.hFile); 1579 if (RT_SUCCESS(rc)) 1580 pObj->File.hFile = NIL_RTFILE; 1581 } 1582 else 1583 rc = VINF_SUCCESS; 1584 1585 return rc; 1586 } 1587 1588 /** 1589 * Finalizes an audio test set object. 1590 * 1591 * @param pObj Object to finalize. 1592 */ 1593 static void audioTestSetObjFinalize(PAUDIOTESTOBJ pObj) 1594 { 1595 /** @todo Generalize this function more once we have more object types. */ 1596 AssertReturnVoid(pObj->enmType == AUDIOTESTOBJTYPE_FILE); 1597 1598 if (RTFileIsValid(pObj->File.hFile)) 1599 pObj->File.cbSize = RTFileTell(pObj->File.hFile); 1600 } 1601 1602 /** 1603 * Compares two (binary) files. 1604 * 1605 * @returns \c true if equal, or \c false if not. 1606 * @param hFileA File handle to file A to compare. 1607 * @param hFileB File handle to file B to compare file A with. 1608 * @param cbToCompare Number of bytes to compare starting the the both file's 1609 * current position. 1610 */ 1611 static bool audioTestFilesCompareBinary(RTFILE hFileA, RTFILE hFileB, uint64_t cbToCompare) 1612 { 1613 uint8_t auBufA[_32K]; 1614 uint8_t auBufB[_32K]; 1615 1616 int rc = VINF_SUCCESS; 1617 1618 while (cbToCompare) 1619 { 1620 size_t cbReadA; 1621 rc = RTFileRead(hFileA, auBufA, RT_MIN(cbToCompare, sizeof(auBufA)), &cbReadA); 1622 AssertRCBreak(rc); 1623 size_t cbReadB; 1624 rc = RTFileRead(hFileB, auBufB, RT_MIN(cbToCompare, sizeof(auBufB)), &cbReadB); 1625 AssertRCBreak(rc); 1626 AssertBreakStmt(cbReadA == cbReadB, rc = VERR_INVALID_PARAMETER); /** @todo Find a better rc. */ 1627 if (memcmp(auBufA, auBufB, RT_MIN(cbReadA, cbReadB)) != 0) 1628 return false; 1629 Assert(cbToCompare >= cbReadA); 1630 cbToCompare -= cbReadA; 1631 } 1632 1633 return RT_SUCCESS(rc) && (cbToCompare == 0); 1634 } 1635 1636 /** 1637 * Does the actual PCM data verification of a test tone. 1638 * 1639 * @returns VBox status code. 1640 * @param pVerify Verification job to verify PCM data for. 1641 * @param phTest Test handle of test to verify PCM data for. 1642 */ 1643 static int audioTestVerifyTestToneData(PAUDIOTESTVERIFYJOB pVerify, PAUDIOTESTOBJHANDLE phTest) 1644 { 1645 int rc; 1646 1647 /** @todo For now ASSUME that we only have one object per test. */ 1648 1649 char szObjA[128]; 1650 rc = audioTestGetValueStr(pVerify->pSetA, phTest, "obj0_uuid", szObjA, sizeof(szObjA)); 1651 AssertRCReturn(rc, rc); 1652 PAUDIOTESTOBJ pObjA; 1653 rc = audioTestSetObjOpen(pVerify->pSetA, szObjA, &pObjA); 1654 AssertRCReturn(rc, rc); 1655 1656 char szObjB[128]; 1657 rc = audioTestGetValueStr(pVerify->pSetB, phTest, "obj0_uuid", szObjB, sizeof(szObjB)); 1658 AssertRCReturn(rc, rc); 1659 PAUDIOTESTOBJ pObjB; 1660 rc = audioTestSetObjOpen(pVerify->pSetB, szObjB, &pObjB); 1661 AssertRCReturn(rc, rc); 1662 1663 AssertReturn(pObjA->enmType == AUDIOTESTOBJTYPE_FILE, VERR_NOT_SUPPORTED); 1664 AssertReturn(pObjB->enmType == AUDIOTESTOBJTYPE_FILE, VERR_NOT_SUPPORTED); 1665 1666 /* 1667 * Start with most obvious methods first. 1668 */ 1669 uint64_t cbSizeA, cbSizeB; 1670 rc = RTFileQuerySize(pObjA->File.hFile, &cbSizeA); 1671 AssertRCReturn(rc, rc); 1672 rc = RTFileQuerySize(pObjB->File.hFile, &cbSizeB); 1673 AssertRCReturn(rc, rc); 1674 if ( cbSizeA != cbSizeB 1675 || !audioTestFilesCompareBinary(pObjA->File.hFile, pObjB->File.hFile, cbSizeA)) 1676 { 1677 /** @todo Add more sophisticated stuff here. */ 1678 1679 int rc2 = audioTestErrorDescAdd(pVerify->pErr, pVerify->idxTest, "Files '%s' and '%s' don't match\n", szObjA, szObjB); 1680 AssertRC(rc2); 1681 } 1682 1683 rc = audioTestSetObjCloseInternal(pObjA); 1684 AssertRCReturn(rc, rc); 1685 rc = audioTestSetObjCloseInternal(pObjB); 1686 AssertRCReturn(rc, rc); 1687 1688 return rc; 1689 } 1690 1691 /** 1505 1692 * Verifies a test tone test. 1506 1693 * … … 1509 1696 * @retval VERR_ 1510 1697 * @param pVerify Verification job to verify test tone for. 1511 * @param p szSec Sectionof test tone to verify.1698 * @param phTest Test handle of test tone to verify. 1512 1699 * @param pSetPlay Test set which did the playing part. 1513 1700 * @param pSetRecord Test set which did the recording part. 1514 1701 */ 1515 static int audioTestVerifyTestTone(PAUDIOTESTVERIFYJOB pVerify, const char *pszSec, PAUDIOTESTSET pSetPlay, PAUDIOTESTSET pSetRecord)1702 static int audioTestVerifyTestTone(PAUDIOTESTVERIFYJOB pVerify, PAUDIOTESTOBJHANDLE phTest, PAUDIOTESTSET pSetPlay, PAUDIOTESTSET pSetRecord) 1516 1703 { 1517 1704 RT_NOREF(pSetPlay, pSetRecord); … … 1523 1710 * More important items have precedence. 1524 1711 */ 1525 rc = audioTestVerifyValue(pVerify, pszSec, "error_rc", "0", "Test was reported as failed"); 1526 AssertRCReturn(rc, rc); 1527 rc = audioTestVerifyValue(pVerify, pszSec, "obj_count", NULL, "Object counts don't match"); 1528 AssertRCReturn(rc, rc); 1529 rc = audioTestVerifyValue(pVerify, pszSec, "tone_freq_hz", NULL, "Tone frequency doesn't match"); 1530 AssertRCReturn(rc, rc); 1531 rc = audioTestVerifyValue(pVerify, pszSec, "tone_prequel_ms", NULL, "Tone prequel (ms) doesn't match"); 1532 AssertRCReturn(rc, rc); 1533 rc = audioTestVerifyValue(pVerify, pszSec, "tone_duration_ms", NULL, "Tone duration (ms) doesn't match"); 1534 AssertRCReturn(rc, rc); 1535 rc = audioTestVerifyValue(pVerify, pszSec, "tone_sequel_ms", NULL, "Tone sequel (ms) doesn't match"); 1536 AssertRCReturn(rc, rc); 1537 rc = audioTestVerifyValue(pVerify, pszSec, "tone_volume_percent", NULL, "Tone volume (percent) doesn't match"); 1538 AssertRCReturn(rc, rc); 1539 rc = audioTestVerifyValue(pVerify, pszSec, "tone_pcm_hz", NULL, "Tone PCM Hz doesn't match"); 1540 AssertRCReturn(rc, rc); 1541 rc = audioTestVerifyValue(pVerify, pszSec, "tone_pcm_channels", NULL, "Tone PCM channels don't match"); 1542 AssertRCReturn(rc, rc); 1543 rc = audioTestVerifyValue(pVerify, pszSec, "tone_pcm_bits", NULL, "Tone PCM bits don't match"); 1544 AssertRCReturn(rc, rc); 1545 rc = audioTestVerifyValue(pVerify, pszSec, "tone_pcm_is_signed", NULL, "Tone PCM signed bit doesn't match"); 1546 AssertRCReturn(rc, rc); 1712 rc = audioTestVerifyValue(pVerify, phTest, "error_rc", "0", "Test was reported as failed"); 1713 AssertRCReturn(rc, rc); 1714 rc = audioTestVerifyValue(pVerify, phTest, "obj_count", NULL, "Object counts don't match"); 1715 AssertRCReturn(rc, rc); 1716 rc = audioTestVerifyValue(pVerify, phTest, "tone_freq_hz", NULL, "Tone frequency doesn't match"); 1717 AssertRCReturn(rc, rc); 1718 rc = audioTestVerifyValue(pVerify, phTest, "tone_prequel_ms", NULL, "Tone prequel (ms) doesn't match"); 1719 AssertRCReturn(rc, rc); 1720 rc = audioTestVerifyValue(pVerify, phTest, "tone_duration_ms", NULL, "Tone duration (ms) doesn't match"); 1721 AssertRCReturn(rc, rc); 1722 rc = audioTestVerifyValue(pVerify, phTest, "tone_sequel_ms", NULL, "Tone sequel (ms) doesn't match"); 1723 AssertRCReturn(rc, rc); 1724 rc = audioTestVerifyValue(pVerify, phTest, "tone_volume_percent", NULL, "Tone volume (percent) doesn't match"); 1725 AssertRCReturn(rc, rc); 1726 rc = audioTestVerifyValue(pVerify, phTest, "tone_pcm_hz", NULL, "Tone PCM Hz doesn't match"); 1727 AssertRCReturn(rc, rc); 1728 rc = audioTestVerifyValue(pVerify, phTest, "tone_pcm_channels", NULL, "Tone PCM channels don't match"); 1729 AssertRCReturn(rc, rc); 1730 rc = audioTestVerifyValue(pVerify, phTest, "tone_pcm_bits", NULL, "Tone PCM bits don't match"); 1731 AssertRCReturn(rc, rc); 1732 rc = audioTestVerifyValue(pVerify, phTest, "tone_pcm_is_signed", NULL, "Tone PCM signed bit doesn't match"); 1733 AssertRCReturn(rc, rc); 1734 1735 /* 1736 * Now the fun stuff, PCM data analysis. 1737 */ 1738 rc = audioTestVerifyTestToneData(pVerify, phTest); 1739 if (RT_FAILURE(rc)) 1740 { 1741 int rc2 = audioTestErrorDescAdd(pVerify->pErr, pVerify->idxTest, "Verififcation of test tone data failed\n"); 1742 AssertRC(rc2); 1743 } 1547 1744 1548 1745 return VINF_SUCCESS; … … 1580 1777 * Compare obvious values first. 1581 1778 */ 1582 rc = audioTestVerifyValue(&VerJob, "header", "magic", "vkat_ini", "Manifest magic wrong"); 1583 AssertRCReturn(rc, rc); 1584 rc = audioTestVerifyValue(&VerJob, "header", "ver", "1" , "Manifest version wrong"); 1585 AssertRCReturn(rc, rc); 1586 rc = audioTestVerifyValue(&VerJob, "header", "tag", NULL, "Manifest tags don't match"); 1587 AssertRCReturn(rc, rc); 1588 rc = audioTestVerifyValue(&VerJob, "header", "test_count", NULL, "Test counts don't match"); 1589 AssertRCReturn(rc, rc); 1590 rc = audioTestVerifyValue(&VerJob, "header", "obj_count", NULL, "Object counts don't match"); 1779 AUDIOTESTOBJHANDLE hHdr; 1780 RTStrPrintf(hHdr.szSec, sizeof(hHdr.szSec), "header"); 1781 1782 rc = audioTestVerifyValue(&VerJob, &hHdr, "magic", "vkat_ini", "Manifest magic wrong"); 1783 AssertRCReturn(rc, rc); 1784 rc = audioTestVerifyValue(&VerJob, &hHdr, "ver", "1" , "Manifest version wrong"); 1785 AssertRCReturn(rc, rc); 1786 rc = audioTestVerifyValue(&VerJob, &hHdr, "tag", NULL, "Manifest tags don't match"); 1787 AssertRCReturn(rc, rc); 1788 rc = audioTestVerifyValue(&VerJob, &hHdr, "test_count", NULL, "Test counts don't match"); 1789 AssertRCReturn(rc, rc); 1790 rc = audioTestVerifyValue(&VerJob, &hHdr, "obj_count", NULL, "Object counts don't match"); 1591 1791 AssertRCReturn(rc, rc); 1592 1792 … … 1599 1799 */ 1600 1800 uint32_t cTests; 1601 rc = audioTestGetValueUInt32(VerJob.pSetA, "header", "test_count", &cTests);1801 rc = audioTestGetValueUInt32(VerJob.pSetA, &hHdr, "test_count", &cTests); 1602 1802 AssertRCReturn(rc, rc); 1603 1803 … … 1606 1806 VerJob.idxTest = i; 1607 1807 1608 char szSec[64];1609 RTStrPrintf( szSec, sizeof(szSec), "test_%04RU32", i);1808 AUDIOTESTOBJHANDLE hTest; 1809 RTStrPrintf(hTest.szSec, sizeof(hTest.szSec), "test_%04RU32", i); 1610 1810 1611 1811 AUDIOTESTTYPE enmTestTypeA; 1612 audioTestGetValueUInt32(VerJob.pSetA, szSec, "test_type", (uint32_t *)&enmTestTypeA); 1812 rc = audioTestGetValueUInt32(VerJob.pSetA, &hTest, "test_type", (uint32_t *)&enmTestTypeA); 1813 AssertRCReturn(rc, rc); 1613 1814 AUDIOTESTTYPE enmTestTypeB; 1614 audioTestGetValueUInt32(VerJob.pSetB, szSec, "test_type", (uint32_t *)&enmTestTypeB); 1815 rc = audioTestGetValueUInt32(VerJob.pSetB, &hTest, "test_type", (uint32_t *)&enmTestTypeB); 1816 AssertRCReturn(rc, rc); 1615 1817 1616 1818 switch (enmTestTypeA) … … 1620 1822 if (enmTestTypeB == AUDIOTESTTYPE_TESTTONE_RECORD) 1621 1823 { 1622 rc = audioTestVerifyTestTone(&VerJob, szSec, VerJob.pSetA, VerJob.pSetB);1824 rc = audioTestVerifyTestTone(&VerJob, &hTest, VerJob.pSetA, VerJob.pSetB); 1623 1825 } 1624 1826 else … … 1630 1832 case AUDIOTESTTYPE_TESTTONE_RECORD: 1631 1833 { 1632 if (enmTestTypeB != AUDIOTESTTYPE_TESTTONE_PLAY)1834 if (enmTestTypeB == AUDIOTESTTYPE_TESTTONE_PLAY) 1633 1835 { 1634 rc = audioTestVerifyTestTone(&VerJob, szSec, VerJob.pSetB, VerJob.pSetA);1836 rc = audioTestVerifyTestTone(&VerJob, &hTest, VerJob.pSetB, VerJob.pSetA); 1635 1837 } 1636 1838 else -
trunk/src/VBox/Devices/Audio/AudioTest.h
r89711 r89747 120 120 /** Record a test tone. */ 121 121 AUDIOTESTTYPE_TESTTONE_RECORD, 122 122 /** The usual 32-bit hack. */ 123 123 AUDIOTESTTYPE_32BIT_HACK = 0x7fffffff 124 124 } AUDIOTESTTYPE;
Note:
See TracChangeset
for help on using the changeset viewer.