VirtualBox

Changeset 96607 in vbox


Ignore:
Timestamp:
Sep 5, 2022 10:30:23 PM (2 years ago)
Author:
vboxsync
Message:

ValKit/Audio: Added a 'backends' command for listing available backends. Made --help after a command result in info about just that command rather than loads of irrelevant info about other commands. Likewise, just list the commands when none is given or we don't recognizes the one specified. bugref:10008

Location:
trunk/src/VBox/ValidationKit/utils/audio
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/utils/audio/vkat.cpp

    r96473 r96607  
    926926                break;
    927927
    928             AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion);
     928            AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion, &g_CmdTest);
    929929
    930930            default:
     
    12181218                break;
    12191219
    1220             AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion);
     1220            AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion, &g_CmdVerify);
    12211221
    12221222            default:
     
    13091309    &g_CmdTest,
    13101310    &g_CmdVerify,
     1311    &g_CmdBackends,
    13111312    &g_CmdEnum,
    13121313    &g_CmdPlay,
     
    13181319 * Shows tool usage text.
    13191320 */
    1320 RTEXITCODE audioTestUsage(PRTSTREAM pStrm)
    1321 {
    1322     RTStrmPrintf(pStrm, "usage: %s [global options] <command> [command-options]\n",
    1323                  RTPathFilename(RTProcExecutablePath()));
     1321RTEXITCODE audioTestUsage(PRTSTREAM pStrm, PCVKATCMD pOnlyCmd)
     1322{
     1323    RTStrmPrintf(pStrm, "usage: %s [global options] <command> [command-options]\n", RTProcShortName());
    13241324    RTStrmPrintf(pStrm,
    13251325                 "\n"
     
    13421342    {
    13431343        PCVKATCMD const pCmd = g_apCommands[iCmd];
    1344         RTStrmPrintf(pStrm,
    1345                      "\n"
    1346                      "Command '%s':\n"
    1347                      "    %s\n"
    1348                      "Options for '%s':\n",
    1349                      pCmd->pszCommand, pCmd->pszDesc, pCmd->pszCommand);
    1350         PCRTGETOPTDEF const paOptions = pCmd->paOptions;
    1351         for (unsigned i = 0; i < pCmd->cOptions; i++)
     1344        if (!pOnlyCmd || pCmd == pOnlyCmd)
    13521345        {
    1353             if (RT_C_IS_PRINT(paOptions[i].iShort))
    1354                 RTStrmPrintf(pStrm, "  -%c, %s\n", paOptions[i].iShort, paOptions[i].pszLong);
    1355             else
    1356                 RTStrmPrintf(pStrm, "  %s\n", paOptions[i].pszLong);
    1357 
    1358             const char *pszHelp = NULL;
    1359             if (pCmd->pfnOptionHelp)
    1360                 pszHelp = pCmd->pfnOptionHelp(&paOptions[i]);
    1361             if (pszHelp)
    1362                 RTStrmPrintf(pStrm, "    %s\n", pszHelp);
     1346            RTStrmPrintf(pStrm,
     1347                         "\n"
     1348                         "Command '%s':\n"
     1349                         "    %s\n"
     1350                         "Options for '%s':\n",
     1351                         pCmd->pszCommand, pCmd->pszDesc, pCmd->pszCommand);
     1352            PCRTGETOPTDEF const paOptions = pCmd->paOptions;
     1353            for (unsigned i = 0; i < pCmd->cOptions; i++)
     1354            {
     1355                if (RT_C_IS_PRINT(paOptions[i].iShort))
     1356                    RTStrmPrintf(pStrm, "  -%c, %s\n", paOptions[i].iShort, paOptions[i].pszLong);
     1357                else
     1358                    RTStrmPrintf(pStrm, "  %s\n", paOptions[i].pszLong);
     1359
     1360                const char *pszHelp = NULL;
     1361                if (pCmd->pfnOptionHelp)
     1362                    pszHelp = pCmd->pfnOptionHelp(&paOptions[i]);
     1363                if (pszHelp)
     1364                    RTStrmPrintf(pStrm, "    %s\n", pszHelp);
     1365            }
     1366
     1367            if (pCmd->fNeedsTransport)
     1368                for (uintptr_t iTx = 0; iTx < g_cTransports; iTx++)
     1369                    g_apTransports[iTx]->pfnUsage(pStrm);
    13631370        }
    1364 
    1365         if (pCmd->fNeedsTransport)
    1366         {
    1367             for (uintptr_t iTx = 0; iTx < g_cTransports; iTx++)
    1368                 g_apTransports[iTx]->pfnUsage(pStrm);
    1369         }
    1370     }
    1371 
     1371    }
     1372
     1373    return RTEXITCODE_SUCCESS;
     1374}
     1375
     1376/**
     1377 * Lists the commands and their descriptions.
     1378 */
     1379static RTEXITCODE audioTestListCommands(PRTSTREAM pStrm)
     1380{
     1381    RTStrmPrintf(pStrm, "Commands:\n");
     1382    for (uintptr_t iCmd = 0; iCmd < RT_ELEMENTS(g_apCommands); iCmd++)
     1383        RTStrmPrintf(pStrm, "%8s - %s\n", g_apCommands[iCmd]->pszCommand, g_apCommands[iCmd]->pszDesc);
    13721384    return RTEXITCODE_SUCCESS;
    13731385}
     
    14061418     * everything else.
    14071419     */
     1420    /** @todo r=bird: this isn't at all syntactically sane, because you don't know
     1421     * how to parse past the command (can almost be done safely thought, since
     1422     * you've got the option definitions for every command at hand).  So, if someone
     1423     * wants to play a file named "-v.wav", you'll incorrectly take that as two 'v'
     1424     * options. The parsing has to stop when you get to the command, i.e. first
     1425     * VINF_GETOPT_NOT_OPTION or anything that isn't a common option. Daemonizing
     1426     * when for instance encountering an invalid command, is not correct.
     1427     *
     1428     * Btw. you MUST however process the 'q' option in parallel to 'v' here, they
     1429     * are oposites.  For instance '-vqvvv' is supposed to give you level 3 logging,
     1430     * not quiet!  So, either you process both 'v' and 'q' here, or you pospone them
     1431     * (better option).
     1432     */
     1433    /** @todo r=bird: Is the daemonizing needed? The testcase doesn't seem to use
     1434     *        it... If you don't need it, drop it as it make the parsing complex
     1435     *        and illogical.  The --daemonized / --damonize options should be
     1436     *        required to before the command, then okay.  */
    14081437    bool fDaemonize  = false;
    14091438    bool fDaemonized = false;
     
    14391468    }
    14401469
     1470    /** @todo add something to suppress this stuff.   */
    14411471    audioTestShowLogo(g_pStdOut);
    14421472
     
    15441574        switch (ch)
    15451575        {
    1546             AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion);
     1576            AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion, NULL);
    15471577
    15481578            case VINF_GETOPT_NOT_OPTION:
     
    15531583                    if (strcmp(ValueUnion.psz, pCmd->pszCommand) == 0)
    15541584                    {
     1585                        /* Count the combined option definitions:  */
    15551586                        size_t cCombinedOptions  = pCmd->cOptions + RT_ELEMENTS(g_aCmdCommonOptions);
    15561587                        if (pCmd->fNeedsTransport)
    1557                         {
    15581588                            for (uintptr_t iTx = 0; iTx < g_cTransports; iTx++)
    15591589                                cCombinedOptions += g_apTransports[iTx]->cOpts;
    1560                         }
     1590
     1591                        /* Combine the option definitions: */
    15611592                        PRTGETOPTDEF paCombinedOptions = (PRTGETOPTDEF)RTMemAlloc(cCombinedOptions * sizeof(RTGETOPTDEF));
    15621593                        if (paCombinedOptions)
     
    15651596                            memcpy(paCombinedOptions, g_aCmdCommonOptions, sizeof(g_aCmdCommonOptions));
    15661597                            idxOpts += RT_ELEMENTS(g_aCmdCommonOptions);
     1598
    15671599                            memcpy(&paCombinedOptions[idxOpts], pCmd->paOptions, pCmd->cOptions * sizeof(RTGETOPTDEF));
    15681600                            idxOpts += (uint32_t)pCmd->cOptions;
     1601
    15691602                            if (pCmd->fNeedsTransport)
    1570                             {
    15711603                                for (uintptr_t iTx = 0; iTx < g_cTransports; iTx++)
    15721604                                {
     
    15751607                                    idxOpts += (uint32_t)g_apTransports[iTx]->cOpts;
    15761608                                }
    1577                             }
    1578 
     1609
     1610                            /* Re-initialize the option getter state and pass it to the command handler. */
    15791611                            rc = RTGetOptInit(&GetState, argc, argv, paCombinedOptions, cCombinedOptions,
    15801612                                              GetState.iNext /*idxFirst*/, RTGETOPTINIT_FLAGS_OPTS_FIRST);
     
    15851617                                return rcExit;
    15861618                            }
     1619                            RTMemFree(paCombinedOptions);
    15871620                            return RTMsgErrorExitFailure("RTGetOptInit failed for '%s': %Rrc", ValueUnion.psz, rc);
    15881621                        }
     
    15911624                }
    15921625                RTMsgError("Unknown command '%s'!\n", ValueUnion.psz);
    1593                 audioTestUsage(g_pStdErr);
     1626                audioTestListCommands(g_pStdErr);
    15941627                return RTEXITCODE_SYNTAX;
    15951628            }
     
    16011634
    16021635    RTMsgError("No command specified!\n");
    1603     audioTestUsage(g_pStdErr);
     1636    audioTestListCommands(g_pStdErr);
    16041637    return RTEXITCODE_SYNTAX;
    16051638}
  • trunk/src/VBox/ValidationKit/utils/audio/vkatCmdGeneric.cpp

    r96407 r96607  
    4848
    4949/*********************************************************************************************************************************
     50*   Command: backends                                                                                                                *
     51*********************************************************************************************************************************/
     52
     53/**
     54 * Options for 'backends'.
     55 */
     56static const RTGETOPTDEF g_aCmdBackendsOptions[] =
     57{
     58    { "--dummy", 'd',  RTGETOPT_REQ_NOTHING  }, /* just a placeholder */
     59};
     60
     61
     62/** The 'backends' command option help. */
     63static DECLCALLBACK(const char *) audioTestCmdBackendsHelp(PCRTGETOPTDEF pOpt)
     64{
     65    RT_NOREF(pOpt);
     66    return NULL;
     67}
     68
     69/**
     70 * The 'backends' command handler.
     71 *
     72 * @returns Program exit code.
     73 * @param   pGetState   RTGetOpt state.
     74 */
     75static DECLCALLBACK(RTEXITCODE) audioTestCmdBackendsHandler(PRTGETOPTSTATE pGetState)
     76{
     77    /*
     78     * Parse options.
     79     */
     80    int           ch;
     81    RTGETOPTUNION ValueUnion;
     82    while ((ch = RTGetOpt(pGetState, &ValueUnion)) != 0)
     83    {
     84        switch (ch)
     85        {
     86            AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion, &g_CmdBackends);
     87
     88            default:
     89                return RTGetOptPrintError(ch, &ValueUnion);
     90        }
     91    }
     92
     93    /*
     94     * List the backends.
     95     */
     96    RTPrintf("Backends (%u):\n", g_cBackends);
     97    for (size_t i = 0; i < g_cBackends; i++)
     98        RTPrintf(" %12s - %s\n", g_aBackends[i].pszName, g_aBackends[i].pDrvReg->pszDescription);
     99
     100    return RTEXITCODE_SUCCESS;
     101}
     102
     103
     104/**
     105 * Command table entry for 'backends'.
     106 */
     107const VKATCMD g_CmdBackends =
     108{
     109    /* .pszCommand = */         "backends",
     110    /* .pfnHandler = */         audioTestCmdBackendsHandler,
     111    /* .pszDesc = */            "Lists the compiled in audio backends.",
     112    /* .paOptions = */          g_aCmdBackendsOptions,
     113    /* .cOptions = */           0 /*RT_ELEMENTS(g_aCmdBackendsOptions)*/,
     114    /* .pfnOptionHelp = */      audioTestCmdBackendsHelp,
     115    /* .fNeedsTransport = */    false
     116};
     117
     118
     119/*********************************************************************************************************************************
    50120*   Command: enum                                                                                                                *
    51121*********************************************************************************************************************************/
     
    114184                break;
    115185
    116             AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion);
     186            AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion, &g_CmdEnum);
    117187
    118188            default:
     
    673743            }
    674744
    675             AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion);
     745            AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion, &g_CmdPlay);
    676746
    677747            default:
     
    10741144            }
    10751145
    1076             AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion);
     1146            AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion, &g_CmdRec);
    10771147
    10781148            default:
  • trunk/src/VBox/ValidationKit/utils/audio/vkatCmdSelfTest.cpp

    r96407 r96607  
    415415                break;
    416416
    417             AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion);
     417            AUDIO_TEST_COMMON_OPTION_CASES(ValueUnion, &g_CmdSelfTest);
    418418
    419419            default:
  • trunk/src/VBox/ValidationKit/utils/audio/vkatInternal.h

    r96407 r96607  
    378378extern const char      *g_pszDrvAudioDebug;
    379379
     380extern const VKATCMD    g_CmdTest;
     381extern const VKATCMD    g_CmdVerify;
     382extern const VKATCMD    g_CmdBackends;
    380383extern const VKATCMD    g_CmdEnum;
    381384extern const VKATCMD    g_CmdPlay;
     
    383386extern const VKATCMD    g_CmdSelfTest;
    384387
     388
    385389extern AUDIOTESTDESC    g_aTests[];
    386390extern unsigned         g_cTests;
     
    396400/** @name Command line handlers
    397401 * @{ */
    398 RTEXITCODE audioTestUsage(PRTSTREAM pStrm);
     402RTEXITCODE audioTestUsage(PRTSTREAM pStrm, PCVKATCMD pOnlyCmd);
    399403RTEXITCODE audioTestVersion(void);
    400404void       audioTestShowLogo(PRTSTREAM pStream);
     
    494498void        audioTestIoOptsInitDefaults(PAUDIOTESTIOOPTS pIoOpts);
    495499
     500
    496501/*********************************************************************************************************************************
    497502*   Common command line stuff                                                                                                    *
     
    510515
    511516/** For use in the option switch to handle common options. */
    512 #define AUDIO_TEST_COMMON_OPTION_CASES(a_ValueUnion) \
     517#define AUDIO_TEST_COMMON_OPTION_CASES(a_ValueUnion, a_pCmd) \
    513518            case 'q': \
    514519                g_uVerbosity = 0; \
     
    518523            \
    519524            case 'v': \
    520                 /* No-op here, has been handled by main() already. */ \
     525                /* No-op here, has been handled by main() already. */ /** @todo r-bird: -q works, so -v must too! */ \
    521526                break; \
    522527            \
     
    525530            \
    526531            case 'h': \
    527                 return audioTestUsage(g_pStdOut); \
     532                return audioTestUsage(g_pStdOut, a_pCmd); \
    528533            \
    529534            case AUDIO_TEST_OPT_CMN_DEBUG_AUDIO_ENABLE: \
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette