- Timestamp:
- Mar 30, 2015 12:07:39 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 99276
- Location:
- trunk
- Files:
-
- 1 deleted
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/pdmaudioifs.h
r54491 r55005 30 30 #include <iprt/list.h> 31 31 32 #ifndef VBOX_WITH_PDM_AUDIO_DRIVER 32 33 typedef struct 33 34 { … … 36 37 uint32_t l; 37 38 } volume_t; 39 #endif 38 40 39 41 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER … … 137 139 PDMAUDIOMIXERCTL_PCM, 138 140 PDMAUDIOMIXERCTL_LINE_IN, 141 PDMAUDIOMIXERCTL_MIC_IN, 139 142 /** Hack to blow the type up to 32-bit. */ 140 143 PDMAUDIOMIXERCTL_32BIT_HACK = 0x7fffffff … … 199 202 bool fSwapEndian; 200 203 } PDMPCMPROPS, *PPDMPCMPROPS; 204 205 /** 206 * Structure keeping an audio volume level. 207 */ 208 typedef struct PDMAUDIOVOLUME 209 { 210 /** Set to @c true if this stream is muted, @c false if not. */ 211 bool fMuted; 212 /** Left channel volume. */ 213 uint32_t uLeft; 214 /** Right channel volume. */ 215 uint32_t uRight; 216 } PDMAUDIOVOLUME, *PPDMAUDIOVOLUME; 201 217 202 218 /** … … 243 259 * in the samples buffer. */ 244 260 uint32_t offReadWrite; 245 /** Total samples already mixed down to the 246 * parent buffer (if any). Always starting at 247 * the parent's offReadWrite position. 248 * Note: Count always is specified in parent samples, 249 * as the sample count can differ between parent 250 * and child. */ 261 /** 262 * Total samples already mixed down to the parent buffer (if any). Always starting at 263 * the parent's offReadWrite position. 264 * 265 * Note: Count always is specified in parent samples, as the sample count can differ between parent 266 * and child. 267 */ 251 268 uint32_t cMixed; 252 269 uint32_t cProcessed; 253 270 /** Pointer to parent buffer (if any). */ 254 271 PPDMAUDIOMIXBUF pParent; 255 /** List of children mix buffers to keep 256 * in sync with (if being a parent buffer). */ 272 /** List of children mix buffers to keep in sync with (if being a parent buffer). */ 257 273 RTLISTANCHOR lstBuffers; 258 /** Intermediate structure for buffer 259 * conversion tasks. */ 274 /** Intermediate structure for buffer conversion tasks. */ 260 275 PPDMAUDIOSTRMRATE pRate; 276 /** Current volume used for mixing. */ 277 PDMAUDIOVOLUME Volume; 261 278 /** This buffer's audio format. */ 262 279 PDMAUDIOMIXBUFFMT AudioFmt; … … 335 352 /** Guest audio output stream has some samples or not. */ 336 353 bool fEmpty; 337 /** Set to @c true if this stream is muted, @c false if not. */338 bool fMuted;339 354 /** Name of this stream. */ 340 355 char *pszName; 341 /** Left channel volume. */342 uint32_t uVolumeLeft;343 /** Right channel volume. */344 uint32_t uVolumeRight;345 356 } PDMAUDIOGSTSTRMSTATE, *PPDMAUDIOGSTSTRMSTATE; 346 357 … … 443 454 */ 444 455 DECLR3CALLBACKMEMBER(int, pfnInitNull, (PPDMIAUDIOCONNECTOR pInterface)); 445 446 /**447 * Sets the audio volume of a specific guest output stream.448 *449 * @returns VBox status code.450 * @param pInterface Pointer to the interface structure containing the called function pointer.451 * @param pGstStrmOut Pointer to guest output stream.452 * @param fMute Whether to mute or not.453 * @param uVolLeft Left audio stream volume.454 * @param uVolRight Right audio stream volume.455 */456 DECLR3CALLBACKMEMBER(int, pfnSetVolumeOut, (PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut,457 bool fMute, uint8_t uVolLeft, uint8_t uVolRight));458 459 /**460 * Sets the overall audio volume.461 *462 * @returns VBox status code.463 * @param pInterface Pointer to the interface structure containing the called function pointer.464 * @param fMute Whether to mute or not.465 * @param uVolLeft Left audio stream volume.466 * @param uVolRight Right audio stream volume.467 */468 DECLR3CALLBACKMEMBER(int, pfnSetVolume, (PPDMIAUDIOCONNECTOR pInterface,469 bool fMute, uint8_t uVolLeft, uint8_t uVolRight));470 456 471 457 /** -
trunk/src/VBox/Devices/Audio/AudioMixBuffer.cpp
r54980 r55005 48 48 #include "AudioMixBuffer.h" 49 49 50 #if 050 #if 1 51 51 # define AUDMIXBUF_LOG(x) LogFlowFunc(x) 52 52 #else … … 57 57 # endif 58 58 #endif 59 60 /** 61 * Structure for holding sample conversion parameters for 62 * the audioMixBufConvFromXXX / audioMixBufConvToXXX macros. 63 */ 64 typedef struct AUDMIXBUF_CONVOPTS 65 { 66 /** Number of audio samples to convert. */ 67 uint32_t cSamples; 68 /** Volume to apply during conversion. Pass 0 69 * to convert the original values. May not apply to 70 * all conversion functions. */ 71 PDMAUDIOVOLUME Volume; 72 } AUDMIXBUF_CONVOPTS, *PAUDMIXBUF_CONVOPTS; 59 73 60 74 /* … … 76 90 static inline void audioMixBufPrint(PPDMAUDIOMIXBUF pMixBuf); 77 91 78 typedef uint32_t (AUDMIXBUF_FN_CONVFROM) (PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, uint32_t cSamples);92 typedef uint32_t (AUDMIXBUF_FN_CONVFROM) (PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, const PAUDMIXBUF_CONVOPTS pOpts); 79 93 typedef AUDMIXBUF_FN_CONVFROM *PAUDMIXBUF_FN_CONVFROM; 80 94 81 typedef void (AUDMIXBUF_FN_CONVTO) (void *pvDst, const PPDMAUDIOSAMPLE paSrc, uint32_t cSamples);95 typedef void (AUDMIXBUF_FN_CONVTO) (void *pvDst, const PPDMAUDIOSAMPLE paSrc, const PAUDMIXBUF_CONVOPTS pOpts); 82 96 typedef AUDMIXBUF_FN_CONVTO *PAUDMIXBUF_FN_CONVTO; 83 97 … … 186 200 } 187 201 202 if (pMixBuf->pRate) 203 { 204 RTMemFree(pMixBuf->pRate); 205 pMixBuf->pRate = NULL; 206 } 207 188 208 audioMixBufFreeBuf(pMixBuf); 189 209 } … … 249 269 /** 250 270 * Macro for generating the conversion routines from/to different formats. 271 * Be careful what to pass in/out, as most of the macros are optimized for speed and 272 * thus don't do any bounds checking! 273 * 251 274 * Note: Currently does not handle any endianess conversion yet! 252 275 */ … … 273 296 } \ 274 297 \ 275 AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Stereo(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, uint32_t cSamples) \ 298 AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Stereo(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, \ 299 const PAUDMIXBUF_CONVOPTS pOpts) \ 276 300 { \ 277 301 _aType *pSrc = (_aType *)pvSrc; \ 278 cSamples = (uint32_t)RT_MIN(cSamples, cbSrc / sizeof(_aType)); \279 AUDMIXBUF_MACRO_LOG(("cSamples=%RU32, sizeof(%zu)\n", cSamples, sizeof(_aType))); \302 uint32_t cSamples = (uint32_t)RT_MIN(pOpts->cSamples, cbSrc / sizeof(_aType)); \ 303 AUDMIXBUF_MACRO_LOG(("cSamples=%RU32, sizeof(%zu)\n", pOpts->cSamples, sizeof(_aType))); \ 280 304 for (uint32_t i = 0; i < cSamples; i++) \ 281 305 { \ 282 306 AUDMIXBUF_MACRO_LOG(("%p: l=%RI16, r=%RI16\n", paDst, *pSrc, *(pSrc + 1))); \ 283 paDst->u64LSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), 0x5F000000 /* Volume */) >> 31); \284 paDst->u64RSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), 0x5F000000 /* Volume */) >> 31); \307 paDst->u64LSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uLeft ) >> 31); \ 308 paDst->u64RSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uRight) >> 31); \ 285 309 AUDMIXBUF_MACRO_LOG(("\t-> l=%RI64, r=%RI64\n", paDst->u64LSample, paDst->u64RSample)); \ 286 310 paDst++; \ … … 290 314 } \ 291 315 \ 292 AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Mono(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, uint32_t cSamples) \ 316 AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Mono(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, \ 317 const PAUDMIXBUF_CONVOPTS pOpts) \ 293 318 { \ 294 319 _aType *pSrc = (_aType *)pvSrc; \ 295 cSamples = (uint32_t)RT_MIN(cSamples, cbSrc / sizeof(_aType)); \320 uint32_t cSamples = (uint32_t)RT_MIN(pOpts->cSamples, cbSrc / sizeof(_aType)); \ 296 321 AUDMIXBUF_MACRO_LOG(("cSamples=%RU32, sizeof(%zu)\n", cSamples, sizeof(_aType))); \ 297 322 for (uint32_t i = 0; i < cSamples; i++) \ 298 323 { \ 299 paDst->u64LSample = ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(pSrc[0]), 0x5F000000 /* Volume */); \324 paDst->u64LSample = ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(pSrc[0]), pOpts->Volume.uLeft); \ 300 325 paDst->u64RSample = paDst->u64LSample; \ 301 326 pSrc++; \ … … 306 331 } \ 307 332 \ 308 /* Note: Does no buffer size checking, so be careful what to do! */\309 AUDMIXBUF_MACRO_FN void audioMixBufConvTo##_aName##Stereo(void *pvDst, const PPDMAUDIOSAMPLE paSrc, uint32_t cSamples) \333 AUDMIXBUF_MACRO_FN void audioMixBufConvTo##_aName##Stereo(void *pvDst, const PPDMAUDIOSAMPLE paSrc, \ 334 const PAUDMIXBUF_CONVOPTS pOpts) \ 310 335 { \ 311 336 PPDMAUDIOSAMPLE pSrc = paSrc; \ 312 337 _aType *pDst = (_aType *)pvDst; \ 313 338 _aType l, r; \ 339 uint32_t cSamples = pOpts->cSamples; \ 314 340 while (cSamples--) \ 315 341 { \ … … 324 350 } \ 325 351 \ 326 /* Note: Does no buffer size checking, so be careful what to do! */\327 AUDMIXBUF_MACRO_FN void audioMixBufConvTo##_aName##Mono(void *pvDst, const PPDMAUDIOSAMPLE paSrc, uint32_t cSamples) \352 AUDMIXBUF_MACRO_FN void audioMixBufConvTo##_aName##Mono(void *pvDst, const PPDMAUDIOSAMPLE paSrc, \ 353 const PAUDMIXBUF_CONVOPTS pOpts) \ 328 354 { \ 329 355 PPDMAUDIOSAMPLE pSrc = paSrc; \ 330 356 _aType *pDst = (_aType *)pvDst; \ 357 uint32_t cSamples = pOpts->cSamples; \ 331 358 while (cSamples--) \ 332 359 { \ … … 458 485 #undef AUDMIXBUF_MACRO_LOG 459 486 487 /** 488 * 489 ** @todo Speed up the lookup by binding it to the actual stream state. 490 * 491 * @return IPRT status code. 492 * @return PAUDMIXBUF_FN_CONVFROM 493 * @param enmFmt 494 */ 460 495 static inline PAUDMIXBUF_FN_CONVFROM audioMixBufConvFromLookup(PDMAUDIOMIXBUFFMT enmFmt) 461 496 { … … 510 545 } 511 546 547 /** 548 * 549 ** @todo Speed up the lookup by binding it to the actual stream state. 550 * 551 * @return PAUDMIXBUF_FN_CONVTO 552 * @param enmFmt 553 */ 512 554 static inline PAUDMIXBUF_FN_CONVTO audioMixBufConvToLookup(PDMAUDIOMIXBUFFMT enmFmt) 513 555 { … … 562 604 } 563 605 564 static inline int audioMixBufConvFrom(PPDMAUDIOSAMPLE paDst,565 const void *pvSrc, size_t cbSrc,566 uint32_t cSamples, PDMAUDIOMIXBUFFMT enmFmt,567 uint32_t *pcWritten)568 {569 AssertPtrReturn(paDst, VERR_INVALID_POINTER);570 AssertPtrReturn(pvSrc, VERR_INVALID_POINTER);571 AssertReturn(cbSrc, VERR_INVALID_PARAMETER);572 /* pcbWritten is optional. */573 574 int rc;575 576 PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt);577 if (pConv)578 {579 uint32_t cWritten = pConv(paDst, pvSrc, cbSrc, cSamples);580 581 if (pcWritten)582 *pcWritten = (uint32_t )cWritten;583 584 rc = VINF_SUCCESS;585 }586 else587 rc = VERR_INVALID_PARAMETER;588 589 return rc;590 }591 592 /**593 * TODO594 *595 * Note: This routine does not do any bounds checking for speed596 * reasons, so be careful what you do with it.597 *598 * @return IPRT status code.599 * @param pvDst600 * @param paSrc601 * @param cSamples602 * @param pCfg603 */604 static inline int audioMixBufConvTo(void *pvDst, const PPDMAUDIOSAMPLE paSrc, uint32_t cSamples,605 PDMAUDIOMIXBUFFMT enmFmt)606 {607 AssertPtrReturn(pvDst, VERR_INVALID_POINTER);608 AssertPtrReturn(paSrc, VERR_INVALID_POINTER);609 610 int rc;611 612 PAUDMIXBUF_FN_CONVTO pConv = audioMixBufConvToLookup(enmFmt);613 if (pConv)614 {615 pConv(pvDst, paSrc, cSamples);616 rc = VINF_SUCCESS;617 }618 else619 rc = VERR_INVALID_PARAMETER;620 621 return rc;622 }623 624 606 static void audioMixBufFreeBuf(PPDMAUDIOMIXBUF pMixBuf) 625 607 { … … 636 618 } 637 619 638 int audioMixBufInit(PPDMAUDIOMIXBUF pMixBuf, const char *pszName, 639 PPDMPCMPROPS pProps, uint32_t cSamples) 620 int audioMixBufInit(PPDMAUDIOMIXBUF pMixBuf, const char *pszName, PPDMPCMPROPS pProps, uint32_t cSamples) 640 621 { 641 622 AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER); 642 623 AssertPtrReturn(pszName, VERR_INVALID_POINTER); 643 AssertPtrReturn(pProps, VERR_INVALID_POINTER);624 AssertPtrReturn(pProps, VERR_INVALID_POINTER); 644 625 645 626 pMixBuf->pParent = NULL; … … 652 633 pMixBuf->cMixed = 0; 653 634 pMixBuf->cProcessed = 0; 635 636 /* Set initial volume to max. */ 637 pMixBuf->Volume.fMuted = false; 638 pMixBuf->Volume.uLeft = UINT32_MAX; 639 pMixBuf->Volume.uRight = UINT32_MAX; 654 640 655 641 /* Prevent division by zero. … … 974 960 if (cToProcess) 975 961 { 976 rc = audioMixBufConvTo(pvBuf, pMixBuf->pSamples + offSamples, 977 cToProcess, enmFmt); 962 PAUDMIXBUF_FN_CONVTO pConv = audioMixBufConvToLookup(enmFmt); 963 if (pConv) 964 { 965 AUDMIXBUF_CONVOPTS convOpts = { cToProcess, pMixBuf->Volume }; 966 pConv(pvBuf, pMixBuf->pSamples + offSamples, &convOpts); 967 968 rc = VINF_SUCCESS; 969 } 970 else 971 rc = VERR_INVALID_PARAMETER; 978 972 979 973 audioMixBufPrint(pMixBuf); … … 982 976 rc = VINF_SUCCESS; 983 977 984 if (pcbRead) 985 *pcbRead = AUDIOMIXBUF_S2B(pMixBuf, cToProcess); 978 if (RT_SUCCESS(rc)) 979 { 980 if (pcbRead) 981 *pcbRead = AUDIOMIXBUF_S2B(pMixBuf, cToProcess); 982 } 986 983 987 984 AUDMIXBUF_LOG(("cbRead=%RU32, rc=%Rrc\n", AUDIOMIXBUF_S2B(pMixBuf, cToProcess), rc)); … … 1020 1017 return VINF_SUCCESS; 1021 1018 } 1019 1020 PAUDMIXBUF_FN_CONVTO pConv = audioMixBufConvToLookup(enmFmt); 1021 if (!pConv) /* Audio format not supported. */ 1022 return VERR_NOT_SUPPORTED; 1022 1023 1023 1024 PPDMAUDIOSAMPLE pSamplesSrc1 = pMixBuf->pSamples + pMixBuf->offReadWrite; … … 1047 1048 } 1048 1049 1050 AUDMIXBUF_CONVOPTS convOpts; 1051 convOpts.Volume = pMixBuf->Volume; 1052 1049 1053 /* Anything to do at all? */ 1050 1054 int rc = VINF_SUCCESS; 1051 1055 if (cLenSrc1) 1052 1056 { 1057 convOpts.cSamples = cLenSrc1; 1058 1053 1059 AUDMIXBUF_LOG(("P1: offRead=%RU32, cToRead=%RU32\n", pMixBuf->offReadWrite, cLenSrc1)); 1054 rc = audioMixBufConvTo(pvBuf, pSamplesSrc1, cLenSrc1, enmFmt);1060 pConv(pvBuf, pSamplesSrc1, &convOpts); 1055 1061 } 1056 1062 … … 1061 1067 AssertPtr(pSamplesSrc2); 1062 1068 1069 convOpts.cSamples = cLenSrc2; 1070 1063 1071 AUDMIXBUF_LOG(("P2: cToRead=%RU32, offWrite=%RU32 (%zu bytes)\n", cLenSrc2, cLenSrc1, 1064 1072 AUDIOMIXBUF_S2B(pMixBuf, cLenSrc1))); 1065 rc = audioMixBufConvTo((uint8_t *)pvBuf + AUDIOMIXBUF_S2B(pMixBuf, cLenSrc1), 1066 pSamplesSrc2, cLenSrc2, enmFmt); 1073 pConv((uint8_t *)pvBuf + AUDIOMIXBUF_S2B(pMixBuf, cLenSrc1), pSamplesSrc2, &convOpts); 1067 1074 } 1068 1075 … … 1079 1086 } 1080 1087 #endif 1081 pMixBuf->offReadWrite = offRead % pMixBuf->cSamples;1082 pMixBuf->cProcessed -= RT_MIN(cLenSrc1 + cLenSrc2, pMixBuf->cProcessed);1088 pMixBuf->offReadWrite = offRead % pMixBuf->cSamples; 1089 pMixBuf->cProcessed -= RT_MIN(cLenSrc1 + cLenSrc2, pMixBuf->cProcessed); 1083 1090 1084 1091 if (pcRead) … … 1106 1113 if (pMixBuf->cSamples) 1107 1114 RT_BZERO(pMixBuf->pSamples, pMixBuf->cSamples * sizeof(PDMAUDIOSAMPLE)); 1115 } 1116 1117 void audioMixBufSetVolume(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOVOLUME pVol) 1118 { 1119 AssertPtrReturnVoid(pMixBuf); 1120 AssertPtrReturnVoid(pVol); 1121 1122 AUDMIXBUF_LOG(("%s: lVol=%RU32, rVol=%RU32\n", pMixBuf->pszName, pVol->uLeft, pVol->uRight)); 1123 1124 pMixBuf->Volume = *pVol; 1108 1125 } 1109 1126 … … 1210 1227 return VERR_BUFFER_OVERFLOW; 1211 1228 1229 PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt); 1230 if (!pConv) 1231 return VERR_NOT_SUPPORTED; 1232 1212 1233 int rc; 1213 1234 uint32_t cWritten; … … 1226 1247 if (cToProcess) 1227 1248 { 1228 rc = audioMixBufConvFrom(pMixBuf->pSamples + offSamples, pvBuf, cbBuf,1229 cToProcess, enmFmt, &cWritten); 1230 1249 AUDMIXBUF_CONVOPTS convOpts = { cToProcess, pMixBuf->Volume }; 1250 1251 cWritten = pConv(pMixBuf->pSamples + offSamples, pvBuf, cbBuf, &convOpts); 1231 1252 audioMixBufPrint(pMixBuf); 1253 1254 rc = cWritten ? VINF_SUCCESS : VERR_GENERAL_FAILURE; /** @todo Fudge! */ 1232 1255 } 1233 1256 else … … 1285 1308 return VINF_SUCCESS; 1286 1309 } 1310 1311 PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt); 1312 if (!pConv) 1313 return VERR_NOT_SUPPORTED; 1287 1314 1288 1315 int rc = VINF_SUCCESS; … … 1317 1344 } 1318 1345 1346 uint32_t cWrittenTotal = 0; 1347 1319 1348 /* Anything to do at all? */ 1320 1349 if (cLenDst1) 1321 rc = audioMixBufConvFrom(pSamplesDst1, pvBuf, cbBuf, cLenDst1, enmFmt, NULL); 1350 { 1351 AUDMIXBUF_CONVOPTS convOpts = { cLenDst1, pMixBuf->Volume }; 1352 cWrittenTotal = pConv(pSamplesDst1, pvBuf, cbBuf, &convOpts); 1353 } 1322 1354 1323 1355 /* Second part present? */ … … 1326 1358 { 1327 1359 AssertPtr(pSamplesDst2); 1328 rc = audioMixBufConvFrom(pSamplesDst2, 1329 (uint8_t *)pvBuf + AUDIOMIXBUF_S2B(pMixBuf, cLenDst1), cbBuf,1330 cLenDst2, enmFmt, NULL);1360 1361 AUDMIXBUF_CONVOPTS convOpts = { cLenDst2, pMixBuf->Volume }; 1362 cWrittenTotal += pConv(pSamplesDst2, (uint8_t *)pvBuf + AUDIOMIXBUF_S2B(pMixBuf, cLenDst1), cbBuf, &convOpts); 1331 1363 } 1332 1364 … … 1358 1390 return rc; 1359 1391 } 1360 -
trunk/src/VBox/Devices/Audio/AudioMixBuffer.h
r54230 r55005 67 67 int audioMixBufReadCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, void *pvBuf, size_t cbBuf, uint32_t *pcRead); 68 68 void audioMixBufReset(PPDMAUDIOMIXBUF pMixBuf); 69 void audioMixBufSetVolume(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOVOLUME pVol); 69 70 uint32_t audioMixBufSize(PPDMAUDIOMIXBUF pMixBuf); 70 71 size_t audioMixBufSizeBytes(PPDMAUDIOMIXBUF pMixBuf); -
trunk/src/VBox/Devices/Audio/AudioMixer.cpp
r53442 r55005 7 7 8 8 /* 9 * Copyright (C) 2014 Oracle Corporation9 * Copyright (C) 2014-2015 Oracle Corporation 10 10 * 11 11 * This file is part of VirtualBox Open Source Edition (OSE), as … … 19 19 20 20 #include "AudioMixer.h" 21 #include "AudioMixBuffer.h" 21 22 22 23 #include <VBox/vmm/pdm.h> … … 36 37 #include <VBox/log.h> 37 38 38 int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, PAUDMIXSINK *ppSink)39 int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, AUDMIXSINKDIR enmDir, PAUDMIXSINK *ppSink) 39 40 { 40 41 AssertPtrReturn(pMixer, VERR_INVALID_POINTER); … … 53 54 if (RT_SUCCESS(rc)) 54 55 { 55 pSink->pParent = pMixer;56 pSink->pParent = pMixer; 56 57 pSink->cStreams = 0; 58 pSink->enmDir = enmDir; 57 59 RTListInit(&pSink->lstStreams); 60 61 /* Set initial volume to max. */ 62 pSink->Volume.fMuted = false; 63 pSink->Volume.uLeft = UINT32_MAX; 64 pSink->Volume.uRight = UINT32_MAX; 58 65 59 66 RTListAppend(&pMixer->lstSinks, &pSink->Node); … … 85 92 int rc; 86 93 87 if (pSink->cStreams == INT8_MAX) /* 255 streams per sink max. */94 if (pSink->cStreams == UINT8_MAX) /* 255 streams per sink max. */ 88 95 return VERR_TOO_MUCH_DATA; 89 96 … … 93 100 { 94 101 pMixStream->pConn = pConnector; 95 pMixStream->pStrm = pStream; 102 pMixStream->pIn = pStream; 103 /** @todo Process flags. */ 104 105 RTListAppend(&pSink->lstStreams, &pMixStream->Node); 106 pSink->cStreams++; 107 108 LogFlowFunc(("pSink=%p, pStream=%p, cStreams=%RU8\n", 109 pSink, pMixStream, pSink->cStreams)); 110 111 if (ppStream) 112 *ppStream = pMixStream; 113 114 rc = VINF_SUCCESS; 115 } 116 else 117 rc = VERR_NO_MEMORY; 118 119 return rc; 120 } 121 122 int audioMixerAddStreamOut(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMOUT pStream, 123 uint32_t uFlags, PAUDMIXSTREAM *ppStream) 124 { 125 AssertPtrReturn(pSink, VERR_INVALID_POINTER); 126 AssertPtrReturn(pStream, VERR_INVALID_POINTER); 127 /** @todo Add flag validation. */ 128 /* ppStream is optional. */ 129 130 int rc; 131 132 if (pSink->cStreams == UINT8_MAX) /* 255 streams per sink max. */ 133 return VERR_TOO_MUCH_DATA; 134 135 PAUDMIXSTREAM pMixStream 136 = (PAUDMIXSTREAM)RTMemAllocZ(sizeof(AUDMIXSTREAM)); 137 if (pMixStream) 138 { 139 pMixStream->pConn = pConnector; 140 pMixStream->pOut = pStream; 96 141 /** @todo Process flags. */ 97 142 … … 137 182 pMixer->cSinks = 0; 138 183 RTListInit(&pMixer->lstSinks); 184 185 pMixer->VolMaster.fMuted = false; 186 pMixer->VolMaster.uLeft = UINT32_MAX; 187 pMixer->VolMaster.uRight = UINT32_MAX; 139 188 140 189 LogFlowFunc(("Created %p ...\n", pMixer)); … … 213 262 } 214 263 215 int audioMixerProcessSinkIn(PAUDMIXSINK pSink, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed)264 int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed) 216 265 { 217 266 AssertPtrReturn(pSink, VERR_INVALID_POINTER); … … 220 269 /* pcbProcessed is optional. */ 221 270 271 /** @todo Handle mixing operation enmOp! */ 272 222 273 uint8_t *pvMixBuf = (uint8_t *)RTMemAlloc(cbBuf); 223 274 if (!pvMixBuf) … … 233 284 { 234 285 /** @todo Support output sinks as well! */ 235 if (!pStream->pConn->pfnIsActiveIn(pStream->pConn, pStream->p Strm))286 if (!pStream->pConn->pfnIsActiveIn(pStream->pConn, pStream->pIn)) 236 287 continue; 237 288 … … 243 294 uint32_t cbRead; 244 295 AssertPtr(pStream->pConn); 245 rc = pStream->pConn->pfnRead(pStream->pConn, pStream->p Strm,296 rc = pStream->pConn->pfnRead(pStream->pConn, pStream->pIn, 246 297 (uint8_t *)pvMixBuf + cbTotalRead, cbToRead, &cbRead); 247 298 if ( RT_FAILURE(rc) … … 274 325 } 275 326 327 int audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed) 328 { 329 return VERR_NOT_IMPLEMENTED; 330 } 331 276 332 void audioMixerRemoveSink(PAUDIOMIXER pMixer, PAUDMIXSINK pSink) 277 333 { … … 312 368 return; 313 369 370 Assert(pSink->cStreams); 314 371 RTListNodeRemove(&pStream->Node); 315 Assert(pSink->cStreams);316 372 pSink->cStreams--; 317 373 … … 333 389 } 334 390 391 static PDMAUDIOVOLUME audioMixerTranslateVolume(const PPDMAUDIOVOLUME pVolMaster, PPDMAUDIOVOLUME pVol) 392 { 393 PDMAUDIOVOLUME volMaster = *pVolMaster; 394 395 uint32_t u32VolumeLeft = (uint32_t)pVol->uLeft; 396 uint32_t u32VolumeRight = (uint32_t)pVol->uRight; 397 /* 0x00..0xff => 0x01..0x100 */ 398 if (u32VolumeLeft) 399 u32VolumeLeft++; 400 if (u32VolumeRight) 401 u32VolumeRight++; 402 403 volMaster.uLeft = u32VolumeLeft * 0x800000; /* Maximum is 0x80000000 */ 404 volMaster.uRight = u32VolumeRight * 0x800000; /* Maximum is 0x80000000 */ 405 406 PDMAUDIOVOLUME volOut; 407 volOut.fMuted = volMaster.fMuted || pVol->fMuted; 408 volOut.uLeft = ASMMultU64ByU32DivByU32(volMaster.uLeft, pVol->uLeft, 0x80000000U); /* Maximum is 0x80000000U */ 409 volOut.uRight = ASMMultU64ByU32DivByU32(volMaster.uRight, pVol->uRight, 0x80000000U); /* Maximum is 0x80000000U */ 410 411 LogFlowFunc(("pMaster=%p, lVol=%RU32, rVol=%RU32\n", 412 pVolMaster, pVolMaster->uLeft, pVolMaster->uRight)); 413 LogFlowFunc(("pVol=%p, lVol=%RU32, rVol=%RU32 => lVol=%RU32, rVol=%RU32\n", 414 pVol, pVol->uLeft, pVol->uRight, volOut.uLeft, volOut.uRight)); 415 416 return volOut; 417 } 418 419 int audioMixerSetMasterVolume(PAUDIOMIXER pMixer, PPDMAUDIOVOLUME pVol) 420 { 421 AssertPtrReturn(pMixer, VERR_INVALID_POINTER); 422 AssertPtrReturn(pVol, VERR_INVALID_POINTER); 423 424 pMixer->VolMaster = audioMixerTranslateVolume(&pMixer->VolMaster, pVol); 425 #if 0 426 .uLeft = pVol->uLeft * 0x800000; /* maximum is 0x80000000 */ 427 pMixer->VolMaster.uRight = pVol->uRight * 0x800000; /* maximum is 0x80000000 */ 428 #endif 429 LogFlowFunc(("%s: lVol=%RU32, rVol=%RU32 => lVol=%RU32, rVol=%RU32\n", 430 pVol->uLeft, pVol->uRight, pMixer->VolMaster.uLeft, pMixer->VolMaster.uRight)); 431 432 return VINF_SUCCESS; 433 } 434 435 int audioMixerSetSinkVolume(PAUDMIXSINK pSink, PPDMAUDIOVOLUME pVol) 436 { 437 AssertPtrReturn(pSink, VERR_INVALID_POINTER); 438 AssertPtrReturn(pVol, VERR_INVALID_POINTER); 439 440 LogFlowFunc(("%s: lVol=%RU32, rVol=%RU32\n", pSink->pszName, pVol->uLeft, pVol->uRight)); 441 442 pSink->Volume.uLeft = pVol->uLeft * 0x808080; /* Maximum is INT_MAX = 0x7fffffff */ 443 pSink->Volume.uRight = pVol->uRight * 0x808080; /* Maximum is INT_MAX = 0x7fffffff */ 444 445 /** @todo Apply the mixer's master volume to it. */ 446 447 /** @todo Very crude implementation for now -- needs more work! */ 448 449 bool fOut = pSink->enmDir == AUDMIXSINKDIR_OUTPUT; 450 451 /* Propagate new sink volume to all streams in the sink. */ 452 PAUDMIXSTREAM pStream; 453 RTListForEach(&pSink->lstStreams, pStream, AUDMIXSTREAM, Node) 454 { 455 if (fOut) 456 audioMixBufSetVolume(&pStream->pOut->MixBuf, &pSink->Volume); 457 else 458 audioMixBufSetVolume(&pStream->pIn->MixBuf, &pSink->Volume); 459 } 460 461 return VINF_SUCCESS; 462 } 463 -
trunk/src/VBox/Devices/Audio/AudioMixer.h
r54230 r55005 32 32 * can work with it. */ 33 33 PDMAUDIOSTREAMCFG devFmt; 34 /** The master volume of this mixer. */ 35 PDMAUDIOVOLUME VolMaster; 34 36 /* List of audio mixer sinks. */ 35 37 RTLISTANCHOR lstSinks; … … 42 44 RTLISTNODE Node; 43 45 PPDMIAUDIOCONNECTOR pConn; 44 /** @todo Add support for output streams. */ 45 PPDMAUDIOGSTSTRMIN pStrm; 46 union 47 { 48 PPDMAUDIOGSTSTRMIN pIn; 49 PPDMAUDIOGSTSTRMOUT pOut; 50 }; 46 51 } AUDMIXSTREAM, *PAUDMIXSTREAM; 47 52 … … 50 55 AUDMIXSINKDIR_UNKNOWN = 0, 51 56 AUDMIXSINKDIR_INPUT, 52 AUDMIXSINKDIR_OUTPUT 57 AUDMIXSINKDIR_OUTPUT, 58 /** The usual 32-bit hack. */ 59 AUDMIXSINKDIR_32BIT_HACK = 0x7fffffff 53 60 } AUDMIXSINKDIR; 54 61 … … 70 77 /** This sink's mixing buffer. */ 71 78 PDMAUDIOMIXBUF MixBuf; 79 /** The volume of this sink. The volume always will 80 * be combined with the mixer's master volume. */ 81 PDMAUDIOVOLUME Volume; 72 82 } AUDMIXSINK, *PAUDMIXSINK; 73 83 … … 76 86 AUDMIXOP_NONE = 0, 77 87 AUDMIXOP_COPY, 78 AUDMIXOP_BLEND 88 AUDMIXOP_BLEND, 89 /** The usual 32-bit hack. */ 90 AUDMIXOP_32BIT_HACK = 0x7fffffff 79 91 } AUDMIXOP; 80 92 81 93 82 int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, PAUDMIXSINK *ppSink);94 int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, AUDMIXSINKDIR enmDir, PAUDMIXSINK *ppSink); 83 95 int audioMixerAddStreamIn(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMIN pStream, uint32_t uFlags, PAUDMIXSTREAM *ppStream); 84 int audioMixerControlStream(AUDMIXSTREAM pHandle); /** @todo */ 96 int audioMixerAddStreamOut(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMOUT pStream, uint32_t uFlags, PAUDMIXSTREAM *ppStream); 97 int audioMixerControlStream(AUDMIXSTREAM pHandle); /** @todo Implement me. */ 85 98 int audioMixerCreate(const char *pszName, uint32_t uFlags, PAUDIOMIXER *ppMixer); 86 99 void audioMixerDestroy(PAUDIOMIXER pMixer); 87 int audioMixerProcessSamples(AUDMIXOP enmOp, PPDMAUDIOSAMPLE pDst, uint32_t cToWrite, PPDMAUDIOSAMPLE pSrc, uint32_t cToRead, uint32_t *pcRead, uint32_t *pcWritten);88 int audioMixerProcessSamplesEx(AUDMIXOP enmOp, void *pvParms, size_t cbParms, PPDMAUDIOSAMPLE pDst, uint32_t cToWrite, PPDMAUDIOSAMPLE pSrc, uint32_t cToRead, uint32_t *pcRead, uint32_t *pcWritten);89 100 uint32_t audioMixerGetStreamCount(PAUDIOMIXER pMixer); 90 int audioMixerProcessSinkIn(PAUDMIXSINK pSink, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed); 101 int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed); 102 int audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed); 91 103 void audioMixerRemoveSink(PAUDIOMIXER pMixer, PAUDMIXSINK pSink); 92 104 void audioMixerRemoveStream(PAUDMIXSINK pMixer, PAUDMIXSTREAM pStream); 93 105 int audioMixerSetDeviceFormat(PAUDIOMIXER pMixer, PPDMAUDIOSTREAMCFG pCfg); 106 int audioMixerSetMasterVolume(PAUDIOMIXER pMixer, PPDMAUDIOVOLUME pVol); 107 int audioMixerSetSinkVolume(PAUDMIXSINK pSink, PPDMAUDIOVOLUME pVol); 94 108 95 109 #endif /* AUDIO_MIXER_H */ 110 -
trunk/src/VBox/Devices/Audio/DevIchAc97.cpp
r54988 r55005 64 64 #define AC97_SSM_VERSION 1 65 65 66 #ifndef VBOX 67 # define SOFT_VOLUME 66 #ifdef VBOX 67 # ifdef VBOX_WITH_PDM_AUDIO_DRIVER 68 # define SOFT_VOLUME /** @todo Get rid of this crap. */ 69 # else 70 # undef SOFT_VOLUME 71 # endif 68 72 #else 69 # undefSOFT_VOLUME73 # define SOFT_VOLUME 70 74 #endif 75 71 76 #define SR_FIFOE RT_BIT(4) /* rwc, fifo error */ 72 77 #define SR_BCIS RT_BIT(3) /* rwc, buffer completion interrupt status */ … … 151 156 AC97_Reset = 0x00, 152 157 AC97_Master_Volume_Mute = 0x02, 153 AC97_Headphone_Volume_Mute = 0x04, 158 AC97_Headphone_Volume_Mute = 0x04, /** Also known as AUX, see table 16, section 5.7. */ 154 159 AC97_Master_Volume_Mono_Mute = 0x06, 155 160 AC97_Master_Tone_RL = 0x08, … … 224 229 /** PCM output stream. */ 225 230 R3PTRTYPE(PPDMAUDIOGSTSTRMOUT) pStrmOut; 231 /** Mixer handle for output stream. */ 232 R3PTRTYPE(PAUDMIXSTREAM) phStrmOut; 226 233 } AC97OUTPUTSTREAM, *PAC97OUTPUTSTREAM; 227 234 … … 293 300 /** The device' software mixer. */ 294 301 R3PTRTYPE(PAUDIOMIXER) pMixer; 302 /** Audio sink for PCM output. */ 303 R3PTRTYPE(PAUDMIXSINK) pSinkOutput; 295 304 /** Audio sink for line input. */ 296 305 R3PTRTYPE(PAUDMIXSINK) pSinkLineIn; … … 603 612 rc = pDrv->pConnector->pfnOpenOut(pDrv->pConnector, pszDesc, &streamCfg, &pDrv->Out.pStrmOut); 604 613 LogFlowFunc(("LUN#%RU8: Opened output with rc=%Rrc\n", uLUN, rc)); 614 if (rc == VINF_SUCCESS) /* Note: Could return VWRN_ALREADY_EXISTS. */ 615 { 616 audioMixerRemoveStream(pThis->pSinkOutput, pDrv->Out.phStrmOut); 617 rc = audioMixerAddStreamOut(pThis->pSinkOutput, 618 pDrv->pConnector, pDrv->Out.pStrmOut, 619 0 /* uFlags */, 620 &pDrv->Out.phStrmOut); 621 } 605 622 606 623 RTStrFree(pszDesc); … … 653 670 { 654 671 pDrv->pConnector->pfnCloseIn(pDrv->pConnector, pDrv->LineIn.pStrmIn); 655 audioMixerRemoveStream(pThis->pSinkLineIn, pDrv->LineIn.phStrmIn);656 657 pDrv->LineIn.pStrmIn = NULL;672 audioMixerRemoveStream(pThis->pSinkLineIn, pDrv->LineIn.phStrmIn); 673 674 pDrv->LineIn.pStrmIn = NULL; 658 675 pDrv->LineIn.phStrmIn = NULL; 659 676 } … … 668 685 { 669 686 pDrv->pConnector->pfnCloseOut(pDrv->pConnector, pDrv->Out.pStrmOut); 670 pDrv->Out.pStrmOut = NULL; 687 audioMixerRemoveStream(pThis->pSinkOutput, pDrv->Out.phStrmOut); 688 689 pDrv->Out.pStrmOut = NULL; 690 pDrv->Out.phStrmOut = NULL; 671 691 } 672 692 … … 827 847 lvol = 255 * lvol / VOL_MASK; 828 848 829 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 830 PAC97DRIVER pDrv; 831 #endif 849 LogFunc(("mt=%ld, val=%RU32\n", mt, val)); 832 850 833 851 #ifdef SOFT_VOLUME 852 # ifdef VBOX_WITH_PDM_AUDIO_DRIVER 853 if (pThis->pMixer) /* Device can be in reset state, so no mixer available. */ 854 { 855 PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol }; 856 PAC97DRIVER pDrv; 857 switch (mt) 858 { 859 case PDMAUDIOMIXERCTL_VOLUME: 860 audioMixerSetMasterVolume(pThis->pMixer, &vol); 861 break; 862 863 case PDMAUDIOMIXERCTL_PCM: 864 audioMixerSetSinkVolume(pThis->pSinkOutput, &vol); 865 break; 866 867 case PDMAUDIOMIXERCTL_MIC_IN: 868 audioMixerSetSinkVolume(pThis->pSinkMicIn, &vol); 869 break; 870 871 case PDMAUDIOMIXERCTL_LINE_IN: 872 audioMixerSetSinkVolume(pThis->pSinkLineIn, &vol); 873 break; 874 875 default: 876 break; 877 } 878 } 879 # else /* !VBOX_WITH_PDM_AUDIO_DRIVER */ 834 880 if (index == AC97_Master_Volume_Mute) 835 {836 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER837 RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node)838 pDrv->pConnector->pfnSetVolumeOut(pDrv->pConnector, pDrv->Out.pStrmOut, RT_BOOL(mute), lvol, rvol);839 #else840 881 AUD_set_volume_out(pThis->voice_po, mute, lvol, rvol); 841 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */842 }843 /** @todo Handle AC97_Mic_Volume_Mute + AC97_Line_In_Volume_Mute. */844 882 else 845 {846 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER847 RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node)848 pDrv->pConnector->pfnSetVolume(pDrv->pConnector, RT_BOOL(mute), lvol, rvol);849 #else850 883 AUD_set_volume(mt, &mute, &lvol, &rvol); 851 # endif /* VBOX_WITH_PDM_AUDIO_DRIVER */852 } 884 # endif /* VBOX_WITH_PDM_AUDIO_DRIVER */ 885 853 886 #else /* !SOFT_VOLUME */ 854 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER855 RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node)856 pDrv->pConnector->pfnSetVolume(pDrv->pConnector, RT_BOOL(mute), lvol, rvol);857 #else858 887 AUD_set_volume(mt, &mute, &lvol, &rvol); 859 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */860 888 #endif /* SOFT_VOLUME */ 861 889 … … 940 968 RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node) 941 969 { 970 pDrv->Out.phStrmOut = NULL; 942 971 pDrv->LineIn.phStrmIn = NULL; 943 972 pDrv->MicIn.phStrmIn = NULL; 944 973 } 945 974 975 pThis->pSinkOutput = NULL; 946 976 pThis->pSinkLineIn = NULL; 947 pThis->pSinkMicIn = NULL;977 pThis->pSinkMicIn = NULL; 948 978 949 979 if (pThis->pMixer) … … 1000 1030 1001 1031 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 1002 int rc2 = audioMixerCreate("AC'97 Mixer", 0 /* uFlags */, 1003 &pThis->pMixer); 1032 int rc2 = audioMixerCreate("AC'97 Mixer", 0 /* uFlags */, &pThis->pMixer); 1004 1033 if (RT_SUCCESS(rc2)) 1005 1034 { 1035 /* Set a default audio format for our mixer. */ 1006 1036 PDMAUDIOSTREAMCFG streamCfg; 1007 streamCfg.uHz = 4 8000;1037 streamCfg.uHz = 41000; 1008 1038 streamCfg.cChannels = 2; 1009 1039 streamCfg.enmFormat = AUD_FMT_S16; … … 1014 1044 1015 1045 /* Add all required audio sinks. */ 1046 rc2 = audioMixerAddSink(pThis->pMixer, "[Playback] PCM Output", 1047 AUDMIXSINKDIR_OUTPUT, &pThis->pSinkOutput); 1048 AssertRC(rc2); 1049 1016 1050 rc2 = audioMixerAddSink(pThis->pMixer, "[Recording] Line In", 1017 &pThis->pSinkLineIn);1051 AUDMIXSINKDIR_INPUT, &pThis->pSinkLineIn); 1018 1052 AssertRC(rc2); 1019 1053 1020 1054 rc2 = audioMixerAddSink(pThis->pMixer, "[Recording] Microphone In", 1021 &pThis->pSinkMicIn);1055 AUDMIXSINKDIR_INPUT, &pThis->pSinkMicIn); 1022 1056 AssertRC(rc2); 1023 1057 } … … 1209 1243 if (pvMixBuf) 1210 1244 { 1211 rc = audioMixerProcessSinkIn(pSink, pvMixBuf, cbToRead, &cbRead);1245 rc = audioMixerProcessSinkIn(pSink, AUDMIXOP_BLEND, pvMixBuf, cbToRead, &cbRead); 1212 1246 if ( RT_SUCCESS(rc) 1213 1247 && cbRead) -
trunk/src/VBox/Devices/Audio/DevIchHda.cpp
r54428 r55005 678 678 /** The device' software mixer. */ 679 679 R3PTRTYPE(PAUDIOMIXER) pMixer; 680 /** Audio sink for PCM output. */ 681 R3PTRTYPE(PAUDMIXSINK) pSinkOutput; 680 682 /** Audio mixer sink for line input. */ 681 683 R3PTRTYPE(PAUDMIXSINK) pSinkLineIn; … … 2206 2208 { 2207 2209 uint32_t cbRead = 0; 2208 rc = audioMixerProcessSinkIn(pSink, pBdle->au8HdaBuffer, cb2Copy, &cbRead);2210 rc = audioMixerProcessSinkIn(pSink, AUDMIXOP_BLEND, pBdle->au8HdaBuffer, cb2Copy, &cbRead); 2209 2211 if (RT_SUCCESS(rc)) 2210 2212 { … … 2511 2513 int rc = VINF_SUCCESS; 2512 2514 2513 PHDADRIVER pDrv; 2514 RTListForEach(&pThis->lstDrv, pDrv, HDADRIVER, Node) 2515 { 2516 int rc2 = pDrv->pConnector->pfnSetVolume(pDrv->pConnector, 2517 fMute, uVolLeft, uVolRight); 2518 if (RT_FAILURE(rc2)) 2519 { 2520 LogFunc(("Failed for LUN #%RU8, rc=%Rrc\n", pDrv->uLUN, rc2)); 2521 if (RT_SUCCESS(rc)) 2522 rc = rc2; 2523 /* Keep going. */ 2524 } 2525 } 2515 PDMAUDIOVOLUME vol = { fMute, uVolLeft, uVolRight }; 2516 audioMixerSetMasterVolume(pThis->pMixer, &vol); 2526 2517 2527 2518 LogFlowFuncLeaveRC(rc); … … 3837 3828 if (RT_SUCCESS(rc)) 3838 3829 { 3839 rc = audioMixerCreate("HDA Mixer", 0 /* uFlags */, 3840 &pThis->pMixer); 3830 rc = audioMixerCreate("HDA Mixer", 0 /* uFlags */, &pThis->pMixer); 3841 3831 if (RT_SUCCESS(rc)) 3842 3832 { 3833 /* Set a default audio format for our mixer. */ 3843 3834 PDMAUDIOSTREAMCFG streamCfg; 3844 streamCfg.uHz = 4 8000;3835 streamCfg.uHz = 41000; 3845 3836 streamCfg.cChannels = 2; 3846 3837 streamCfg.enmFormat = AUD_FMT_S16; … … 3851 3842 3852 3843 /* Add all required audio sinks. */ 3844 rc = audioMixerAddSink(pThis->pMixer, "[Playback] PCM Output", 3845 AUDMIXSINKDIR_OUTPUT, &pThis->pSinkOutput); 3846 AssertRC(rc); 3847 3853 3848 rc = audioMixerAddSink(pThis->pMixer, "[Recording] Line In", 3854 &pThis->pSinkLineIn);3849 AUDMIXSINKDIR_INPUT, &pThis->pSinkLineIn); 3855 3850 AssertRC(rc); 3856 3851 3857 3852 rc = audioMixerAddSink(pThis->pMixer, "[Recording] Microphone In", 3858 &pThis->pSinkMicIn);3853 AUDMIXSINKDIR_INPUT, &pThis->pSinkMicIn); 3859 3854 AssertRC(rc); 3860 3855 } -
trunk/src/VBox/Devices/Audio/DevSB16.cpp
r54230 r55005 40 40 #include "vl_vbox.h" 41 41 42 #ifndef VBOX_WITH_PDM_AUDIO_DRIVER 43 extern "C" { 44 #include "audio.h" 45 } 42 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 43 # include "AudioMixer.h" 44 #else 45 extern "C" { 46 #include "audio.h" 47 } 46 48 #endif 47 49 … … 84 86 #endif /* !VBOX */ 85 87 86 typedef struct SB16State { 88 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 89 typedef struct SB16OUTPUTSTREAM 90 { 91 /** PCM output stream. */ 92 R3PTRTYPE(PPDMAUDIOGSTSTRMOUT) pStrmOut; 93 /** Mixer handle for output stream. */ 94 R3PTRTYPE(PAUDMIXSTREAM) phStrmOut; 95 } SB16OUTPUTSTREAM, *PSB16OUTPUTSTREAM; 96 97 /** 98 * Struct for maintaining a host backend driver. 99 */ 100 typedef struct SB16STATE *PSB16STATE; 101 typedef struct SB16DRIVER 102 { 103 union 104 { 105 /** Node for storing this driver in our device driver 106 * list of AC97STATE. */ 107 RTLISTNODE Node; 108 struct 109 { 110 R3PTRTYPE(void *) dummy1; 111 R3PTRTYPE(void *) dummy2; 112 } dummy; 113 }; 114 115 /** Pointer to SB16 controller (state). */ 116 R3PTRTYPE(PSB16STATE) pSB16State; 117 /** Driver flags. */ 118 PDMAUDIODRVFLAGS Flags; 119 uint32_t PaddingFlags; 120 /** LUN # to which this driver has been assigned. */ 121 uint8_t uLUN; 122 uint8_t Padding[5]; 123 /** Audio connector interface to the underlying 124 * host backend. */ 125 R3PTRTYPE(PPDMIAUDIOCONNECTOR) pConnector; 126 /** Stream for output. */ 127 SB16OUTPUTSTREAM Out; 128 } SB16DRIVER, *PSB16DRIVER; 129 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */ 130 131 typedef struct SB16STATE 132 { 87 133 #ifdef VBOX 88 134 /** Pointer to the device instance. */ 89 PPDMDEVINSR3 pDevIns;135 PPDMDEVINSR3 pDevIns; 90 136 /** Pointer to the connector of the attached audio driver. */ 91 PPDMIAUDIOCONNECTOR pDrv; 92 #endif 93 #ifdef VBOX /* lazy bird */ 137 PPDMIAUDIOCONNECTOR pDrv; 94 138 int irqCfg; 95 139 int dmaCfg; … … 152 196 153 197 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 154 PPDMAUDIOGSTSTRMOUT pGstStrmOut; 198 R3PTRTYPE(PPDMAUDIOGSTSTRMOUT) pGstStrmOut; 199 /** List of associated LUN drivers. */ 200 RTLISTANCHOR lstDrv; 201 /** The device' software mixer. */ 202 R3PTRTYPE(PAUDIOMIXER) pMixer; 203 /** Audio sink for PCM output. */ 204 R3PTRTYPE(PAUDMIXSINK) pSinkOutput; 155 205 #else 156 206 SWVoiceOut *voice; … … 165 215 int mixer_nreg; 166 216 uint8_t mixer_regs[256]; 167 } SB16S tate;217 } SB16STATE, *PSB16STATE; 168 218 169 219 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER … … 222 272 #endif 223 273 224 static void speaker ( SB16State *s, int on)225 { 226 s->speaker = on;227 /* AUD_enable ( s->voice, on); */228 } 229 230 static void control ( SB16State *s, int hold)231 { 232 int dma = s->use_hdma ? s->hdma :s->dma;233 s->dma_running = hold;234 235 LogFlowFunc(("hold %d high %d dma %d\n", hold, s->use_hdma, dma));274 static void speaker (PSB16STATE pThis, int on) 275 { 276 pThis->speaker = on; 277 /* AUD_enable (pThis->voice, on); */ 278 } 279 280 static void control (PSB16STATE pThis, int hold) 281 { 282 int dma = pThis->use_hdma ? pThis->hdma : pThis->dma; 283 pThis->dma_running = hold; 284 285 LogFlowFunc(("hold %d high %d dma %d\n", hold, pThis->use_hdma, dma)); 236 286 237 287 #ifndef VBOX 238 288 if (hold) { 239 289 DMA_hold_DREQ (dma); 240 AUD_set_active_out ( s->voice, 1);290 AUD_set_active_out (pThis->voice, 1); 241 291 } 242 292 else { 243 293 DMA_release_DREQ (dma); 244 AUD_set_active_out ( s->voice, 0);294 AUD_set_active_out (pThis->voice, 0); 245 295 } 246 296 #else /* VBOX */ 247 297 if (hold) 248 298 { 249 PDMDevHlpDMASetDREQ ( s->pDevIns, dma, 1);250 PDMDevHlpDMASchedule ( s->pDevIns);299 PDMDevHlpDMASetDREQ (pThis->pDevIns, dma, 1); 300 PDMDevHlpDMASchedule (pThis->pDevIns); 251 301 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 252 s->pDrv->pfnEnableOut(s->pDrv,s->pGstStrmOut, true /* fEnable */);253 #else 254 AUD_set_active_out ( s->voice, 1);302 pThis->pDrv->pfnEnableOut(pThis->pDrv, pThis->pGstStrmOut, true /* fEnable */); 303 #else 304 AUD_set_active_out (pThis->voice, 1); 255 305 #endif 256 306 } 257 307 else 258 308 { 259 PDMDevHlpDMASetDREQ ( s->pDevIns, dma, 0);309 PDMDevHlpDMASetDREQ (pThis->pDevIns, dma, 0); 260 310 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 261 s->pDrv->pfnEnableOut(s->pDrv,s->pGstStrmOut, false /* fEnable */);262 #else 263 AUD_set_active_out ( s->voice, 0);311 pThis->pDrv->pfnEnableOut(pThis->pDrv, pThis->pGstStrmOut, false /* fEnable */); 312 #else 313 AUD_set_active_out (pThis->voice, 0); 264 314 #endif 265 315 } … … 270 320 static void aux_timer (void *opaque) 271 321 { 272 SB16State *s = opaque;273 s->can_write = 1;274 qemu_irq_raise ( s->pic[s->irq]);322 PSB16STATE pThis = opaque; 323 pThis->can_write = 1; 324 qemu_irq_raise (pThis->pic[pThis->irq]); 275 325 } 276 326 #else /* VBOX */ 277 327 static DECLCALLBACK(void) sb16Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvThis) 278 328 { 279 SB16State *s = (SB16State*)pvThis;280 s->can_write = 1;281 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 1);329 PSB16STATE pThis = (SB16STATE *)pvThis; 330 pThis->can_write = 1; 331 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1); 282 332 } 283 333 #endif /* VBOX */ … … 286 336 #define DMA8_HIGH 2 287 337 288 static void continue_dma8 ( SB16State *s)289 { 290 if ( s->freq > 0)338 static void continue_dma8 (PSB16STATE pThis) 339 { 340 if (pThis->freq > 0) 291 341 { 292 s->audio_free = 0;342 pThis->audio_free = 0; 293 343 294 344 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 295 345 PDMAUDIOSTREAMCFG as; 296 as.uHz = s->freq;297 as.cChannels = 1 << s->fmt_stereo;298 as.enmFormat = s->fmt;346 as.uHz = pThis->freq; 347 as.cChannels = 1 << pThis->fmt_stereo; 348 as.enmFormat = pThis->fmt; 299 349 as.enmEndianness = PDMAUDIOHOSTENDIANESS; 300 350 301 int rc = s->pDrv->pfnOpenOut(s->pDrv, "sb16.out", &as, &s->pGstStrmOut);351 int rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, "sb16.out", &as, &pThis->pGstStrmOut); 302 352 AssertRC(rc); 303 353 #else 304 354 audsettings_t as; 305 as.freq = s->freq;306 as.nchannels = 1 << s->fmt_stereo;307 as.fmt = s->fmt;355 as.freq = pThis->freq; 356 as.nchannels = 1 << pThis->fmt_stereo; 357 as.fmt = pThis->fmt; 308 358 as.endianness = 0; 309 s->voice = AUD_open_out (310 & s->card,311 s->voice,359 pThis->voice = AUD_open_out ( 360 &pThis->card, 361 pThis->voice, 312 362 "sb16", 313 s,363 pThis, 314 364 sb16AudioCallback, 315 365 &as … … 318 368 } 319 369 320 control (s, 1);321 } 322 323 static void dma_cmd8 ( SB16State *s, int mask, int dma_len)324 { 325 s->fmt = AUD_FMT_U8;326 s->use_hdma = 0;327 s->fmt_bits = 8;328 s->fmt_signed = 0;329 s->fmt_stereo = (s->mixer_regs[0x0e] & 2) != 0;330 if (-1 == s->time_const) {331 if ( s->freq <= 0)332 s->freq = 11025;370 control(pThis, 1); 371 } 372 373 static void dma_cmd8 (PSB16STATE pThis, int mask, int dma_len) 374 { 375 pThis->fmt = AUD_FMT_U8; 376 pThis->use_hdma = 0; 377 pThis->fmt_bits = 8; 378 pThis->fmt_signed = 0; 379 pThis->fmt_stereo = (pThis->mixer_regs[0x0e] & 2) != 0; 380 if (-1 == pThis->time_const) { 381 if (pThis->freq <= 0) 382 pThis->freq = 11025; 333 383 } 334 384 else { 335 int tmp = (256 - s->time_const);336 s->freq = (1000000 + (tmp / 2)) / tmp;385 int tmp = (256 - pThis->time_const); 386 pThis->freq = (1000000 + (tmp / 2)) / tmp; 337 387 } 338 388 339 389 if (dma_len != -1) { 340 s->block_size = dma_len <<s->fmt_stereo;390 pThis->block_size = dma_len << pThis->fmt_stereo; 341 391 } 342 392 else { … … 350 400 Both use stereo, and Creatives own documentation states that 351 401 0x48 sets block size in bytes less one.. go figure */ 352 s->block_size &= ~s->fmt_stereo;353 } 354 355 s->freq >>=s->fmt_stereo;356 s->left_till_irq =s->block_size;357 s->bytes_per_second = (s->freq <<s->fmt_stereo);358 /* s->highspeed = (mask & DMA8_HIGH) != 0; */359 s->dma_auto = (mask & DMA8_AUTO) != 0;360 s->align = (1 <<s->fmt_stereo) - 1;361 362 if ( s->block_size &s->align) {402 pThis->block_size &= ~pThis->fmt_stereo; 403 } 404 405 pThis->freq >>= pThis->fmt_stereo; 406 pThis->left_till_irq = pThis->block_size; 407 pThis->bytes_per_second = (pThis->freq << pThis->fmt_stereo); 408 /* pThis->highspeed = (mask & DMA8_HIGH) != 0; */ 409 pThis->dma_auto = (mask & DMA8_AUTO) != 0; 410 pThis->align = (1 << pThis->fmt_stereo) - 1; 411 412 if (pThis->block_size & pThis->align) { 363 413 LogFlowFunc(("warning: misaligned block size %d, alignment %d\n", 364 s->block_size,s->align + 1));414 pThis->block_size, pThis->align + 1)); 365 415 } 366 416 367 417 LogFlowFunc(("freq %d, stereo %d, sign %d, bits %d, " 368 418 "dma %d, auto %d, fifo %d, high %d\n", 369 s->freq, s->fmt_stereo, s->fmt_signed,s->fmt_bits,370 s->block_size, s->dma_auto, s->fifo,s->highspeed));371 372 continue_dma8 ( s);373 speaker ( s, 1);374 } 375 376 static void dma_cmd ( SB16State *s, uint8_t cmd, uint8_t d0, int dma_len)377 { 378 s->use_hdma = cmd < 0xc0;379 s->fifo = (cmd >> 1) & 1;380 s->dma_auto = (cmd >> 2) & 1;381 s->fmt_signed = (d0 >> 4) & 1;382 s->fmt_stereo = (d0 >> 5) & 1;419 pThis->freq, pThis->fmt_stereo, pThis->fmt_signed, pThis->fmt_bits, 420 pThis->block_size, pThis->dma_auto, pThis->fifo, pThis->highspeed)); 421 422 continue_dma8 (pThis); 423 speaker (pThis, 1); 424 } 425 426 static void dma_cmd (PSB16STATE pThis, uint8_t cmd, uint8_t d0, int dma_len) 427 { 428 pThis->use_hdma = cmd < 0xc0; 429 pThis->fifo = (cmd >> 1) & 1; 430 pThis->dma_auto = (cmd >> 2) & 1; 431 pThis->fmt_signed = (d0 >> 4) & 1; 432 pThis->fmt_stereo = (d0 >> 5) & 1; 383 433 384 434 switch (cmd >> 4) { 385 435 case 11: 386 s->fmt_bits = 16;436 pThis->fmt_bits = 16; 387 437 break; 388 438 389 439 case 12: 390 s->fmt_bits = 8;440 pThis->fmt_bits = 8; 391 441 break; 392 442 } 393 443 394 if (-1 != s->time_const) {444 if (-1 != pThis->time_const) { 395 445 #if 1 396 int tmp = 256 - s->time_const;397 s->freq = (1000000 + (tmp / 2)) / tmp;398 #else 399 /* s->freq = 1000000 / ((255 - s->time_const) <<s->fmt_stereo); */400 s->freq = 1000000 / ((255 -s->time_const));401 #endif 402 s->time_const = -1;403 } 404 405 s->block_size = dma_len + 1;406 s->block_size <<= ((s->fmt_bits == 16) ? 1 : 0);407 if (! s->dma_auto) {446 int tmp = 256 - pThis->time_const; 447 pThis->freq = (1000000 + (tmp / 2)) / tmp; 448 #else 449 /* pThis->freq = 1000000 / ((255 - pThis->time_const) << pThis->fmt_stereo); */ 450 pThis->freq = 1000000 / ((255 - pThis->time_const)); 451 #endif 452 pThis->time_const = -1; 453 } 454 455 pThis->block_size = dma_len + 1; 456 pThis->block_size <<= ((pThis->fmt_bits == 16) ? 1 : 0); 457 if (!pThis->dma_auto) { 408 458 /* It is clear that for DOOM and auto-init this value 409 459 shouldn't take stereo into account, while Miles Sound Systems 410 460 setsound.exe with single transfer mode wouldn't work without it 411 461 wonders of SB16 yet again */ 412 s->block_size <<=s->fmt_stereo;462 pThis->block_size <<= pThis->fmt_stereo; 413 463 } 414 464 415 465 LogFlowFunc(("freq %d, stereo %d, sign %d, bits %d, " 416 466 "dma %d, auto %d, fifo %d, high %d\n", 417 s->freq, s->fmt_stereo, s->fmt_signed,s->fmt_bits,418 s->block_size, s->dma_auto, s->fifo,s->highspeed));419 420 if (16 == s->fmt_bits) {421 if ( s->fmt_signed) {422 s->fmt = AUD_FMT_S16;467 pThis->freq, pThis->fmt_stereo, pThis->fmt_signed, pThis->fmt_bits, 468 pThis->block_size, pThis->dma_auto, pThis->fifo, pThis->highspeed)); 469 470 if (16 == pThis->fmt_bits) { 471 if (pThis->fmt_signed) { 472 pThis->fmt = AUD_FMT_S16; 423 473 } 424 474 else { 425 s->fmt = AUD_FMT_U16;475 pThis->fmt = AUD_FMT_U16; 426 476 } 427 477 } 428 478 else { 429 if ( s->fmt_signed) {430 s->fmt = AUD_FMT_S8;479 if (pThis->fmt_signed) { 480 pThis->fmt = AUD_FMT_S8; 431 481 } 432 482 else { 433 s->fmt = AUD_FMT_U8;434 } 435 } 436 437 s->left_till_irq =s->block_size;438 439 s->bytes_per_second = (s->freq << s->fmt_stereo) << ((s->fmt_bits == 16) ? 1 : 0);440 s->highspeed = 0;441 s->align = (1 << (s->fmt_stereo + (s->fmt_bits == 16))) - 1;442 if ( s->block_size &s->align) {483 pThis->fmt = AUD_FMT_U8; 484 } 485 } 486 487 pThis->left_till_irq = pThis->block_size; 488 489 pThis->bytes_per_second = (pThis->freq << pThis->fmt_stereo) << ((pThis->fmt_bits == 16) ? 1 : 0); 490 pThis->highspeed = 0; 491 pThis->align = (1 << (pThis->fmt_stereo + (pThis->fmt_bits == 16))) - 1; 492 if (pThis->block_size & pThis->align) { 443 493 LogFlowFunc(("warning: misaligned block size %d, alignment %d\n", 444 s->block_size,s->align + 1));445 } 446 447 if ( s->freq)494 pThis->block_size, pThis->align + 1)); 495 } 496 497 if (pThis->freq) 448 498 { 449 s->audio_free = 0;499 pThis->audio_free = 0; 450 500 451 501 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 452 502 PDMAUDIOSTREAMCFG as; 453 as.uHz = s->freq;454 as.cChannels = 1 << s->fmt_stereo;455 as.enmFormat = s->fmt;503 as.uHz = pThis->freq; 504 as.cChannels = 1 << pThis->fmt_stereo; 505 as.enmFormat = pThis->fmt; 456 506 as.enmEndianness = PDMAUDIOHOSTENDIANESS; 457 507 458 int rc = s->pDrv->pfnOpenOut(s->pDrv, "sb16.out", &as, &s->pGstStrmOut);508 int rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, "sb16.out", &as, &pThis->pGstStrmOut); 459 509 AssertRC(rc); 460 510 #else 461 511 audsettings_t as; 462 as.freq = s->freq;463 as.nchannels = 1 << s->fmt_stereo;464 as.fmt = s->fmt;512 as.freq = pThis->freq; 513 as.nchannels = 1 << pThis->fmt_stereo; 514 as.fmt = pThis->fmt; 465 515 as.endianness = 0; 466 s->voice = AUD_open_out (467 & s->card,468 s->voice,516 pThis->voice = AUD_open_out ( 517 &pThis->card, 518 pThis->voice, 469 519 "sb16", 470 s,520 pThis, 471 521 sb16AudioCallback, 472 522 &as … … 475 525 } 476 526 477 control ( s, 1);478 speaker ( s, 1);479 } 480 481 static inline void dsp_out_data ( SB16State *s, uint8_t val)527 control (pThis, 1); 528 speaker (pThis, 1); 529 } 530 531 static inline void dsp_out_data (PSB16STATE pThis, uint8_t val) 482 532 { 483 533 LogFlowFunc(("outdata %#x\n", val)); 484 if ((size_t) s->out_data_len < sizeof (s->out_data)) {485 s->out_data[s->out_data_len++] = val;486 } 487 } 488 489 static inline uint8_t dsp_get_data ( SB16State *s)490 { 491 if ( s->in_index) {492 return s->in2_data[--s->in_index];534 if ((size_t) pThis->out_data_len < sizeof (pThis->out_data)) { 535 pThis->out_data[pThis->out_data_len++] = val; 536 } 537 } 538 539 static inline uint8_t dsp_get_data (PSB16STATE pThis) 540 { 541 if (pThis->in_index) { 542 return pThis->in2_data[--pThis->in_index]; 493 543 } 494 544 else { … … 498 548 } 499 549 500 static void command ( SB16State *s, uint8_t cmd)550 static void command (PSB16STATE pThis, uint8_t cmd) 501 551 { 502 552 LogFlowFunc(("command %#x\n", cmd)); … … 514 564 LogFlowFunc(("%#x wrong bits\n", cmd)); 515 565 } 516 s->needed_bytes = 3;566 pThis->needed_bytes = 3; 517 567 } 518 568 else { 519 s->needed_bytes = 0;569 pThis->needed_bytes = 0; 520 570 521 571 switch (cmd) { 522 572 case 0x03: 523 dsp_out_data ( s, 0x10); /*s->csp_param); */573 dsp_out_data (pThis, 0x10); /* pThis->csp_param); */ 524 574 goto warn; 525 575 526 576 case 0x04: 527 s->needed_bytes = 1;577 pThis->needed_bytes = 1; 528 578 goto warn; 529 579 530 580 case 0x05: 531 s->needed_bytes = 2;581 pThis->needed_bytes = 2; 532 582 goto warn; 533 583 … … 537 587 538 588 case 0x0e: 539 s->needed_bytes = 2;589 pThis->needed_bytes = 2; 540 590 goto warn; 541 591 542 592 case 0x09: 543 dsp_out_data ( s, 0xf8);593 dsp_out_data (pThis, 0xf8); 544 594 goto warn; 545 595 546 596 case 0x0f: 547 s->needed_bytes = 1;597 pThis->needed_bytes = 1; 548 598 goto warn; 549 599 550 600 case 0x10: 551 s->needed_bytes = 1;601 pThis->needed_bytes = 1; 552 602 goto warn; 553 603 554 604 case 0x14: 555 s->needed_bytes = 2;556 s->block_size = 0;605 pThis->needed_bytes = 2; 606 pThis->block_size = 0; 557 607 break; 558 608 559 609 case 0x1c: /* Auto-Initialize DMA DAC, 8-bit */ 560 dma_cmd8 ( s, DMA8_AUTO, -1);610 dma_cmd8 (pThis, DMA8_AUTO, -1); 561 611 break; 562 612 563 613 case 0x20: /* Direct ADC, Juice/PL */ 564 dsp_out_data ( s, 0xff);614 dsp_out_data (pThis, 0xff); 565 615 goto warn; 566 616 … … 570 620 571 621 case 0x40: 572 s->freq = -1;573 s->time_const = -1;574 s->needed_bytes = 1;622 pThis->freq = -1; 623 pThis->time_const = -1; 624 pThis->needed_bytes = 1; 575 625 break; 576 626 577 627 case 0x41: 578 s->freq = -1;579 s->time_const = -1;580 s->needed_bytes = 2;628 pThis->freq = -1; 629 pThis->time_const = -1; 630 pThis->needed_bytes = 2; 581 631 break; 582 632 583 633 case 0x42: 584 s->freq = -1;585 s->time_const = -1;586 s->needed_bytes = 2;634 pThis->freq = -1; 635 pThis->time_const = -1; 636 pThis->needed_bytes = 2; 587 637 goto warn; 588 638 589 639 case 0x45: 590 dsp_out_data ( s, 0xaa);640 dsp_out_data (pThis, 0xaa); 591 641 goto warn; 592 642 … … 595 645 596 646 case 0x48: 597 s->needed_bytes = 2;647 pThis->needed_bytes = 2; 598 648 break; 599 649 600 650 case 0x74: 601 s->needed_bytes = 2; /* DMA DAC, 4-bit ADPCM */651 pThis->needed_bytes = 2; /* DMA DAC, 4-bit ADPCM */ 602 652 LogFlowFunc(("0x75 - DMA DAC, 4-bit ADPCM not implemented\n")); 603 653 break; 604 654 605 655 case 0x75: /* DMA DAC, 4-bit ADPCM Reference */ 606 s->needed_bytes = 2;656 pThis->needed_bytes = 2; 607 657 LogFlowFunc(("0x74 - DMA DAC, 4-bit ADPCM Reference not implemented\n")); 608 658 break; 609 659 610 660 case 0x76: /* DMA DAC, 2.6-bit ADPCM */ 611 s->needed_bytes = 2;661 pThis->needed_bytes = 2; 612 662 LogFlowFunc(("0x74 - DMA DAC, 2.6-bit ADPCM not implemented\n")); 613 663 break; 614 664 615 665 case 0x77: /* DMA DAC, 2.6-bit ADPCM Reference */ 616 s->needed_bytes = 2;666 pThis->needed_bytes = 2; 617 667 LogFlowFunc(("0x74 - DMA DAC, 2.6-bit ADPCM Reference not implemented\n")); 618 668 break; … … 629 679 630 680 case 0x80: 631 s->needed_bytes = 2;681 pThis->needed_bytes = 2; 632 682 break; 633 683 634 684 case 0x90: 635 685 case 0x91: 636 dma_cmd8 ( s, (((cmd & 1) == 0) ? 1 : 0) | DMA8_HIGH, -1);686 dma_cmd8 (pThis, (((cmd & 1) == 0) ? 1 : 0) | DMA8_HIGH, -1); 637 687 break; 638 688 639 689 case 0xd0: /* halt DMA operation. 8bit */ 640 control ( s, 0);690 control (pThis, 0); 641 691 break; 642 692 643 693 case 0xd1: /* speaker on */ 644 speaker ( s, 1);694 speaker (pThis, 1); 645 695 break; 646 696 647 697 case 0xd3: /* speaker off */ 648 speaker ( s, 0);698 speaker (pThis, 0); 649 699 break; 650 700 … … 652 702 /* KQ6 (or maybe Sierras audblst.drv in general) resets 653 703 the frequency between halt/continue */ 654 continue_dma8 ( s);704 continue_dma8 (pThis); 655 705 break; 656 706 657 707 case 0xd5: /* halt DMA operation. 16bit */ 658 control ( s, 0);708 control (pThis, 0); 659 709 break; 660 710 661 711 case 0xd6: /* continue DMA operation. 16bit */ 662 control ( s, 1);712 control (pThis, 1); 663 713 break; 664 714 665 715 case 0xd9: /* exit auto-init DMA after this block. 16bit */ 666 s->dma_auto = 0;716 pThis->dma_auto = 0; 667 717 break; 668 718 669 719 case 0xda: /* exit auto-init DMA after this block. 8bit */ 670 s->dma_auto = 0;720 pThis->dma_auto = 0; 671 721 break; 672 722 673 723 case 0xe0: /* DSP identification */ 674 s->needed_bytes = 1;724 pThis->needed_bytes = 1; 675 725 break; 676 726 677 727 case 0xe1: 678 dsp_out_data ( s,s->ver & 0xff);679 dsp_out_data ( s,s->ver >> 8);728 dsp_out_data (pThis, pThis->ver & 0xff); 729 dsp_out_data (pThis, pThis->ver >> 8); 680 730 break; 681 731 682 732 case 0xe2: 683 s->needed_bytes = 1;733 pThis->needed_bytes = 1; 684 734 goto warn; 685 735 … … 688 738 int i; 689 739 for (i = sizeof (e3) - 1; i >= 0; --i) 690 dsp_out_data ( s, e3[i]);740 dsp_out_data (pThis, e3[i]); 691 741 } 692 742 break; 693 743 694 744 case 0xe4: /* write test reg */ 695 s->needed_bytes = 1;745 pThis->needed_bytes = 1; 696 746 break; 697 747 … … 701 751 702 752 case 0xe8: /* read test reg */ 703 dsp_out_data ( s,s->test_reg);753 dsp_out_data (pThis, pThis->test_reg); 704 754 break; 705 755 706 756 case 0xf2: 707 757 case 0xf3: 708 dsp_out_data ( s, 0xaa);709 s->mixer_regs[0x82] |= (cmd == 0xf2) ? 1 : 2;758 dsp_out_data (pThis, 0xaa); 759 pThis->mixer_regs[0x82] |= (cmd == 0xf2) ? 1 : 2; 710 760 #ifndef VBOX 711 qemu_irq_raise ( s->pic[s->irq]);712 #else 713 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 1);761 qemu_irq_raise (pThis->pic[pThis->irq]); 762 #else 763 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1); 714 764 #endif 715 765 break; 716 766 717 767 case 0xf9: 718 s->needed_bytes = 1;768 pThis->needed_bytes = 1; 719 769 goto warn; 720 770 721 771 case 0xfa: 722 dsp_out_data ( s, 0);772 dsp_out_data (pThis, 0); 723 773 goto warn; 724 774 725 775 case 0xfc: /* FIXME */ 726 dsp_out_data ( s, 0);776 dsp_out_data (pThis, 0); 727 777 goto warn; 728 778 … … 733 783 } 734 784 735 if (! s->needed_bytes) {785 if (!pThis->needed_bytes) { 736 786 LogFlow(("\n")); 737 787 } 738 788 739 789 exit: 740 if (! s->needed_bytes) {741 s->cmd = -1;790 if (!pThis->needed_bytes) { 791 pThis->cmd = -1; 742 792 } 743 793 else { 744 s->cmd = cmd;794 pThis->cmd = cmd; 745 795 } 746 796 return; … … 748 798 warn: 749 799 LogFlowFunc(("warning: command %#x,%d is not truly understood yet\n", 750 cmd, s->needed_bytes));800 cmd, pThis->needed_bytes)); 751 801 goto exit; 752 802 753 803 } 754 804 755 static uint16_t dsp_get_lohi ( SB16State *s)756 { 757 uint8_t hi = dsp_get_data ( s);758 uint8_t lo = dsp_get_data ( s);805 static uint16_t dsp_get_lohi (PSB16STATE pThis) 806 { 807 uint8_t hi = dsp_get_data (pThis); 808 uint8_t lo = dsp_get_data (pThis); 759 809 return (hi << 8) | lo; 760 810 } 761 811 762 static uint16_t dsp_get_hilo ( SB16State *s)763 { 764 uint8_t lo = dsp_get_data ( s);765 uint8_t hi = dsp_get_data ( s);812 static uint16_t dsp_get_hilo (PSB16STATE pThis) 813 { 814 uint8_t lo = dsp_get_data (pThis); 815 uint8_t hi = dsp_get_data (pThis); 766 816 return (hi << 8) | lo; 767 817 } 768 818 769 static void complete ( SB16State *s)819 static void complete (PSB16STATE pThis) 770 820 { 771 821 int d0, d1, d2; 772 822 LogFlowFunc(("complete command %#x, in_index %d, needed_bytes %d\n", 773 s->cmd, s->in_index,s->needed_bytes));774 775 if ( s->cmd > 0xaf &&s->cmd < 0xd0) {776 d2 = dsp_get_data ( s);777 d1 = dsp_get_data ( s);778 d0 = dsp_get_data ( s);779 780 if ( s->cmd & 8) {823 pThis->cmd, pThis->in_index, pThis->needed_bytes)); 824 825 if (pThis->cmd > 0xaf && pThis->cmd < 0xd0) { 826 d2 = dsp_get_data (pThis); 827 d1 = dsp_get_data (pThis); 828 d0 = dsp_get_data (pThis); 829 830 if (pThis->cmd & 8) { 781 831 LogFlowFunc(("ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n", 782 s->cmd, d0, d1, d2));832 pThis->cmd, d0, d1, d2)); 783 833 } 784 834 else { 785 835 LogFlowFunc(("cmd = %#x d0 = %d, d1 = %d, d2 = %d\n", 786 s->cmd, d0, d1, d2));787 dma_cmd ( s,s->cmd, d0, d1 + (d2 << 8));836 pThis->cmd, d0, d1, d2)); 837 dma_cmd (pThis, pThis->cmd, d0, d1 + (d2 << 8)); 788 838 } 789 839 } 790 840 else { 791 switch ( s->cmd) {841 switch (pThis->cmd) { 792 842 case 0x04: 793 s->csp_mode = dsp_get_data (s);794 s->csp_reg83r = 0;795 s->csp_reg83w = 0;796 LogFlowFunc(("CSP command 0x04: mode=%#x\n", s->csp_mode));843 pThis->csp_mode = dsp_get_data (pThis); 844 pThis->csp_reg83r = 0; 845 pThis->csp_reg83w = 0; 846 LogFlowFunc(("CSP command 0x04: mode=%#x\n", pThis->csp_mode)); 797 847 break; 798 848 799 849 case 0x05: 800 s->csp_param = dsp_get_data (s);801 s->csp_value = dsp_get_data (s);850 pThis->csp_param = dsp_get_data (pThis); 851 pThis->csp_value = dsp_get_data (pThis); 802 852 LogFlowFunc(("CSP command 0x05: param=%#x value=%#x\n", 803 s->csp_param,804 s->csp_value));853 pThis->csp_param, 854 pThis->csp_value)); 805 855 break; 806 856 807 857 case 0x0e: 808 d0 = dsp_get_data ( s);809 d1 = dsp_get_data ( s);858 d0 = dsp_get_data (pThis); 859 d1 = dsp_get_data (pThis); 810 860 LogFlowFunc(("write CSP register %d <- %#x\n", d1, d0)); 811 861 if (d1 == 0x83) { 812 LogFlowFunc(("0x83[%d] <- %#x\n", s->csp_reg83r, d0));813 s->csp_reg83[s->csp_reg83r % 4] = d0;814 s->csp_reg83r += 1;862 LogFlowFunc(("0x83[%d] <- %#x\n", pThis->csp_reg83r, d0)); 863 pThis->csp_reg83[pThis->csp_reg83r % 4] = d0; 864 pThis->csp_reg83r += 1; 815 865 } 816 866 else { 817 s->csp_regs[d1] = d0;867 pThis->csp_regs[d1] = d0; 818 868 } 819 869 break; 820 870 821 871 case 0x0f: 822 d0 = dsp_get_data ( s);872 d0 = dsp_get_data (pThis); 823 873 LogFlowFunc(("read CSP register %#x -> %#x, mode=%#x\n", 824 d0, s->csp_regs[d0],s->csp_mode));874 d0, pThis->csp_regs[d0], pThis->csp_mode)); 825 875 if (d0 == 0x83) { 826 876 LogFlowFunc(("0x83[%d] -> %#x\n", 827 s->csp_reg83w,828 s->csp_reg83[s->csp_reg83w % 4]));829 dsp_out_data ( s, s->csp_reg83[s->csp_reg83w % 4]);830 s->csp_reg83w += 1;877 pThis->csp_reg83w, 878 pThis->csp_reg83[pThis->csp_reg83w % 4])); 879 dsp_out_data (pThis, pThis->csp_reg83[pThis->csp_reg83w % 4]); 880 pThis->csp_reg83w += 1; 831 881 } 832 882 else { 833 dsp_out_data ( s,s->csp_regs[d0]);883 dsp_out_data (pThis, pThis->csp_regs[d0]); 834 884 } 835 885 break; 836 886 837 887 case 0x10: 838 d0 = dsp_get_data ( s);888 d0 = dsp_get_data (pThis); 839 889 LogFlowFunc(("cmd 0x10 d0=%#x\n", d0)); 840 890 break; 841 891 842 892 case 0x14: 843 dma_cmd8 ( s, 0, dsp_get_lohi (s) + 1);893 dma_cmd8 (pThis, 0, dsp_get_lohi (pThis) + 1); 844 894 break; 845 895 846 896 case 0x40: 847 s->time_const = dsp_get_data (s);848 LogFlowFunc(("set time const %d\n", s->time_const));897 pThis->time_const = dsp_get_data (pThis); 898 LogFlowFunc(("set time const %d\n", pThis->time_const)); 849 899 break; 850 900 … … 854 904 #endif 855 905 case 0x41: 856 s->freq = dsp_get_hilo (s);857 LogFlowFunc(("set freq %d\n", s->freq));906 pThis->freq = dsp_get_hilo (pThis); 907 LogFlowFunc(("set freq %d\n", pThis->freq)); 858 908 break; 859 909 860 910 case 0x48: 861 s->block_size = dsp_get_lohi (s) + 1;862 LogFlowFunc(("set dma block len %d\n", s->block_size));911 pThis->block_size = dsp_get_lohi (pThis) + 1; 912 LogFlowFunc(("set dma block len %d\n", pThis->block_size)); 863 913 break; 864 914 … … 875 925 uint64_t ticks; 876 926 877 freq = s->freq > 0 ?s->freq : 11025;878 samples = dsp_get_lohi ( s) + 1;879 bytes = samples << s->fmt_stereo << ((s->fmt_bits == 16) ? 1 : 0);927 freq = pThis->freq > 0 ? pThis->freq : 11025; 928 samples = dsp_get_lohi (pThis) + 1; 929 bytes = samples << pThis->fmt_stereo << ((pThis->fmt_bits == 16) ? 1 : 0); 880 930 #ifndef VBOX 881 931 ticks = (bytes * ticks_per_sec) / freq; 882 932 if (ticks < ticks_per_sec / 1024) { 883 qemu_irq_raise ( s->pic[s->irq]);933 qemu_irq_raise (pThis->pic[pThis->irq]); 884 934 } 885 935 else { 886 if ( s->aux_ts) {936 if (pThis->aux_ts) { 887 937 qemu_mod_timer ( 888 s->aux_ts,938 pThis->aux_ts, 889 939 qemu_get_clock (vm_clock) + ticks 890 940 ); … … 893 943 LogFlowFunc(("mix silence %d %d %" PRId64 "\n", samples, bytes, ticks)); 894 944 #else /* VBOX */ 895 ticks = (bytes * TMTimerGetFreq( s->pTimer)) / freq;896 if (ticks < TMTimerGetFreq( s->pTimer) / 1024)897 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 1);945 ticks = (bytes * TMTimerGetFreq(pThis->pTimer)) / freq; 946 if (ticks < TMTimerGetFreq(pThis->pTimer) / 1024) 947 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1); 898 948 else 899 TMTimerSet( s->pTimer, TMTimerGet(s->pTimer) + ticks);949 TMTimerSet(pThis->pTimer, TMTimerGet(pThis->pTimer) + ticks); 900 950 LogFlowFunc(("mix silence %d %d % %RU64\n", samples, bytes, ticks)); 901 951 #endif /* VBOX */ … … 904 954 905 955 case 0xe0: 906 d0 = dsp_get_data ( s);907 s->out_data_len = 0;956 d0 = dsp_get_data (pThis); 957 pThis->out_data_len = 0; 908 958 LogFlowFunc(("E0 data = %#x\n", d0)); 909 dsp_out_data ( s, ~d0);959 dsp_out_data (pThis, ~d0); 910 960 break; 911 961 912 962 case 0xe2: 913 d0 = dsp_get_data ( s);963 d0 = dsp_get_data (pThis); 914 964 LogFlow(("SB16:E2 = %#x\n", d0)); 915 965 break; 916 966 917 967 case 0xe4: 918 s->test_reg = dsp_get_data (s);968 pThis->test_reg = dsp_get_data (pThis); 919 969 break; 920 970 921 971 case 0xf9: 922 d0 = dsp_get_data ( s);972 d0 = dsp_get_data (pThis); 923 973 LogFlowFunc(("command 0xf9 with %#x\n", d0)); 924 974 switch (d0) { 925 975 case 0x0e: 926 dsp_out_data ( s, 0xff);976 dsp_out_data (pThis, 0xff); 927 977 break; 928 978 929 979 case 0x0f: 930 dsp_out_data ( s, 0x07);980 dsp_out_data (pThis, 0x07); 931 981 break; 932 982 933 983 case 0x37: 934 dsp_out_data ( s, 0x38);984 dsp_out_data (pThis, 0x38); 935 985 break; 936 986 937 987 default: 938 dsp_out_data ( s, 0x00);988 dsp_out_data (pThis, 0x00); 939 989 break; 940 990 } … … 942 992 943 993 default: 944 LogFlowFunc(("complete: unrecognized command %#x\n", s->cmd));994 LogFlowFunc(("complete: unrecognized command %#x\n", pThis->cmd)); 945 995 return; 946 996 } … … 948 998 949 999 LogFlow(("\n")); 950 s->cmd = -1;1000 pThis->cmd = -1; 951 1001 return; 952 1002 } 953 1003 954 static void legacy_reset ( SB16State *s)955 { 956 s->freq = 11025;957 s->fmt_signed = 0;958 s->fmt_bits = 8;959 s->fmt_stereo = 0;1004 static void legacy_reset (PSB16STATE pThis) 1005 { 1006 pThis->freq = 11025; 1007 pThis->fmt_signed = 0; 1008 pThis->fmt_bits = 8; 1009 pThis->fmt_stereo = 0; 960 1010 961 1011 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 962 1012 PDMAUDIOSTREAMCFG as; 963 as.uHz = s->freq;1013 as.uHz = pThis->freq; 964 1014 as.cChannels = 1; 965 1015 as.enmFormat = AUD_FMT_U8; 966 1016 as.enmEndianness = PDMAUDIOHOSTENDIANESS; 967 1017 968 int rc = s->pDrv->pfnOpenOut(s->pDrv, "sb16.out", &as, &s->pGstStrmOut);1018 int rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, "sb16.out", &as, &pThis->pGstStrmOut); 969 1019 AssertRC(rc); 970 1020 #else 971 1021 audsettings_t as; 972 as.freq = s->freq;1022 as.freq = pThis->freq; 973 1023 as.nchannels = 1; 974 1024 as.fmt = AUD_FMT_U8; 975 1025 as.endianness = 0; 976 s->voice = AUD_open_out (977 & s->card,978 s->voice,1026 pThis->voice = AUD_open_out ( 1027 &pThis->card, 1028 pThis->voice, 979 1029 "sb16", 980 s,1030 pThis, 981 1031 sb16AudioCallback, 982 1032 &as … … 985 1035 986 1036 /* Not sure about that... */ 987 /* AUD_set_active_out ( s->voice, 1); */988 } 989 990 static void reset ( SB16State *s)1037 /* AUD_set_active_out (pThis->voice, 1); */ 1038 } 1039 1040 static void reset (PSB16STATE pThis) 991 1041 { 992 1042 #ifndef VBOX 993 qemu_irq_lower ( s->pic[s->irq]);994 if ( s->dma_auto) {995 qemu_irq_raise ( s->pic[s->irq]);996 qemu_irq_lower ( s->pic[s->irq]);1043 qemu_irq_lower (pThis->pic[pThis->irq]); 1044 if (pThis->dma_auto) { 1045 qemu_irq_raise (pThis->pic[pThis->irq]); 1046 qemu_irq_lower (pThis->pic[pThis->irq]); 997 1047 } 998 1048 #else /* VBOX */ 999 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 0);1000 if ( s->dma_auto) {1001 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 1);1002 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 0);1049 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0); 1050 if (pThis->dma_auto) { 1051 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1); 1052 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0); 1003 1053 } 1004 1054 #endif /* VBOX */ 1005 1055 1006 s->mixer_regs[0x82] = 0;1007 s->dma_auto = 0;1008 s->in_index = 0;1009 s->out_data_len = 0;1010 s->left_till_irq = 0;1011 s->needed_bytes = 0;1012 s->block_size = -1;1013 s->nzero = 0;1014 s->highspeed = 0;1015 s->v2x6 = 0;1016 s->cmd = -1;1017 1018 dsp_out_data( s, 0xaa);1019 speaker ( s, 0);1020 control ( s, 0);1021 legacy_reset ( s);1056 pThis->mixer_regs[0x82] = 0; 1057 pThis->dma_auto = 0; 1058 pThis->in_index = 0; 1059 pThis->out_data_len = 0; 1060 pThis->left_till_irq = 0; 1061 pThis->needed_bytes = 0; 1062 pThis->block_size = -1; 1063 pThis->nzero = 0; 1064 pThis->highspeed = 0; 1065 pThis->v2x6 = 0; 1066 pThis->cmd = -1; 1067 1068 dsp_out_data(pThis, 0xaa); 1069 speaker (pThis, 0); 1070 control (pThis, 0); 1071 legacy_reset (pThis); 1022 1072 } 1023 1073 1024 1074 static IO_WRITE_PROTO (dsp_write) 1025 1075 { 1026 SB16State *s = (SB16State*)opaque;1027 int iport = nport - s->port;1076 PSB16STATE pThis = (SB16STATE*)opaque; 1077 int iport = nport - pThis->port; 1028 1078 1029 1079 LogFlowFunc(("write %#x <- %#x\n", nport, val)); … … 1032 1082 switch (val) { 1033 1083 case 0x00: 1034 if ( s->v2x6 == 1) {1035 if (0 && s->highspeed) {1036 s->highspeed = 0;1084 if (pThis->v2x6 == 1) { 1085 if (0 && pThis->highspeed) { 1086 pThis->highspeed = 0; 1037 1087 #ifndef VBOX 1038 qemu_irq_lower ( s->pic[s->irq]);1039 #else 1040 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 0);1041 #endif 1042 control ( s, 0);1088 qemu_irq_lower (pThis->pic[pThis->irq]); 1089 #else 1090 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0); 1091 #endif 1092 control (pThis, 0); 1043 1093 } 1044 1094 else { 1045 reset ( s);1095 reset (pThis); 1046 1096 } 1047 1097 } 1048 s->v2x6 = 0;1098 pThis->v2x6 = 0; 1049 1099 break; 1050 1100 1051 1101 case 0x01: 1052 1102 case 0x03: /* FreeBSD kludge */ 1053 s->v2x6 = 1;1103 pThis->v2x6 = 1; 1054 1104 break; 1055 1105 1056 1106 case 0xc6: 1057 s->v2x6 = 0; /* Prince of Persia, csp.sys, diagnose.exe */1107 pThis->v2x6 = 0; /* Prince of Persia, csp.sys, diagnose.exe */ 1058 1108 break; 1059 1109 1060 1110 case 0xb8: /* Panic */ 1061 reset ( s);1111 reset (pThis); 1062 1112 break; 1063 1113 1064 1114 case 0x39: 1065 dsp_out_data ( s, 0x38);1066 reset ( s);1067 s->v2x6 = 0x39;1115 dsp_out_data (pThis, 0x38); 1116 reset (pThis); 1117 pThis->v2x6 = 0x39; 1068 1118 break; 1069 1119 1070 1120 default: 1071 s->v2x6 = val;1121 pThis->v2x6 = val; 1072 1122 break; 1073 1123 } … … 1075 1125 1076 1126 case 0x0c: /* write data or command | write status */ 1077 /* if ( s->highspeed) */1127 /* if (pThis->highspeed) */ 1078 1128 /* break; */ 1079 1129 1080 if (0 == s->needed_bytes) {1081 command ( s, val);1130 if (0 == pThis->needed_bytes) { 1131 command (pThis, val); 1082 1132 #if 0 1083 if (0 == s->needed_bytes) {1084 log_dsp ( s);1133 if (0 == pThis->needed_bytes) { 1134 log_dsp (pThis); 1085 1135 } 1086 1136 #endif 1087 1137 } 1088 1138 else { 1089 if ( s->in_index == sizeof (s->in2_data)) {1139 if (pThis->in_index == sizeof (pThis->in2_data)) { 1090 1140 LogFlowFunc(("in data overrun\n")); 1091 1141 } 1092 1142 else { 1093 s->in2_data[s->in_index++] = val;1094 if ( s->in_index ==s->needed_bytes) {1095 s->needed_bytes = 0;1096 complete ( s);1143 pThis->in2_data[pThis->in_index++] = val; 1144 if (pThis->in_index == pThis->needed_bytes) { 1145 pThis->needed_bytes = 0; 1146 complete (pThis); 1097 1147 #if 0 1098 log_dsp ( s);1148 log_dsp (pThis); 1099 1149 #endif 1100 1150 } … … 1115 1165 static IO_READ_PROTO (dsp_read) 1116 1166 { 1117 SB16State *s = (SB16State*)opaque;1167 PSB16STATE pThis = (SB16STATE*)opaque; 1118 1168 int iport, retval, ack = 0; 1119 1169 1120 iport = nport - s->port;1170 iport = nport - pThis->port; 1121 1171 #ifdef VBOX 1122 1172 /** @todo reject non-byte access? … … 1130 1180 1131 1181 case 0x0a: /* read data */ 1132 if ( s->out_data_len) {1133 retval = s->out_data[--s->out_data_len];1134 s->last_read_byte = retval;1182 if (pThis->out_data_len) { 1183 retval = pThis->out_data[--pThis->out_data_len]; 1184 pThis->last_read_byte = retval; 1135 1185 } 1136 1186 else { 1137 if ( s->cmd != -1) {1187 if (pThis->cmd != -1) { 1138 1188 LogFlowFunc(("empty output buffer for command %#x\n", 1139 s->cmd));1189 pThis->cmd)); 1140 1190 } 1141 retval = s->last_read_byte;1191 retval = pThis->last_read_byte; 1142 1192 /* goto error; */ 1143 1193 } … … 1145 1195 1146 1196 case 0x0c: /* 0 can write */ 1147 retval = s->can_write ? 0 : 0x80;1197 retval = pThis->can_write ? 0 : 0x80; 1148 1198 break; 1149 1199 … … 1154 1204 1155 1205 case 0x0e: /* data available status | irq 8 ack */ 1156 retval = (! s->out_data_len ||s->highspeed) ? 0 : 0x80;1157 if ( s->mixer_regs[0x82] & 1) {1206 retval = (!pThis->out_data_len || pThis->highspeed) ? 0 : 0x80; 1207 if (pThis->mixer_regs[0x82] & 1) { 1158 1208 ack = 1; 1159 s->mixer_regs[0x82] &= ~1;1209 pThis->mixer_regs[0x82] &= ~1; 1160 1210 #ifndef VBOX 1161 qemu_irq_lower ( s->pic[s->irq]);1162 #else 1163 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 0);1211 qemu_irq_lower (pThis->pic[pThis->irq]); 1212 #else 1213 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0); 1164 1214 #endif 1165 1215 } … … 1168 1218 case 0x0f: /* irq 16 ack */ 1169 1219 retval = 0xff; 1170 if ( s->mixer_regs[0x82] & 2) {1220 if (pThis->mixer_regs[0x82] & 2) { 1171 1221 ack = 1; 1172 s->mixer_regs[0x82] &= ~2;1222 pThis->mixer_regs[0x82] &= ~2; 1173 1223 #ifndef VBOX 1174 qemu_irq_lower ( s->pic[s->irq]);1175 #else 1176 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 0);1224 qemu_irq_lower (pThis->pic[pThis->irq]); 1225 #else 1226 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0); 1177 1227 #endif 1178 1228 } … … 1203 1253 } 1204 1254 1205 static void reset_mixer ( SB16State *s)1255 static void reset_mixer (PSB16STATE pThis) 1206 1256 { 1207 1257 int i; 1208 1258 1209 memset ( s->mixer_regs, 0xff, 0x7f);1210 memset ( s->mixer_regs + 0x83, 0xff, sizeof (s->mixer_regs) - 0x83);1211 1212 s->mixer_regs[0x02] = 4; /* master volume 3bits */1213 s->mixer_regs[0x06] = 4; /* MIDI volume 3bits */1214 s->mixer_regs[0x08] = 0; /* CD volume 3bits */1215 s->mixer_regs[0x0a] = 0; /* voice volume 2bits */1259 memset (pThis->mixer_regs, 0xff, 0x7f); 1260 memset (pThis->mixer_regs + 0x83, 0xff, sizeof (pThis->mixer_regs) - 0x83); 1261 1262 pThis->mixer_regs[0x02] = 4; /* master volume 3bits */ 1263 pThis->mixer_regs[0x06] = 4; /* MIDI volume 3bits */ 1264 pThis->mixer_regs[0x08] = 0; /* CD volume 3bits */ 1265 pThis->mixer_regs[0x0a] = 0; /* voice volume 2bits */ 1216 1266 1217 1267 /* d5=input filt, d3=lowpass filt, d1,d2=input source */ 1218 s->mixer_regs[0x0c] = 0;1268 pThis->mixer_regs[0x0c] = 0; 1219 1269 1220 1270 /* d5=output filt, d1=stereo switch */ 1221 s->mixer_regs[0x0e] = 0;1271 pThis->mixer_regs[0x0e] = 0; 1222 1272 1223 1273 /* voice volume L d5,d7, R d1,d3 */ 1224 s->mixer_regs[0x04] = (4 << 5) | (4 << 1);1274 pThis->mixer_regs[0x04] = (4 << 5) | (4 << 1); 1225 1275 /* master ... */ 1226 s->mixer_regs[0x22] = (4 << 5) | (4 << 1);1276 pThis->mixer_regs[0x22] = (4 << 5) | (4 << 1); 1227 1277 /* MIDI ... */ 1228 s->mixer_regs[0x26] = (4 << 5) | (4 << 1);1278 pThis->mixer_regs[0x26] = (4 << 5) | (4 << 1); 1229 1279 1230 1280 for (i = 0x30; i < 0x48; i++) { 1231 s->mixer_regs[i] = 0x20;1281 pThis->mixer_regs[i] = 0x20; 1232 1282 } 1233 1283 } … … 1235 1285 static IO_WRITE_PROTO(mixer_write_indexb) 1236 1286 { 1237 SB16State *s = (SB16State*)opaque;1287 PSB16STATE pThis = (SB16STATE*)opaque; 1238 1288 (void) nport; 1239 s->mixer_nreg = val;1289 pThis->mixer_nreg = val; 1240 1290 1241 1291 #ifdef VBOX … … 1263 1313 static IO_WRITE_PROTO(mixer_write_datab) 1264 1314 { 1265 SB16State *s = (SB16State*)opaque;1266 bool update_master = false;1267 bool update_voice= false;1315 PSB16STATE pThis = (PSB16STATE)opaque; 1316 bool fUpdateMaster = false; 1317 bool fUpdateStream = false; 1268 1318 1269 1319 (void) nport; 1270 LogFlowFunc(("mixer_write [%#x] <- %#x\n", s->mixer_nreg, val)); 1271 1272 switch (s->mixer_nreg) { 1273 case 0x00: 1274 reset_mixer(s); 1275 /* And update the actual volume, too. */ 1276 update_master = true; 1277 update_voice = true; 1278 break; 1279 1280 case 0x04: 1281 /* Translate from old style voice volume (L/R). */ 1282 s->mixer_regs[0x32] = val & 0xff; 1283 s->mixer_regs[0x33] = val << 4; 1284 update_voice = true; 1285 break; 1286 1287 case 0x22: 1288 /* Translate from old style master volume (L/R). */ 1289 s->mixer_regs[0x30] = val & 0xff; 1290 s->mixer_regs[0x31] = val << 4; 1291 update_master = true; 1292 break; 1293 1294 case 0x30: 1295 /* Translate to old style master volume (L). */ 1296 s->mixer_regs[0x22] = (s->mixer_regs[0x22] & 0x0f) | val; 1297 update_master = true; 1298 break; 1299 1300 case 0x31: 1301 /* Translate to old style master volume (R). */ 1302 s->mixer_regs[0x22] = (s->mixer_regs[0x22] & 0xf0) | (val >> 4); 1303 update_master = true; 1304 break; 1305 1306 case 0x32: 1307 /* Translate to old style voice volume (L). */ 1308 s->mixer_regs[0x04] = (s->mixer_regs[0x04] & 0x0f) | val; 1309 update_voice = true; 1310 break; 1311 1312 case 0x33: 1313 /* Translate to old style voice volume (R). */ 1314 s->mixer_regs[0x04] = (s->mixer_regs[0x04] & 0xf0) | (val >> 4); 1315 update_voice = true; 1316 break; 1317 1318 case 0x80: 1320 LogFlowFunc(("mixer_write [%#x] <- %#x\n", pThis->mixer_nreg, val)); 1321 1322 switch (pThis->mixer_nreg) 1323 { 1324 case 0x00: 1325 reset_mixer(pThis); 1326 /* And update the actual volume, too. */ 1327 fUpdateMaster = true; 1328 fUpdateStream = true; 1329 break; 1330 1331 case 0x04: 1332 /* Translate from old style stream volume (L/R). */ 1333 pThis->mixer_regs[0x32] = val & 0xff; 1334 pThis->mixer_regs[0x33] = val << 4; 1335 fUpdateStream = true; 1336 break; 1337 1338 case 0x22: 1339 /* Translate from old style master volume (L/R). */ 1340 pThis->mixer_regs[0x30] = val & 0xff; 1341 pThis->mixer_regs[0x31] = val << 4; 1342 fUpdateMaster = true; 1343 break; 1344 1345 case 0x30: 1346 /* Translate to old style master volume (L). */ 1347 pThis->mixer_regs[0x22] = (pThis->mixer_regs[0x22] & 0x0f) | val; 1348 fUpdateMaster = true; 1349 break; 1350 1351 case 0x31: 1352 /* Translate to old style master volume (R). */ 1353 pThis->mixer_regs[0x22] = (pThis->mixer_regs[0x22] & 0xf0) | (val >> 4); 1354 fUpdateMaster = true; 1355 break; 1356 1357 case 0x32: 1358 /* Translate to old style stream volume (L). */ 1359 pThis->mixer_regs[0x04] = (pThis->mixer_regs[0x04] & 0x0f) | val; 1360 fUpdateStream = true; 1361 break; 1362 1363 case 0x33: 1364 /* Translate to old style stream volume (R). */ 1365 pThis->mixer_regs[0x04] = (pThis->mixer_regs[0x04] & 0xf0) | (val >> 4); 1366 fUpdateStream = true; 1367 break; 1368 1369 case 0x80: 1319 1370 { 1320 int irq = irq_of_magic 1371 int irq = irq_of_magic(val); 1321 1372 LogFlowFunc(("setting irq to %d (val=%#x)\n", irq, val)); 1322 if (irq > 0) { 1323 s->irq = irq; 1324 } 1325 } 1326 break; 1327 1328 case 0x81: 1373 if (irq > 0) 1374 pThis->irq = irq; 1375 break; 1376 } 1377 1378 case 0x81: 1329 1379 { 1330 1380 int dma, hdma; … … 1332 1382 dma = lsbindex (val & 0xf); 1333 1383 hdma = lsbindex (val & 0xf0); 1334 if (dma != s->dma || hdma != s->hdma) { 1335 LogFlow(( 1336 "SB16: attempt to change DMA " 1337 "8bit %d(%d), 16bit %d(%d) (val=%#x)\n", 1338 dma, s->dma, hdma, s->hdma, val)); 1339 } 1384 if (dma != pThis->dma || hdma != pThis->hdma) 1385 LogFlow(("SB16: attempt to change DMA 8bit %d(%d), 16bit %d(%d) (val=%#x)\n", 1386 dma, pThis->dma, hdma, pThis->hdma, val)); 1340 1387 #if 0 1341 s->dma = dma; 1342 s->hdma = hdma; 1343 #endif 1344 } 1345 break; 1346 1347 case 0x82: 1348 LogFlowFunc(("attempt to write into IRQ status register (val=%#x)\n", 1349 val)); 1388 pThis->dma = dma; 1389 pThis->hdma = hdma; 1390 #endif 1391 break; 1392 } 1393 1394 case 0x82: 1395 LogFlowFunc(("attempt to write into IRQ status register (val=%#x)\n", val)); 1350 1396 #ifdef VBOX 1351 return VINF_SUCCESS; 1352 #endif 1353 1354 default: 1355 if (s->mixer_nreg >= 0x80) { 1356 LogFlowFunc(("attempt to write mixer[%#x] <- %#x\n", s->mixer_nreg, val)); 1357 } 1358 break; 1359 } 1360 1361 s->mixer_regs[s->mixer_nreg] = val; 1397 return VINF_SUCCESS; 1398 #endif 1399 1400 default: 1401 if (pThis->mixer_nreg >= 0x80) 1402 LogFlowFunc(("attempt to write mixer[%#x] <- %#x\n", pThis->mixer_nreg, val)); 1403 break; 1404 } 1405 1406 pThis->mixer_regs[pThis->mixer_nreg] = val; 1362 1407 1363 1408 #ifdef VBOX 1364 1409 /* Update the master (mixer) volume. */ 1365 if ( update_master)1410 if (fUpdateMaster) 1366 1411 { 1367 int mute = 0; 1368 uint8_t lvol = s->mixer_regs[0x30];1369 uint8_t rvol = s->mixer_regs[0x31];1412 int mute = 0; /** @todo Handle (un)muting. */ 1413 uint8_t lvol = pThis->mixer_regs[0x30]; 1414 uint8_t rvol = pThis->mixer_regs[0x31]; 1370 1415 1371 1416 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 1372 s->pDrv->pfnSetVolume(s->pDrv, RT_BOOL(mute), lvol, rvol); 1417 PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol }; 1418 audioMixerSetMasterVolume(pThis->pMixer, &vol); 1373 1419 #else 1374 1420 AUD_set_volume(AUD_MIXER_VOLUME, &mute, &lvol, &rvol); 1375 1421 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */ 1376 1422 } 1377 /* Update the voice (PCM) volume. */ 1378 if (update_voice) 1423 1424 /* Update the stream (PCM) volume. */ 1425 if (fUpdateStream) 1379 1426 { 1380 int mute = 0; 1381 uint8_t lvol = s->mixer_regs[0x32];1382 uint8_t rvol = s->mixer_regs[0x33];1427 int mute = 0; /** @todo Handle (un)muting. */ 1428 uint8_t lvol = pThis->mixer_regs[0x32]; 1429 uint8_t rvol = pThis->mixer_regs[0x33]; 1383 1430 1384 1431 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 1385 s->pDrv->pfnSetVolume(s->pDrv, RT_BOOL(mute), lvol, rvol); 1432 PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol }; 1433 audioMixerSetSinkVolume(pThis->pSinkOutput, &vol); 1386 1434 #else 1387 1435 AUD_set_volume(AUD_MIXER_PCM, &mute, &lvol, &rvol); … … 1401 1449 mixer_write_datab (opaque, nport, (val >> 8) & 0xff); 1402 1450 #else /* VBOX */ 1403 SB16State *s = (SB16State*)opaque;1404 int iport = nport - s->port;1451 PSB16STATE pThis = (SB16STATE*)opaque; 1452 int iport = nport - pThis->port; 1405 1453 switch (cb) 1406 1454 { … … 1430 1478 static IO_READ_PROTO(mixer_read) 1431 1479 { 1432 SB16State *s = (SB16State*)opaque;1480 PSB16STATE pThis = (SB16STATE*)opaque; 1433 1481 1434 1482 (void) nport; 1435 1483 #ifndef DEBUG_SB16_MOST 1436 if ( s->mixer_nreg != 0x82) {1484 if (pThis->mixer_nreg != 0x82) { 1437 1485 LogFlowFunc(("mixer_read[%#x] -> %#x\n", 1438 s->mixer_nreg, s->mixer_regs[s->mixer_nreg]));1486 pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg])); 1439 1487 } 1440 1488 #else 1441 1489 LogFlowFunc(("mixer_read[%#x] -> %#x\n", 1442 s->mixer_nreg, s->mixer_regs[s->mixer_nreg]));1490 pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg])); 1443 1491 #endif 1444 1492 #ifndef VBOX 1445 return s->mixer_regs[s->mixer_nreg];1446 #else 1447 *pu32 = s->mixer_regs[s->mixer_nreg];1493 return pThis->mixer_regs[pThis->mixer_nreg]; 1494 #else 1495 *pu32 = pThis->mixer_regs[pThis->mixer_nreg]; 1448 1496 return VINF_SUCCESS; 1449 1497 #endif 1450 1498 } 1451 1499 1452 static int write_audio ( SB16State *s, int nchan, int dma_pos,1500 static int write_audio (PSB16STATE pThis, int nchan, int dma_pos, 1453 1501 int dma_len, int len) 1454 1502 { … … 1477 1525 copied = DMA_read_memory (nchan, tmpbuf, dma_pos, to_copy); 1478 1526 #else 1479 int rc = PDMDevHlpDMAReadMemory( s->pDevIns, nchan, tmpbuf, dma_pos,1527 int rc = PDMDevHlpDMAReadMemory(pThis->pDevIns, nchan, tmpbuf, dma_pos, 1480 1528 to_copy, &copied); 1481 1529 AssertMsgRC (rc, ("DMAReadMemory -> %Rrc\n", rc)); … … 1483 1531 1484 1532 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 1485 rc = s->pDrv->pfnWrite(s->pDrv,s->pGstStrmOut, tmpbuf, to_copy, &copied);1533 rc = pThis->pDrv->pfnWrite(pThis->pDrv, pThis->pGstStrmOut, tmpbuf, to_copy, &copied); 1486 1534 if (RT_FAILURE(rc)) 1487 1535 break; 1488 1536 #else 1489 copied = AUD_write ( s->voice, tmpbuf, copied);1537 copied = AUD_write (pThis->voice, tmpbuf, copied); 1490 1538 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */ 1491 1539 … … 1507 1555 #endif 1508 1556 { 1509 SB16State *s = (SB16State*)opaque;1557 PSB16STATE pThis = (SB16STATE*)opaque; 1510 1558 int till, copy, written, free; 1511 1559 1512 if ( s->block_size <= 0) {1560 if (pThis->block_size <= 0) { 1513 1561 LogFlowFunc(("invalid block size=%d nchan=%d dma_pos=%d dma_len=%d\n", 1514 s->block_size, nchan, dma_pos, dma_len));1562 pThis->block_size, nchan, dma_pos, dma_len)); 1515 1563 return dma_pos; 1516 1564 } 1517 1565 1518 if ( s->left_till_irq < 0) {1519 s->left_till_irq =s->block_size;1566 if (pThis->left_till_irq < 0) { 1567 pThis->left_till_irq = pThis->block_size; 1520 1568 } 1521 1569 1522 1570 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 1523 if ( s->pGstStrmOut) {1524 #else 1525 if ( s->voice) {1571 if (pThis->pGstStrmOut) { 1572 #else 1573 if (pThis->voice) { 1526 1574 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */ 1527 free = s->audio_free & ~s->align;1575 free = pThis->audio_free & ~pThis->align; 1528 1576 if ((free <= 0) || !dma_len) { 1529 1577 return dma_pos; … … 1535 1583 1536 1584 copy = free; 1537 till = s->left_till_irq;1585 till = pThis->left_till_irq; 1538 1586 1539 1587 #ifdef DEBUG_SB16_MOST … … 1543 1591 1544 1592 if (copy >= till) { 1545 if (0 == s->dma_auto) {1593 if (0 == pThis->dma_auto) { 1546 1594 copy = till; 1547 1595 } else { 1548 if( copy >= till + s->block_size ) {1596 if( copy >= till + pThis->block_size ) { 1549 1597 copy = till; /* Make sure we won't skip IRQs. */ 1550 1598 } … … 1552 1600 } 1553 1601 1554 written = write_audio ( s, nchan, dma_pos, dma_len, copy);1602 written = write_audio (pThis, nchan, dma_pos, dma_len, copy); 1555 1603 dma_pos = (dma_pos + written) % dma_len; 1556 s->left_till_irq -= written;1557 1558 if ( s->left_till_irq <= 0) {1559 s->mixer_regs[0x82] |= (nchan & 4) ? 2 : 1;1604 pThis->left_till_irq -= written; 1605 1606 if (pThis->left_till_irq <= 0) { 1607 pThis->mixer_regs[0x82] |= (nchan & 4) ? 2 : 1; 1560 1608 #ifndef VBOX 1561 qemu_irq_raise ( s->pic[s->irq]);1562 #else 1563 PDMDevHlpISASetIrq( s->pDevIns,s->irq, 1);1564 #endif 1565 if (0 == s->dma_auto) {1566 control ( s, 0);1567 speaker ( s, 0);1609 qemu_irq_raise (pThis->pic[pThis->irq]); 1610 #else 1611 PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1); 1612 #endif 1613 if (0 == pThis->dma_auto) { 1614 control (pThis, 0); 1615 speaker (pThis, 0); 1568 1616 } 1569 1617 } … … 1571 1619 #ifdef DEBUG_SB16_MOST 1572 1620 LogFlowFunc(("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n", 1573 dma_pos, free, dma_len, s->left_till_irq, copy, written,1574 s->block_size));1575 #endif 1576 1577 while ( s->left_till_irq <= 0) {1578 s->left_till_irq = s->block_size +s->left_till_irq;1621 dma_pos, free, dma_len, pThis->left_till_irq, copy, written, 1622 pThis->block_size)); 1623 #endif 1624 1625 while (pThis->left_till_irq <= 0) { 1626 pThis->left_till_irq = pThis->block_size + pThis->left_till_irq; 1579 1627 } 1580 1628 … … 1588 1636 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */ 1589 1637 { 1590 SB16S tate *pState = (SB16State*)pvContext;1638 SB16STATE *pState = (SB16STATE*)pvContext; 1591 1639 AssertPtrReturnVoid(pState); 1592 1640 pState->audio_free = cbFree; … … 1600 1648 { 1601 1649 #ifndef VBOX 1602 SB16State *s = opaque;1603 #else 1604 SB16State *s = (SB16State*)opaque;1605 #endif 1606 1607 qemu_put_be32 (f, s->irq);1608 qemu_put_be32 (f, s->dma);1609 qemu_put_be32 (f, s->hdma);1610 qemu_put_be32 (f, s->port);1611 qemu_put_be32 (f, s->ver);1612 qemu_put_be32 (f, s->in_index);1613 qemu_put_be32 (f, s->out_data_len);1614 qemu_put_be32 (f, s->fmt_stereo);1615 qemu_put_be32 (f, s->fmt_signed);1616 qemu_put_be32 (f, s->fmt_bits);1617 qemu_put_be32s (f, & s->fmt);1618 qemu_put_be32 (f, s->dma_auto);1619 qemu_put_be32 (f, s->block_size);1620 qemu_put_be32 (f, s->fifo);1621 qemu_put_be32 (f, s->freq);1622 qemu_put_be32 (f, s->time_const);1623 qemu_put_be32 (f, s->speaker);1624 qemu_put_be32 (f, s->needed_bytes);1625 qemu_put_be32 (f, s->cmd);1626 qemu_put_be32 (f, s->use_hdma);1627 qemu_put_be32 (f, s->highspeed);1628 qemu_put_be32 (f, s->can_write);1629 qemu_put_be32 (f, s->v2x6);1630 1631 qemu_put_8s (f, & s->csp_param);1632 qemu_put_8s (f, & s->csp_value);1633 qemu_put_8s (f, & s->csp_mode);1634 qemu_put_8s (f, & s->csp_param);1635 qemu_put_buffer (f, s->csp_regs, 256);1636 qemu_put_8s (f, & s->csp_index);1637 qemu_put_buffer (f, s->csp_reg83, 4);1638 qemu_put_be32 (f, s->csp_reg83r);1639 qemu_put_be32 (f, s->csp_reg83w);1640 1641 qemu_put_buffer (f, s->in2_data, sizeof (s->in2_data));1642 qemu_put_buffer (f, s->out_data, sizeof (s->out_data));1643 qemu_put_8s (f, & s->test_reg);1644 qemu_put_8s (f, & s->last_read_byte);1645 1646 qemu_put_be32 (f, s->nzero);1647 qemu_put_be32 (f, s->left_till_irq);1648 qemu_put_be32 (f, s->dma_running);1649 qemu_put_be32 (f, s->bytes_per_second);1650 qemu_put_be32 (f, s->align);1651 1652 qemu_put_be32 (f, s->mixer_nreg);1653 qemu_put_buffer (f, s->mixer_regs, 256);1650 PSB16STATE pThis = opaque; 1651 #else 1652 PSB16STATE pThis = (SB16STATE *)opaque; 1653 #endif 1654 1655 qemu_put_be32 (f, pThis->irq); 1656 qemu_put_be32 (f, pThis->dma); 1657 qemu_put_be32 (f, pThis->hdma); 1658 qemu_put_be32 (f, pThis->port); 1659 qemu_put_be32 (f, pThis->ver); 1660 qemu_put_be32 (f, pThis->in_index); 1661 qemu_put_be32 (f, pThis->out_data_len); 1662 qemu_put_be32 (f, pThis->fmt_stereo); 1663 qemu_put_be32 (f, pThis->fmt_signed); 1664 qemu_put_be32 (f, pThis->fmt_bits); 1665 qemu_put_be32s (f, &pThis->fmt); 1666 qemu_put_be32 (f, pThis->dma_auto); 1667 qemu_put_be32 (f, pThis->block_size); 1668 qemu_put_be32 (f, pThis->fifo); 1669 qemu_put_be32 (f, pThis->freq); 1670 qemu_put_be32 (f, pThis->time_const); 1671 qemu_put_be32 (f, pThis->speaker); 1672 qemu_put_be32 (f, pThis->needed_bytes); 1673 qemu_put_be32 (f, pThis->cmd); 1674 qemu_put_be32 (f, pThis->use_hdma); 1675 qemu_put_be32 (f, pThis->highspeed); 1676 qemu_put_be32 (f, pThis->can_write); 1677 qemu_put_be32 (f, pThis->v2x6); 1678 1679 qemu_put_8s (f, &pThis->csp_param); 1680 qemu_put_8s (f, &pThis->csp_value); 1681 qemu_put_8s (f, &pThis->csp_mode); 1682 qemu_put_8s (f, &pThis->csp_param); 1683 qemu_put_buffer (f, pThis->csp_regs, 256); 1684 qemu_put_8s (f, &pThis->csp_index); 1685 qemu_put_buffer (f, pThis->csp_reg83, 4); 1686 qemu_put_be32 (f, pThis->csp_reg83r); 1687 qemu_put_be32 (f, pThis->csp_reg83w); 1688 1689 qemu_put_buffer (f, pThis->in2_data, sizeof (pThis->in2_data)); 1690 qemu_put_buffer (f, pThis->out_data, sizeof (pThis->out_data)); 1691 qemu_put_8s (f, &pThis->test_reg); 1692 qemu_put_8s (f, &pThis->last_read_byte); 1693 1694 qemu_put_be32 (f, pThis->nzero); 1695 qemu_put_be32 (f, pThis->left_till_irq); 1696 qemu_put_be32 (f, pThis->dma_running); 1697 qemu_put_be32 (f, pThis->bytes_per_second); 1698 qemu_put_be32 (f, pThis->align); 1699 1700 qemu_put_be32 (f, pThis->mixer_nreg); 1701 qemu_put_buffer (f, pThis->mixer_regs, 256); 1654 1702 } 1655 1703 … … 1657 1705 { 1658 1706 #ifndef VBOX 1659 SB16State *s = opaque;1707 PSB16STATE pThis = opaque; 1660 1708 1661 1709 if (version_id != 1) { … … 1663 1711 } 1664 1712 #else 1665 SB16State *s = (SB16State*)opaque;1666 #endif 1667 1668 s->irq=qemu_get_be32 (f);1669 s->dma=qemu_get_be32 (f);1670 s->hdma=qemu_get_be32 (f);1671 s->port=qemu_get_be32 (f);1672 s->ver=qemu_get_be32 (f);1673 s->in_index=qemu_get_be32 (f);1674 s->out_data_len=qemu_get_be32 (f);1675 s->fmt_stereo=qemu_get_be32 (f);1676 s->fmt_signed=qemu_get_be32 (f);1677 s->fmt_bits=qemu_get_be32 (f);1678 qemu_get_be32s (f, (uint32_t*)& s->fmt);1679 s->dma_auto=qemu_get_be32 (f);1680 s->block_size=qemu_get_be32 (f);1681 s->fifo=qemu_get_be32 (f);1682 s->freq=qemu_get_be32 (f);1683 s->time_const=qemu_get_be32 (f);1684 s->speaker=qemu_get_be32 (f);1685 s->needed_bytes=qemu_get_be32 (f);1686 s->cmd=qemu_get_be32 (f);1687 s->use_hdma=qemu_get_be32 (f);1688 s->highspeed=qemu_get_be32 (f);1689 s->can_write=qemu_get_be32 (f);1690 s->v2x6=qemu_get_be32 (f);1691 1692 qemu_get_8s (f, & s->csp_param);1693 qemu_get_8s (f, & s->csp_value);1694 qemu_get_8s (f, & s->csp_mode);1695 qemu_get_8s (f, & s->csp_param);1696 qemu_get_buffer (f, s->csp_regs, 256);1697 qemu_get_8s (f, & s->csp_index);1698 qemu_get_buffer (f, s->csp_reg83, 4);1699 s->csp_reg83r=qemu_get_be32 (f);1700 s->csp_reg83w=qemu_get_be32 (f);1701 1702 qemu_get_buffer (f, s->in2_data, sizeof (s->in2_data));1703 qemu_get_buffer (f, s->out_data, sizeof (s->out_data));1704 qemu_get_8s (f, & s->test_reg);1705 qemu_get_8s (f, & s->last_read_byte);1706 1707 s->nzero=qemu_get_be32 (f);1708 s->left_till_irq=qemu_get_be32 (f);1709 s->dma_running=qemu_get_be32 (f);1710 s->bytes_per_second=qemu_get_be32 (f);1711 s->align=qemu_get_be32 (f);1712 1713 s->mixer_nreg=qemu_get_be32 (f);1714 qemu_get_buffer (f, s->mixer_regs, 256);1713 PSB16STATE pThis = (SB16STATE *)opaque; 1714 #endif 1715 1716 pThis->irq=qemu_get_be32 (f); 1717 pThis->dma=qemu_get_be32 (f); 1718 pThis->hdma=qemu_get_be32 (f); 1719 pThis->port=qemu_get_be32 (f); 1720 pThis->ver=qemu_get_be32 (f); 1721 pThis->in_index=qemu_get_be32 (f); 1722 pThis->out_data_len=qemu_get_be32 (f); 1723 pThis->fmt_stereo=qemu_get_be32 (f); 1724 pThis->fmt_signed=qemu_get_be32 (f); 1725 pThis->fmt_bits=qemu_get_be32 (f); 1726 qemu_get_be32s (f, (uint32_t*)&pThis->fmt); 1727 pThis->dma_auto=qemu_get_be32 (f); 1728 pThis->block_size=qemu_get_be32 (f); 1729 pThis->fifo=qemu_get_be32 (f); 1730 pThis->freq=qemu_get_be32 (f); 1731 pThis->time_const=qemu_get_be32 (f); 1732 pThis->speaker=qemu_get_be32 (f); 1733 pThis->needed_bytes=qemu_get_be32 (f); 1734 pThis->cmd=qemu_get_be32 (f); 1735 pThis->use_hdma=qemu_get_be32 (f); 1736 pThis->highspeed=qemu_get_be32 (f); 1737 pThis->can_write=qemu_get_be32 (f); 1738 pThis->v2x6=qemu_get_be32 (f); 1739 1740 qemu_get_8s (f, &pThis->csp_param); 1741 qemu_get_8s (f, &pThis->csp_value); 1742 qemu_get_8s (f, &pThis->csp_mode); 1743 qemu_get_8s (f, &pThis->csp_param); 1744 qemu_get_buffer (f, pThis->csp_regs, 256); 1745 qemu_get_8s (f, &pThis->csp_index); 1746 qemu_get_buffer (f, pThis->csp_reg83, 4); 1747 pThis->csp_reg83r=qemu_get_be32 (f); 1748 pThis->csp_reg83w=qemu_get_be32 (f); 1749 1750 qemu_get_buffer (f, pThis->in2_data, sizeof (pThis->in2_data)); 1751 qemu_get_buffer (f, pThis->out_data, sizeof (pThis->out_data)); 1752 qemu_get_8s (f, &pThis->test_reg); 1753 qemu_get_8s (f, &pThis->last_read_byte); 1754 1755 pThis->nzero=qemu_get_be32 (f); 1756 pThis->left_till_irq=qemu_get_be32 (f); 1757 pThis->dma_running=qemu_get_be32 (f); 1758 pThis->bytes_per_second=qemu_get_be32 (f); 1759 pThis->align=qemu_get_be32 (f); 1760 1761 pThis->mixer_nreg=qemu_get_be32 (f); 1762 qemu_get_buffer (f, pThis->mixer_regs, 256); 1715 1763 1716 1764 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 1717 if ( s->pGstStrmOut)1765 if (pThis->pGstStrmOut) 1718 1766 { 1719 s->pDrv->pfnCloseOut(s->pDrv,s->pGstStrmOut);1720 s->pGstStrmOut = NULL;1721 } 1722 #else 1723 AUD_close_out (& s->card,s->voice);1724 s->voice = NULL;1767 pThis->pDrv->pfnCloseOut(pThis->pDrv, pThis->pGstStrmOut); 1768 pThis->pGstStrmOut = NULL; 1769 } 1770 #else 1771 AUD_close_out (&pThis->card, pThis->voice); 1772 pThis->voice = NULL; 1725 1773 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */ 1726 1774 1727 if ( s->dma_running)1775 if (pThis->dma_running) 1728 1776 { 1729 if ( s->freq)1777 if (pThis->freq) 1730 1778 { 1731 s->audio_free = 0;1779 pThis->audio_free = 0; 1732 1780 1733 1781 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 1734 1782 PDMAUDIOSTREAMCFG streamCfg; 1735 streamCfg.uHz = s->freq;1736 streamCfg.cChannels = 1 << s->fmt_stereo;1737 streamCfg.enmFormat = s->fmt;1783 streamCfg.uHz = pThis->freq; 1784 streamCfg.cChannels = 1 << pThis->fmt_stereo; 1785 streamCfg.enmFormat = pThis->fmt; 1738 1786 streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS; 1739 1787 1740 int rc = s->pDrv->pfnOpenOut(s->pDrv, "sb16.out", &streamCfg, &s->pGstStrmOut);1788 int rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, "sb16.out", &streamCfg, &pThis->pGstStrmOut); 1741 1789 AssertRC(rc); 1742 1790 #else 1743 1791 audsettings_t as; 1744 as.freq = s->freq;1745 as.nchannels = 1 << s->fmt_stereo;1746 as.fmt = s->fmt;1792 as.freq = pThis->freq; 1793 as.nchannels = 1 << pThis->fmt_stereo; 1794 as.fmt = pThis->fmt; 1747 1795 as.endianness = 0; 1748 s->voice = AUD_open_out (1749 & s->card,1750 s->voice,1796 pThis->voice = AUD_open_out ( 1797 &pThis->card, 1798 pThis->voice, 1751 1799 "sb16", 1752 s,1800 pThis, 1753 1801 sb16AudioCallback, 1754 1802 &as … … 1757 1805 } 1758 1806 1759 control( s, 1);1760 speaker( s,s->speaker);1807 control(pThis, 1); 1808 speaker(pThis, pThis->speaker); 1761 1809 } 1762 1810 … … 1769 1817 int SB16_init (AudioState *audio, qemu_irq *pic) 1770 1818 { 1771 SB16State *s;1819 PSB16STATE pThis; 1772 1820 int i; 1773 1821 static const uint8_t dsp_write_ports[] = {0x6, 0xc}; … … 1786 1834 } 1787 1835 1788 s->cmd = -1;1789 s->pic = pic;1790 s->irq = conf.irq;1791 s->dma = conf.dma;1792 s->hdma = conf.hdma;1793 s->port = conf.port;1794 s->ver = conf.ver_lo | (conf.ver_hi << 8);1795 1796 s->mixer_regs[0x80] = magic_of_irq (s->irq);1797 s->mixer_regs[0x81] = (1 << s->dma) | (1 <<s->hdma);1798 s->mixer_regs[0x82] = 2 << 5;1799 1800 s->csp_regs[5] = 1;1801 s->csp_regs[9] = 0xf8;1802 1803 reset_mixer ( s);1804 s->aux_ts = qemu_new_timer (vm_clock, aux_timer, s);1805 if (! s->aux_ts) {1836 pThis->cmd = -1; 1837 pThis->pic = pic; 1838 pThis->irq = conf.irq; 1839 pThis->dma = conf.dma; 1840 pThis->hdma = conf.hdma; 1841 pThis->port = conf.port; 1842 pThis->ver = conf.ver_lo | (conf.ver_hi << 8); 1843 1844 pThis->mixer_regs[0x80] = magic_of_irq (pThis->irq); 1845 pThis->mixer_regs[0x81] = (1 << pThis->dma) | (1 << pThis->hdma); 1846 pThis->mixer_regs[0x82] = 2 << 5; 1847 1848 pThis->csp_regs[5] = 1; 1849 pThis->csp_regs[9] = 0xf8; 1850 1851 reset_mixer (pThis); 1852 pThis->aux_ts = qemu_new_timer (vm_clock, aux_timer, s); 1853 if (!pThis->aux_ts) { 1806 1854 LogFlowFunc(("warning: Could not create auxiliary timer\n")); 1807 1855 } 1808 1856 1809 1857 for (i = 0; i < LENOFA (dsp_write_ports); i++) { 1810 register_ioport_write ( s->port + dsp_write_ports[i], 1, 1, dsp_write, s);1858 register_ioport_write (pThis->port + dsp_write_ports[i], 1, 1, dsp_write, s); 1811 1859 } 1812 1860 1813 1861 for (i = 0; i < LENOFA (dsp_read_ports); i++) { 1814 register_ioport_read ( s->port + dsp_read_ports[i], 1, 1, dsp_read, s);1815 } 1816 1817 register_ioport_write ( s->port + 0x4, 1, 1, mixer_write_indexb, s);1818 register_ioport_write ( s->port + 0x4, 1, 2, mixer_write_indexw, s);1819 register_ioport_read ( s->port + 0x5, 1, 1, mixer_read, s);1820 register_ioport_write ( s->port + 0x5, 1, 1, mixer_write_datab, s);1821 1822 DMA_register_channel ( s->hdma, SB_read_DMA, s);1823 DMA_register_channel ( s->dma, SB_read_DMA, s);1824 s->can_write = 1;1862 register_ioport_read (pThis->port + dsp_read_ports[i], 1, 1, dsp_read, s); 1863 } 1864 1865 register_ioport_write (pThis->port + 0x4, 1, 1, mixer_write_indexb, s); 1866 register_ioport_write (pThis->port + 0x4, 1, 2, mixer_write_indexw, s); 1867 register_ioport_read (pThis->port + 0x5, 1, 1, mixer_read, s); 1868 register_ioport_write (pThis->port + 0x5, 1, 1, mixer_write_datab, s); 1869 1870 DMA_register_channel (pThis->hdma, SB_read_DMA, s); 1871 DMA_register_channel (pThis->dma, SB_read_DMA, s); 1872 pThis->can_write = 1; 1825 1873 1826 1874 register_savevm ("sb16", 0, 1, SB_save, SB_load, s); 1827 AUD_register_card (audio, "sb16", & s->card);1875 AUD_register_card (audio, "sb16", &pThis->card); 1828 1876 return 0; 1829 1877 } … … 1834 1882 static DECLCALLBACK(int) sb16LiveExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass) 1835 1883 { 1836 SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);1884 PSB16STATE pThis = PDMINS_2_DATA (pDevIns, PSB16STATE); 1837 1885 1838 1886 SSMR3PutS32(pSSM, pThis->irqCfg); … … 1846 1894 static DECLCALLBACK(int) sb16SaveExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 1847 1895 { 1848 SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);1896 PSB16STATE pThis = PDMINS_2_DATA (pDevIns, PSB16STATE); 1849 1897 1850 1898 sb16LiveExec (pDevIns, pSSM, 0); … … 1856 1904 uint32_t uVersion, uint32_t uPass) 1857 1905 { 1858 SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);1906 PSB16STATE pThis = PDMINS_2_DATA (pDevIns, PSB16STATE); 1859 1907 1860 1908 AssertMsgReturn( uVersion == SB16_SAVE_STATE_VERSION … … 1902 1950 const char *pszIID) 1903 1951 { 1904 SB16State *pThis = RT_FROM_MEMBER(pInterface, SB16State, IBase);1952 PSB16STATE pThis = RT_FROM_MEMBER(pInterface, SB16STATE, IBase); 1905 1953 Assert(&pThis->IBase == pInterface); 1906 1954 … … 1914 1962 static DECLCALLBACK(int) sb16Destruct(PPDMDEVINS pDevIns) 1915 1963 { 1916 SB16State *pThis = PDMINS_2_DATA(pDevIns, SB16State *); 1964 PSB16STATE pThis = PDMINS_2_DATA(pDevIns, PSB16STATE); 1965 1966 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 1967 PSB16DRIVER pDrv; 1968 1969 RTListForEach(&pThis->lstDrv, pDrv, SB16DRIVER, Node) 1970 pDrv->Out.phStrmOut = NULL; 1971 1972 pThis->pSinkOutput = NULL; 1973 1974 if (pThis->pMixer) 1975 { 1976 audioMixerDestroy(pThis->pMixer); 1977 pThis->pMixer = NULL; 1978 } 1979 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */ 1917 1980 1918 1981 return VINF_SUCCESS; … … 1921 1984 static DECLCALLBACK(int) sb16Construct (PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfgHandle) 1922 1985 { 1923 SB16State *s = PDMINS_2_DATA(pDevIns, SB16State *);1986 PSB16STATE pThis = PDMINS_2_DATA(pDevIns, PSB16STATE); 1924 1987 int rc; 1925 1988 … … 1941 2004 * Read config data. 1942 2005 */ 1943 rc = CFGMR3QuerySIntDef(pCfgHandle, "IRQ", & s->irq, 5);2006 rc = CFGMR3QuerySIntDef(pCfgHandle, "IRQ", &pThis->irq, 5); 1944 2007 if (RT_FAILURE(rc)) 1945 2008 return PDMDEV_SET_ERROR(pDevIns, rc, 1946 2009 N_("Configuration error: Failed to get the \"IRQ\" value")); 1947 s->irqCfg =s->irq;1948 1949 rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA", & s->dma, 1);2010 pThis->irqCfg = pThis->irq; 2011 2012 rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA", &pThis->dma, 1); 1950 2013 if (RT_FAILURE(rc)) 1951 2014 return PDMDEV_SET_ERROR(pDevIns, rc, 1952 2015 N_("Configuration error: Failed to get the \"DMA\" value")); 1953 s->dmaCfg =s->dma;1954 1955 rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA16", & s->hdma, 5);2016 pThis->dmaCfg = pThis->dma; 2017 2018 rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA16", &pThis->hdma, 5); 1956 2019 if (RT_FAILURE(rc)) 1957 2020 return PDMDEV_SET_ERROR(pDevIns, rc, 1958 2021 N_("Configuration error: Failed to get the \"DMA16\" value")); 1959 s->hdmaCfg =s->hdma;2022 pThis->hdmaCfg = pThis->hdma; 1960 2023 1961 2024 RTIOPORT Port; … … 1964 2027 return PDMDEV_SET_ERROR(pDevIns, rc, 1965 2028 N_("Configuration error: Failed to get the \"Port\" value")); 1966 s->port = Port;1967 s->portCfg = Port;2029 pThis->port = Port; 2030 pThis->portCfg = Port; 1968 2031 1969 2032 uint16_t u16Version; … … 1972 2035 return PDMDEV_SET_ERROR(pDevIns, rc, 1973 2036 N_("Configuration error: Failed to get the \"Version\" value")); 1974 s->ver = u16Version;1975 s->verCfg = u16Version;2037 pThis->ver = u16Version; 2038 pThis->verCfg = u16Version; 1976 2039 1977 2040 /* 1978 2041 * Init instance data. 1979 2042 */ 1980 s->pDevIns = pDevIns;1981 s->IBase.pfnQueryInterface = sb16QueryInterface;1982 s->cmd = -1;1983 1984 s->mixer_regs[0x80] = magic_of_irq (s->irq);1985 s->mixer_regs[0x81] = (1 << s->dma) | (1 <<s->hdma);1986 s->mixer_regs[0x82] = 2 << 5;1987 1988 s->csp_regs[5] = 1;1989 s->csp_regs[9] = 0xf8;1990 1991 reset_mixer( s);2043 pThis->pDevIns = pDevIns; 2044 pThis->IBase.pfnQueryInterface = sb16QueryInterface; 2045 pThis->cmd = -1; 2046 2047 pThis->mixer_regs[0x80] = magic_of_irq (pThis->irq); 2048 pThis->mixer_regs[0x81] = (1 << pThis->dma) | (1 << pThis->hdma); 2049 pThis->mixer_regs[0x82] = 2 << 5; 2050 2051 pThis->csp_regs[5] = 1; 2052 pThis->csp_regs[9] = 0xf8; 2053 2054 reset_mixer(pThis); 1992 2055 1993 2056 /* 1994 2057 * Create timer, register & attach stuff. 1995 2058 */ 1996 rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, sb16Timer, s,1997 TMTIMER_FLAGS_DEFAULT_CRIT_SECT, "SB16 timer", & s->pTimer);2059 rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, sb16Timer, pThis, 2060 TMTIMER_FLAGS_DEFAULT_CRIT_SECT, "SB16 timer", &pThis->pTimer); 1998 2061 if (RT_FAILURE(rc)) 1999 2062 AssertMsgFailedReturn(("pfnTMTimerCreate -> %Rrc\n", rc), rc); 2000 2063 2001 rc = PDMDevHlpIOPortRegister(pDevIns, s->port + 0x04, 2,s,2064 rc = PDMDevHlpIOPortRegister(pDevIns, pThis->port + 0x04, 2, pThis, 2002 2065 mixer_write, mixer_read, NULL, NULL, "SB16"); 2003 2066 if (RT_FAILURE(rc)) 2004 2067 return rc; 2005 rc = PDMDevHlpIOPortRegister(pDevIns, s->port + 0x06, 10,s,2068 rc = PDMDevHlpIOPortRegister(pDevIns, pThis->port + 0x06, 10, pThis, 2006 2069 dsp_write, dsp_read, NULL, NULL, "SB16"); 2007 2070 if (RT_FAILURE(rc)) 2008 2071 return rc; 2009 2072 2010 rc = PDMDevHlpDMARegister(pDevIns, s->hdma, SB_read_DMA,s);2073 rc = PDMDevHlpDMARegister(pDevIns, pThis->hdma, SB_read_DMA, pThis); 2011 2074 if (RT_FAILURE(rc)) 2012 2075 return rc; 2013 rc = PDMDevHlpDMARegister(pDevIns, s->dma, SB_read_DMA,s);2076 rc = PDMDevHlpDMARegister(pDevIns, pThis->dma, SB_read_DMA, pThis); 2014 2077 if (RT_FAILURE(rc)) 2015 2078 return rc; 2016 2079 2017 s->can_write = 1;2018 2019 rc = PDMDevHlpSSMRegister3(pDevIns, SB16_SAVE_STATE_VERSION, sizeof( *s), sb16LiveExec, sb16SaveExec, sb16LoadExec);2080 pThis->can_write = 1; 2081 2082 rc = PDMDevHlpSSMRegister3(pDevIns, SB16_SAVE_STATE_VERSION, sizeof(SB16STATE), sb16LiveExec, sb16SaveExec, sb16LoadExec); 2020 2083 if (RT_FAILURE(rc)) 2021 2084 return rc; 2022 2085 2023 rc = PDMDevHlpDriverAttach(pDevIns, 0, & s->IBase, &s->pDrvBase, "Audio Driver Port");2086 rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThis->IBase, &pThis->pDrvBase, "Audio Driver Port"); 2024 2087 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 2025 2088 if(RT_SUCCESS(rc)) 2026 2089 { 2027 s->pDrv = PDMIBASE_QUERY_INTERFACE(s->pDrvBase, PDMIAUDIOCONNECTOR);2028 AssertMsgReturn( s->pDrv,2090 pThis->pDrv = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIAUDIOCONNECTOR); 2091 AssertMsgReturn(pThis->pDrv, 2029 2092 ("Configuration error: instance %d has no host audio interface!\n", iInstance), 2030 2093 VERR_PDM_MISSING_INTERFACE); … … 2042 2105 2043 2106 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER 2044 legacy_reset( s);2045 2046 if (! s->pDrv->pfnIsOutputOK(s->pDrv,s->pGstStrmOut))2107 legacy_reset(pThis); 2108 2109 if (!pThis->pDrv->pfnIsOutputOK(pThis->pDrv,pThis->pGstStrmOut)) 2047 2110 { 2048 2111 LogRel(("SB16: WARNING: Unable to open PCM OUT!\n")); 2049 s->pDrv->pfnCloseOut(s->pDrv,s->pGstStrmOut );2050 s->pGstStrmOut = NULL;2051 2052 s->pDrv->pfnInitNull(s->pDrv);2112 pThis->pDrv->pfnCloseOut(pThis->pDrv, pThis->pGstStrmOut ); 2113 pThis->pGstStrmOut = NULL; 2114 2115 pThis->pDrv->pfnInitNull(pThis->pDrv); 2053 2116 2054 2117 PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "HostAudioNotResponding", … … 2057 2120 } 2058 2121 #else 2059 AUD_register_card("sb16", & s->card);2060 legacy_reset( s);2061 2062 if (!AUD_is_host_voice_out_ok( s->voice))2122 AUD_register_card("sb16", &pThis->card); 2123 legacy_reset(pThis); 2124 2125 if (!AUD_is_host_voice_out_ok(pThis->voice)) 2063 2126 { 2064 2127 LogRel (("SB16: WARNING: Unable to open PCM OUT!\n")); 2065 AUD_close_out (& s->card,s->voice);2066 s->voice = NULL;2128 AUD_close_out (&pThis->card, pThis->voice); 2129 pThis->voice = NULL; 2067 2130 2068 2131 AUD_init_null(); … … 2096 2159 1, 2097 2160 /* cbInstance */ 2098 sizeof(SB16S tate),2161 sizeof(SB16STATE), 2099 2162 /* pfnConstruct */ 2100 2163 sb16Construct, -
trunk/src/VBox/Devices/Audio/DrvAudio.cpp
r54975 r55005 76 76 static int drvAudioDestroyHstIn(PDRVAUDIO pThis, PPDMAUDIOHSTSTRMIN pHstStrmIn); 77 77 78 volume_t nominal_volume =79 {80 0,81 INT_MAX,82 INT_MAX83 };84 85 volume_t sum_out_volume =86 {87 0,88 INT_MAX,89 INT_MAX90 };91 92 volume_t pcm_in_volume =93 {94 0,95 INT_MAX,96 INT_MAX97 };98 99 78 int drvAudioAddHstOut(PDRVAUDIO pThis, const char *pszName, PPDMAUDIOSTREAMCFG pCfg, PPDMAUDIOHSTSTRMOUT *ppHstStrmOut) 100 79 { … … 498 477 const char *pszName, PPDMAUDIOSTREAMCFG pCfg) 499 478 { 479 AssertPtrReturn(pGstStrmOut, VERR_INVALID_POINTER); 480 AssertPtrReturn(pHostStrmOut, VERR_INVALID_POINTER); 481 AssertPtrReturn(pszName, VERR_INVALID_POINTER); 482 AssertPtrReturn(pCfg, VERR_INVALID_POINTER); 483 500 484 int rc = drvAudioStreamCfgToProps(pCfg, &pGstStrmOut->Props); 501 485 if (RT_SUCCESS(rc)) … … 505 489 return VERR_NO_MEMORY; 506 490 507 rc = audioMixBufInit(&pGstStrmOut->MixBuf, pszTemp, &pGstStrmOut->Props, 508 audioMixBufSize(&pHostStrmOut->MixBuf)); 491 rc = audioMixBufInit(&pGstStrmOut->MixBuf, pszTemp, &pGstStrmOut->Props, audioMixBufSize(&pHostStrmOut->MixBuf)); 509 492 if (RT_SUCCESS(rc)) 510 493 rc = audioMixBufLinkTo(&pGstStrmOut->MixBuf, &pHostStrmOut->MixBuf); … … 758 741 return VERR_NO_MEMORY; 759 742 760 rc = audioMixBufInit(&pGstStrmIn->MixBuf, pszTemp, &pGstStrmIn->Props, 761 audioMixBufSize(&pHstStrmIn->MixBuf)); 743 rc = audioMixBufInit(&pGstStrmIn->MixBuf, pszTemp, &pGstStrmIn->Props, audioMixBufSize(&pHstStrmIn->MixBuf)); 762 744 if (RT_SUCCESS(rc)) 763 745 rc = audioMixBufLinkTo(&pHstStrmIn->MixBuf, &pGstStrmIn->MixBuf); … … 1456 1438 cRead, AUDIOMIXBUF_S2B(&pGstStrmIn->MixBuf, cRead), rc)); 1457 1439 return rc; 1458 }1459 1460 static DECLCALLBACK(int) drvAudioIsSetOutVolume(PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut,1461 bool fMute, uint8_t uVolLeft, uint8_t uVolRight)1462 {1463 LogFlowFunc(("[%s] fMute=%RTbool, uVolLeft=%RU8, uVolRight=%RU8\n",1464 pGstStrmOut->MixBuf.pszName, fMute, uVolLeft, uVolRight));1465 1466 if (pGstStrmOut)1467 {1468 pGstStrmOut->State.fMuted = fMute;1469 pGstStrmOut->State.uVolumeLeft = (uint32_t)uVolLeft * 0x808080; /* maximum is INT_MAX = 0x7fffffff */1470 pGstStrmOut->State.uVolumeRight = (uint32_t)uVolRight * 0x808080; /* maximum is INT_MAX = 0x7fffffff */1471 }1472 1473 return VINF_SUCCESS;1474 }1475 1476 /** @todo Handle more channels than stereo ... */1477 static DECLCALLBACK(int) drvAudioSetVolume(PPDMIAUDIOCONNECTOR pInterface,1478 bool fMute, uint8_t uVolLeft, uint8_t uVolRight)1479 {1480 LogFlowFunc(("fMute=%RTbool, uVolLeft=%RU8, uVolRight=%RU8\n",1481 fMute, uVolLeft, uVolRight));1482 1483 volume_t vol;1484 1485 uint32_t u32VolumeLeft = uVolLeft;1486 uint32_t u32VolumeRight = uVolRight;1487 1488 /* 0x00..0xff => 0x01..0x100 */1489 if (u32VolumeLeft)1490 u32VolumeLeft++;1491 if (u32VolumeRight)1492 u32VolumeRight++;1493 vol.mute = fMute ? 1 : 0;1494 vol.l = u32VolumeLeft * 0x800000; /* maximum is 0x80000000 */1495 vol.r = u32VolumeRight * 0x800000; /* maximum is 0x80000000 */1496 1497 sum_out_volume.mute = 0;1498 sum_out_volume.l = ASMMultU64ByU32DivByU32(INT_MAX, INT_MAX, 0x80000000U);1499 sum_out_volume.r = ASMMultU64ByU32DivByU32(INT_MAX, INT_MAX, 0x80000000U);1500 1501 LogFlowFunc(("sum_out l=%RU32, r=%RU32\n", sum_out_volume.l, sum_out_volume.r));1502 1503 return VINF_SUCCESS;1504 1440 } 1505 1441 … … 1677 1613 1678 1614 if (pGstStrmIn) 1679 {1680 pGstStrmIn->State.uVolumeLeft = nominal_volume.l;1681 pGstStrmIn->State.uVolumeRight = nominal_volume.r;1682 pGstStrmIn->State.fMuted = RT_BOOL(nominal_volume.mute);1683 1684 1615 *ppGstStrmIn = pGstStrmIn; 1685 }1686 1616 1687 1617 LogFlowFuncLeaveRC(rc); … … 1763 1693 { 1764 1694 AssertPtr(pGstStrmOut); 1765 pGstStrmOut->State.uVolumeLeft = nominal_volume.l;1766 pGstStrmOut->State.uVolumeRight = nominal_volume.r;1767 pGstStrmOut->State.fMuted = RT_BOOL(nominal_volume.mute);1768 1769 1695 *ppGstStrmOut = pGstStrmOut; 1770 1696 #if 0 … … 1902 1828 pThis->IAudioConnector.pfnIsOutputOK = drvAudioIsOutputOK; 1903 1829 pThis->IAudioConnector.pfnInitNull = drvAudioInitNull; 1904 pThis->IAudioConnector.pfnSetVolumeOut = drvAudioIsSetOutVolume;1905 pThis->IAudioConnector.pfnSetVolume = drvAudioSetVolume;1906 1830 pThis->IAudioConnector.pfnEnableOut = drvAudioEnableOut; 1907 1831 pThis->IAudioConnector.pfnEnableIn = drvAudioEnableIn;
Note:
See TracChangeset
for help on using the changeset viewer.