VirtualBox

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

Last change on this file since 64685 was 64568, checked in by vboxsync, 8 years ago

Audio/DrvAudio: Added some more statistics to STAM about read, written, mixed and lost audio samples. Mix written samples immediately to the parent instead of postponing it for the next iteration. Logging tweaks.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.7 KB
Line 
1/* $Id: DrvAudio.h 64568 2016-11-04 12:38:20Z vboxsync $ */
2/** @file
3 * Intermediate audio driver header.
4 */
5
6/*
7 * Copyright (C) 2006-2016 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 * This code is based on: audio.h
19 *
20 * QEMU Audio subsystem header
21 *
22 * Copyright (c) 2003-2005 Vassili Karpov (malc)
23 *
24 * Permission is hereby granted, free of charge, to any person obtaining a copy
25 * of this software and associated documentation files (the "Software"), to deal
26 * in the Software without restriction, including without limitation the rights
27 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
28 * copies of the Software, and to permit persons to whom the Software is
29 * furnished to do so, subject to the following conditions:
30 *
31 * The above copyright notice and this permission notice shall be included in
32 * all copies or substantial portions of the Software.
33 *
34 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
37 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
38 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
39 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
40 * THE SOFTWARE.
41 */
42
43#ifndef DRV_AUDIO_H
44#define DRV_AUDIO_H
45
46#include <limits.h>
47
48#include <iprt/circbuf.h>
49#include <iprt/critsect.h>
50#include <iprt/file.h>
51#include <iprt/path.h>
52
53#include <VBox/vmm/pdmdev.h>
54#include <VBox/vmm/pdm.h>
55#include <VBox/vmm/pdmaudioifs.h>
56
57typedef enum
58{
59 AUD_OPT_INT,
60 AUD_OPT_FMT,
61 AUD_OPT_STR,
62 AUD_OPT_BOOL
63} audio_option_tag_e;
64
65typedef struct audio_option
66{
67 const char *name;
68 audio_option_tag_e tag;
69 void *valp;
70 const char *descr;
71 int *overridenp;
72 int overriden;
73} audio_option;
74
75#ifdef VBOX_WITH_STATISTICS
76/**
77 * Structure for keeping stream statistics for the
78 * statistic manager (STAM).
79 */
80typedef struct DRVAUDIOSTATS
81{
82 STAMCOUNTER TotalStreamsActive;
83 STAMCOUNTER TotalStreamsCreated;
84 STAMCOUNTER TotalSamplesRead;
85 STAMCOUNTER TotalSamplesWritten;
86 STAMCOUNTER TotalSamplesMixed;
87 STAMCOUNTER TotalSamplesLost;
88 STAMCOUNTER TotalSamplesPlayed;
89 STAMCOUNTER TotalSamplesCaptured;
90 STAMCOUNTER TotalBytesRead;
91 STAMCOUNTER TotalBytesWritten;
92 /** How much delay (in ms) for input processing. */
93 STAMPROFILEADV DelayIn;
94 /** How much delay (in ms) for output processing. */
95 STAMPROFILEADV DelayOut;
96} DRVAUDIOSTATS, *PDRVAUDIOSTATS;
97#endif
98
99/**
100 * Audio driver instance data.
101 *
102 * @implements PDMIAUDIOCONNECTOR
103 */
104typedef struct DRVAUDIO
105{
106 /** Input/output processing thread. */
107 RTTHREAD hThread;
108 /** Critical section for serializing access. */
109 RTCRITSECT CritSect;
110 /** Shutdown indicator. */
111 bool fTerminate;
112 /** Our audio connector interface. */
113 PDMIAUDIOCONNECTOR IAudioConnector;
114 /** Pointer to the driver instance. */
115 PPDMDRVINS pDrvIns;
116 /** Pointer to audio driver below us. */
117 PPDMIHOSTAUDIO pHostDrvAudio;
118 /** List of host input/output audio streams. */
119 RTLISTANCHOR lstHstStreams;
120 /** List of guest input/output audio streams. */
121 RTLISTANCHOR lstGstStreams;
122 /** Max. number of free input streams.
123 * UINT32_MAX for unlimited streams. */
124 uint32_t cStreamsFreeIn;
125 /** Max. number of free output streams.
126 * UINT32_MAX for unlimited streams. */
127 uint32_t cStreamsFreeOut;
128#ifdef VBOX_WITH_AUDIO_ENUM
129 /** Flag indicating to perform an (re-)enumeration of the host audio devices. */
130 bool fEnumerateDevices;
131#endif
132 /** Audio configuration settings retrieved from the backend. */
133 PDMAUDIOBACKENDCFG BackendCfg;
134#ifdef VBOX_WITH_AUDIO_DEVICE_CALLBACKS
135 /** @todo Use a map with primary key set to the callback type? */
136 RTLISTANCHOR lstCBIn;
137 RTLISTANCHOR lstCBOut;
138#endif
139#ifdef VBOX_WITH_STATISTICS
140 /** Statistics for the statistics manager (STAM). */
141 DRVAUDIOSTATS Stats;
142#endif
143} DRVAUDIO, *PDRVAUDIO;
144
145/** Makes a PDRVAUDIO out of a PPDMIAUDIOCONNECTOR. */
146#define PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface) \
147 ( (PDRVAUDIO)((uintptr_t)pInterface - RT_OFFSETOF(DRVAUDIO, IAudioConnector)) )
148
149
150bool DrvAudioHlpAudFmtIsSigned(PDMAUDIOFMT enmFmt);
151uint8_t DrvAudioHlpAudFmtToBits(PDMAUDIOFMT enmFmt);
152const char *DrvAudioHlpAudFmtToStr(PDMAUDIOFMT enmFmt);
153void DrvAudioHlpClearBuf(PPDMAUDIOPCMPROPS pPCMInfo, void *pvBuf, size_t cbBuf, uint32_t cSamples);
154uint32_t DrvAudioHlpCalcBitrate(uint8_t cBits, uint32_t uHz, uint8_t cChannels);
155uint32_t DrvAudioHlpCalcBitrate(PPDMAUDIOSTREAMCFG pCfg);
156bool DrvAudioHlpPCMPropsAreEqual(PPDMAUDIOPCMPROPS pPCMProps1, PPDMAUDIOPCMPROPS pPCMProps2);
157bool DrvAudioHlpPCMPropsAreEqual(PPDMAUDIOPCMPROPS pPCMProps, PPDMAUDIOSTREAMCFG pCfg);
158int DrvAudioHlpPCMPropsToStreamCfg(PPDMAUDIOPCMPROPS pPCMProps, PPDMAUDIOSTREAMCFG pCfg);
159const char *DrvAudioHlpRecSrcToStr(PDMAUDIORECSOURCE enmRecSource);
160void DrvAudioHlpStreamCfgPrint(PPDMAUDIOSTREAMCFG pCfg);
161bool DrvAudioHlpStreamCfgIsValid(PPDMAUDIOSTREAMCFG pCfg);
162int DrvAudioHlpStreamCfgToProps(PPDMAUDIOSTREAMCFG pCfg, PPDMAUDIOPCMPROPS pProps);
163PDMAUDIOFMT DrvAudioHlpStrToAudFmt(const char *pszFmt);
164
165int DrvAudioHlpSanitizeFileName(char *pszPath, size_t cbPath);
166int DrvAudioHlpGetFileName(char *pszFile, size_t cchFile, const char *pszPath, const char *pszName, PDMAUDIOFILETYPE enmType);
167
168PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData);
169void DrvAudioHlpDeviceFree(PPDMAUDIODEVICE pDev);
170PPDMAUDIODEVICE DrvAudioHlpDeviceDup(PPDMAUDIODEVICE pDev, bool fCopyUserData);
171
172int DrvAudioHlpDeviceEnumInit(PPDMAUDIODEVICEENUM pDevEnm);
173void DrvAudioHlpDeviceEnumFree(PPDMAUDIODEVICEENUM pDevEnm);
174int DrvAudioHlpDeviceEnumAdd(PPDMAUDIODEVICEENUM pDevEnm, PPDMAUDIODEVICE pDev);
175int DrvAudioHlpDeviceEnumCopyEx(PPDMAUDIODEVICEENUM pDstDevEnm, PPDMAUDIODEVICEENUM pSrcDevEnm, PDMAUDIODIR enmUsage);
176int DrvAudioHlpDeviceEnumCopy(PPDMAUDIODEVICEENUM pDstDevEnm, PPDMAUDIODEVICEENUM pSrcDevEnm);
177PPDMAUDIODEVICEENUM DrvAudioHlpDeviceEnumDup(PPDMAUDIODEVICEENUM pDevEnm);
178int DrvAudioHlpDeviceEnumCopy(PPDMAUDIODEVICEENUM pDstDevEnm, PPDMAUDIODEVICEENUM pSrcDevEnm);
179int DrvAudioHlpDeviceEnumCopyEx(PPDMAUDIODEVICEENUM pDstDevEnm, PPDMAUDIODEVICEENUM pSrcDevEnm, PDMAUDIODIR enmUsage, bool fCopyUserData);
180PPDMAUDIODEVICE DrvAudioHlpDeviceEnumGetDefaultDevice(PPDMAUDIODEVICEENUM pDevEnm, PDMAUDIODIR enmDir);
181void DrvAudioHlpDeviceEnumPrint(const char *pszDesc, PPDMAUDIODEVICEENUM pDevEnm);
182
183const char *DrvAudioHlpAudDirToStr(PDMAUDIODIR enmDir);
184char *DrvAudioHlpAudDevFlagsToStrA(PDMAUDIODEVFLAG fFlags);
185
186int DrvAudioHlpWAVFileOpen(PPDMAUDIOFILE pFile, const char *pszFile, uint32_t fOpen, PPDMAUDIOPCMPROPS pProps, PDMAUDIOFILEFLAGS fFlags);
187int DrvAudioHlpWAVFileClose(PPDMAUDIOFILE pFile);
188size_t DrvAudioHlpWAVFileGetDataSize(PPDMAUDIOFILE pFile);
189int DrvAudioHlpWAVFileWrite(PPDMAUDIOFILE pFile, const void *pvBuf, size_t cbBuf, uint32_t fFlags);
190
191#define AUDIO_MAKE_FOURCC(c0, c1, c2, c3) RT_H2LE_U32_C(RT_MAKE_U32_FROM_U8(c0, c1, c2, c3))
192
193#endif /* DRV_AUDIO_H */
194
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