VirtualBox

source: vbox/trunk/src/VBox/Devices/Audio/DevHDA.h@ 87465

Last change on this file since 87465 was 87436, checked in by vboxsync, 4 years ago

Audio/HDA+AC97: Made the device emulation's internal [in|out]put FIFO buffer size configurable via extra data "VBoxInternal2/Audio/Device/BufSize[In|Out]Ms" (optional, defaults to 1000ms if not set). ticketoem2ref:36

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.1 KB
Line 
1/* $Id: DevHDA.h 87436 2021-01-26 16:59:29Z vboxsync $ */
2/** @file
3 * DevHDA.h - VBox Intel HD Audio Controller.
4 */
5
6/*
7 * Copyright (C) 2016-2020 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 VBOX_INCLUDED_SRC_Audio_DevHDA_h
19#define VBOX_INCLUDED_SRC_Audio_DevHDA_h
20#ifndef RT_WITHOUT_PRAGMA_ONCE
21# pragma once
22#endif
23
24#include <iprt/path.h>
25
26#include <VBox/vmm/pdmdev.h>
27
28#include "AudioMixer.h"
29
30#include "HDACodec.h"
31#include "HDAStream.h"
32#include "HDAStreamMap.h"
33#include "HDAStreamPeriod.h"
34
35
36
37/**
38 * HDA mixer sink definition (ring-3).
39 *
40 * Its purpose is to know which audio mixer sink is bound to which SDn
41 * (SDI/SDO) device stream.
42 *
43 * This is needed in order to handle interleaved streams (that is, multiple
44 * channels in one stream) or non-interleaved streams (each channel has a
45 * dedicated stream).
46 *
47 * This is only known to the actual device emulation level.
48 */
49typedef struct HDAMIXERSINK
50{
51 R3PTRTYPE(PHDASTREAM) pStreamShared;
52 R3PTRTYPE(PHDASTREAMR3) pStreamR3;
53 /** Pointer to the actual audio mixer sink. */
54 R3PTRTYPE(PAUDMIXSINK) pMixSink;
55} HDAMIXERSINK;
56/** Pointer to an HDA mixer sink definition (ring-3). */
57typedef HDAMIXERSINK *PHDAMIXERSINK;
58
59/**
60 * Mapping a stream tag to an HDA stream (ring-3).
61 */
62typedef struct HDATAG
63{
64 /** Own stream tag. */
65 uint8_t uTag;
66 uint8_t Padding[7];
67 /** Pointer to associated stream. */
68 R3PTRTYPE(PHDASTREAMR3) pStreamR3;
69} HDATAG;
70/** Pointer to a HDA stream tag mapping. */
71typedef HDATAG *PHDATAG;
72
73/**
74 * Shared ICH Intel HD audio controller state.
75 */
76typedef struct HDASTATE
77{
78 /** Critical section protecting the HDA state. */
79 PDMCRITSECT CritSect;
80 /** The HDA's register set. */
81 uint32_t au32Regs[HDA_NUM_REGS];
82 /** Internal stream states. */
83 HDASTREAM aStreams[HDA_MAX_STREAMS];
84 /** CORB buffer base address. */
85 uint64_t u64CORBBase;
86 /** RIRB buffer base address. */
87 uint64_t u64RIRBBase;
88 /** DMA base address.
89 * Made out of DPLBASE + DPUBASE (3.3.32 + 3.3.33). */
90 uint64_t u64DPBase;
91 /** Size in bytes of CORB buffer (#au32CorbBuf). */
92 uint32_t cbCorbBuf;
93 /** Size in bytes of RIRB buffer (#au64RirbBuf). */
94 uint32_t cbRirbBuf;
95 /** Response Interrupt Count (RINTCNT). */
96 uint16_t u16RespIntCnt;
97 /** Position adjustment (in audio frames).
98 *
99 * This is not an official feature of the HDA specs, but used by
100 * certain OS drivers (e.g. snd_hda_intel) to work around certain
101 * quirks by "real" HDA hardware implementations.
102 *
103 * The position adjustment specifies how many audio frames
104 * a stream is ahead from its actual reading/writing position when
105 * starting a stream.
106 */
107 uint16_t cPosAdjustFrames;
108 /** Whether the position adjustment is enabled or not. */
109 bool fPosAdjustEnabled;
110 /** DMA position buffer enable bit. */
111 bool fDMAPosition;
112 /** Current IRQ level. */
113 uint8_t u8IRQL;
114#ifdef VBOX_STRICT
115 /** Wall clock (WALCLK) stale count.
116 * This indicates the number of set wall clock values which did not actually
117 * move the counter forward (stale). */
118 uint8_t u8WalClkStaleCnt;
119#else
120 uint8_t bPadding1;
121#endif
122 /** The device timer Hz rate. Defaults to HDA_TIMER_HZ_DEFAULT. */
123 uint16_t uTimerHz;
124 /** Buffer size (in ms) of the internal input FIFO buffer.
125 * The actual buffer size in bytes will depend on the actual stream configuration. */
126 uint16_t cbCircBufInMs;
127 /** Buffer size (in ms) of the internal output FIFO buffer.
128 * The actual buffer size in bytes will depend on the actual stream configuration. */
129 uint16_t cbCircBufOutMs;
130 /** Padding for alignment. */
131 uint16_t u16Padding3;
132 /** Last updated wall clock (WALCLK) counter. */
133 uint64_t u64WalClk;
134 /** The CORB buffer. */
135 uint32_t au32CorbBuf[HDA_CORB_SIZE];
136 /** Pointer to RIRB buffer. */
137 uint64_t au64RirbBuf[HDA_RIRB_SIZE];
138
139 /** PCI Region \#0: 16KB of MMIO stuff. */
140 IOMMMIOHANDLE hMmio;
141
142#ifdef VBOX_WITH_STATISTICS
143 STAMPROFILE StatIn;
144 STAMPROFILE StatOut;
145 STAMCOUNTER StatBytesRead;
146 STAMCOUNTER StatBytesWritten;
147
148 /** @name Register statistics.
149 * The array members run parallel to g_aHdaRegMap.
150 * @{ */
151 STAMCOUNTER aStatRegReads[HDA_NUM_REGS];
152 STAMCOUNTER aStatRegReadsToR3[HDA_NUM_REGS];
153 STAMCOUNTER aStatRegWrites[HDA_NUM_REGS];
154 STAMCOUNTER aStatRegWritesToR3[HDA_NUM_REGS];
155 STAMCOUNTER StatRegMultiReadsRZ;
156 STAMCOUNTER StatRegMultiReadsR3;
157 STAMCOUNTER StatRegMultiWritesRZ;
158 STAMCOUNTER StatRegMultiWritesR3;
159 STAMCOUNTER StatRegSubWriteRZ;
160 STAMCOUNTER StatRegSubWriteR3;
161 STAMCOUNTER StatRegUnknownReads;
162 STAMCOUNTER StatRegUnknownWrites;
163 STAMCOUNTER StatRegWritesBlockedByReset;
164 STAMCOUNTER StatRegWritesBlockedByRun;
165 /** @} */
166#endif
167
168#ifdef DEBUG
169 /** Debug stuff.
170 * @todo Make STAM values out some of this? */
171 struct
172 {
173# if 0 /* unused */
174 /** Timestamp (in ns) of the last timer callback (hdaTimer).
175 * Used to calculate the time actually elapsed between two timer callbacks. */
176 uint64_t tsTimerLastCalledNs;
177# endif
178 /** IRQ debugging information. */
179 struct
180 {
181 /** Timestamp (in ns) of last processed (asserted / deasserted) IRQ. */
182 uint64_t tsProcessedLastNs;
183 /** Timestamp (in ns) of last asserted IRQ. */
184 uint64_t tsAssertedNs;
185# if 0 /* unused */
186 /** How many IRQs have been asserted already. */
187 uint64_t cAsserted;
188 /** Accumulated elapsed time (in ns) of all IRQ being asserted. */
189 uint64_t tsAssertedTotalNs;
190 /** Timestamp (in ns) of last deasserted IRQ. */
191 uint64_t tsDeassertedNs;
192 /** How many IRQs have been deasserted already. */
193 uint64_t cDeasserted;
194 /** Accumulated elapsed time (in ns) of all IRQ being deasserted. */
195 uint64_t tsDeassertedTotalNs;
196# endif
197 } IRQ;
198 } Dbg;
199#endif
200 /** This is for checking that the build was correctly configured in all contexts.
201 * This is set to HDASTATE_ALIGNMENT_CHECK_MAGIC. */
202 uint64_t uAlignmentCheckMagic;
203} HDASTATE;
204/** Pointer to a shared HDA device state. */
205typedef HDASTATE *PHDASTATE;
206
207/** Value for HDASTATE:uAlignmentCheckMagic. */
208#define HDASTATE_ALIGNMENT_CHECK_MAGIC UINT64_C(0x1298afb75893e059)
209
210
211/**
212 * Ring-3 ICH Intel HD audio controller state.
213 */
214typedef struct HDASTATER3
215{
216 /** Internal stream states. */
217 HDASTREAMR3 aStreams[HDA_MAX_STREAMS];
218 /** Mapping table between stream tags and stream states. */
219 HDATAG aTags[HDA_MAX_TAGS];
220 /** Number of active (running) SDn streams. */
221 uint8_t cStreamsActive;
222 uint8_t abPadding0[7];
223 /** R3 Pointer to the device instance. */
224 PPDMDEVINSR3 pDevIns;
225 /** The base interface for LUN\#0. */
226 PDMIBASE IBase;
227 /** Pointer to HDA codec to use. */
228 R3PTRTYPE(PHDACODEC) pCodec;
229 /** List of associated LUN drivers (HDADRIVER). */
230 RTLISTANCHORR3 lstDrv;
231 /** The device' software mixer. */
232 R3PTRTYPE(PAUDIOMIXER) pMixer;
233 /** HDA sink for (front) output. */
234 HDAMIXERSINK SinkFront;
235#ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND
236 /** HDA sink for center / LFE output. */
237 HDAMIXERSINK SinkCenterLFE;
238 /** HDA sink for rear output. */
239 HDAMIXERSINK SinkRear;
240#endif
241 /** HDA mixer sink for line input. */
242 HDAMIXERSINK SinkLineIn;
243#ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
244 /** Audio mixer sink for microphone input. */
245 HDAMIXERSINK SinkMicIn;
246#endif
247 /** Debug stuff. */
248 struct
249 {
250 /** Whether debugging is enabled or not. */
251 bool fEnabled;
252 /** Path where to dump the debug output to.
253 * Defaults to VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH. */
254 R3PTRTYPE(char *) pszOutPath;
255 } Dbg;
256} HDASTATER3;
257/** Pointer to a ring-3 HDA device state. */
258typedef HDASTATER3 *PHDASTATER3;
259
260
261#endif /* !VBOX_INCLUDED_SRC_Audio_DevHDA_h */
262
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