VirtualBox

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

Last change on this file since 65635 was 65624, checked in by vboxsync, 8 years ago

Audio: More abstraction for the backends: Now the backend stream's data is completely separate from the audio connector interface. That way the backends cannot mess with the audio connector's data (e.g. mixing buffers and friends) anymore, and those are forced to use the audio connector API as meant now. Needs more testing, partly work in progress.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.0 KB
Line 
1/* $Id: DrvAudio.h 65624 2017-02-06 14:13:36Z vboxsync $ */
2/** @file
3 * Intermediate audio driver header.
4 */
5
6/*
7 * Copyright (C) 2006-2017 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 TotalSamplesMixedIn;
87 STAMCOUNTER TotalSamplesMixedOut;
88 STAMCOUNTER TotalSamplesLostIn;
89 STAMCOUNTER TotalSamplesLostOut;
90 STAMCOUNTER TotalSamplesOut;
91 STAMCOUNTER TotalSamplesIn;
92 STAMCOUNTER TotalBytesRead;
93 STAMCOUNTER TotalBytesWritten;
94 /** How much delay (in ms) for input processing. */
95 STAMPROFILEADV DelayIn;
96 /** How much delay (in ms) for output processing. */
97 STAMPROFILEADV DelayOut;
98} DRVAUDIOSTATS, *PDRVAUDIOSTATS;
99#endif
100
101/**
102 * Audio driver instance data.
103 *
104 * @implements PDMIAUDIOCONNECTOR
105 */
106typedef struct DRVAUDIO
107{
108 /** Input/output processing thread. */
109 RTTHREAD hThread;
110 /** Critical section for serializing access. */
111 RTCRITSECT CritSect;
112 /** Shutdown indicator. */
113 bool fTerminate;
114 /** Our audio connector interface. */
115 PDMIAUDIOCONNECTOR IAudioConnector;
116 /** Pointer to the driver instance. */
117 PPDMDRVINS pDrvIns;
118 /** Pointer to audio driver below us. */
119 PPDMIHOSTAUDIO pHostDrvAudio;
120 /** List of host input/output audio streams. */
121 RTLISTANCHOR lstHstStreams;
122 /** List of guest input/output audio streams. */
123 RTLISTANCHOR lstGstStreams;
124 /** Max. number of free input streams.
125 * UINT32_MAX for unlimited streams. */
126 uint32_t cStreamsFreeIn;
127 /** Max. number of free output streams.
128 * UINT32_MAX for unlimited streams. */
129 uint32_t cStreamsFreeOut;
130#ifdef VBOX_WITH_AUDIO_ENUM
131 /** Flag indicating to perform an (re-)enumeration of the host audio devices. */
132 bool fEnumerateDevices;
133#endif
134 /** Audio configuration settings retrieved from the backend. */
135 PDMAUDIOBACKENDCFG BackendCfg;
136#ifdef VBOX_WITH_AUDIO_DEVICE_CALLBACKS
137 /** @todo Use a map with primary key set to the callback type? */
138 RTLISTANCHOR lstCBIn;
139 RTLISTANCHOR lstCBOut;
140#endif
141#ifdef VBOX_WITH_STATISTICS
142 /** Statistics for the statistics manager (STAM). */
143 DRVAUDIOSTATS Stats;
144#endif
145} DRVAUDIO, *PDRVAUDIO;
146
147/** Makes a PDRVAUDIO out of a PPDMIAUDIOCONNECTOR. */
148#define PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface) \
149 ( (PDRVAUDIO)((uintptr_t)pInterface - RT_OFFSETOF(DRVAUDIO, IAudioConnector)) )
150
151
152bool DrvAudioHlpAudFmtIsSigned(PDMAUDIOFMT enmFmt);
153uint8_t DrvAudioHlpAudFmtToBits(PDMAUDIOFMT enmFmt);
154const char *DrvAudioHlpAudFmtToStr(PDMAUDIOFMT enmFmt);
155void DrvAudioHlpClearBuf(PPDMAUDIOPCMPROPS pPCMInfo, void *pvBuf, size_t cbBuf, uint32_t cSamples);
156uint32_t DrvAudioHlpCalcBitrate(uint8_t cBits, uint32_t uHz, uint8_t cChannels);
157uint32_t DrvAudioHlpCalcBitrate(PPDMAUDIOPCMPROPS pProps);
158bool DrvAudioHlpPCMPropsAreEqual(PPDMAUDIOPCMPROPS pPCMProps1, PPDMAUDIOPCMPROPS pPCMProps2);
159bool DrvAudioHlpPCMPropsAreEqual(PPDMAUDIOPCMPROPS pPCMProps, PPDMAUDIOSTREAMCFG pCfg);
160int DrvAudioHlpPCMPropsToStreamCfg(PPDMAUDIOPCMPROPS pPCMProps, PPDMAUDIOSTREAMCFG pCfg);
161const char *DrvAudioHlpRecSrcToStr(PDMAUDIORECSOURCE enmRecSource);
162void DrvAudioHlpStreamCfgPrint(PPDMAUDIOSTREAMCFG pCfg);
163bool DrvAudioHlpStreamCfgIsValid(const PPDMAUDIOSTREAMCFG pCfg);
164int DrvAudioHlpStreamCfgCopy(PPDMAUDIOSTREAMCFG pDstCfg, const PPDMAUDIOSTREAMCFG pSrcCfg);
165PPDMAUDIOSTREAMCFG DrvAudioHlpStreamCfgDup(const PPDMAUDIOSTREAMCFG pCfg);
166void DrvAudioHlpStreamCfgFree(PPDMAUDIOSTREAMCFG pCfg);
167const char *DrvAudioHlpStreamCmdToStr(PDMAUDIOSTREAMCMD enmCmd);
168PDMAUDIOFMT DrvAudioHlpStrToAudFmt(const char *pszFmt);
169
170int DrvAudioHlpSanitizeFileName(char *pszPath, size_t cbPath);
171int DrvAudioHlpGetFileName(char *pszFile, size_t cchFile, const char *pszPath, const char *pszName, PDMAUDIOFILETYPE enmType);
172
173PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData);
174void DrvAudioHlpDeviceFree(PPDMAUDIODEVICE pDev);
175PPDMAUDIODEVICE DrvAudioHlpDeviceDup(PPDMAUDIODEVICE pDev, bool fCopyUserData);
176
177int DrvAudioHlpDeviceEnumInit(PPDMAUDIODEVICEENUM pDevEnm);
178void DrvAudioHlpDeviceEnumFree(PPDMAUDIODEVICEENUM pDevEnm);
179int DrvAudioHlpDeviceEnumAdd(PPDMAUDIODEVICEENUM pDevEnm, PPDMAUDIODEVICE pDev);
180int DrvAudioHlpDeviceEnumCopyEx(PPDMAUDIODEVICEENUM pDstDevEnm, PPDMAUDIODEVICEENUM pSrcDevEnm, PDMAUDIODIR enmUsage);
181int DrvAudioHlpDeviceEnumCopy(PPDMAUDIODEVICEENUM pDstDevEnm, PPDMAUDIODEVICEENUM pSrcDevEnm);
182PPDMAUDIODEVICEENUM DrvAudioHlpDeviceEnumDup(PPDMAUDIODEVICEENUM pDevEnm);
183int DrvAudioHlpDeviceEnumCopy(PPDMAUDIODEVICEENUM pDstDevEnm, PPDMAUDIODEVICEENUM pSrcDevEnm);
184int DrvAudioHlpDeviceEnumCopyEx(PPDMAUDIODEVICEENUM pDstDevEnm, PPDMAUDIODEVICEENUM pSrcDevEnm, PDMAUDIODIR enmUsage, bool fCopyUserData);
185PPDMAUDIODEVICE DrvAudioHlpDeviceEnumGetDefaultDevice(PPDMAUDIODEVICEENUM pDevEnm, PDMAUDIODIR enmDir);
186void DrvAudioHlpDeviceEnumPrint(const char *pszDesc, PPDMAUDIODEVICEENUM pDevEnm);
187
188const char *DrvAudioHlpAudDirToStr(PDMAUDIODIR enmDir);
189const char *DrvAudioHlpAudMixerCtlToStr(PDMAUDIOMIXERCTL enmMixerCtl);
190char *DrvAudioHlpAudDevFlagsToStrA(PDMAUDIODEVFLAG fFlags);
191
192int DrvAudioHlpWAVFileOpen(PPDMAUDIOFILE pFile, const char *pszFile, uint32_t fOpen, PPDMAUDIOPCMPROPS pProps, PDMAUDIOFILEFLAGS fFlags);
193int DrvAudioHlpWAVFileClose(PPDMAUDIOFILE pFile);
194size_t DrvAudioHlpWAVFileGetDataSize(PPDMAUDIOFILE pFile);
195int DrvAudioHlpWAVFileWrite(PPDMAUDIOFILE pFile, const void *pvBuf, size_t cbBuf, uint32_t fFlags);
196
197#define AUDIO_MAKE_FOURCC(c0, c1, c2, c3) RT_H2LE_U32_C(RT_MAKE_U32_FROM_U8(c0, c1, c2, c3))
198
199#endif /* DRV_AUDIO_H */
200
Note: See TracBrowser for help on using the repository browser.

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