VirtualBox

source: vbox/trunk/src/VBox/Devices/Audio/DrvAudio.h@ 73529

Last change on this file since 73529 was 73467, checked in by vboxsync, 6 years ago

DrvAudio: Cleaned up the internal stream organization by not duplicating stuff like the status and the like by having two PDMAUDIOSTREAMs (on for the guest side and one for the host side). Instead, only use PDMAUDIOSTREAM and keep the guest and host specifics in PDMAUDIOSTREAMCTX. Should help simplifying things a lot.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.8 KB
Line 
1/* $Id: DrvAudio.h 73467 2018-08-03 09:49:55Z vboxsync $ */
2/** @file
3 * Intermediate audio driver header.
4 */
5
6/*
7 * Copyright (C) 2006-2018 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef DRV_AUDIO_H
19#define DRV_AUDIO_H
20
21#include <limits.h>
22
23#include <iprt/circbuf.h>
24#include <iprt/critsect.h>
25#include <iprt/file.h>
26#include <iprt/path.h>
27
28#include <VBox/vmm/pdmdev.h>
29#include <VBox/vmm/pdm.h>
30#include <VBox/vmm/pdmaudioifs.h>
31
32typedef enum
33{
34 AUD_OPT_INT,
35 AUD_OPT_FMT,
36 AUD_OPT_STR,
37 AUD_OPT_BOOL
38} audio_option_tag_e;
39
40typedef struct audio_option
41{
42 const char *name;
43 audio_option_tag_e tag;
44 void *valp;
45 const char *descr;
46 int *overridenp;
47 int overriden;
48} audio_option;
49
50#ifdef VBOX_WITH_STATISTICS
51/**
52 * Structure for keeping stream statistics for the
53 * statistic manager (STAM).
54 */
55typedef struct DRVAUDIOSTATS
56{
57 STAMCOUNTER TotalStreamsActive;
58 STAMCOUNTER TotalStreamsCreated;
59 STAMCOUNTER TotalFramesRead;
60 STAMCOUNTER TotalFramesWritten;
61 STAMCOUNTER TotalFramesMixedIn;
62 STAMCOUNTER TotalFramesMixedOut;
63 STAMCOUNTER TotalFramesLostIn;
64 STAMCOUNTER TotalFramesLostOut;
65 STAMCOUNTER TotalFramesOut;
66 STAMCOUNTER TotalFramesIn;
67 STAMCOUNTER TotalBytesRead;
68 STAMCOUNTER TotalBytesWritten;
69 /** How much delay (in ms) for input processing. */
70 STAMPROFILEADV DelayIn;
71 /** How much delay (in ms) for output processing. */
72 STAMPROFILEADV DelayOut;
73} DRVAUDIOSTATS, *PDRVAUDIOSTATS;
74#endif
75
76/**
77 * Audio driver configuration data, tweakable via CFGM.
78 */
79typedef struct DRVAUDIOCFG
80{
81 /** Configures the period size (in ms).
82 * This value reflects the time in between each hardware interrupt on the
83 * backend (host) side. */
84 uint32_t uPeriodMs;
85 /** Configures the (ring) buffer size (in ms). Often is a multiple of uPeriodMs. */
86 uint32_t uBufferSizeMs;
87 /** Configures the pre-buffering size (in ms).
88 * Time needed in buffer before the stream becomes active (pre buffering).
89 * The bigger this value is, the more latency for the stream will occur.
90 * Set to 0 to disable pre-buffering completely.
91 * By default set to UINT32_MAX if not set to a custom value. */
92 uint32_t uPreBufMs;
93 /** The driver's debugging configuration. */
94 struct
95 {
96 /** Whether audio debugging is enabled or not. */
97 bool fEnabled;
98 /** Where to store the debugging files.
99 * Defaults to VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH if not set. */
100 char szPathOut[RTPATH_MAX + 1];
101 } Dbg;
102} DRVAUDIOCFG, *PDRVAUDIOCFG;
103
104/**
105 * Audio driver instance data.
106 *
107 * @implements PDMIAUDIOCONNECTOR
108 */
109typedef struct DRVAUDIO
110{
111 /** Friendly name of the driver. */
112 char szName[64];
113 /** Critical section for serializing access. */
114 RTCRITSECT CritSect;
115 /** Shutdown indicator. */
116 bool fTerminate;
117 /** Our audio connector interface. */
118 PDMIAUDIOCONNECTOR IAudioConnector;
119 /** Pointer to the driver instance. */
120 PPDMDRVINS pDrvIns;
121 /** Pointer to audio driver below us. */
122 PPDMIHOSTAUDIO pHostDrvAudio;
123 /** Pointer to CFGM configuration node of this driver. */
124 PCFGMNODE pCFGMNode;
125 /** List of audio streams. */
126 RTLISTANCHOR lstStreams;
127#ifdef VBOX_WITH_AUDIO_ENUM
128 /** Flag indicating to perform an (re-)enumeration of the host audio devices. */
129 bool fEnumerateDevices;
130#endif
131 /** Audio configuration settings retrieved from the backend. */
132 PDMAUDIOBACKENDCFG BackendCfg;
133#ifdef VBOX_WITH_STATISTICS
134 /** Statistics for the statistics manager (STAM). */
135 DRVAUDIOSTATS Stats;
136#endif
137 struct
138 {
139 /** Whether this driver's input streams are enabled or not.
140 * This flag overrides all the attached stream statuses. */
141 bool fEnabled;
142 /** Max. number of free input streams.
143 * UINT32_MAX for unlimited streams. */
144 uint32_t cStreamsFree;
145#ifdef VBOX_WITH_AUDIO_CALLBACKS
146 RTLISTANCHOR lstCB;
147#endif
148 /** The driver's input confguration (tweakable via CFGM). */
149 DRVAUDIOCFG Cfg;
150 } In;
151 struct
152 {
153 /** Whether this driver's output streams are enabled or not.
154 * This flag overrides all the attached stream statuses. */
155 bool fEnabled;
156 /** Max. number of free output streams.
157 * UINT32_MAX for unlimited streams. */
158 uint32_t cStreamsFree;
159#ifdef VBOX_WITH_AUDIO_CALLBACKS
160 RTLISTANCHOR lstCB;
161#endif
162 /** The driver's output confguration (tweakable via CFGM). */
163 DRVAUDIOCFG Cfg;
164 } Out;
165} DRVAUDIO, *PDRVAUDIO;
166
167/** Makes a PDRVAUDIO out of a PPDMIAUDIOCONNECTOR. */
168#define PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface) \
169 ( (PDRVAUDIO)((uintptr_t)pInterface - RT_UOFFSETOF(DRVAUDIO, IAudioConnector)) )
170
171/** @name Audio format helper methods.
172 * @{ */
173const char *DrvAudioHlpAudDirToStr(PDMAUDIODIR enmDir);
174const char *DrvAudioHlpAudFmtToStr(PDMAUDIOFMT enmFmt);
175bool DrvAudioHlpAudFmtIsSigned(PDMAUDIOFMT enmFmt);
176uint8_t DrvAudioHlpAudFmtToBits(PDMAUDIOFMT enmFmt);
177/** @} */
178
179/** @name Audio calculation helper methods.
180 * @{ */
181void DrvAudioHlpClearBuf(const PPDMAUDIOPCMPROPS pPCMInfo, void *pvBuf, size_t cbBuf, uint32_t cFrames);
182uint32_t DrvAudioHlpCalcBitrate(uint8_t cBits, uint32_t uHz, uint8_t cChannels);
183uint32_t DrvAudioHlpCalcBitrate(const PPDMAUDIOPCMPROPS pProps);
184uint32_t DrvAudioHlpBytesAlign(uint32_t cbSize, const PPDMAUDIOPCMPROPS pProps);
185bool DrvAudioHlpBytesIsAligned(uint32_t cbSize, const PPDMAUDIOPCMPROPS pProps);
186uint32_t DrvAudioHlpBytesToFrames(uint32_t cbBytes, const PPDMAUDIOPCMPROPS pProps);
187uint64_t DrvAudioHlpBytesToMilli(uint32_t cbBytes, const PPDMAUDIOPCMPROPS pProps);
188uint64_t DrvAudioHlpBytesToNano(uint32_t cbBytes, const PPDMAUDIOPCMPROPS pProps);
189uint32_t DrvAudioHlpFramesToBytes(uint32_t cFrames, const PPDMAUDIOPCMPROPS pProps);
190uint64_t DrvAudioHlpFramesToMilli(uint32_t cFrames, const PPDMAUDIOPCMPROPS pProps);
191uint64_t DrvAudioHlpFramesToNano(uint32_t cFrames, const PPDMAUDIOPCMPROPS pProps);
192uint32_t DrvAudioHlpMilliToBytes(uint64_t uMs, const PPDMAUDIOPCMPROPS pProps);
193uint32_t DrvAudioHlpNanoToBytes(uint64_t uNs, const PPDMAUDIOPCMPROPS pProps);
194uint32_t DrvAudioHlpMilliToFrames(uint64_t uMs, const PPDMAUDIOPCMPROPS pProps);
195uint32_t DrvAudioHlpNanoToFrames(uint64_t uNs, const PPDMAUDIOPCMPROPS pProps);
196/** @} */
197
198/** @name Audio PCM properties helper methods.
199 * @{ */
200bool DrvAudioHlpPCMPropsAreEqual(const PPDMAUDIOPCMPROPS pPCMProps1, const PPDMAUDIOPCMPROPS pPCMProps2);
201bool DrvAudioHlpPCMPropsAreEqual(const PPDMAUDIOPCMPROPS pPCMProps, const PPDMAUDIOSTREAMCFG pCfg);
202bool DrvAudioHlpPCMPropsAreValid(const PPDMAUDIOPCMPROPS pProps);
203uint32_t DrvAudioHlpPCMPropsBytesPerFrame(const PPDMAUDIOPCMPROPS pProps);
204void DrvAudioHlpPCMPropsPrint(const PPDMAUDIOPCMPROPS pProps);
205int DrvAudioHlpPCMPropsToStreamCfg(const PPDMAUDIOPCMPROPS pPCMProps, PPDMAUDIOSTREAMCFG pCfg);
206/** @} */
207
208/** @name Audio stream helper methods.
209 * @{ */
210void DrvAudioHlpStreamCfgPrint(const PPDMAUDIOSTREAMCFG pCfg);
211bool DrvAudioHlpStreamCfgIsValid(const PPDMAUDIOSTREAMCFG pCfg);
212int DrvAudioHlpStreamCfgCopy(PPDMAUDIOSTREAMCFG pDstCfg, const PPDMAUDIOSTREAMCFG pSrcCfg);
213PPDMAUDIOSTREAMCFG DrvAudioHlpStreamCfgDup(const PPDMAUDIOSTREAMCFG pCfg);
214void DrvAudioHlpStreamCfgFree(PPDMAUDIOSTREAMCFG pCfg);
215const char *DrvAudioHlpStreamCmdToStr(PDMAUDIOSTREAMCMD enmCmd);
216/** @} */
217
218/** @name Audio stream helper methods.
219 * @{ */
220bool DrvAudioHlpStreamStatusCanRead(PDMAUDIOSTREAMSTS enmStatus);
221bool DrvAudioHlpStreamStatusCanWrite(PDMAUDIOSTREAMSTS enmStatus);
222bool DrvAudioHlpStreamStatusIsReady(PDMAUDIOSTREAMSTS enmStatus);
223/** @} */
224
225/** @name Audio file (name) helper methods.
226 * @{ */
227int DrvAudioHlpFileNameSanitize(char *pszPath, size_t cbPath);
228int DrvAudioHlpFileNameGet(char *pszFile, size_t cchFile, const char *pszPath, const char *pszName, uint32_t uInstance, PDMAUDIOFILETYPE enmType, PDMAUDIOFILENAMEFLAGS fFlags);
229/** @} */
230
231/** @name Audio device methods.
232 * @{ */
233PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData);
234void DrvAudioHlpDeviceFree(PPDMAUDIODEVICE pDev);
235PPDMAUDIODEVICE DrvAudioHlpDeviceDup(const PPDMAUDIODEVICE pDev, bool fCopyUserData);
236/** @} */
237
238/** @name Audio device enumartion methods.
239 * @{ */
240int DrvAudioHlpDeviceEnumInit(PPDMAUDIODEVICEENUM pDevEnm);
241void DrvAudioHlpDeviceEnumFree(PPDMAUDIODEVICEENUM pDevEnm);
242int DrvAudioHlpDeviceEnumAdd(PPDMAUDIODEVICEENUM pDevEnm, PPDMAUDIODEVICE pDev);
243int DrvAudioHlpDeviceEnumCopyEx(PPDMAUDIODEVICEENUM pDstDevEnm, const PPDMAUDIODEVICEENUM pSrcDevEnm, PDMAUDIODIR enmUsage);
244int DrvAudioHlpDeviceEnumCopy(PPDMAUDIODEVICEENUM pDstDevEnm, const PPDMAUDIODEVICEENUM pSrcDevEnm);
245PPDMAUDIODEVICEENUM DrvAudioHlpDeviceEnumDup(const PPDMAUDIODEVICEENUM pDevEnm);
246int DrvAudioHlpDeviceEnumCopy(PPDMAUDIODEVICEENUM pDstDevEnm, const PPDMAUDIODEVICEENUM pSrcDevEnm);
247int DrvAudioHlpDeviceEnumCopyEx(PPDMAUDIODEVICEENUM pDstDevEnm, const PPDMAUDIODEVICEENUM pSrcDevEnm, PDMAUDIODIR enmUsage, bool fCopyUserData);
248PPDMAUDIODEVICE DrvAudioHlpDeviceEnumGetDefaultDevice(const PPDMAUDIODEVICEENUM pDevEnm, PDMAUDIODIR enmDir);
249void DrvAudioHlpDeviceEnumPrint(const char *pszDesc, const PPDMAUDIODEVICEENUM pDevEnm);
250/** @} */
251
252/** @name Audio string-ify methods.
253 * @{ */
254const char *DrvAudioHlpAudMixerCtlToStr(PDMAUDIOMIXERCTL enmMixerCtl);
255const char *DrvAudioHlpPlaybackDstToStr(const PDMAUDIOPLAYBACKDEST enmPlaybackDst);
256const char *DrvAudioHlpRecSrcToStr(const PDMAUDIORECSOURCE enmRecSource);
257PDMAUDIOFMT DrvAudioHlpStrToAudFmt(const char *pszFmt);
258char *DrvAudioHlpAudDevFlagsToStrA(PDMAUDIODEVFLAG fFlags);
259/** @} */
260
261/** @name Audio file methods.
262 * @{ */
263int DrvAudioHlpFileCreate(PDMAUDIOFILETYPE enmType, const char *pszFile, PDMAUDIOFILEFLAGS fFlags, PPDMAUDIOFILE *ppFile);
264void DrvAudioHlpFileDestroy(PPDMAUDIOFILE pFile);
265int DrvAudioHlpFileOpen(PPDMAUDIOFILE pFile, uint32_t fOpen, const PPDMAUDIOPCMPROPS pProps);
266int DrvAudioHlpFileClose(PPDMAUDIOFILE pFile);
267int DrvAudioHlpFileDelete(PPDMAUDIOFILE pFile);
268size_t DrvAudioHlpFileGetDataSize(PPDMAUDIOFILE pFile);
269bool DrvAudioHlpFileIsOpen(PPDMAUDIOFILE pFile);
270int DrvAudioHlpFileWrite(PPDMAUDIOFILE pFile, const void *pvBuf, size_t cbBuf, uint32_t fFlags);
271/** @} */
272
273#define AUDIO_MAKE_FOURCC(c0, c1, c2, c3) RT_H2LE_U32_C(RT_MAKE_U32_FROM_U8(c0, c1, c2, c3))
274
275#endif /* !DRV_AUDIO_H */
276
Note: See TracBrowser for help on using the repository browser.

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