- Timestamp:
- Jun 24, 2021 12:30:53 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 145345
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 2 deleted
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevHda.cpp
r89885 r89887 401 401 }; 402 402 403 const HDAREGALIAS g_aHdaRegAliases[] = 403 /** 404 * HDA register aliases (HDA spec 3.3.45). 405 * @remarks Sorted by offReg. 406 */ 407 static struct HDAREGALIAS 408 { 409 /** The alias register offset. */ 410 uint32_t offReg; 411 /** The register index. */ 412 int idxAlias; 413 } const g_aHdaRegAliases[] = 404 414 { 405 415 { 0x2030, HDA_REG_WALCLK }, … … 497 507 UINT32_C(0), UINT32_C(0x000000ff), UINT32_C(0x0000ffff), UINT32_C(0x00ffffff), UINT32_C(0xffffffff) 498 508 }; 509 510 511 512 /** 513 * Returns a new INTSTS value based on the current device state. 514 * 515 * @returns Determined INTSTS register value. 516 * @param pThis The shared HDA device state. 517 * 518 * @remarks This function does *not* set INTSTS! 519 */ 520 static uint32_t hdaGetINTSTS(PHDASTATE pThis) 521 { 522 uint32_t intSts = 0; 523 524 /* Check controller interrupts (RIRB, STATEST). */ 525 if (HDA_REG(pThis, RIRBSTS) & HDA_REG(pThis, RIRBCTL) & (HDA_RIRBCTL_ROIC | HDA_RIRBCTL_RINTCTL)) 526 { 527 intSts |= HDA_INTSTS_CIS; /* Set the Controller Interrupt Status (CIS). */ 528 } 529 530 /* Check SDIN State Change Status Flags. */ 531 if (HDA_REG(pThis, STATESTS) & HDA_REG(pThis, WAKEEN)) 532 { 533 intSts |= HDA_INTSTS_CIS; /* Touch Controller Interrupt Status (CIS). */ 534 } 535 536 /* For each stream, check if any interrupt status bit is set and enabled. */ 537 for (uint8_t iStrm = 0; iStrm < HDA_MAX_STREAMS; ++iStrm) 538 { 539 if (HDA_STREAM_REG(pThis, STS, iStrm) & HDA_STREAM_REG(pThis, CTL, iStrm) & (HDA_SDCTL_DEIE | HDA_SDCTL_FEIE | HDA_SDCTL_IOCE)) 540 { 541 Log3Func(("[SD%d] interrupt status set\n", iStrm)); 542 intSts |= RT_BIT(iStrm); 543 } 544 } 545 546 if (intSts) 547 intSts |= HDA_INTSTS_GIS; /* Set the Global Interrupt Status (GIS). */ 548 549 Log3Func(("-> 0x%x\n", intSts)); 550 551 return intSts; 552 } 553 554 555 /** 556 * Processes (asserts/deasserts) the HDA interrupt according to the current state. 557 * 558 * @param pDevIns The device instance. 559 * @param pThis The shared HDA device state. 560 * @param pszSource Caller information. 561 */ 562 #if defined(LOG_ENABLED) || defined(DOXYGEN_RUNNING) 563 void hdaProcessInterrupt(PPDMDEVINS pDevIns, PHDASTATE pThis, const char *pszSource) 564 #else 565 void hdaProcessInterrupt(PPDMDEVINS pDevIns, PHDASTATE pThis) 566 #endif 567 { 568 uint32_t uIntSts = hdaGetINTSTS(pThis); 569 570 HDA_REG(pThis, INTSTS) = uIntSts; 571 572 /* NB: It is possible to have GIS set even when CIE/SIEn are all zero; the GIS bit does 573 * not control the interrupt signal. See Figure 4 on page 54 of the HDA 1.0a spec. 574 */ 575 /* Global Interrupt Enable (GIE) set? */ 576 if ( (HDA_REG(pThis, INTCTL) & HDA_INTCTL_GIE) 577 && (HDA_REG(pThis, INTSTS) & HDA_REG(pThis, INTCTL) & (HDA_INTCTL_CIE | HDA_STRMINT_MASK))) 578 { 579 Log3Func(("Asserted (%s)\n", pszSource)); 580 581 PDMDevHlpPCISetIrq(pDevIns, 0, 1 /* Assert */); 582 pThis->u8IRQL = 1; 583 584 #ifdef DEBUG 585 pThis->Dbg.IRQ.tsAssertedNs = RTTimeNanoTS(); 586 pThis->Dbg.IRQ.tsProcessedLastNs = pThis->Dbg.IRQ.tsAssertedNs; 587 #endif 588 } 589 else 590 { 591 Log3Func(("Deasserted (%s)\n", pszSource)); 592 593 PDMDevHlpPCISetIrq(pDevIns, 0, 0 /* Deassert */); 594 pThis->u8IRQL = 0; 595 } 596 } 499 597 500 598 … … 1552 1650 } 1553 1651 1652 /** 1653 * Calculates the number of bytes of a FIFOW register. 1654 * 1655 * @return Number of bytes of a given FIFOW register. 1656 * @param u16RegFIFOW FIFOW register to convert. 1657 */ 1658 uint8_t hdaSDFIFOWToBytes(uint16_t u16RegFIFOW) 1659 { 1660 uint32_t cb; 1661 switch (u16RegFIFOW) 1662 { 1663 case HDA_SDFIFOW_8B: cb = 8; break; 1664 case HDA_SDFIFOW_16B: cb = 16; break; 1665 case HDA_SDFIFOW_32B: cb = 32; break; 1666 default: 1667 AssertFailedStmt(cb = 32); /* Paranoia. */ 1668 break; 1669 } 1670 1671 Assert(RT_IS_POWER_OF_TWO(cb)); 1672 return cb; 1673 } 1674 1554 1675 static VBOXSTRICTRC hdaRegWriteSDFIFOW(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t u32Value) 1555 1676 { … … 2159 2280 int rc = VINF_SUCCESS; 2160 2281 2161 PHDASTREAM pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkLineIn);2282 PHDASTREAM pStream = pThisCC->SinkLineIn.pStreamShared; 2162 2283 if ( pStream 2163 2284 && AudioHlpStreamCfgIsValid(&pStream->State.Cfg)) … … 2169 2290 2170 2291 # ifdef VBOX_WITH_AUDIO_HDA_MIC_IN 2171 pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkMicIn);2292 pStream = pThisCC->SinkMicIn.pStreamShared; 2172 2293 if ( pStream 2173 2294 && AudioHlpStreamCfgIsValid(&pStream->State.Cfg)) … … 2179 2300 # endif 2180 2301 2181 pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkFront);2302 pStream = pThisCC->SinkFront.pStreamShared; 2182 2303 if ( pStream 2183 2304 && AudioHlpStreamCfgIsValid(&pStream->State.Cfg)) … … 2189 2310 2190 2311 # ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND 2191 pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkCenterLFE);2312 pStream = pThisCC->SinkCenterLFE.pStreamShared; 2192 2313 if ( pStream 2193 2314 && AudioHlpStreamCfgIsValid(&pStream->State.Cfg)) … … 2198 2319 } 2199 2320 2200 pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkRear);2321 pStream = pThisCC->SinkRear.pStreamShared; 2201 2322 if ( pStream 2202 2323 && AudioHlpStreamCfgIsValid(&pStream->State.Cfg)) … … 4857 4978 { 4858 4979 struct HDAREGDESC const *pReg = &g_aHdaRegMap[i]; 4859 struct HDAREGDESC const *pNextReg = i + 1 < RT_ELEMENTS(g_aHdaRegMap) ? 4980 struct HDAREGDESC const *pNextReg = i + 1 < RT_ELEMENTS(g_aHdaRegMap) ? &g_aHdaRegMap[i + 1] : NULL; 4860 4981 4861 4982 /* binary search order. */ -
trunk/src/VBox/Devices/Audio/DevHda.h
r89885 r89887 69 69 /** Pointer to a ring-3 HDA device state. */ 70 70 typedef struct HDASTATER3 *PHDASTATER3; 71 /** Pointer to an HDA mixer sink definition (ring-3). */ 72 typedef struct HDAMIXERSINK *PHDAMIXERSINK; 71 73 72 74 … … 74 76 * The rest of the headers. 75 77 */ 76 #include "DevHdaCommon.h"77 78 #include "DevHdaStream.h" 78 79 #include "DevHdaCodec.h" 80 81 82 83 /** @name Stream counts. 84 * 85 * At the moment we support 4 input + 4 output streams max, which is 8 in total. 86 * Bidirectional streams are currently *not* supported. 87 * 88 * @note When changing any of those values, be prepared for some saved state 89 * fixups / trouble! 90 * @{ 91 */ 92 #define HDA_MAX_SDI 4 93 #define HDA_MAX_SDO 4 94 #define HDA_MAX_STREAMS (HDA_MAX_SDI + HDA_MAX_SDO) 95 /** @} */ 96 AssertCompile(HDA_MAX_SDI <= HDA_MAX_SDO); 97 98 99 /** Number of general registers. */ 100 #define HDA_NUM_GENERAL_REGS 34 101 /** Number of total registers in the HDA's register map. */ 102 #define HDA_NUM_REGS (HDA_NUM_GENERAL_REGS + (HDA_MAX_STREAMS * 10 /* Each stream descriptor has 10 registers */)) 103 /** Total number of stream tags (channels). Index 0 is reserved / invalid. */ 104 #define HDA_MAX_TAGS 16 105 106 107 /** Read callback. */ 108 typedef VBOXSTRICTRC FNHDAREGREAD(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value); 109 /** Write callback. */ 110 typedef VBOXSTRICTRC FNHDAREGWRITE(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t u32Value); 111 112 /** 113 * HDA register descriptor. 114 */ 115 typedef struct HDAREGDESC 116 { 117 /** Register offset in the register space. */ 118 uint32_t offset; 119 /** Size in bytes. Registers of size > 4 are in fact tables. */ 120 uint32_t size; 121 /** Readable bits. */ 122 uint32_t readable; 123 /** Writable bits. */ 124 uint32_t writable; 125 /** Register descriptor (RD) flags of type HDA_RD_F_XXX. These are used to 126 * specify the handling (read/write) policy of the register. */ 127 uint32_t fFlags; 128 /** Read callback. */ 129 FNHDAREGREAD *pfnRead; 130 /** Write callback. */ 131 FNHDAREGWRITE *pfnWrite; 132 /** Index into the register storage array. 133 * @todo r=bird: Bad structure layout. Move up before pfnRead. */ 134 uint32_t mem_idx; 135 /** Abbreviated name. */ 136 const char *abbrev; 137 /** Descripton. */ 138 const char *desc; 139 } HDAREGDESC; 140 141 extern const HDAREGDESC g_aHdaRegMap[HDA_NUM_REGS]; 142 143 144 /** 145 * ICH6 datasheet defines limits for FIFOS registers (18.2.39). 146 * Formula: size - 1 147 * Other values not listed are not supported. 148 */ 149 150 /** Offset of the SD0 register map. */ 151 #define HDA_REG_DESC_SD0_BASE 0x80 152 153 /** Turn a short global register name into an memory index and a stringized name. */ 154 #define HDA_REG_IDX(abbrev) HDA_MEM_IND_NAME(abbrev), #abbrev 155 156 /** Turns a short stream register name into an memory index and a stringized name. */ 157 #define HDA_REG_IDX_STRM(reg, suff) HDA_MEM_IND_NAME(reg ## suff), #reg #suff 158 159 /** Same as above for a register *not* stored in memory. */ 160 #define HDA_REG_IDX_NOMEM(abbrev) 0, #abbrev 161 162 /* 163 * NB: Register values stored in memory (au32Regs[]) are indexed through 164 * the HDA_RMX_xxx macros (also HDA_MEM_IND_NAME()). On the other hand, the 165 * register descriptors in g_aHdaRegMap[] are indexed through the 166 * HDA_REG_xxx macros (also HDA_REG_IND_NAME()). 167 * 168 * The au32Regs[] layout is kept unchanged for saved state 169 * compatibility. 170 */ 171 172 /* Registers */ 173 #define HDA_REG_IND_NAME(x) HDA_REG_##x 174 #define HDA_MEM_IND_NAME(x) HDA_RMX_##x 175 #define HDA_REG_IND(pThis, x) ((pThis)->au32Regs[g_aHdaRegMap[x].mem_idx]) 176 #define HDA_REG(pThis, x) (HDA_REG_IND((pThis), HDA_REG_IND_NAME(x))) 177 178 179 #define HDA_REG_GCAP 0 /* Range 0x00 - 0x01 */ 180 #define HDA_RMX_GCAP 0 181 /** 182 * GCAP HDASpec 3.3.2 This macro encodes the following information about HDA in a compact manner: 183 * 184 * oss (15:12) - Number of output streams supported. 185 * iss (11:8) - Number of input streams supported. 186 * bss (7:3) - Number of bidirectional streams supported. 187 * bds (2:1) - Number of serial data out (SDO) signals supported. 188 * b64sup (0) - 64 bit addressing supported. 189 */ 190 #define HDA_MAKE_GCAP(oss, iss, bss, bds, b64sup) \ 191 ( (((oss) & 0xF) << 12) \ 192 | (((iss) & 0xF) << 8) \ 193 | (((bss) & 0x1F) << 3) \ 194 | (((bds) & 0x3) << 2) \ 195 | ((b64sup) & 1)) 196 197 #define HDA_REG_VMIN 1 /* 0x02 */ 198 #define HDA_RMX_VMIN 1 199 200 #define HDA_REG_VMAJ 2 /* 0x03 */ 201 #define HDA_RMX_VMAJ 2 202 203 #define HDA_REG_OUTPAY 3 /* 0x04-0x05 */ 204 #define HDA_RMX_OUTPAY 3 205 206 #define HDA_REG_INPAY 4 /* 0x06-0x07 */ 207 #define HDA_RMX_INPAY 4 208 209 #define HDA_REG_GCTL 5 /* 0x08-0x0B */ 210 #define HDA_RMX_GCTL 5 211 #define HDA_GCTL_UNSOL RT_BIT(8) /* Accept Unsolicited Response Enable */ 212 #define HDA_GCTL_FCNTRL RT_BIT(1) /* Flush Control */ 213 #define HDA_GCTL_CRST RT_BIT(0) /* Controller Reset */ 214 215 #define HDA_REG_WAKEEN 6 /* 0x0C */ 216 #define HDA_RMX_WAKEEN 6 217 218 #define HDA_REG_STATESTS 7 /* 0x0E */ 219 #define HDA_RMX_STATESTS 7 220 #define HDA_STATESTS_SCSF_MASK 0x7 /* State Change Status Flags (6.2.8). */ 221 222 #define HDA_REG_GSTS 8 /* 0x10-0x11*/ 223 #define HDA_RMX_GSTS 8 224 #define HDA_GSTS_FSTS RT_BIT(1) /* Flush Status */ 225 226 #define HDA_REG_OUTSTRMPAY 9 /* 0x18 */ 227 #define HDA_RMX_OUTSTRMPAY 112 228 229 #define HDA_REG_INSTRMPAY 10 /* 0x1a */ 230 #define HDA_RMX_INSTRMPAY 113 231 232 #define HDA_REG_INTCTL 11 /* 0x20 */ 233 #define HDA_RMX_INTCTL 9 234 #define HDA_INTCTL_GIE RT_BIT(31) /* Global Interrupt Enable */ 235 #define HDA_INTCTL_CIE RT_BIT(30) /* Controller Interrupt Enable */ 236 /** Bits 0-29 correspond to streams 0-29. */ 237 #define HDA_STRMINT_MASK 0xFF /* Streams 0-7 implemented. Applies to INTCTL and INTSTS. */ 238 239 #define HDA_REG_INTSTS 12 /* 0x24 */ 240 #define HDA_RMX_INTSTS 10 241 #define HDA_INTSTS_GIS RT_BIT(31) /* Global Interrupt Status */ 242 #define HDA_INTSTS_CIS RT_BIT(30) /* Controller Interrupt Status */ 243 244 #define HDA_REG_WALCLK 13 /* 0x30 */ 245 /**NB: HDA_RMX_WALCLK is not defined because the register is not stored in memory. */ 246 247 /** 248 * Note: The HDA specification defines a SSYNC register at offset 0x38. The 249 * ICH6/ICH9 datahseet defines SSYNC at offset 0x34. The Linux HDA driver matches 250 * the datasheet. 251 */ 252 #define HDA_REG_SSYNC 14 /* 0x34 */ 253 #define HDA_RMX_SSYNC 12 254 255 #define HDA_REG_CORBLBASE 15 /* 0x40 */ 256 #define HDA_RMX_CORBLBASE 13 257 258 #define HDA_REG_CORBUBASE 16 /* 0x44 */ 259 #define HDA_RMX_CORBUBASE 14 260 261 #define HDA_REG_CORBWP 17 /* 0x48 */ 262 #define HDA_RMX_CORBWP 15 263 264 #define HDA_REG_CORBRP 18 /* 0x4A */ 265 #define HDA_RMX_CORBRP 16 266 #define HDA_CORBRP_RST RT_BIT(15) /* CORB Read Pointer Reset */ 267 268 #define HDA_REG_CORBCTL 19 /* 0x4C */ 269 #define HDA_RMX_CORBCTL 17 270 #define HDA_CORBCTL_DMA RT_BIT(1) /* Enable CORB DMA Engine */ 271 #define HDA_CORBCTL_CMEIE RT_BIT(0) /* CORB Memory Error Interrupt Enable */ 272 273 #define HDA_REG_CORBSTS 20 /* 0x4D */ 274 #define HDA_RMX_CORBSTS 18 275 276 #define HDA_REG_CORBSIZE 21 /* 0x4E */ 277 #define HDA_RMX_CORBSIZE 19 278 #define HDA_CORBSIZE_SZ_CAP 0xF0 279 #define HDA_CORBSIZE_SZ 0x3 280 281 /** Number of CORB buffer entries. */ 282 #define HDA_CORB_SIZE 256 283 /** CORB element size (in bytes). */ 284 #define HDA_CORB_ELEMENT_SIZE 4 285 /** Number of RIRB buffer entries. */ 286 #define HDA_RIRB_SIZE 256 287 /** RIRB element size (in bytes). */ 288 #define HDA_RIRB_ELEMENT_SIZE 8 289 290 #define HDA_REG_RIRBLBASE 22 /* 0x50 */ 291 #define HDA_RMX_RIRBLBASE 20 292 293 #define HDA_REG_RIRBUBASE 23 /* 0x54 */ 294 #define HDA_RMX_RIRBUBASE 21 295 296 #define HDA_REG_RIRBWP 24 /* 0x58 */ 297 #define HDA_RMX_RIRBWP 22 298 #define HDA_RIRBWP_RST RT_BIT(15) /* RIRB Write Pointer Reset */ 299 300 #define HDA_REG_RINTCNT 25 /* 0x5A */ 301 #define HDA_RMX_RINTCNT 23 302 303 /** Maximum number of Response Interrupts. */ 304 #define HDA_MAX_RINTCNT 256 305 306 #define HDA_REG_RIRBCTL 26 /* 0x5C */ 307 #define HDA_RMX_RIRBCTL 24 308 #define HDA_RIRBCTL_ROIC RT_BIT(2) /* Response Overrun Interrupt Control */ 309 #define HDA_RIRBCTL_RDMAEN RT_BIT(1) /* RIRB DMA Enable */ 310 #define HDA_RIRBCTL_RINTCTL RT_BIT(0) /* Response Interrupt Control */ 311 312 #define HDA_REG_RIRBSTS 27 /* 0x5D */ 313 #define HDA_RMX_RIRBSTS 25 314 #define HDA_RIRBSTS_RIRBOIS RT_BIT(2) /* Response Overrun Interrupt Status */ 315 #define HDA_RIRBSTS_RINTFL RT_BIT(0) /* Response Interrupt Flag */ 316 317 #define HDA_REG_RIRBSIZE 28 /* 0x5E */ 318 #define HDA_RMX_RIRBSIZE 26 319 320 #define HDA_REG_IC 29 /* 0x60 */ 321 #define HDA_RMX_IC 27 322 323 #define HDA_REG_IR 30 /* 0x64 */ 324 #define HDA_RMX_IR 28 325 326 #define HDA_REG_IRS 31 /* 0x68 */ 327 #define HDA_RMX_IRS 29 328 #define HDA_IRS_IRV RT_BIT(1) /* Immediate Result Valid */ 329 #define HDA_IRS_ICB RT_BIT(0) /* Immediate Command Busy */ 330 331 #define HDA_REG_DPLBASE 32 /* 0x70 */ 332 #define HDA_RMX_DPLBASE 30 333 334 #define HDA_REG_DPUBASE 33 /* 0x74 */ 335 #define HDA_RMX_DPUBASE 31 336 337 #define DPBASE_ADDR_MASK (~(uint64_t)0x7f) 338 339 #define HDA_STREAM_REG_DEF(name, num) (HDA_REG_SD##num##name) 340 #define HDA_STREAM_RMX_DEF(name, num) (HDA_RMX_SD##num##name) 341 /** @note sdnum here _MUST_ be stream reg number [0,7]. */ 342 #define HDA_STREAM_REG(pThis, name, sdnum) (HDA_REG_IND((pThis), HDA_REG_SD0##name + (sdnum) * 10)) 343 344 #define HDA_SD_NUM_FROM_REG(pThis, func, reg) ((reg - HDA_STREAM_REG_DEF(func, 0)) / 10) 345 346 /** @todo Condense marcos! */ 347 348 #define HDA_REG_SD0CTL HDA_NUM_GENERAL_REGS /* 0x80; other streams offset by 0x20 */ 349 #define HDA_RMX_SD0CTL 32 350 #define HDA_RMX_SD1CTL (HDA_STREAM_RMX_DEF(CTL, 0) + 10) 351 #define HDA_RMX_SD2CTL (HDA_STREAM_RMX_DEF(CTL, 0) + 20) 352 #define HDA_RMX_SD3CTL (HDA_STREAM_RMX_DEF(CTL, 0) + 30) 353 #define HDA_RMX_SD4CTL (HDA_STREAM_RMX_DEF(CTL, 0) + 40) 354 #define HDA_RMX_SD5CTL (HDA_STREAM_RMX_DEF(CTL, 0) + 50) 355 #define HDA_RMX_SD6CTL (HDA_STREAM_RMX_DEF(CTL, 0) + 60) 356 #define HDA_RMX_SD7CTL (HDA_STREAM_RMX_DEF(CTL, 0) + 70) 357 358 #define HDA_SDCTL_NUM_MASK 0xF 359 #define HDA_SDCTL_NUM_SHIFT 20 360 #define HDA_SDCTL_DIR RT_BIT(19) /* Direction (Bidirectional streams only!) */ 361 #define HDA_SDCTL_TP RT_BIT(18) /* Traffic Priority (PCI Express) */ 362 #define HDA_SDCTL_STRIPE_MASK 0x3 363 #define HDA_SDCTL_STRIPE_SHIFT 16 364 #define HDA_SDCTL_DEIE RT_BIT(4) /* Descriptor Error Interrupt Enable */ 365 #define HDA_SDCTL_FEIE RT_BIT(3) /* FIFO Error Interrupt Enable */ 366 #define HDA_SDCTL_IOCE RT_BIT(2) /* Interrupt On Completion Enable */ 367 #define HDA_SDCTL_RUN RT_BIT(1) /* Stream Run */ 368 #define HDA_SDCTL_SRST RT_BIT(0) /* Stream Reset */ 369 370 #define HDA_REG_SD0STS 35 /* 0x83; other streams offset by 0x20 */ 371 #define HDA_RMX_SD0STS 33 372 #define HDA_RMX_SD1STS (HDA_STREAM_RMX_DEF(STS, 0) + 10) 373 #define HDA_RMX_SD2STS (HDA_STREAM_RMX_DEF(STS, 0) + 20) 374 #define HDA_RMX_SD3STS (HDA_STREAM_RMX_DEF(STS, 0) + 30) 375 #define HDA_RMX_SD4STS (HDA_STREAM_RMX_DEF(STS, 0) + 40) 376 #define HDA_RMX_SD5STS (HDA_STREAM_RMX_DEF(STS, 0) + 50) 377 #define HDA_RMX_SD6STS (HDA_STREAM_RMX_DEF(STS, 0) + 60) 378 #define HDA_RMX_SD7STS (HDA_STREAM_RMX_DEF(STS, 0) + 70) 379 380 #define HDA_SDSTS_FIFORDY RT_BIT(5) /* FIFO Ready */ 381 #define HDA_SDSTS_DESE RT_BIT(4) /* Descriptor Error */ 382 #define HDA_SDSTS_FIFOE RT_BIT(3) /* FIFO Error */ 383 #define HDA_SDSTS_BCIS RT_BIT(2) /* Buffer Completion Interrupt Status */ 384 385 #define HDA_REG_SD0LPIB 36 /* 0x84; other streams offset by 0x20 */ 386 #define HDA_REG_SD1LPIB (HDA_STREAM_REG_DEF(LPIB, 0) + 10) /* 0xA4 */ 387 #define HDA_REG_SD2LPIB (HDA_STREAM_REG_DEF(LPIB, 0) + 20) /* 0xC4 */ 388 #define HDA_REG_SD3LPIB (HDA_STREAM_REG_DEF(LPIB, 0) + 30) /* 0xE4 */ 389 #define HDA_REG_SD4LPIB (HDA_STREAM_REG_DEF(LPIB, 0) + 40) /* 0x104 */ 390 #define HDA_REG_SD5LPIB (HDA_STREAM_REG_DEF(LPIB, 0) + 50) /* 0x124 */ 391 #define HDA_REG_SD6LPIB (HDA_STREAM_REG_DEF(LPIB, 0) + 60) /* 0x144 */ 392 #define HDA_REG_SD7LPIB (HDA_STREAM_REG_DEF(LPIB, 0) + 70) /* 0x164 */ 393 #define HDA_RMX_SD0LPIB 34 394 #define HDA_RMX_SD1LPIB (HDA_STREAM_RMX_DEF(LPIB, 0) + 10) 395 #define HDA_RMX_SD2LPIB (HDA_STREAM_RMX_DEF(LPIB, 0) + 20) 396 #define HDA_RMX_SD3LPIB (HDA_STREAM_RMX_DEF(LPIB, 0) + 30) 397 #define HDA_RMX_SD4LPIB (HDA_STREAM_RMX_DEF(LPIB, 0) + 40) 398 #define HDA_RMX_SD5LPIB (HDA_STREAM_RMX_DEF(LPIB, 0) + 50) 399 #define HDA_RMX_SD6LPIB (HDA_STREAM_RMX_DEF(LPIB, 0) + 60) 400 #define HDA_RMX_SD7LPIB (HDA_STREAM_RMX_DEF(LPIB, 0) + 70) 401 402 #define HDA_REG_SD0CBL 37 /* 0x88; other streams offset by 0x20 */ 403 #define HDA_RMX_SD0CBL 35 404 #define HDA_RMX_SD1CBL (HDA_STREAM_RMX_DEF(CBL, 0) + 10) 405 #define HDA_RMX_SD2CBL (HDA_STREAM_RMX_DEF(CBL, 0) + 20) 406 #define HDA_RMX_SD3CBL (HDA_STREAM_RMX_DEF(CBL, 0) + 30) 407 #define HDA_RMX_SD4CBL (HDA_STREAM_RMX_DEF(CBL, 0) + 40) 408 #define HDA_RMX_SD5CBL (HDA_STREAM_RMX_DEF(CBL, 0) + 50) 409 #define HDA_RMX_SD6CBL (HDA_STREAM_RMX_DEF(CBL, 0) + 60) 410 #define HDA_RMX_SD7CBL (HDA_STREAM_RMX_DEF(CBL, 0) + 70) 411 412 #define HDA_REG_SD0LVI 38 /* 0x8C; other streams offset by 0x20 */ 413 #define HDA_RMX_SD0LVI 36 414 #define HDA_RMX_SD1LVI (HDA_STREAM_RMX_DEF(LVI, 0) + 10) 415 #define HDA_RMX_SD2LVI (HDA_STREAM_RMX_DEF(LVI, 0) + 20) 416 #define HDA_RMX_SD3LVI (HDA_STREAM_RMX_DEF(LVI, 0) + 30) 417 #define HDA_RMX_SD4LVI (HDA_STREAM_RMX_DEF(LVI, 0) + 40) 418 #define HDA_RMX_SD5LVI (HDA_STREAM_RMX_DEF(LVI, 0) + 50) 419 #define HDA_RMX_SD6LVI (HDA_STREAM_RMX_DEF(LVI, 0) + 60) 420 #define HDA_RMX_SD7LVI (HDA_STREAM_RMX_DEF(LVI, 0) + 70) 421 422 #define HDA_REG_SD0FIFOW 39 /* 0x8E; other streams offset by 0x20 */ 423 #define HDA_RMX_SD0FIFOW 37 424 #define HDA_RMX_SD1FIFOW (HDA_STREAM_RMX_DEF(FIFOW, 0) + 10) 425 #define HDA_RMX_SD2FIFOW (HDA_STREAM_RMX_DEF(FIFOW, 0) + 20) 426 #define HDA_RMX_SD3FIFOW (HDA_STREAM_RMX_DEF(FIFOW, 0) + 30) 427 #define HDA_RMX_SD4FIFOW (HDA_STREAM_RMX_DEF(FIFOW, 0) + 40) 428 #define HDA_RMX_SD5FIFOW (HDA_STREAM_RMX_DEF(FIFOW, 0) + 50) 429 #define HDA_RMX_SD6FIFOW (HDA_STREAM_RMX_DEF(FIFOW, 0) + 60) 430 #define HDA_RMX_SD7FIFOW (HDA_STREAM_RMX_DEF(FIFOW, 0) + 70) 431 432 /* 433 * ICH6 datasheet defined limits for FIFOW values (18.2.38). 434 */ 435 #define HDA_SDFIFOW_8B 0x2 436 #define HDA_SDFIFOW_16B 0x3 437 #define HDA_SDFIFOW_32B 0x4 438 439 #define HDA_REG_SD0FIFOS 40 /* 0x90; other streams offset by 0x20 */ 440 #define HDA_RMX_SD0FIFOS 38 441 #define HDA_RMX_SD1FIFOS (HDA_STREAM_RMX_DEF(FIFOS, 0) + 10) 442 #define HDA_RMX_SD2FIFOS (HDA_STREAM_RMX_DEF(FIFOS, 0) + 20) 443 #define HDA_RMX_SD3FIFOS (HDA_STREAM_RMX_DEF(FIFOS, 0) + 30) 444 #define HDA_RMX_SD4FIFOS (HDA_STREAM_RMX_DEF(FIFOS, 0) + 40) 445 #define HDA_RMX_SD5FIFOS (HDA_STREAM_RMX_DEF(FIFOS, 0) + 50) 446 #define HDA_RMX_SD6FIFOS (HDA_STREAM_RMX_DEF(FIFOS, 0) + 60) 447 #define HDA_RMX_SD7FIFOS (HDA_STREAM_RMX_DEF(FIFOS, 0) + 70) 448 449 #define HDA_SDIFIFO_120B 0x77 /* 8-, 16-, 20-, 24-, 32-bit Input Streams */ 450 #define HDA_SDIFIFO_160B 0x9F /* 20-, 24-bit Input Streams Streams */ 451 452 #define HDA_SDOFIFO_16B 0x0F /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 453 #define HDA_SDOFIFO_32B 0x1F /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 454 #define HDA_SDOFIFO_64B 0x3F /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 455 #define HDA_SDOFIFO_128B 0x7F /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 456 #define HDA_SDOFIFO_192B 0xBF /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 457 #define HDA_SDOFIFO_256B 0xFF /* 20-, 24-bit Output Streams */ 458 459 #define HDA_REG_SD0FMT 41 /* 0x92; other streams offset by 0x20 */ 460 #define HDA_RMX_SD0FMT 39 461 #define HDA_RMX_SD1FMT (HDA_STREAM_RMX_DEF(FMT, 0) + 10) 462 #define HDA_RMX_SD2FMT (HDA_STREAM_RMX_DEF(FMT, 0) + 20) 463 #define HDA_RMX_SD3FMT (HDA_STREAM_RMX_DEF(FMT, 0) + 30) 464 #define HDA_RMX_SD4FMT (HDA_STREAM_RMX_DEF(FMT, 0) + 40) 465 #define HDA_RMX_SD5FMT (HDA_STREAM_RMX_DEF(FMT, 0) + 50) 466 #define HDA_RMX_SD6FMT (HDA_STREAM_RMX_DEF(FMT, 0) + 60) 467 #define HDA_RMX_SD7FMT (HDA_STREAM_RMX_DEF(FMT, 0) + 70) 468 469 #define HDA_REG_SD0BDPL 42 /* 0x98; other streams offset by 0x20 */ 470 #define HDA_RMX_SD0BDPL 40 471 #define HDA_RMX_SD1BDPL (HDA_STREAM_RMX_DEF(BDPL, 0) + 10) 472 #define HDA_RMX_SD2BDPL (HDA_STREAM_RMX_DEF(BDPL, 0) + 20) 473 #define HDA_RMX_SD3BDPL (HDA_STREAM_RMX_DEF(BDPL, 0) + 30) 474 #define HDA_RMX_SD4BDPL (HDA_STREAM_RMX_DEF(BDPL, 0) + 40) 475 #define HDA_RMX_SD5BDPL (HDA_STREAM_RMX_DEF(BDPL, 0) + 50) 476 #define HDA_RMX_SD6BDPL (HDA_STREAM_RMX_DEF(BDPL, 0) + 60) 477 #define HDA_RMX_SD7BDPL (HDA_STREAM_RMX_DEF(BDPL, 0) + 70) 478 479 #define HDA_REG_SD0BDPU 43 /* 0x9C; other streams offset by 0x20 */ 480 #define HDA_RMX_SD0BDPU 41 481 #define HDA_RMX_SD1BDPU (HDA_STREAM_RMX_DEF(BDPU, 0) + 10) 482 #define HDA_RMX_SD2BDPU (HDA_STREAM_RMX_DEF(BDPU, 0) + 20) 483 #define HDA_RMX_SD3BDPU (HDA_STREAM_RMX_DEF(BDPU, 0) + 30) 484 #define HDA_RMX_SD4BDPU (HDA_STREAM_RMX_DEF(BDPU, 0) + 40) 485 #define HDA_RMX_SD5BDPU (HDA_STREAM_RMX_DEF(BDPU, 0) + 50) 486 #define HDA_RMX_SD6BDPU (HDA_STREAM_RMX_DEF(BDPU, 0) + 60) 487 #define HDA_RMX_SD7BDPU (HDA_STREAM_RMX_DEF(BDPU, 0) + 70) 488 489 #define HDA_CODEC_CAD_SHIFT 28 490 /** Encodes the (required) LUN into a codec command. */ 491 #define HDA_CODEC_CMD(cmd, lun) ((cmd) | (lun << HDA_CODEC_CAD_SHIFT)) 492 493 #define HDA_SDFMT_NON_PCM_SHIFT 15 494 #define HDA_SDFMT_NON_PCM_MASK 0x1 495 #define HDA_SDFMT_BASE_RATE_SHIFT 14 496 #define HDA_SDFMT_BASE_RATE_MASK 0x1 497 #define HDA_SDFMT_MULT_SHIFT 11 498 #define HDA_SDFMT_MULT_MASK 0x7 499 #define HDA_SDFMT_DIV_SHIFT 8 500 #define HDA_SDFMT_DIV_MASK 0x7 501 #define HDA_SDFMT_BITS_SHIFT 4 502 #define HDA_SDFMT_BITS_MASK 0x7 503 #define HDA_SDFMT_CHANNELS_MASK 0xF 504 505 #define HDA_SDFMT_TYPE RT_BIT(15) 506 #define HDA_SDFMT_TYPE_PCM (0) 507 #define HDA_SDFMT_TYPE_NON_PCM (1) 508 509 #define HDA_SDFMT_BASE RT_BIT(14) 510 #define HDA_SDFMT_BASE_48KHZ (0) 511 #define HDA_SDFMT_BASE_44KHZ (1) 512 513 #define HDA_SDFMT_MULT_1X (0) 514 #define HDA_SDFMT_MULT_2X (1) 515 #define HDA_SDFMT_MULT_3X (2) 516 #define HDA_SDFMT_MULT_4X (3) 517 518 #define HDA_SDFMT_DIV_1X (0) 519 #define HDA_SDFMT_DIV_2X (1) 520 #define HDA_SDFMT_DIV_3X (2) 521 #define HDA_SDFMT_DIV_4X (3) 522 #define HDA_SDFMT_DIV_5X (4) 523 #define HDA_SDFMT_DIV_6X (5) 524 #define HDA_SDFMT_DIV_7X (6) 525 #define HDA_SDFMT_DIV_8X (7) 526 527 #define HDA_SDFMT_8_BIT (0) 528 #define HDA_SDFMT_16_BIT (1) 529 #define HDA_SDFMT_20_BIT (2) 530 #define HDA_SDFMT_24_BIT (3) 531 #define HDA_SDFMT_32_BIT (4) 532 533 #define HDA_SDFMT_CHAN_MONO (0) 534 #define HDA_SDFMT_CHAN_STEREO (1) 535 536 /** Emits a SDnFMT register format. 537 * Also being used in the codec's converter format. */ 538 #define HDA_SDFMT_MAKE(_afNonPCM, _aBaseRate, _aMult, _aDiv, _aBits, _aChan) \ 539 ( (((_afNonPCM) & HDA_SDFMT_NON_PCM_MASK) << HDA_SDFMT_NON_PCM_SHIFT) \ 540 | (((_aBaseRate) & HDA_SDFMT_BASE_RATE_MASK) << HDA_SDFMT_BASE_RATE_SHIFT) \ 541 | (((_aMult) & HDA_SDFMT_MULT_MASK) << HDA_SDFMT_MULT_SHIFT) \ 542 | (((_aDiv) & HDA_SDFMT_DIV_MASK) << HDA_SDFMT_DIV_SHIFT) \ 543 | (((_aBits) & HDA_SDFMT_BITS_MASK) << HDA_SDFMT_BITS_SHIFT) \ 544 | ( (_aChan) & HDA_SDFMT_CHANNELS_MASK)) 545 546 /** Interrupt on completion (IOC) flag. */ 547 #define HDA_BDLE_F_IOC RT_BIT(0) 548 549 550 /** 551 * BDL description structure. 552 * Do not touch this, as this must match to the HDA specs. 553 */ 554 typedef struct HDABDLEDESC 555 { 556 /** Starting address of the actual buffer. Must be 128-bit aligned. */ 557 uint64_t u64BufAddr; 558 /** Size of the actual buffer (in bytes). */ 559 uint32_t u32BufSize; 560 /** Bit 0: Interrupt on completion; the controller will generate 561 * an interrupt when the last byte of the buffer has been 562 * fetched by the DMA engine. 563 * 564 * Rest is reserved for further use and must be 0. */ 565 uint32_t fFlags; 566 } HDABDLEDESC, *PHDABDLEDESC; 567 AssertCompileSize(HDABDLEDESC, 16); /* Always 16 byte. Also must be aligned on 128-byte boundary. */ 568 79 569 80 570 … … 98 588 R3PTRTYPE(PAUDMIXSINK) pMixSink; 99 589 } HDAMIXERSINK; 100 /** Pointer to an HDA mixer sink definition (ring-3). */101 typedef HDAMIXERSINK *PHDAMIXERSINK;102 590 103 591 /** … … 303 791 typedef CTX_SUFF(PHDASTATE) PHDASTATECC; 304 792 793 794 /** @def HDA_PROCESS_INTERRUPT 795 * Wrapper around hdaProcessInterrupt that supplies the source function name 796 * string in logging builds. */ 797 #if defined(LOG_ENABLED) || defined(DOXYGEN_RUNNING) 798 void hdaProcessInterrupt(PPDMDEVINS pDevIns, PHDASTATE pThis, const char *pszSource); 799 # define HDA_PROCESS_INTERRUPT(a_pDevIns, a_pThis) hdaProcessInterrupt((a_pDevIns), (a_pThis), __FUNCTION__) 800 #else 801 void hdaProcessInterrupt(PPDMDEVINS pDevIns, PHDASTATE pThis); 802 # define HDA_PROCESS_INTERRUPT(a_pDevIns, a_pThis) hdaProcessInterrupt((a_pDevIns), (a_pThis)) 803 #endif 804 805 /** 806 * Returns the audio direction of a specified stream descriptor. 807 * 808 * The register layout specifies that input streams (SDI) come first, 809 * followed by the output streams (SDO). So every stream ID below HDA_MAX_SDI 810 * is an input stream, whereas everything >= HDA_MAX_SDI is an output stream. 811 * 812 * @note SDnFMT register does not provide that information, so we have to judge 813 * for ourselves. 814 * 815 * @return Audio direction. 816 * @param uSD The stream number. 817 */ 818 DECLINLINE(PDMAUDIODIR) hdaGetDirFromSD(uint8_t uSD) 819 { 820 if (uSD < HDA_MAX_SDI) 821 return PDMAUDIODIR_IN; 822 AssertReturn(uSD < HDA_MAX_STREAMS, PDMAUDIODIR_UNKNOWN); 823 return PDMAUDIODIR_OUT; 824 } 825 826 /* Used by hdaR3StreamSetUp: */ 827 uint8_t hdaSDFIFOWToBytes(uint16_t u16RegFIFOW); 828 305 829 #endif /* !VBOX_INCLUDED_SRC_Audio_DevHda_h */ 306 830 -
trunk/src/VBox/Devices/Audio/DevHdaCodec.cpp
r89869 r89887 41 41 #include "AudioMixer.h" 42 42 #include "DevHda.h" 43 #include "DevHdaCodec.h"44 #include "DevHdaCommon.h"45 43 46 44 -
trunk/src/VBox/Devices/Audio/DevHdaStream.cpp
r89885 r89887 206 206 LogFlowFuncLeave(); 207 207 } 208 209 210 /** 211 * Converts an HDA stream's SDFMT register into a given PCM properties structure. 212 * 213 * @returns VBox status code. 214 * @param u16SDFMT The HDA stream's SDFMT value to convert. 215 * @param pProps PCM properties structure to hold converted result on success. 216 */ 217 int hdaR3SDFMTToPCMProps(uint16_t u16SDFMT, PPDMAUDIOPCMPROPS pProps) 218 { 219 AssertPtrReturn(pProps, VERR_INVALID_POINTER); 220 221 # define EXTRACT_VALUE(v, mask, shift) ((v & ((mask) << (shift))) >> (shift)) 222 223 int rc = VINF_SUCCESS; 224 225 uint32_t u32Hz = EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_BASE_RATE_MASK, HDA_SDFMT_BASE_RATE_SHIFT) 226 ? 44100 : 48000; 227 uint32_t u32HzMult = 1; 228 uint32_t u32HzDiv = 1; 229 230 switch (EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_MULT_MASK, HDA_SDFMT_MULT_SHIFT)) 231 { 232 case 0: u32HzMult = 1; break; 233 case 1: u32HzMult = 2; break; 234 case 2: u32HzMult = 3; break; 235 case 3: u32HzMult = 4; break; 236 default: 237 LogFunc(("Unsupported multiplier %x\n", 238 EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_MULT_MASK, HDA_SDFMT_MULT_SHIFT))); 239 rc = VERR_NOT_SUPPORTED; 240 break; 241 } 242 switch (EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_DIV_MASK, HDA_SDFMT_DIV_SHIFT)) 243 { 244 case 0: u32HzDiv = 1; break; 245 case 1: u32HzDiv = 2; break; 246 case 2: u32HzDiv = 3; break; 247 case 3: u32HzDiv = 4; break; 248 case 4: u32HzDiv = 5; break; 249 case 5: u32HzDiv = 6; break; 250 case 6: u32HzDiv = 7; break; 251 case 7: u32HzDiv = 8; break; 252 default: 253 LogFunc(("Unsupported divisor %x\n", 254 EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_DIV_MASK, HDA_SDFMT_DIV_SHIFT))); 255 rc = VERR_NOT_SUPPORTED; 256 break; 257 } 258 259 uint8_t cbSample = 0; 260 switch (EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_BITS_MASK, HDA_SDFMT_BITS_SHIFT)) 261 { 262 case 0: 263 cbSample = 1; 264 break; 265 case 1: 266 cbSample = 2; 267 break; 268 case 4: 269 cbSample = 4; 270 break; 271 default: 272 AssertMsgFailed(("Unsupported bits per sample %x\n", 273 EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_BITS_MASK, HDA_SDFMT_BITS_SHIFT))); 274 rc = VERR_NOT_SUPPORTED; 275 break; 276 } 277 278 if (RT_SUCCESS(rc)) 279 { 280 PDMAudioPropsInit(pProps, cbSample, true /*fSigned*/, (u16SDFMT & 0xf) + 1 /*cChannels*/, u32Hz * u32HzMult / u32HzDiv); 281 /** @todo is there anything we need to / can do about channel assignments? */ 282 } 283 284 # undef EXTRACT_VALUE 285 return rc; 286 } 287 288 # ifdef LOG_ENABLED 289 void hdaR3BDLEDumpAll(PPDMDEVINS pDevIns, PHDASTATE pThis, uint64_t u64BDLBase, uint16_t cBDLE) 290 { 291 LogFlowFunc(("BDLEs @ 0x%x (%RU16):\n", u64BDLBase, cBDLE)); 292 if (!u64BDLBase) 293 return; 294 295 uint32_t cbBDLE = 0; 296 for (uint16_t i = 0; i < cBDLE; i++) 297 { 298 HDABDLEDESC bd; 299 PDMDevHlpPhysRead(pDevIns, u64BDLBase + i * sizeof(HDABDLEDESC), &bd, sizeof(bd)); 300 301 LogFunc(("\t#%03d BDLE(adr:0x%llx, size:%RU32, ioc:%RTbool)\n", 302 i, bd.u64BufAddr, bd.u32BufSize, bd.fFlags & HDA_BDLE_F_IOC)); 303 304 cbBDLE += bd.u32BufSize; 305 } 306 307 LogFlowFunc(("Total: %RU32 bytes\n", cbBDLE)); 308 309 if (!pThis->u64DPBase) /* No DMA base given? Bail out. */ 310 return; 311 312 LogFlowFunc(("DMA counters:\n")); 313 314 for (int i = 0; i < cBDLE; i++) 315 { 316 uint32_t uDMACnt; 317 PDMDevHlpPhysRead(pDevIns, (pThis->u64DPBase & DPBASE_ADDR_MASK) + (i * 2 * sizeof(uint32_t)), 318 &uDMACnt, sizeof(uDMACnt)); 319 320 LogFlowFunc(("\t#%03d DMA @ 0x%x\n", i , uDMACnt)); 321 } 322 } 323 # endif /* LOG_ENABLED */ 208 324 209 325 … … 793 909 return rc; 794 910 } 911 912 913 /** 914 * Worker for hdaR3StreamReset(). 915 * 916 * @returns The default mixer sink, NULL if none found. 917 * @param pThisCC The ring-3 HDA device state. 918 * @param uSD SD# to return mixer sink for. 919 * NULL if not found / handled. 920 */ 921 static PHDAMIXERSINK hdaR3GetDefaultSink(PHDASTATER3 pThisCC, uint8_t uSD) 922 { 923 if (hdaGetDirFromSD(uSD) == PDMAUDIODIR_IN) 924 { 925 const uint8_t uFirstSDI = 0; 926 927 if (uSD == uFirstSDI) /* First SDI. */ 928 return &pThisCC->SinkLineIn; 929 # ifdef VBOX_WITH_AUDIO_HDA_MIC_IN 930 if (uSD == uFirstSDI + 1) 931 return &pThisCC->SinkMicIn; 932 # else 933 /* If we don't have a dedicated Mic-In sink, use the always present Line-In sink. */ 934 return &pThisCC->SinkLineIn; 935 # endif 936 } 937 else 938 { 939 const uint8_t uFirstSDO = HDA_MAX_SDI; 940 941 if (uSD == uFirstSDO) 942 return &pThisCC->SinkFront; 943 # ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND 944 if (uSD == uFirstSDO + 1) 945 return &pThisCC->SinkCenterLFE; 946 if (uSD == uFirstSDO + 2) 947 return &pThisCC->SinkRear; 948 # endif 949 } 950 951 return NULL; 952 } 953 795 954 796 955 /** -
trunk/src/VBox/Devices/Audio/DevHdaStream.h
r89885 r89887 337 337 /** @} */ 338 338 339 /** @name Helper functions associated with the stream code. 340 * @{ */ 341 int hdaR3SDFMTToPCMProps(uint16_t u16SDFMT, PPDMAUDIOPCMPROPS pProps); 342 # ifdef LOG_ENABLED 343 void hdaR3BDLEDumpAll(PPDMDEVINS pDevIns, PHDASTATE pThis, uint64_t u64BDLBase, uint16_t cBDLE); 344 # endif 345 /** @} */ 346 339 347 #endif /* IN_RING3 */ 340 348 #endif /* !VBOX_INCLUDED_SRC_Audio_DevHdaStream_h */ -
trunk/src/VBox/Devices/Makefile.kmk
r89414 r89887 638 638 Audio/DevSB16.cpp \ 639 639 Audio/DevHda.cpp \ 640 Audio/DevHdaCommon.cpp \641 640 Audio/DevHdaCodec.cpp \ 642 641 Audio/DevHdaStream.cpp \ … … 1005 1004 VBoxDDRC_SOURCES += \ 1006 1005 Audio/DevHda.cpp \ 1007 Audio/DevHdaCommon.cpp \1008 1006 Audio/DevIchAc97.cpp 1009 1007 … … 1235 1233 VBoxDDR0_SOURCES += \ 1236 1234 Audio/DevHda.cpp \ 1237 Audio/DevHdaCommon.cpp \1238 1235 Audio/DevHdaStream.cpp \ 1239 1236 Audio/DevIchAc97.cpp
Note:
See TracChangeset
for help on using the changeset viewer.