VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/utils/audio/vkatInternal.h@ 96407

最後變更 在這個檔案從96407是 96407,由 vboxsync 提交於 3 年 前

scm copyright and license note update

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 20.9 KB
 
1/* $Id: vkatInternal.h 96407 2022-08-22 17:43:14Z vboxsync $ */
2/** @file
3 * VKAT - Internal header file for common definitions + structs.
4 */
5
6/*
7 * Copyright (C) 2021-2022 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.alldomusa.eu.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * The contents of this file may alternatively be used under the terms
26 * of the Common Development and Distribution License Version 1.0
27 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
28 * in the VirtualBox distribution, in which case the provisions of the
29 * CDDL are applicable instead of those of the GPL.
30 *
31 * You may elect to license modified versions of this file under the
32 * terms and conditions of either the GPL or the CDDL or both.
33 *
34 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
35 */
36
37#ifndef VBOX_INCLUDED_SRC_audio_vkatInternal_h
38#define VBOX_INCLUDED_SRC_audio_vkatInternal_h
39#ifndef RT_WITHOUT_PRAGMA_ONCE
40# pragma once
41#endif
42
43
44/*********************************************************************************************************************************
45* Header Files *
46*********************************************************************************************************************************/
47#include <iprt/getopt.h>
48
49#include <VBox/vmm/pdmdrv.h>
50#include <VBox/vmm/pdmaudioinline.h>
51#include <VBox/vmm/pdmaudiohostenuminline.h>
52
53#include "Audio/AudioMixBuffer.h"
54#include "Audio/AudioTest.h"
55#include "Audio/AudioTestService.h"
56#include "Audio/AudioTestServiceClient.h"
57
58#include "VBoxDD.h"
59
60
61/*********************************************************************************************************************************
62* Structures and Typedefs *
63*********************************************************************************************************************************/
64/**
65 * Audio driver stack.
66 *
67 * This can be just be backend driver alone or DrvAudio with a backend.
68 * @todo add automatic resampling via mixer so we can test more of the audio
69 * stack used by the device emulations.
70 */
71typedef struct AUDIOTESTDRVSTACK
72{
73 /** The device registration record for the backend. */
74 PCPDMDRVREG pDrvReg;
75 /** The backend driver instance. */
76 PPDMDRVINS pDrvBackendIns;
77 /** The backend's audio interface. */
78 PPDMIHOSTAUDIO pIHostAudio;
79
80 /** The DrvAudio instance. */
81 PPDMDRVINS pDrvAudioIns;
82 /** This is NULL if we don't use DrvAudio. */
83 PPDMIAUDIOCONNECTOR pIAudioConnector;
84
85 /** The current (last) audio device enumeration to use. */
86 PDMAUDIOHOSTENUM DevEnum;
87} AUDIOTESTDRVSTACK;
88/** Pointer to an audio driver stack. */
89typedef AUDIOTESTDRVSTACK *PAUDIOTESTDRVSTACK;
90
91/**
92 * Backend-only stream structure.
93 */
94typedef struct AUDIOTESTDRVSTACKSTREAM
95{
96 /** The public stream data. */
97 PDMAUDIOSTREAM Core;
98 /** The backend data (variable size). */
99 PDMAUDIOBACKENDSTREAM Backend;
100} AUDIOTESTDRVSTACKSTREAM;
101/** Pointer to a backend-only stream structure. */
102typedef AUDIOTESTDRVSTACKSTREAM *PAUDIOTESTDRVSTACKSTREAM;
103
104/**
105 * Mixer setup for a stream.
106 */
107typedef struct AUDIOTESTDRVMIXSTREAM
108{
109 /** Pointer to the driver stack. */
110 PAUDIOTESTDRVSTACK pDrvStack;
111 /** Pointer to the stream. */
112 PPDMAUDIOSTREAM pStream;
113 /** Properties to use. */
114 PCPDMAUDIOPCMPROPS pProps;
115 /** Set if we're mixing or just passing thru to the driver stack. */
116 bool fDoMixing;
117 /** Mixer buffer. */
118 AUDIOMIXBUF MixBuf;
119 /** Write state. */
120 AUDIOMIXBUFWRITESTATE WriteState;
121 /** Peek state. */
122 AUDIOMIXBUFPEEKSTATE PeekState;
123} AUDIOTESTDRVMIXSTREAM;
124/** Pointer to mixer setup for a stream. */
125typedef AUDIOTESTDRVMIXSTREAM *PAUDIOTESTDRVMIXSTREAM;
126
127/**
128 * Enumeration specifying the current audio test mode.
129 */
130typedef enum AUDIOTESTMODE
131{
132 /** Unknown mode. */
133 AUDIOTESTMODE_UNKNOWN = 0,
134 /** VKAT is running on the guest side. */
135 AUDIOTESTMODE_GUEST,
136 /** VKAT is running on the host side. */
137 AUDIOTESTMODE_HOST
138} AUDIOTESTMODE;
139
140struct AUDIOTESTENV;
141/** Pointer a audio test environment. */
142typedef AUDIOTESTENV *PAUDIOTESTENV;
143
144struct AUDIOTESTDESC;
145/** Pointer a audio test descriptor. */
146typedef AUDIOTESTDESC *PAUDIOTESTDESC;
147
148/**
149 * Callback to set up the test parameters for a specific test.
150 *
151 * @returns IPRT status code.
152 * @retval VINF_SUCCESS if setting the parameters up succeeded. Any other error code
153 * otherwise indicating the kind of error.
154 * @param pszTest Test name.
155 * @param pTstParmsAcq The audio test parameters to set up.
156 */
157typedef DECLCALLBACKTYPE(int, FNAUDIOTESTSETUP,(PAUDIOTESTENV pTstEnv, PAUDIOTESTDESC pTstDesc, PAUDIOTESTPARMS pTstParmsAcq, void **ppvCtx));
158/** Pointer to an audio test setup callback. */
159typedef FNAUDIOTESTSETUP *PFNAUDIOTESTSETUP;
160
161typedef DECLCALLBACKTYPE(int, FNAUDIOTESTEXEC,(PAUDIOTESTENV pTstEnv, void *pvCtx, PAUDIOTESTPARMS pTstParms));
162/** Pointer to an audio test exec callback. */
163typedef FNAUDIOTESTEXEC *PFNAUDIOTESTEXEC;
164
165typedef DECLCALLBACKTYPE(int, FNAUDIOTESTDESTROY,(PAUDIOTESTENV pTstEnv, void *pvCtx));
166/** Pointer to an audio test destroy callback. */
167typedef FNAUDIOTESTDESTROY *PFNAUDIOTESTDESTROY;
168
169/**
170 * Structure for keeping an audio test audio stream.
171 */
172typedef struct AUDIOTESTSTREAM
173{
174 /** The PDM stream. */
175 PPDMAUDIOSTREAM pStream;
176 /** The backend stream. */
177 PPDMAUDIOBACKENDSTREAM pBackend;
178 /** The stream config. */
179 PDMAUDIOSTREAMCFG Cfg;
180 /** Associated mixing stream. Optional. */
181 AUDIOTESTDRVMIXSTREAM Mix;
182} AUDIOTESTSTREAM;
183/** Pointer to audio test stream. */
184typedef AUDIOTESTSTREAM *PAUDIOTESTSTREAM;
185
186/** Maximum audio streams a test environment can handle. */
187#define AUDIOTESTENV_MAX_STREAMS 8
188
189/**
190 * Structure for keeping TCP/IP-specific options.
191 */
192typedef struct AUDIOTESTENVTCPOPTS
193{
194 /** Connection mode(s) to use. */
195 ATSCONNMODE enmConnMode;
196 /** Bind address (server mode). When empty, "0.0.0.0" (any host) will be used. */
197 char szBindAddr[128];
198 /** Bind port (server mode). */
199 uint16_t uBindPort;
200 /** Connection address (client mode). */
201 char szConnectAddr[128];
202 /** Connection port (client mode). */
203 uint16_t uConnectPort;
204} AUDIOTESTENVTCPOPTS;
205/** Pointer to audio test TCP options. */
206typedef AUDIOTESTENVTCPOPTS *PAUDIOTESTENVTCPOPTS;
207
208/**
209 * Structure holding additional I/O options.
210 */
211typedef struct AUDIOTESTIOOPTS
212{
213 /** Whether to use the audio connector or not. */
214 bool fWithDrvAudio;
215 /** Whether to use a mixing buffer or not. */
216 bool fWithMixer;
217 /** Buffer size (in ms). */
218 uint32_t cMsBufferSize;
219 /** Pre-buffering size (in ms). */
220 uint32_t cMsPreBuffer;
221 /** Scheduling (in ms). */
222 uint32_t cMsSchedulingHint;
223 /** Audio vlume to use (in percent). */
224 uint8_t uVolumePercent;
225 /** PCM audio properties to use. */
226 PDMAUDIOPCMPROPS Props;
227} AUDIOTESTIOOPTS;
228/** Pointer to additional playback options. */
229typedef AUDIOTESTIOOPTS *PAUDIOTESTIOOPTS;
230
231/**
232 * Structure for keeping a user context for the test service callbacks.
233 */
234typedef struct ATSCALLBACKCTX
235{
236 /** The test environment bound to this context. */
237 PAUDIOTESTENV pTstEnv;
238 /** Absolute path to the packed up test set archive.
239 * Keep it simple for now and only support one (open) archive at a time. */
240 char szTestSetArchive[RTPATH_MAX];
241 /** File handle to the (opened) test set archive for reading. */
242 RTFILE hTestSetArchive;
243 /** Number of currently connected clients. */
244 uint8_t cClients;
245} ATSCALLBACKCTX;
246typedef ATSCALLBACKCTX *PATSCALLBACKCTX;
247
248/**
249 * Audio test environment parameters.
250 *
251 * This is global to all tests defined.
252 */
253typedef struct AUDIOTESTENV
254{
255 /** Audio testing mode. */
256 AUDIOTESTMODE enmMode;
257 /** Whether self test mode is active or not. */
258 bool fSelftest;
259 /** Whether skip the actual verification or not. */
260 bool fSkipVerify;
261 /** Name of the audio device to use.
262 * If empty the default audio device will be used. */
263 char szDev[128];
264 /** Zero-based index of current test (will be increased for every run test). */
265 uint32_t idxTest;
266 /** Number of iterations for *all* tests specified.
267 * When set to 0 (default), a random value (see specific test) will be chosen. */
268 uint32_t cIterations;
269 /** I/O options to use. */
270 AUDIOTESTIOOPTS IoOpts;
271 /** Test tone parameters to use. */
272 AUDIOTESTTONEPARMS ToneParms;
273 /** Output path for storing the test environment's final test files. */
274 char szTag[AUDIOTEST_TAG_MAX];
275 /** Output path for storing the test environment's final test files. */
276 char szPathOut[RTPATH_MAX];
277 /** Temporary path for this test environment. */
278 char szPathTemp[RTPATH_MAX];
279 /** Pointer to audio test driver stack to use. */
280 PAUDIOTESTDRVSTACK pDrvStack;
281 /** Audio stream. */
282 AUDIOTESTSTREAM aStreams[AUDIOTESTENV_MAX_STREAMS];
283 /** The audio test set to use. */
284 AUDIOTESTSET Set;
285 /** TCP options to use for ATS. */
286 AUDIOTESTENVTCPOPTS TcpOpts;
287 /** ATS server instance to use.
288 * NULL if not in use. */
289 PATSSERVER pSrv;
290 /** ATS callback context to use. */
291 ATSCALLBACKCTX CallbackCtx;
292 union
293 {
294 struct
295 {
296 /** Client connected to the ATS on the guest side. */
297 ATSCLIENT AtsClGuest;
298 /** Path to the guest's test set downloaded to the host. */
299 char szPathTestSetGuest[RTPATH_MAX];
300 /** Client connected to the Validation Kit audio driver ATS. */
301 ATSCLIENT AtsClValKit;
302 /** Path to the Validation Kit audio driver's test set downloaded to the host. */
303 char szPathTestSetValKit[RTPATH_MAX];
304 } Host;
305 } u;
306} AUDIOTESTENV;
307
308/**
309 * Audio test descriptor.
310 */
311typedef struct AUDIOTESTDESC
312{
313 /** (Sort of) Descriptive test name. */
314 const char *pszName;
315 /** Flag whether the test is excluded. */
316 bool fExcluded;
317 /** The setup callback. */
318 PFNAUDIOTESTSETUP pfnSetup;
319 /** The exec callback. */
320 PFNAUDIOTESTEXEC pfnExec;
321 /** The destruction callback. */
322 PFNAUDIOTESTDESTROY pfnDestroy;
323} AUDIOTESTDESC;
324
325/**
326 * Backend description.
327 */
328typedef struct AUDIOTESTBACKENDDESC
329{
330 /** The driver registration structure. */
331 PCPDMDRVREG pDrvReg;
332 /** The backend name.
333 * Aliases are implemented by having multiple entries for the same backend. */
334 const char *pszName;
335} AUDIOTESTBACKENDDESC;
336
337/**
338 * VKAT command table entry.
339 */
340typedef struct VKATCMD
341{
342 /** The command name. */
343 const char *pszCommand;
344 /** The command handler. */
345 DECLCALLBACKMEMBER(RTEXITCODE, pfnHandler,(PRTGETOPTSTATE pGetState));
346
347 /** Command description. */
348 const char *pszDesc;
349 /** Options array. */
350 PCRTGETOPTDEF paOptions;
351 /** Number of options in the option array. */
352 size_t cOptions;
353 /** Gets help for an option. */
354 DECLCALLBACKMEMBER(const char *, pfnOptionHelp,(PCRTGETOPTDEF pOpt));
355 /** Flag indicating if the command needs the ATS transport layer.
356 * Needed for command line parsing. */
357 bool fNeedsTransport;
358} VKATCMD;
359/** Pointer to a const VKAT command entry. */
360typedef VKATCMD const *PCVKATCMD;
361
362
363/*********************************************************************************************************************************
364* Global Variables *
365*********************************************************************************************************************************/
366/** Terminate ASAP if set. Set on Ctrl-C. */
367extern bool volatile g_fTerminate;
368/** The release logger. */
369extern PRTLOGGER g_pRelLogger;
370
371/** The test handle. */
372extern RTTEST g_hTest;
373/** The current verbosity level. */
374extern unsigned g_uVerbosity;
375/** DrvAudio: Enable debug (or not). */
376extern bool g_fDrvAudioDebug;
377/** DrvAudio: The debug output path. */
378extern const char *g_pszDrvAudioDebug;
379
380extern const VKATCMD g_CmdEnum;
381extern const VKATCMD g_CmdPlay;
382extern const VKATCMD g_CmdRec;
383extern const VKATCMD g_CmdSelfTest;
384
385extern AUDIOTESTDESC g_aTests[];
386extern unsigned g_cTests;
387
388extern AUDIOTESTBACKENDDESC const g_aBackends[];
389extern unsigned g_cBackends;
390
391
392/*********************************************************************************************************************************
393* Prototypes *
394*********************************************************************************************************************************/
395
396/** @name Command line handlers
397 * @{ */
398RTEXITCODE audioTestUsage(PRTSTREAM pStrm);
399RTEXITCODE audioTestVersion(void);
400void audioTestShowLogo(PRTSTREAM pStream);
401/** @} */
402
403/** @name Driver stack
404 * @{ */
405int AudioTestDriverStackPerformSelftest(void);
406
407void audioTestDriverStackDelete(PAUDIOTESTDRVSTACK pDrvStack);
408int audioTestDriverStackInitEx(PAUDIOTESTDRVSTACK pDrvStack, PCPDMDRVREG pDrvReg, bool fEnabledIn, bool fEnabledOut, bool fWithDrvAudio);
409int audioTestDriverStackInit(PAUDIOTESTDRVSTACK pDrvStack, PCPDMDRVREG pDrvReg, bool fWithDrvAudio);
410int audioTestDriverStackProbe(PAUDIOTESTDRVSTACK pDrvStack, PCPDMDRVREG pDrvReg, bool fEnabledIn, bool fEnabledOut, bool fWithDrvAudio);
411int audioTestDriverStackSetDevice(PAUDIOTESTDRVSTACK pDrvStack, PDMAUDIODIR enmDir, const char *pszDevId);
412/** @} */
413
414/** @name Driver
415 * @{ */
416int audioTestDrvConstruct(PAUDIOTESTDRVSTACK pDrvStack, PCPDMDRVREG pDrvReg, PPDMDRVINS pParentDrvIns, PPPDMDRVINS ppDrvIns);
417/** @} */
418
419/** @name Driver stack stream
420 * @{ */
421int audioTestDriverStackStreamCreateInput(PAUDIOTESTDRVSTACK pDrvStack, PCPDMAUDIOPCMPROPS pProps,
422 uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint,
423 PPDMAUDIOSTREAM *ppStream, PPDMAUDIOSTREAMCFG pCfgAcq);
424int audioTestDriverStackStreamCreateOutput(PAUDIOTESTDRVSTACK pDrvStack, PCPDMAUDIOPCMPROPS pProps,
425 uint32_t cMsBufferSize, uint32_t cMsPreBuffer, uint32_t cMsSchedulingHint,
426 PPDMAUDIOSTREAM *ppStream, PPDMAUDIOSTREAMCFG pCfgAcq);
427void audioTestDriverStackStreamDestroy(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream);
428int audioTestDriverStackStreamDrain(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream, bool fSync);
429int audioTestDriverStackStreamEnable(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream);
430int AudioTestDriverStackStreamDisable(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream);
431bool audioTestDriverStackStreamIsOkay(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream);
432uint32_t audioTestDriverStackStreamGetWritable(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream);
433int audioTestDriverStackStreamPlay(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream, void const *pvBuf,
434 uint32_t cbBuf, uint32_t *pcbPlayed);
435uint32_t audioTestDriverStackStreamGetReadable(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream);
436int audioTestDriverStackStreamCapture(PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream,
437 void *pvBuf, uint32_t cbBuf, uint32_t *pcbCaptured);
438/** @} */
439
440/** @name Backend handling
441 * @{ */
442PCPDMDRVREG AudioTestGetDefaultBackend(void);
443PCPDMDRVREG AudioTestFindBackendOpt(const char *pszBackend);
444/** @} */
445
446/** @name Mixing stream
447 * @{ */
448int AudioTestMixStreamInit(PAUDIOTESTDRVMIXSTREAM pMix, PAUDIOTESTDRVSTACK pDrvStack, PPDMAUDIOSTREAM pStream,
449 PCPDMAUDIOPCMPROPS pProps, uint32_t cMsBuffer);
450void AudioTestMixStreamTerm(PAUDIOTESTDRVMIXSTREAM pMix);
451int AudioTestMixStreamEnable(PAUDIOTESTDRVMIXSTREAM pMix);
452int AudioTestMixStreamDrain(PAUDIOTESTDRVMIXSTREAM pMix, bool fSync);
453int AudioTestMixStreamDisable(PAUDIOTESTDRVMIXSTREAM pMix);
454bool AudioTestMixStreamIsOkay(PAUDIOTESTDRVMIXSTREAM pMix);
455uint32_t AudioTestMixStreamGetWritable(PAUDIOTESTDRVMIXSTREAM pMix);
456int AudioTestMixStreamPlay(PAUDIOTESTDRVMIXSTREAM pMix, void const *pvBuf, uint32_t cbBuf, uint32_t *pcbPlayed);
457uint32_t AudioTestMixStreamGetReadable(PAUDIOTESTDRVMIXSTREAM pMix);
458int AudioTestMixStreamCapture(PAUDIOTESTDRVMIXSTREAM pMix, void *pvBuf, uint32_t cbBuf, uint32_t *pcbCaptured);
459void AudioTestMixStreamSetVolume(PAUDIOTESTDRVMIXSTREAM pMix, uint8_t uVolumePercent);
460/** @} */
461
462/** @name Device handling
463 * @{ */
464int audioTestDeviceOpen(PPDMAUDIOHOSTDEV pDev);
465int audioTestDeviceClose(PPDMAUDIOHOSTDEV pDev);
466
467int audioTestDevicesEnumerateAndCheck(PAUDIOTESTDRVSTACK pDrvStack, const char *pszDev, PPDMAUDIOHOSTDEV *ppDev);
468/** @} */
469
470/** @name ATS routines
471 * @{ */
472int audioTestEnvConnectToValKitAts(PAUDIOTESTENV pTstEnv,
473 const char *pszHostTcpAddr, uint32_t uHostTcpPort);
474/** @} */
475
476/** @name Test environment handling
477 * @{ */
478void audioTestEnvInit(PAUDIOTESTENV pTstEnv);
479int audioTestEnvCreate(PAUDIOTESTENV pTstEnv, PAUDIOTESTDRVSTACK pDrvStack);
480void audioTestEnvDestroy(PAUDIOTESTENV pTstEnv);
481int audioTestEnvPrologue(PAUDIOTESTENV pTstEnv, bool fPack, char *pszPackFile, size_t cbPackFile);
482
483void audioTestParmsInit(PAUDIOTESTPARMS pTstParms);
484void audioTestParmsDestroy(PAUDIOTESTPARMS pTstParms);
485/** @} */
486
487int audioTestWorker(PAUDIOTESTENV pTstEnv);
488
489/** @todo Test tone handling */
490int audioTestPlayTone(PAUDIOTESTIOOPTS pIoOpts, PAUDIOTESTENV pTstEnv, PAUDIOTESTSTREAM pStream, PAUDIOTESTTONEPARMS pParms);
491void audioTestToneParmsInit(PAUDIOTESTTONEPARMS pToneParms);
492/** @} */
493
494void audioTestIoOptsInitDefaults(PAUDIOTESTIOOPTS pIoOpts);
495
496/*********************************************************************************************************************************
497* Common command line stuff *
498*********************************************************************************************************************************/
499
500/**
501 * Common long options values.
502 */
503enum
504{
505 AUDIO_TEST_OPT_CMN_DAEMONIZE = 256,
506 AUDIO_TEST_OPT_CMN_DAEMONIZED,
507 AUDIO_TEST_OPT_CMN_DEBUG_AUDIO_ENABLE,
508 AUDIO_TEST_OPT_CMN_DEBUG_AUDIO_PATH
509};
510
511/** For use in the option switch to handle common options. */
512#define AUDIO_TEST_COMMON_OPTION_CASES(a_ValueUnion) \
513 case 'q': \
514 g_uVerbosity = 0; \
515 if (g_pRelLogger) \
516 RTLogGroupSettings(g_pRelLogger, "all=0 all.e"); \
517 break; \
518 \
519 case 'v': \
520 /* No-op here, has been handled by main() already. */ \
521 break; \
522 \
523 case 'V': \
524 return audioTestVersion(); \
525 \
526 case 'h': \
527 return audioTestUsage(g_pStdOut); \
528 \
529 case AUDIO_TEST_OPT_CMN_DEBUG_AUDIO_ENABLE: \
530 g_fDrvAudioDebug = true; \
531 break; \
532 \
533 case AUDIO_TEST_OPT_CMN_DEBUG_AUDIO_PATH: \
534 g_pszDrvAudioDebug = (a_ValueUnion).psz; \
535 break; \
536 case AUDIO_TEST_OPT_CMN_DAEMONIZE: \
537 break; \
538 case AUDIO_TEST_OPT_CMN_DAEMONIZED: \
539 break;
540
541#endif /* !VBOX_INCLUDED_SRC_audio_vkatInternal_h */
542
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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