Changeset 88031 in vbox
- Timestamp:
- Mar 9, 2021 12:13:46 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 143160
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/pdmaudioifs.h
r88026 r88031 354 354 typedef struct PDMAUDIODEVICE 355 355 { 356 /** List node. */356 /** List entry (like PDMAUDIODEVICEENUM::LstDevices). */ 357 357 RTLISTNODE Node; 358 /** Additional data which might be relevant for the current context. 359 * @todo r=bird: I would do this C++ style, having the host specific bits 360 * appended after this structure and downcast. */ 358 /** Additional data which might be relevant for the current context (follows 359 * immediately after the end of this structure). */ 361 360 void *pvData; 362 361 /** Size of the additional data. */ … … 374 373 /** Maximum number of output audio channels the device supports. */ 375 374 uint8_t cMaxOutputChannels; 375 uint8_t bAlignment[1]; 376 376 /** Device type union, based on enmType. */ 377 377 union … … 380 380 struct 381 381 { 382 /** Vendor ID. 383 * @todo r=bird: Why signed?? VUSB uses uint16_t for idVendor and idProduct! */ 384 int16_t VID; 382 /** Vendor ID. */ 383 uint16_t idVendor; 385 384 /** Product ID. */ 386 int16_t PID;385 uint16_t idProduct; 387 386 } USB; 387 uint64_t uPadding[2]; 388 388 } Type; 389 389 /** Friendly name of the device, if any. */ 390 390 char szName[64]; 391 391 } PDMAUDIODEVICE; 392 AssertCompileSizeAlignment(PDMAUDIODEVICE, 32); 392 393 /** Pointer to audio device info (enum result). */ 393 394 typedef PDMAUDIODEVICE *PPDMAUDIODEVICE; 395 /** Pointer to a const audio device info (enum result). */ 396 typedef PDMAUDIODEVICE const *PCPDMAUDIODEVICE; 394 397 395 398 /** 396 399 * An audio device enumeration result. 400 * 397 401 * @sa PDMIHOSTAUDIO::pfnGetDevices 398 402 */ 399 403 typedef struct PDMAUDIODEVICEENUM 400 404 { 405 /** List of audio devices (PDMAUDIODEVICE). */ 406 RTLISTANCHOR LstDevices; 401 407 /** Number of audio devices in the list. */ 402 uint16_t cDevices; 403 /** List of audio devices. */ 404 RTLISTANCHOR lstDevices; 408 uint32_t cDevices; 405 409 } PDMAUDIODEVICEENUM; 406 410 /** Pointer to an audio device enumeration result. */ 407 411 typedef PDMAUDIODEVICEENUM *PPDMAUDIODEVICEENUM; 412 /** Pointer to a const audio device enumeration result. */ 413 typedef PDMAUDIODEVICEENUM const *PCPDMAUDIODEVICEENUM; 408 414 409 415 /** -
trunk/src/VBox/Devices/Audio/DrvAudio.cpp
r88029 r88031 2172 2172 2173 2173 PPDMAUDIODEVICE pDev; 2174 RTListForEach(&DevEnum. lstDevices, pDev, PDMAUDIODEVICE, Node)2174 RTListForEach(&DevEnum.LstDevices, pDev, PDMAUDIODEVICE, Node) 2175 2175 { 2176 2176 if (fLog) -
trunk/src/VBox/Devices/Audio/DrvAudio.h
r88028 r88031 209 209 /** @name Audio device methods. 210 210 * @{ */ 211 PPDMAUDIODEVICE PDMAudioDeviceAlloc(size_t cb); 212 void PDMAudioDeviceFree(PPDMAUDIODEVICE pDev); 213 PPDMAUDIODEVICE PDMAudioDeviceDup(const PPDMAUDIODEVICE pDev, bool fCopyUserData); 214 211 215 PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData); 212 void DrvAudioHlpDeviceFree(PPDMAUDIODEVICE pDev);213 PPDMAUDIODEVICE DrvAudioHlpDeviceDup(const PPDMAUDIODEVICE pDev, bool fCopyUserData);214 216 /** @} */ 215 217 -
trunk/src/VBox/Devices/Audio/DrvAudioCommon.cpp
r88028 r88031 84 84 85 85 86 #if 0 /* unused, no header prototypes */ 86 87 87 88 /** … … 140 141 } 141 142 143 #endif /* unused */ 144 142 145 /** 143 146 * Allocates an audio device. 144 147 * 145 * @returns Newly allocated audio device, or NULL if failed. 148 * @returns Newly allocated audio device, or NULL on failure. 149 * @param cb The total device structure size. This must be at least the 150 * size of PDMAUDIODEVICE. The idea is that the caller extends 151 * the PDMAUDIODEVICE structure and appends additional data 152 * after it in its private structure. 153 */ 154 PPDMAUDIODEVICE PDMAudioDeviceAlloc(size_t cb) 155 { 156 AssertReturn(cb >= sizeof(PDMAUDIODEVICE), NULL); 157 AssertReturn(cb < _4M, NULL); 158 159 PPDMAUDIODEVICE pDev = (PPDMAUDIODEVICE)RTMemAllocZ(RT_ALIGN_Z(cb, 64)); 160 if (pDev) 161 { 162 pDev->pvData = pDev + 1; 163 pDev->cbData = cb - sizeof(PDMAUDIODEVICE); 164 RTListInit(&pDev->Node); 165 166 //pDev->cMaxInputChannels = 0; 167 //pDev->cMaxOutputChannels = 0; 168 } 169 return pDev; 170 } 171 172 /** 173 * Allocates an audio device. 174 * 175 * @returns Newly allocated audio device, or NULL on failure. 146 176 * @param cbData How much additional data (in bytes) should be allocated to provide 147 177 * a (backend) specific area to store additional data. … … 150 180 PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData) 151 181 { 152 PPDMAUDIODEVICE pDev = (PPDMAUDIODEVICE)RTMemAllocZ(sizeof(PDMAUDIODEVICE)); 153 if (!pDev) 154 return NULL; 155 156 if (cbData) 157 { 158 pDev->pvData = RTMemAllocZ(cbData); 159 if (!pDev->pvData) 160 { 161 RTMemFree(pDev); 162 return NULL; 163 } 164 } 165 166 pDev->cbData = cbData; 167 168 pDev->cMaxInputChannels = 0; 169 pDev->cMaxOutputChannels = 0; 170 171 return pDev; 172 } 173 174 /** 175 * Frees an audio device. 176 * 177 * @param pDev Device to free. 178 */ 179 void DrvAudioHlpDeviceFree(PPDMAUDIODEVICE pDev) 180 { 181 if (!pDev) 182 return; 183 184 Assert(pDev->cRefCount == 0); 185 186 if (pDev->pvData) 187 { 188 Assert(pDev->cbData); 189 190 RTMemFree(pDev->pvData); 182 AssertReturn(cbData < _4M, NULL); 183 return PDMAudioDeviceAlloc(cbData + sizeof(PDMAUDIODEVICE)); 184 } 185 186 /** 187 * Frees an audio device allocated by PDMAudioDeviceAlloc. 188 * 189 * @param pDev The device to free. NULL is ignored. 190 */ 191 void PDMAudioDeviceFree(PPDMAUDIODEVICE pDev) 192 { 193 if (pDev) 194 { 195 Assert(pDev->cRefCount == 0); 196 191 197 pDev->pvData = NULL; 192 }193 194 RTMemFree(pDev);195 pDev = NULL;198 pDev->cbData = 0; 199 200 RTMemFree(pDev); 201 } 196 202 } 197 203 … … 200 206 * 201 207 * @returns Duplicated audio device entry on success, or NULL on failure. 202 * @param pDev Audio deviceentry to duplicate.203 * @param fCopyUserData 204 */ 205 PPDMAUDIODEVICE DrvAudioHlpDeviceDup(constPPDMAUDIODEVICE pDev, bool fCopyUserData)208 * @param pDev The audio device enum entry to duplicate. 209 * @param fCopyUserData Whether to also copy the user data portion or not. 210 */ 211 PPDMAUDIODEVICE PDMAudioDeviceDup(PPDMAUDIODEVICE pDev, bool fCopyUserData) 206 212 { 207 213 AssertPtrReturn(pDev, NULL); 208 214 209 PPDMAUDIODEVICE pDevDup = DrvAudioHlpDeviceAlloc(fCopyUserData ? pDev->cbData : 0);215 PPDMAUDIODEVICE pDevDup = PDMAudioDeviceAlloc(sizeof(*pDev) + (fCopyUserData ? pDev->cbData : 0)); 210 216 if (pDevDup) 211 217 { 212 218 memcpy(pDevDup, pDev, sizeof(PDMAUDIODEVICE)); 219 RTListInit(&pDevDup->Node); 213 220 214 221 if ( fCopyUserData 215 && pDevDup->cbData) 216 { 217 memcpy(pDevDup->pvData, pDev->pvData, pDevDup->cbData); 218 } 219 else 220 { 221 pDevDup->cbData = 0; 222 pDevDup->pvData = NULL; 222 && pDev->cbData) 223 { 224 /** @todo r=bird: This ASSUMES that no special data is stored here, like 225 * pointers or similar that cannot just be memcpy'ied. */ 226 memcpy(pDevDup + 1, pDev + 1, pDev->cbData); 223 227 } 224 228 } … … 237 241 AssertPtrReturn(pDevEnm, VERR_INVALID_POINTER); 238 242 239 RTListInit(&pDevEnm-> lstDevices);243 RTListInit(&pDevEnm->LstDevices); 240 244 pDevEnm->cDevices = 0; 241 245 … … 254 258 255 259 PPDMAUDIODEVICE pDev, pDevNext; 256 RTListForEachSafe(&pDevEnm-> lstDevices, pDev, pDevNext, PDMAUDIODEVICE, Node)260 RTListForEachSafe(&pDevEnm->LstDevices, pDev, pDevNext, PDMAUDIODEVICE, Node) 257 261 { 258 262 RTListNodeRemove(&pDev->Node); 259 263 260 DrvAudioHlpDeviceFree(pDev);264 PDMAudioDeviceFree(pDev); 261 265 262 266 pDevEnm->cDevices--; … … 264 268 265 269 /* Sanity. */ 266 Assert(RTListIsEmpty(&pDevEnm-> lstDevices));270 Assert(RTListIsEmpty(&pDevEnm->LstDevices)); 267 271 Assert(pDevEnm->cDevices == 0); 268 272 } … … 280 284 AssertPtrReturn(pDev, VERR_INVALID_POINTER); 281 285 282 RTListAppend(&pDevEnm-> lstDevices, &pDev->Node);286 RTListAppend(&pDevEnm->LstDevices, &pDev->Node); 283 287 pDevEnm->cDevices++; 284 288 … … 305 309 306 310 PPDMAUDIODEVICE pDev; 307 RTListForEach(&pDevEnm-> lstDevices, pDev, PDMAUDIODEVICE, Node)308 { 309 PPDMAUDIODEVICE pDevDup = DrvAudioHlpDeviceDup(pDev, true /* fCopyUserData */);311 RTListForEach(&pDevEnm->LstDevices, pDev, PDMAUDIODEVICE, Node) 312 { 313 PPDMAUDIODEVICE pDevDup = PDMAudioDeviceDup(pDev, true /* fCopyUserData */); 310 314 if (!pDevDup) 311 315 { … … 317 321 if (RT_FAILURE(rc2)) 318 322 { 319 DrvAudioHlpDeviceFree(pDevDup);323 PDMAudioDeviceFree(pDevDup); 320 324 break; 321 325 } … … 349 353 350 354 PPDMAUDIODEVICE pSrcDev; 351 RTListForEach(&pSrcDevEnm-> lstDevices, pSrcDev, PDMAUDIODEVICE, Node)355 RTListForEach(&pSrcDevEnm->LstDevices, pSrcDev, PDMAUDIODEVICE, Node) 352 356 { 353 357 if ( enmUsage != PDMAUDIODIR_DUPLEX … … 357 361 } 358 362 359 PPDMAUDIODEVICE pDstDev = DrvAudioHlpDeviceDup(pSrcDev, fCopyUserData);363 PPDMAUDIODEVICE pDstDev = PDMAudioDeviceDup(pSrcDev, fCopyUserData); 360 364 if (!pDstDev) 361 365 { … … 400 404 401 405 PPDMAUDIODEVICE pDev; 402 RTListForEach(&pDevEnm-> lstDevices, pDev, PDMAUDIODEVICE, Node)406 RTListForEach(&pDevEnm->LstDevices, pDev, PDMAUDIODEVICE, Node) 403 407 { 404 408 if (enmUsage != PDMAUDIODIR_DUPLEX) … … 432 436 433 437 PPDMAUDIODEVICE pDev; 434 RTListForEach(&pDevEnm-> lstDevices, pDev, PDMAUDIODEVICE, Node)438 RTListForEach(&pDevEnm->LstDevices, pDev, PDMAUDIODEVICE, Node) 435 439 { 436 440 if (enmUsage == pDev->enmUsage) … … 455 459 456 460 PPDMAUDIODEVICE pDev; 457 RTListForEach(&pDevEnm-> lstDevices, pDev, PDMAUDIODEVICE, Node)461 RTListForEach(&pDevEnm->LstDevices, pDev, PDMAUDIODEVICE, Node) 458 462 { 459 463 char *pszFlags = DrvAudioHlpAudDevFlagsToStrA(pDev->fFlags); -
trunk/src/VBox/Devices/Audio/DrvHostCoreAudio.cpp
r88028 r88031 534 534 { 535 535 if (pDev) /* Some (skipped) device to clean up first? */ 536 DrvAudioHlpDeviceFree(pDev);536 PDMAudioDeviceFree(pDev); 537 537 538 538 pDev = DrvAudioHlpDeviceAlloc(sizeof(COREAUDIODEVICEDATA)); … … 669 669 if (RT_FAILURE(rc)) 670 670 { 671 DrvAudioHlpDeviceFree(pDev);671 PDMAudioDeviceFree(pDev); 672 672 pDev = NULL; 673 673 } … … 703 703 { 704 704 PPDMAUDIODEVICE pDevSrc; 705 RTListForEach(&pEnmSrc-> lstDevices, pDevSrc, PDMAUDIODEVICE, Node)705 RTListForEach(&pEnmSrc->LstDevices, pDevSrc, PDMAUDIODEVICE, Node) 706 706 { 707 707 PCOREAUDIODEVICEDATA pDevSrcData = (PCOREAUDIODEVICEDATA)pDevSrc->pvData; … … 746 746 { 747 747 PPDMAUDIODEVICE pDevSrcIn; 748 RTListForEach(&devEnmIn. lstDevices, pDevSrcIn, PDMAUDIODEVICE, Node)748 RTListForEach(&devEnmIn.LstDevices, pDevSrcIn, PDMAUDIODEVICE, Node) 749 749 { 750 750 PCOREAUDIODEVICEDATA pDevSrcInData = (PCOREAUDIODEVICEDATA)pDevSrcIn->pvData; … … 779 779 */ 780 780 PPDMAUDIODEVICE pDevSrcOut; 781 RTListForEach(&devEnmOut. lstDevices, pDevSrcOut, PDMAUDIODEVICE, Node)781 RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, PDMAUDIODEVICE, Node) 782 782 { 783 783 PCOREAUDIODEVICEDATA pDevSrcOutData = (PCOREAUDIODEVICEDATA)pDevSrcOut->pvData; … … 801 801 else 802 802 { 803 DrvAudioHlpDeviceFree(pDevDst);803 PDMAudioDeviceFree(pDevDst); 804 804 pDevDst = NULL; 805 805 } … … 813 813 */ 814 814 PPDMAUDIODEVICE pDevSrcOut; 815 RTListForEach(&devEnmOut. lstDevices, pDevSrcOut, PDMAUDIODEVICE, Node)815 RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, PDMAUDIODEVICE, Node) 816 816 { 817 817 PCOREAUDIODEVICEDATA pDevSrcOutData = (PCOREAUDIODEVICEDATA)pDevSrcOut->pvData; … … 847 847 if (RT_FAILURE(rc)) 848 848 { 849 DrvAudioHlpDeviceFree(pDevDst);849 PDMAudioDeviceFree(pDevDst); 850 850 break; 851 851 } -
trunk/src/VBox/Devices/Audio/DrvHostDSound.cpp
r88028 r88031 181 181 182 182 /** 183 * Structure for keeping a DirectSound-specific device entry. 184 * This is then bound to the PDMAUDIODEVICE's pvData area. 183 * DirectSound-specific device entry. 185 184 */ 186 185 typedef struct DSOUNDDEV 187 186 { 188 GUID Guid; 189 } DSOUNDDEV, *PDSOUNDDEV; 187 PDMAUDIODEVICE Core; 188 /** The GUID if handy. */ 189 GUID Guid; 190 } DSOUNDDEV; 191 /** Pointer to a DirectSound device entry. */ 192 typedef DSOUNDDEV *PDSOUNDDEV; 190 193 191 194 /** … … 1128 1131 */ 1129 1132 1133 #if 0 /* unused */ 1130 1134 static LPCGUID dsoundCaptureSelectDevice(PDRVHOSTDSOUND pThis, PPDMAUDIOSTREAMCFG pCfg) 1131 1135 { … … 1138 1142 if (!pGUID) 1139 1143 { 1140 PPDMAUDIODEVICE pDev = NULL; 1141 1144 PDSOUNDDEV pDev = NULL; 1142 1145 switch (pCfg->u.enmSrc) 1143 1146 { … … 1151 1154 */ 1152 1155 case PDMAUDIORECSRC_MIC: 1153 { 1154 pDev = DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->DeviceEnum, PDMAUDIODIR_IN); 1156 pDev = (PDSOUNDDEV)DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->DeviceEnum, PDMAUDIODIR_IN); 1155 1157 break; 1156 }1157 1158 1158 1159 default: … … 1165 1166 { 1166 1167 DSLOG(("DSound: Guest source '%s' is using host recording device '%s'\n", 1167 PDMAudioRecSrcGetName(pCfg->u.enmSrc), pDev->szName)); 1168 1169 PDSOUNDDEV pDSoundDev = (PDSOUNDDEV)pDev->pvData; 1170 AssertPtr(pDSoundDev); 1171 1172 pGUID = &pDSoundDev->Guid; 1173 } 1174 } 1175 1176 if (RT_FAILURE(rc)) 1177 { 1178 LogRel(("DSound: Selecting recording device failed with %Rrc\n", rc)); 1179 return NULL; 1180 } 1181 1168 PDMAudioRecSrcGetName(pCfg->u.enmSrc), pDev->Core.szName)); 1169 pGUID = &pDev->Guid; 1170 } 1171 if (RT_FAILURE(rc)) 1172 { 1173 LogRel(("DSound: Selecting recording device failed with %Rrc\n", rc)); 1174 return NULL; 1175 } 1176 } 1177 1178 /* This always has to be in the release log. */ 1182 1179 char *pszGUID = dsoundGUIDToUtf8StrA(pGUID); 1183 1184 /* This always has to be in the release log. */1185 1180 LogRel(("DSound: Guest source '%s' is using host recording device with GUID '%s'\n", 1186 1181 PDMAudioRecSrcGetName(pCfg->u.enmSrc), pszGUID ? pszGUID: "{?}")); 1187 1188 if (pszGUID) 1189 { 1190 RTStrFree(pszGUID); 1191 pszGUID = NULL; 1192 } 1182 RTStrFree(pszGUID); 1193 1183 1194 1184 return pGUID; 1195 1185 } 1186 #endif 1196 1187 1197 1188 /** … … 1578 1569 * @param pwszModule Pointer to module name of enumerated device. 1579 1570 * @param lpContext Pointer to PDSOUNDENUMCBCTX context for storing the enumerated information. 1571 * 1572 * @note Carbon copy of dsoundDevicesEnumCbPlayback with OUT direction. 1580 1573 */ 1581 1574 static BOOL CALLBACK dsoundDevicesEnumCbPlayback(LPGUID pGUID, LPCWSTR pwszDescription, LPCWSTR pwszModule, PVOID lpContext) 1582 1575 { 1583 RT_NOREF(pwszModule);1584 1585 1576 PDSOUNDENUMCBCTX pEnumCtx = (PDSOUNDENUMCBCTX)lpContext; 1586 1577 AssertPtrReturn(pEnumCtx , FALSE); … … 1589 1580 AssertPtrReturn(pDevEnm, FALSE); 1590 1581 1591 /* pGUID can be NULL for default device(s). */1582 AssertPtrNullReturn(pGUID, FALSE); /* pGUID can be NULL for default device(s). */ 1592 1583 AssertPtrReturn(pwszDescription, FALSE); 1593 /* Do not care about pwszModule. */1584 RT_NOREF(pwszModule); /* Do not care about pwszModule. */ 1594 1585 1595 1586 int rc; 1596 1597 PPDMAUDIODEVICE pDev = DrvAudioHlpDeviceAlloc(sizeof(DSOUNDDEV)); 1587 PDSOUNDDEV pDev = (PDSOUNDDEV)PDMAudioDeviceAlloc(sizeof(DSOUNDDEV)); 1598 1588 if (pDev) 1599 1589 { 1600 pDev-> enmUsage = PDMAUDIODIR_OUT;1601 pDev-> enmType = PDMAUDIODEVICETYPE_BUILTIN;1590 pDev->Core.enmUsage = PDMAUDIODIR_OUT; 1591 pDev->Core.enmType = PDMAUDIODEVICETYPE_BUILTIN; 1602 1592 1603 1593 if (pGUID == NULL) 1604 pDev-> fFlags = PDMAUDIODEV_FLAGS_DEFAULT;1594 pDev->Core.fFlags = PDMAUDIODEV_FLAGS_DEFAULT; 1605 1595 1606 1596 char *pszName; … … 1608 1598 if (RT_SUCCESS(rc)) 1609 1599 { 1610 RTStrCopy(pDev-> szName, sizeof(pDev->szName), pszName);1600 RTStrCopy(pDev->Core.szName, sizeof(pDev->Core.szName), pszName); 1611 1601 RTStrFree(pszName); 1612 1602 1613 PDSOUNDDEV pDSoundDev = (PDSOUNDDEV)pDev->pvData;1614 1615 1603 if (pGUID) /* pGUID == NULL means default device. */ 1616 memcpy(&pDSoundDev->Guid, pGUID, sizeof(GUID)); 1617 1618 rc = DrvAudioHlpDeviceEnumAdd(pDevEnm, pDev); 1619 1620 /* Note: Querying the actual device information will be done at some 1621 * later point in time outside this enumeration callback to prevent 1622 * DSound hangs. */ 1623 } 1604 memcpy(&pDev->Guid, pGUID, sizeof(pDev->Guid)); 1605 1606 rc = DrvAudioHlpDeviceEnumAdd(pDevEnm, &pDev->Core); 1607 if (RT_SUCCESS(rc)) 1608 { 1609 /* Note: Querying the actual device information will be done at some 1610 * later point in time outside this enumeration callback to prevent 1611 * DSound hangs. */ 1612 return TRUE; 1613 } 1614 } 1615 PDMAudioDeviceFree(&pDev->Core); 1624 1616 } 1625 1617 else 1626 1618 rc = VERR_NO_MEMORY; 1627 1619 1628 if (RT_FAILURE(rc)) 1629 { 1630 LogRel(("DSound: Error enumeration playback device '%ls', rc=%Rrc\n", pwszDescription, rc)); 1631 return FALSE; /* Abort enumeration. */ 1632 } 1633 1634 return TRUE; 1620 LogRel(("DSound: Error enumeration playback device '%ls': rc=%Rrc\n", pwszDescription, rc)); 1621 return FALSE; /* Abort enumeration. */ 1635 1622 } 1636 1623 … … 1643 1630 * @param pwszModule Pointer to module name of enumerated device. 1644 1631 * @param lpContext Pointer to PDSOUNDENUMCBCTX context for storing the enumerated information. 1632 * 1633 * @note Carbon copy of dsoundDevicesEnumCbPlayback with IN direction. 1645 1634 */ 1646 1635 static BOOL CALLBACK dsoundDevicesEnumCbCapture(LPGUID pGUID, LPCWSTR pwszDescription, LPCWSTR pwszModule, PVOID lpContext) 1647 1636 { 1648 RT_NOREF(pwszModule);1649 1650 1637 PDSOUNDENUMCBCTX pEnumCtx = (PDSOUNDENUMCBCTX )lpContext; 1651 1638 AssertPtrReturn(pEnumCtx , FALSE); … … 1654 1641 AssertPtrReturn(pDevEnm, FALSE); 1655 1642 1656 /* pGUID can be NULL for default device(s). */1643 AssertPtrNullReturn(pGUID, FALSE); /* pGUID can be NULL for default device(s). */ 1657 1644 AssertPtrReturn(pwszDescription, FALSE); 1658 /* Do not care about pwszModule. */1645 RT_NOREF(pwszModule); /* Do not care about pwszModule. */ 1659 1646 1660 1647 int rc; 1661 1662 PPDMAUDIODEVICE pDev = DrvAudioHlpDeviceAlloc(sizeof(DSOUNDDEV)); 1648 PDSOUNDDEV pDev = (PDSOUNDDEV)PDMAudioDeviceAlloc(sizeof(DSOUNDDEV)); 1663 1649 if (pDev) 1664 1650 { 1665 pDev-> enmUsage = PDMAUDIODIR_IN;1666 pDev-> enmType = PDMAUDIODEVICETYPE_BUILTIN;1651 pDev->Core.enmUsage = PDMAUDIODIR_IN; 1652 pDev->Core.enmType = PDMAUDIODEVICETYPE_BUILTIN; 1667 1653 1668 1654 char *pszName; … … 1670 1656 if (RT_SUCCESS(rc)) 1671 1657 { 1672 RTStrCopy(pDev-> szName, sizeof(pDev->szName), pszName);1658 RTStrCopy(pDev->Core.szName, sizeof(pDev->Core.szName), pszName); 1673 1659 RTStrFree(pszName); 1674 1660 1675 PDSOUNDDEV pDSoundDev = (PDSOUNDDEV)pDev->pvData;1676 1677 1661 if (pGUID) /* pGUID == NULL means default capture device. */ 1678 memcpy(&pDSoundDev->Guid, pGUID, sizeof(GUID)); 1679 1680 rc = DrvAudioHlpDeviceEnumAdd(pDevEnm, pDev); 1681 1682 /* Note: Querying the actual device information will be done at some 1683 * later point in time outside this enumeration callback to prevent 1684 * DSound hangs. */ 1685 } 1662 memcpy(&pDev->Guid, pGUID, sizeof(pDev->Guid)); 1663 1664 rc = DrvAudioHlpDeviceEnumAdd(pDevEnm, &pDev->Core); 1665 if (RT_SUCCESS(rc)) 1666 { 1667 /* Note: Querying the actual device information will be done at some 1668 * later point in time outside this enumeration callback to prevent 1669 * DSound hangs. */ 1670 return TRUE; 1671 } 1672 } 1673 PDMAudioDeviceFree(&pDev->Core); 1686 1674 } 1687 1675 else 1688 1676 rc = VERR_NO_MEMORY; 1689 1677 1690 if (RT_FAILURE(rc)) 1691 { 1692 LogRel(("DSound: Error enumeration capture device '%ls', rc=%Rrc\n", pwszDescription, rc)); 1693 return FALSE; /* Abort enumeration. */ 1694 } 1695 1696 return TRUE; 1678 LogRel(("DSound: Error enumeration capture device '%ls', rc=%Rrc\n", pwszDescription, rc)); 1679 return FALSE; /* Abort enumeration. */ 1697 1680 } 1698 1681 … … 1704 1687 * @param pDev Audio device to query information for. 1705 1688 */ 1706 static int dsoundDeviceQueryInfo(PDRVHOSTDSOUND pThis, P PDMAUDIODEVICEpDev)1689 static int dsoundDeviceQueryInfo(PDRVHOSTDSOUND pThis, PDSOUNDDEV pDev) 1707 1690 { 1708 1691 AssertPtrReturn(pThis, VERR_INVALID_POINTER); 1709 1692 AssertPtrReturn(pDev, VERR_INVALID_POINTER); 1710 1711 PDSOUNDDEV pDSoundDev = (PDSOUNDDEV)pDev->pvData;1712 AssertPtr(pDSoundDev);1713 1714 1693 int rc; 1715 1694 1716 if (pDev-> enmUsage == PDMAUDIODIR_OUT)1695 if (pDev->Core.enmUsage == PDMAUDIODIR_OUT) 1717 1696 { 1718 1697 LPDIRECTSOUND8 pDS; 1719 HRESULT hr = directSoundPlayInterfaceCreate(&pD SoundDev->Guid, &pDS);1698 HRESULT hr = directSoundPlayInterfaceCreate(&pDev->Guid, &pDS); 1720 1699 if (SUCCEEDED(hr)) 1721 1700 { … … 1726 1705 if (SUCCEEDED(hr)) 1727 1706 { 1728 pDev-> cMaxOutputChannels = DSCaps.dwFlags & DSCAPS_PRIMARYSTEREO ? 2 : 1;1707 pDev->Core.cMaxOutputChannels = DSCaps.dwFlags & DSCAPS_PRIMARYSTEREO ? 2 : 1; 1729 1708 1730 1709 DWORD dwSpeakerCfg; … … 1748 1727 1749 1728 if (uSpeakerCount) /* Do we need to update the channel count? */ 1750 pDev-> cMaxOutputChannels = uSpeakerCount;1729 pDev->Core.cMaxOutputChannels = uSpeakerCount; 1751 1730 1752 1731 rc = VINF_SUCCESS; … … 1769 1748 rc = VERR_GENERAL_FAILURE; 1770 1749 } 1771 else if (pDev-> enmUsage == PDMAUDIODIR_IN)1750 else if (pDev->Core.enmUsage == PDMAUDIODIR_IN) 1772 1751 { 1773 1752 LPDIRECTSOUNDCAPTURE8 pDSC; 1774 HRESULT hr = directSoundCaptureInterfaceCreate(&pD SoundDev->Guid, &pDSC);1753 HRESULT hr = directSoundCaptureInterfaceCreate(&pDev->Guid, &pDSC); 1775 1754 if (SUCCEEDED(hr)) 1776 1755 { … … 1781 1760 if (SUCCEEDED(hr)) 1782 1761 { 1783 pDev-> cMaxInputChannels = DSCCaps.dwChannels;1762 pDev->Core.cMaxInputChannels = DSCCaps.dwChannels; 1784 1763 rc = VINF_SUCCESS; 1785 1764 } … … 1858 1837 * Query Information from all enumerated devices. 1859 1838 */ 1860 PPDMAUDIODEVICE pDev; 1861 RTListForEach(&pDevEnm->lstDevices, pDev, PDMAUDIODEVICE, Node) 1862 /* ignore rc */ dsoundDeviceQueryInfo(pThis, pDev); 1839 PDSOUNDDEV pDev; 1840 RTListForEach(&pDevEnm->LstDevices, pDev, DSOUNDDEV, Core.Node) 1841 { 1842 dsoundDeviceQueryInfo(pThis, pDev); /* ignore rc */ 1843 } 1863 1844 1864 1845 RTLdrClose(hDSound);
Note:
See TracChangeset
for help on using the changeset viewer.