Changeset 88033 in vbox
- Timestamp:
- Mar 9, 2021 1:31:33 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 143162
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/pdmaudioifs.h
r88032 r88033 356 356 /** List entry (like PDMAUDIODEVICEENUM::LstDevices). */ 357 357 RTLISTNODE Node; 358 /** Additional data which might be relevant for the current context (follows 359 * immediately after the end of this structure). */ 360 void *pvData; 358 /** Magic value (PDMAUDIODEVICE_MAGIC). */ 359 uint32_t uMagic; 361 360 /** Size of the additional data. */ 362 size_tcbData;361 uint32_t cbData; 363 362 /** The device type. */ 364 363 PDMAUDIODEVICETYPE enmType; … … 385 384 uint16_t idProduct; 386 385 } USB; 387 uint64_t uPadding[ 2];386 uint64_t uPadding[ARCH_BITS >= 64 ? 3 : 4]; 388 387 } Type; 389 388 /** Friendly name of the device, if any. */ 390 389 char szName[64]; 391 390 } PDMAUDIODEVICE; 392 AssertCompileSizeAlignment(PDMAUDIODEVICE, ARCH_BITS >= 64 ? 32 : 16);391 AssertCompileSizeAlignment(PDMAUDIODEVICE, 32); 393 392 /** Pointer to audio device info (enum result). */ 394 393 typedef PDMAUDIODEVICE *PPDMAUDIODEVICE; 395 394 /** Pointer to a const audio device info (enum result). */ 396 395 typedef PDMAUDIODEVICE const *PCPDMAUDIODEVICE; 396 397 /** Magic value for PDMAUDIODEVICE. (Armando Anthony "Chick" Corea) */ 398 #define PDMAUDIODEVICE_MAGIC UINT32_C(0x19410612) 399 /** Magic value for PDMAUDIODEVICE after free. */ 400 #define PDMAUDIODEVICE_MAGIC_DEAD UINT32_C(0x20210209) 401 397 402 398 403 /** -
trunk/src/VBox/Devices/Audio/DrvAudio.h
r88031 r88033 212 212 void PDMAudioDeviceFree(PPDMAUDIODEVICE pDev); 213 213 PPDMAUDIODEVICE PDMAudioDeviceDup(const PPDMAUDIODEVICE pDev, bool fCopyUserData); 214 215 PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData);216 214 /** @} */ 217 215 -
trunk/src/VBox/Devices/Audio/DrvAudioCommon.cpp
r88031 r88033 160 160 if (pDev) 161 161 { 162 pDev-> pvData = pDev + 1;163 pDev->cbData = cb - sizeof(PDMAUDIODEVICE);162 pDev->uMagic == PDMAUDIODEVICE_MAGIC; 163 pDev->cbData = (uint32_t)(cb - sizeof(PDMAUDIODEVICE)); 164 164 RTListInit(&pDev->Node); 165 165 … … 171 171 172 172 /** 173 * Allocates an audio device.174 *175 * @returns Newly allocated audio device, or NULL on failure.176 * @param cbData How much additional data (in bytes) should be allocated to provide177 * a (backend) specific area to store additional data.178 * Optional, can be 0.179 */180 PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData)181 {182 AssertReturn(cbData < _4M, NULL);183 return PDMAudioDeviceAlloc(cbData + sizeof(PDMAUDIODEVICE));184 }185 186 /**187 173 * Frees an audio device allocated by PDMAudioDeviceAlloc. 188 174 * … … 193 179 if (pDev) 194 180 { 181 Assert(pDev->uMagic == PDMAUDIODEVICE_MAGIC); 195 182 Assert(pDev->cRefCount == 0); 196 197 pDev->pvData = NULL; 183 pDev->uMagic = PDMAUDIODEVICE_MAGIC_DEAD; 198 184 pDev->cbData = 0; 199 185 … … 464 450 465 451 LogFunc(("Device '%s':\n", pDev->szName)); 466 LogFunc((" \tUsage = %s\n", PDMAudioDirGetName(pDev->enmUsage)));467 LogFunc((" \tFlags = %s\n", pszFlags ? pszFlags : "<NONE>"));468 LogFunc((" \tInput channels = %RU8\n", pDev->cMaxInputChannels));469 LogFunc((" \tOutput channels = %RU8\n", pDev->cMaxOutputChannels));470 LogFunc((" \tData = %p (%zu bytes)\n", pDev->pvData,pDev->cbData));452 LogFunc((" Usage = %s\n", PDMAudioDirGetName(pDev->enmUsage))); 453 LogFunc((" Flags = %s\n", pszFlags ? pszFlags : "<NONE>")); 454 LogFunc((" Input channels = %RU8\n", pDev->cMaxInputChannels)); 455 LogFunc((" Output channels = %RU8\n", pDev->cMaxOutputChannels)); 456 LogFunc((" Data = %RU32 bytes\n", pDev->cbData)); 471 457 472 458 if (pszFlags) -
trunk/src/VBox/Devices/Audio/DrvHostCoreAudio.cpp
r88031 r88033 66 66 67 67 /** 68 * Structure for holding Core Audio-specific device data. 69 * This data then lives in the pvData part of the PDMAUDIODEVICE struct. 68 * Core Audio-specific device entry. 69 * 70 * @note This is definitely not safe to just copy! 70 71 */ 71 72 typedef struct COREAUDIODEVICEDATA 72 73 { 74 /** The core PDM structure. */ 75 PDMAUDIODEVICE Core; 76 73 77 /** Pointer to driver instance this device is bound to. */ 74 PDRVHOSTCOREAUDIO pDrv;78 PDRVHOSTCOREAUDIO pDrv; 75 79 /** The audio device ID of the currently used device (UInt32 typedef). */ 76 AudioDeviceID deviceID; 77 /** The device' UUID. */ 78 CFStringRef UUID; 80 AudioDeviceID deviceID; 81 /** The device' "UUID". 82 * @todo r=bird: We leak this. Header say we must CFRelease it. */ 83 CFStringRef UUID; 79 84 /** List of attached (native) Core Audio streams attached to this device. */ 80 RTLISTANCHOR lstStreams; 81 } COREAUDIODEVICEDATA, *PCOREAUDIODEVICEDATA; 85 RTLISTANCHOR lstStreams; 86 } COREAUDIODEVICEDATA; 87 typedef COREAUDIODEVICEDATA *PCOREAUDIODEVICEDATA; 82 88 83 89 /** … … 97 103 /** Pointer to the currently used input device in the device enumeration. 98 104 * Can be NULL if none assigned. */ 99 P PDMAUDIODEVICEpDefaultDevIn;105 PCOREAUDIODEVICEDATA pDefaultDevIn; 100 106 /** Pointer to the currently used output device in the device enumeration. 101 107 * Can be NULL if none assigned. */ 102 P PDMAUDIODEVICEpDefaultDevOut;108 PCOREAUDIODEVICEDATA pDefaultDevOut; 103 109 #ifdef VBOX_WITH_AUDIO_CALLBACKS 104 110 /** Callback function to the upper driver. … … 119 125 /** Pointer to the device this audio unit is bound to. 120 126 * Can be NULL if not bound to a device (anymore). */ 121 P PDMAUDIODEVICEpDevice;127 PCOREAUDIODEVICEDATA pDevice; 122 128 /** The actual audio unit object. */ 123 129 AudioUnit audioUnit; … … 133 139 DECLHIDDEN(int) coreAudioInputPermissionCheck(void); 134 140 135 /******************************************************************************* 136 * 137 * Helper function section 138 * 139 ******************************************************************************/ 141 142 /********************************************************************************************************************************* 143 * Helper function section * 144 *********************************************************************************************************************************/ 140 145 141 146 /* Move these down below the internal function prototypes... */ … … 261 266 262 267 /********************************************************************************************************************************* 263 * Defined Constants And Macros*268 * Structures and Typedefs * 264 269 *********************************************************************************************************************************/ 265 270 … … 393 398 } COREAUDIOSTREAM, *PCOREAUDIOSTREAM; 394 399 395 static int coreAudioStreamInit(PCOREAUDIOSTREAM pCAStream, PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev); 400 401 /********************************************************************************************************************************* 402 * Internal Functions * 403 *********************************************************************************************************************************/ 404 static int coreAudioStreamInit(PCOREAUDIOSTREAM pCAStream, PDRVHOSTCOREAUDIO pThis, PCOREAUDIODEVICEDATA pDev); 396 405 #ifndef VBOX_WITH_AUDIO_CALLBACKS 397 static int coreAudioStreamReinit(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, P PDMAUDIODEVICEpDev);406 static int coreAudioStreamReinit(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, PCOREAUDIODEVICEDATA pDev); 398 407 #endif 399 408 static int coreAudioStreamUninit(PCOREAUDIOSTREAM pCAStream); … … 401 410 static int coreAudioStreamControl(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, PDMAUDIOSTREAMCMD enmStreamCmd); 402 411 403 static int coreAudioDeviceRegisterCallbacks(PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev);404 static int coreAudioDeviceUnregisterCallbacks(PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev);405 412 static void coreAudioDeviceDataInit(PCOREAUDIODEVICEDATA pDevData, AudioDeviceID deviceID, bool fIsInput, PDRVHOSTCOREAUDIO pDrv); 406 413 … … 414 421 static DECLCALLBACK(void) coreAudioOutputQueueCb(void *pvUser, AudioQueueRef audioQueue, AudioQueueBufferRef audioBuffer); 415 422 423 416 424 #ifdef VBOX_WITH_AUDIO_CA_CONVERTER 425 417 426 /** 418 427 * Initializes a conversion callback context. … … 432 441 AssertPtrReturn(pASBDDst, VERR_INVALID_POINTER); 433 442 434 # ifdef DEBUG443 # ifdef DEBUG 435 444 coreAudioPrintASBD("CbCtx: Src", pASBDSrc); 436 445 coreAudioPrintASBD("CbCtx: Dst", pASBDDst); 437 # endif446 # endif 438 447 439 448 pConvCbCtx->pStream = pStream; … … 467 476 pConvCbCtx->cErrors = 0; 468 477 } 478 469 479 #endif /* VBOX_WITH_AUDIO_CA_CONVERTER */ 470 471 480 472 481 /** … … 485 494 int rc = VINF_SUCCESS; 486 495 487 do 496 do /* (this is not a loop, just a device for avoid gotos while trying not to shoot oneself in the foot too badly.) */ 488 497 { 489 498 AudioDeviceID defaultDeviceID = kAudioDeviceUnknown; … … 530 539 UInt16 cDevices = uSize / sizeof(AudioDeviceID); 531 540 532 P PDMAUDIODEVICEpDev = NULL;541 PCOREAUDIODEVICEDATA pDev = NULL; 533 542 for (UInt16 i = 0; i < cDevices; i++) 534 543 { 535 544 if (pDev) /* Some (skipped) device to clean up first? */ 536 PDMAudioDeviceFree( pDev);537 538 pDev = DrvAudioHlpDeviceAlloc(sizeof(COREAUDIODEVICEDATA));545 PDMAudioDeviceFree(&pDev->Core); 546 547 pDev = (PCOREAUDIODEVICEDATA)PDMAudioDeviceAlloc(sizeof(*pDev)); 539 548 if (!pDev) 540 549 { … … 544 553 545 554 /* Set usage. */ 546 pDev-> enmUsage = enmUsage;555 pDev->Core.enmUsage = enmUsage; 547 556 548 557 /* Init backend-specific device data. */ 549 PCOREAUDIODEVICEDATA pDevData = (PCOREAUDIODEVICEDATA)pDev->pvData; 550 AssertPtr(pDevData); 551 coreAudioDeviceDataInit(pDevData, pDevIDs[i], enmUsage == PDMAUDIODIR_IN, pThis); 558 coreAudioDeviceDataInit(pDev, pDevIDs[i], enmUsage == PDMAUDIODIR_IN, pThis); 552 559 553 560 /* Check if the device is valid. */ 554 AudioDeviceID curDevID = pDev Data->deviceID;561 AudioDeviceID curDevID = pDev->deviceID; 555 562 556 563 /* Is the device the default device? */ 557 564 if (curDevID == defaultDeviceID) 558 pDev-> fFlags |= PDMAUDIODEV_FLAGS_DEFAULT;565 pDev->Core.fFlags |= PDMAUDIODEV_FLAGS_DEFAULT; 559 566 560 567 AudioObjectPropertyAddress propAddrCfg = { kAudioDevicePropertyStreamConfiguration, … … 577 584 { 578 585 if (enmUsage == PDMAUDIODIR_IN) 579 pDev-> cMaxInputChannels += pBufList->mBuffers[a].mNumberChannels;586 pDev->Core.cMaxInputChannels += pBufList->mBuffers[a].mNumberChannels; 580 587 else if (enmUsage == PDMAUDIODIR_OUT) 581 pDev-> cMaxOutputChannels += pBufList->mBuffers[a].mNumberChannels;588 pDev->Core.cMaxOutputChannels += pBufList->mBuffers[a].mNumberChannels; 582 589 } 583 590 } 584 591 585 if (pBufList) 586 { 587 RTMemFree(pBufList); 588 pBufList = NULL; 589 } 592 RTMemFree(pBufList); 593 pBufList = NULL; 590 594 591 595 /* Check if the device is valid, e.g. has any input/output channels according to its usage. */ 592 596 if ( enmUsage == PDMAUDIODIR_IN 593 && !pDev-> cMaxInputChannels)597 && !pDev->Core.cMaxInputChannels) 594 598 continue; 595 599 if ( enmUsage == PDMAUDIODIR_OUT 596 && !pDev-> cMaxOutputChannels)600 && !pDev->Core.cMaxOutputChannels) 597 601 continue; 598 602 … … 615 619 if ( pszName 616 620 && CFStringGetCString(pcfstrName, pszName, cbName, kCFStringEncodingUTF8)) 617 RTStrCopy(pDev-> szName, sizeof(pDev->szName), pszName);621 RTStrCopy(pDev->Core.szName, sizeof(pDev->Core.szName), pszName); 618 622 619 623 LogFunc(("Device '%s': %RU32\n", pszName, curDevID)); … … 641 645 && !uAlive) 642 646 { 643 pDev-> fFlags |= PDMAUDIODEV_FLAGS_DEAD;647 pDev->Core.fFlags |= PDMAUDIODEV_FLAGS_DEAD; 644 648 } 645 649 … … 655 659 && (pid != -1)) 656 660 { 657 pDev-> fFlags |= PDMAUDIODEV_FLAGS_LOCKED;661 pDev->Core.fFlags |= PDMAUDIODEV_FLAGS_LOCKED; 658 662 } 659 663 660 664 /* Add the device to the enumeration. */ 661 rc = DrvAudioHlpDeviceEnumAdd(pDevEnm, pDev);665 rc = DrvAudioHlpDeviceEnumAdd(pDevEnm, &pDev->Core); 662 666 if (RT_FAILURE(rc)) 663 667 break; … … 669 673 if (RT_FAILURE(rc)) 670 674 { 671 PDMAudioDeviceFree( pDev);675 PDMAudioDeviceFree(&pDev->Core); 672 676 pDev = NULL; 673 677 } … … 702 706 bool coreAudioDevicesHasDevice(PPDMAUDIODEVICEENUM pEnmSrc, AudioDeviceID deviceID) 703 707 { 704 PPDMAUDIODEVICE pDevSrc; 705 RTListForEach(&pEnmSrc->LstDevices, pDevSrc, PDMAUDIODEVICE, Node) 706 { 707 PCOREAUDIODEVICEDATA pDevSrcData = (PCOREAUDIODEVICEDATA)pDevSrc->pvData; 708 AssertPtr(pDevSrcData); 709 710 if (pDevSrcData->deviceID == deviceID) 708 PCOREAUDIODEVICEDATA pDevSrc; 709 RTListForEach(&pEnmSrc->LstDevices, pDevSrc, COREAUDIODEVICEDATA, Core.Node) 710 { 711 if (pDevSrc->deviceID == deviceID) 711 712 return true; 712 713 } … … 745 746 if (RT_SUCCESS(rc)) 746 747 { 747 P PDMAUDIODEVICEpDevSrcIn;748 RTListForEach(&devEnmIn.LstDevices, pDevSrcIn, PDMAUDIODEVICE,Node)748 PCOREAUDIODEVICEDATA pDevSrcIn; 749 RTListForEach(&devEnmIn.LstDevices, pDevSrcIn, COREAUDIODEVICEDATA, Core.Node) 749 750 { 750 PCOREAUDIODEVICEDATA pDevSrcInData = (PCOREAUDIODEVICEDATA)pDevSrcIn->pvData; 751 AssertPtr(pDevSrcInData); 752 753 PPDMAUDIODEVICE pDevDst = DrvAudioHlpDeviceAlloc(sizeof(COREAUDIODEVICEDATA)); 751 PCOREAUDIODEVICEDATA pDevDst = (PCOREAUDIODEVICEDATA)PDMAudioDeviceAlloc(sizeof(*pDevDst)); 754 752 if (!pDevDst) 755 753 { … … 758 756 } 759 757 760 PCOREAUDIODEVICEDATA pDevDstData = (PCOREAUDIODEVICEDATA)pDevDst->pvData; 761 AssertPtr(pDevDstData); 762 coreAudioDeviceDataInit(pDevDstData, pDevSrcInData->deviceID, true /* fIsInput */, pThis); 763 764 RTStrCopy(pDevDst->szName, sizeof(pDevDst->szName), pDevSrcIn->szName); 765 766 pDevDst->enmUsage = PDMAUDIODIR_IN; /* Input device by default (simplex). */ 767 pDevDst->cMaxInputChannels = pDevSrcIn->cMaxInputChannels; 758 coreAudioDeviceDataInit(pDevDst, pDevSrcIn->deviceID, true /* fIsInput */, pThis); 759 760 RTStrCopy(pDevDst->Core.szName, sizeof(pDevDst->Core.szName), pDevSrcIn->Core.szName); 761 762 pDevDst->Core.enmUsage = PDMAUDIODIR_IN; /* Input device by default (simplex). */ 763 pDevDst->Core.cMaxInputChannels = pDevSrcIn->Core.cMaxInputChannels; 768 764 769 765 /* Handle flags. */ 770 if (pDevSrcIn-> fFlags & PDMAUDIODEV_FLAGS_DEFAULT)771 pDevDst-> fFlags |= PDMAUDIODEV_FLAGS_DEFAULT;766 if (pDevSrcIn->Core.fFlags & PDMAUDIODEV_FLAGS_DEFAULT) 767 pDevDst->Core.fFlags |= PDMAUDIODEV_FLAGS_DEFAULT; 772 768 /** @todo Handle hot plugging? */ 773 769 … … 778 774 * If found, this means we have to treat that device as a duplex device then. 779 775 */ 780 P PDMAUDIODEVICEpDevSrcOut;781 RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, PDMAUDIODEVICE,Node)776 PCOREAUDIODEVICEDATA pDevSrcOut; 777 RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, COREAUDIODEVICEDATA, Core.Node) 782 778 { 783 PCOREAUDIODEVICEDATA pDevSrcOutData = (PCOREAUDIODEVICEDATA)pDevSrcOut->pvData; 784 AssertPtr(pDevSrcOutData); 785 786 if (pDevSrcInData->deviceID == pDevSrcOutData->deviceID) 779 if (pDevSrcIn->deviceID == pDevSrcOut->deviceID) 787 780 { 788 pDevDst-> enmUsage = PDMAUDIODIR_DUPLEX;789 pDevDst-> cMaxOutputChannels = pDevSrcOut->cMaxOutputChannels;790 791 if (pDevSrcOut-> fFlags & PDMAUDIODEV_FLAGS_DEFAULT)792 pDevDst-> fFlags |= PDMAUDIODEV_FLAGS_DEFAULT;781 pDevDst->Core.enmUsage = PDMAUDIODIR_DUPLEX; 782 pDevDst->Core.cMaxOutputChannels = pDevSrcOut->Core.cMaxOutputChannels; 783 784 if (pDevSrcOut->Core.fFlags & PDMAUDIODEV_FLAGS_DEFAULT) 785 pDevDst->Core.fFlags |= PDMAUDIODEV_FLAGS_DEFAULT; 793 786 break; 794 787 } … … 796 789 797 790 if (RT_SUCCESS(rc)) 798 { 799 rc = DrvAudioHlpDeviceEnumAdd(pEnmDst, pDevDst); 800 } 791 rc = DrvAudioHlpDeviceEnumAdd(pEnmDst, &pDevDst->Core); 801 792 else 802 793 { 803 PDMAudioDeviceFree( pDevDst);794 PDMAudioDeviceFree(&pDevDst->Core); 804 795 pDevDst = NULL; 805 796 } … … 812 803 * that is, all output devices which operate in simplex mode. 813 804 */ 814 P PDMAUDIODEVICEpDevSrcOut;815 RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, PDMAUDIODEVICE,Node)805 PCOREAUDIODEVICEDATA pDevSrcOut; 806 RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, COREAUDIODEVICEDATA, Core.Node) 816 807 { 817 PCOREAUDIODEVICEDATA pDevSrcOutData = (PCOREAUDIODEVICEDATA)pDevSrcOut->pvData; 818 AssertPtr(pDevSrcOutData); 819 820 if (coreAudioDevicesHasDevice(pEnmDst, pDevSrcOutData->deviceID)) 808 if (coreAudioDevicesHasDevice(pEnmDst, pDevSrcOut->deviceID)) 821 809 continue; /* Already in our list, skip. */ 822 810 823 P PDMAUDIODEVICE pDevDst = DrvAudioHlpDeviceAlloc(sizeof(COREAUDIODEVICEDATA));811 PCOREAUDIODEVICEDATA pDevDst = (PCOREAUDIODEVICEDATA)PDMAudioDeviceAlloc(sizeof(*pDevDst)); 824 812 if (!pDevDst) 825 813 { … … 828 816 } 829 817 830 PCOREAUDIODEVICEDATA pDevDstData = (PCOREAUDIODEVICEDATA)pDevDst->pvData; 831 AssertPtr(pDevDstData); 832 coreAudioDeviceDataInit(pDevDstData, pDevSrcOutData->deviceID, false /* fIsInput */, pThis); 833 834 RTStrCopy(pDevDst->szName, sizeof(pDevDst->szName), pDevSrcOut->szName); 835 836 pDevDst->enmUsage = PDMAUDIODIR_OUT; 837 pDevDst->cMaxOutputChannels = pDevSrcOut->cMaxOutputChannels; 838 839 pDevDstData->deviceID = pDevSrcOutData->deviceID; 818 coreAudioDeviceDataInit(pDevDst, pDevSrcOut->deviceID, false /* fIsInput */, pThis); 819 820 RTStrCopy(pDevDst->Core.szName, sizeof(pDevDst->Core.szName), pDevSrcOut->Core.szName); 821 822 pDevDst->Core.enmUsage = PDMAUDIODIR_OUT; 823 pDevDst->Core.cMaxOutputChannels = pDevSrcOut->Core.cMaxOutputChannels; 824 825 pDevDst->deviceID = pDevSrcOut->deviceID; 840 826 841 827 /* Handle flags. */ 842 if (pDevSrcOut-> fFlags & PDMAUDIODEV_FLAGS_DEFAULT)843 pDevDst-> fFlags |= PDMAUDIODEV_FLAGS_DEFAULT;828 if (pDevSrcOut->Core.fFlags & PDMAUDIODEV_FLAGS_DEFAULT) 829 pDevDst->Core.fFlags |= PDMAUDIODEV_FLAGS_DEFAULT; 844 830 /** @todo Handle hot plugging? */ 845 831 846 rc = DrvAudioHlpDeviceEnumAdd(pEnmDst, pDevDst);832 rc = DrvAudioHlpDeviceEnumAdd(pEnmDst, &pDevDst->Core); 847 833 if (RT_FAILURE(rc)) 848 834 { 849 PDMAudioDeviceFree( pDevDst);835 PDMAudioDeviceFree(&pDevDst->Core); 850 836 break; 851 837 } … … 910 896 * @param enmSts Status to propagate. 911 897 */ 912 static int coreAudioDevicePropagateStatus(P PDMAUDIODEVICEpDev, COREAUDIOSTATUS enmSts)898 static int coreAudioDevicePropagateStatus(PCOREAUDIODEVICEDATA pDev, COREAUDIOSTATUS enmSts) 913 899 { 914 900 AssertPtrReturn(pDev, VERR_INVALID_POINTER); 915 901 916 PCOREAUDIODEVICEDATA pDevData = (PCOREAUDIODEVICEDATA)pDev->pvData;917 AssertPtrReturn(pDevData, VERR_INVALID_POINTER);918 902 919 903 /* Sanity. */ 920 AssertPtr(pDev Data->pDrv);921 922 LogFlowFunc(("pDev=%p , pDevData=%p, enmSts=%RU32\n", pDev, pDevData, enmSts));904 AssertPtr(pDev->pDrv); 905 906 LogFlowFunc(("pDev=%p enmSts=%RU32\n", pDev, enmSts)); 923 907 924 908 PCOREAUDIOSTREAM pCAStream; 925 RTListForEach(&pDev Data->lstStreams, pCAStream, COREAUDIOSTREAM, Node)909 RTListForEach(&pDev->lstStreams, pCAStream, COREAUDIOSTREAM, Node) 926 910 { 927 911 LogFlowFunc(("pCAStream=%p\n", pCAStream)); … … 946 930 LogFlowFunc(("propertyID=%u, nAddresses=%u, pvUser=%p\n", propertyID, nAddresses, pvUser)); 947 931 948 P PDMAUDIODEVICE pDev = (PPDMAUDIODEVICE)pvUser;932 PCOREAUDIODEVICEDATA pDev = (PCOREAUDIODEVICEDATA)pvUser; 949 933 AssertPtr(pDev); 950 934 951 PCOREAUDIODEVICEDATA pData = (PCOREAUDIODEVICEDATA)pDev->pvData; 952 AssertPtrReturn(pData, VERR_INVALID_POINTER); 953 954 PDRVHOSTCOREAUDIO pThis = pData->pDrv; 935 PDRVHOSTCOREAUDIO pThis = pDev->pDrv; 955 936 AssertPtr(pThis); 956 937 … … 964 945 kAudioObjectPropertyElementMaster }; 965 946 966 AudioDeviceID deviceID = pD ata->deviceID;947 AudioDeviceID deviceID = pDev->deviceID; 967 948 968 949 OSStatus err = AudioObjectGetPropertyData(deviceID, &propAdr, 0, NULL, &uSize, &uAlive); … … 977 958 if (fIsDead) 978 959 { 979 LogRel2(("CoreAudio: Device '%s' stopped functioning\n", pDev-> szName));960 LogRel2(("CoreAudio: Device '%s' stopped functioning\n", pDev->Core.szName)); 980 961 981 962 /* Mark device as dead. */ … … 991 972 992 973 /* Callback for getting notified when the default recording/playback device has been changed. */ 974 /** @todo r=bird: Why DECLCALLBACK? */ 993 975 static DECLCALLBACK(OSStatus) coreAudioDefaultDeviceChangedCb(AudioObjectID propertyID, 994 976 UInt32 nAddresses, … … 1008 990 for (UInt32 idxAddress = 0; idxAddress < nAddresses; idxAddress++) 1009 991 { 1010 P PDMAUDIODEVICEpDev = NULL;992 PCOREAUDIODEVICEDATA pDev = NULL; 1011 993 1012 994 /* … … 1036 1018 if (pDev) 1037 1019 { 1038 PCOREAUDIODEVICEDATA pData = (PCOREAUDIODEVICEDATA)pDev->pvData;1039 AssertPtr(pData);1040 1041 1020 /* This listener is called on every change of the hardware 1042 1021 * device. So check if the default device has really changed. */ … … 1047 1026 if (err == noErr) 1048 1027 { 1049 if (pD ata->deviceID != uResp) /* Has the device ID changed? */1028 if (pDev->deviceID != uResp) /* Has the device ID changed? */ 1050 1029 { 1051 1030 rc2 = coreAudioDevicePropagateStatus(pDev, COREAUDIOSTATUS_REINIT); … … 1067 1046 #ifdef VBOX_WITH_AUDIO_CALLBACKS 1068 1047 if (pfnCallback) 1069 /* Ignore rc */ pfnCallback(pThis->pDrvIns, PDMAUDIOBACKENDCBTYPE_DEVICES_CHANGED, NULL, 0);1048 pfnCallback(pThis->pDrvIns, PDMAUDIOBACKENDCBTYPE_DEVICES_CHANGED, NULL, 0); /* Ignore rc */ 1070 1049 #endif 1071 1050 … … 1074 1053 1075 1054 #ifndef VBOX_WITH_AUDIO_CALLBACKS 1055 1076 1056 /** 1077 1057 * Re-initializes a Core Audio stream with a specific audio device and stream configuration. … … 1083 1063 * @param pCfg Stream configuration to use for re-initialization. 1084 1064 */ 1085 static int coreAudioStreamReinitEx(PDRVHOSTCOREAUDIO pThis, 1086 PCOREAUDIO STREAM pCAStream, PPDMAUDIODEVICEpDev, PPDMAUDIOSTREAMCFG pCfg)1065 static int coreAudioStreamReinitEx(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, 1066 PCOREAUDIODEVICEDATA pDev, PPDMAUDIOSTREAMCFG pCfg) 1087 1067 { 1088 1068 LogFunc(("pCAStream=%p\n", pCAStream)); … … 1120 1100 * @param pDev Audio device to use for re-initialization. 1121 1101 */ 1122 static int coreAudioStreamReinit(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, P PDMAUDIODEVICEpDev)1102 static int coreAudioStreamReinit(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, PCOREAUDIODEVICEDATA pDev) 1123 1103 { 1124 1104 int rc = coreAudioStreamUninit(pCAStream); … … 1135 1115 return rc; 1136 1116 } 1117 1137 1118 #endif /* !VBOX_WITH_AUDIO_CALLBACKS */ 1138 1119 … … 1234 1215 * @param pDev Audio device to use for this stream. 1235 1216 */ 1236 static int coreAudioStreamInit(PCOREAUDIOSTREAM pCAStream, PDRVHOSTCOREAUDIO pThis, P PDMAUDIODEVICEpDev)1217 static int coreAudioStreamInit(PCOREAUDIOSTREAM pCAStream, PDRVHOSTCOREAUDIO pThis, PCOREAUDIODEVICEDATA pDev) 1237 1218 { 1238 1219 AssertPtrReturn(pCAStream, VERR_INVALID_POINTER); … … 1241 1222 1242 1223 Assert(pCAStream->Unit.pDevice == NULL); /* Make sure no device is assigned yet. */ 1243 AssertPtr(pDev->pvData); 1244 Assert(pDev->cbData == sizeof(COREAUDIODEVICEDATA)); 1245 1246 #ifdef DEBUG 1247 PCOREAUDIODEVICEDATA pData = (PCOREAUDIODEVICEDATA)pDev->pvData; 1248 LogFunc(("pCAStream=%p, pDev=%p ('%s', ID=%RU32)\n", pCAStream, pDev, pDev->szName, pData->deviceID)); 1249 #endif 1224 Assert(pDev->Core.cbData == sizeof(COREAUDIODEVICEDATA)); 1225 1226 LogFunc(("pCAStream=%p, pDev=%p ('%s', ID=%RU32)\n", pCAStream, pDev, pDev->Core.szName, pDev->deviceID)); 1250 1227 1251 1228 pCAStream->Unit.pDevice = pDev; … … 1298 1275 * Assign device to queue. 1299 1276 */ 1300 PCOREAUDIODEVICEDATA pD ata = (PCOREAUDIODEVICEDATA)pCAStream->Unit.pDevice->pvData;1301 AssertPtr(pD ata);1302 1303 UInt32 uSize = sizeof(pD ata->UUID);1304 err = AudioQueueSetProperty(pCAStream->audioQueue, kAudioQueueProperty_CurrentDevice, &pD ata->UUID, uSize);1277 PCOREAUDIODEVICEDATA pDev = (PCOREAUDIODEVICEDATA)pCAStream->Unit.pDevice; 1278 AssertPtr(pDev); 1279 1280 UInt32 uSize = sizeof(pDev->UUID); 1281 err = AudioQueueSetProperty(pCAStream->audioQueue, kAudioQueueProperty_CurrentDevice, &pDev->UUID, uSize); 1305 1282 if (err != noErr) 1306 1283 return VERR_GENERAL_FAILURE; /** @todo Fudge! */ … … 1698 1675 * @param pDev Audio device to use for the registered callbacks. 1699 1676 */ 1700 static int coreAudioDeviceRegisterCallbacks(PDRVHOSTCOREAUDIO pThis, P PDMAUDIODEVICEpDev)1677 static int coreAudioDeviceRegisterCallbacks(PDRVHOSTCOREAUDIO pThis, PCOREAUDIODEVICEDATA pDev) 1701 1678 { 1702 1679 RT_NOREF(pThis); 1703 1680 1704 1681 AudioDeviceID deviceID = kAudioDeviceUnknown; 1705 1706 PCOREAUDIODEVICEDATA pData = (PCOREAUDIODEVICEDATA)pDev->pvData; 1707 if (pData) 1708 deviceID = pData->deviceID; 1682 if (pDev && pDev->Core.cbData) /* paranoia or actually needed? */ 1683 deviceID = pDev->deviceID; 1709 1684 1710 1685 if (deviceID != kAudioDeviceUnknown) … … 1750 1725 * @param pDev Audio device to use for the registered callbacks. 1751 1726 */ 1752 static int coreAudioDeviceUnregisterCallbacks(PDRVHOSTCOREAUDIO pThis, P PDMAUDIODEVICEpDev)1727 static int coreAudioDeviceUnregisterCallbacks(PDRVHOSTCOREAUDIO pThis, PCOREAUDIODEVICEDATA pDev) 1753 1728 { 1754 1729 RT_NOREF(pThis); 1755 1730 1756 1731 AudioDeviceID deviceID = kAudioDeviceUnknown; 1757 1758 if (pDev) 1759 { 1760 PCOREAUDIODEVICEDATA pData = (PCOREAUDIODEVICEDATA)pDev->pvData; 1761 if (pData) 1762 deviceID = pData->deviceID; 1763 } 1732 if (pDev && pDev->Core.cbData) /* paranoia or actually needed? */ 1733 deviceID = pDev->deviceID; 1764 1734 1765 1735 if (deviceID != kAudioDeviceUnknown) … … 1810 1780 RT_NOREF(cAddresses, properties, pvUser); 1811 1781 1812 P PDMAUDIODEVICE pDev = (PPDMAUDIODEVICE)pvUser;1782 PCOREAUDIODEVICEDATA pDev = (PCOREAUDIODEVICEDATA)pvUser; 1813 1783 AssertPtr(pDev); 1814 1784 … … 1878 1848 * Default input device. 1879 1849 */ 1880 pThis->pDefaultDevIn = DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->Devices, PDMAUDIODIR_IN);1850 pThis->pDefaultDevIn = (PCOREAUDIODEVICEDATA)DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->Devices, PDMAUDIODIR_IN); 1881 1851 if (pThis->pDefaultDevIn) 1882 1852 { 1883 LogRel2(("CoreAudio: Default capturing device is '%s'\n", pThis->pDefaultDevIn->szName)); 1884 1885 #ifdef DEBUG 1886 PCOREAUDIODEVICEDATA pDevData = (PCOREAUDIODEVICEDATA)pThis->pDefaultDevIn->pvData; 1887 AssertPtr(pDevData); 1888 LogFunc(("pDefaultDevIn=%p, ID=%RU32\n", pThis->pDefaultDevIn, pDevData->deviceID)); 1889 #endif 1853 LogRel2(("CoreAudio: Default capturing device is '%s'\n", pThis->pDefaultDevIn->Core.szName)); 1854 LogFunc(("pDefaultDevIn=%p, ID=%RU32\n", pThis->pDefaultDevIn, pThis->pDefaultDevIn->deviceID)); 1890 1855 rc = coreAudioDeviceRegisterCallbacks(pThis, pThis->pDefaultDevIn); 1891 1856 } … … 1896 1861 * Default output device. 1897 1862 */ 1898 pThis->pDefaultDevOut = DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->Devices, PDMAUDIODIR_OUT);1863 pThis->pDefaultDevOut = (PCOREAUDIODEVICEDATA)DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->Devices, PDMAUDIODIR_OUT); 1899 1864 if (pThis->pDefaultDevOut) 1900 1865 { 1901 LogRel2(("CoreAudio: Default playback device is '%s'\n", pThis->pDefaultDevOut->szName)); 1902 1903 #ifdef DEBUG 1904 PCOREAUDIODEVICEDATA pDevData = (PCOREAUDIODEVICEDATA)pThis->pDefaultDevOut->pvData; 1905 AssertPtr(pDevData); 1906 LogFunc(("pDefaultDevOut=%p, ID=%RU32\n", pThis->pDefaultDevOut, pDevData->deviceID)); 1907 #endif 1866 LogRel2(("CoreAudio: Default playback device is '%s'\n", pThis->pDefaultDevOut->Core.szName)); 1867 LogFunc(("pDefaultDevOut=%p, ID=%RU32\n", pThis->pDefaultDevOut, pThis->pDefaultDevOut->deviceID)); 1908 1868 rc = coreAudioDeviceRegisterCallbacks(pThis, pThis->pDefaultDevOut); 1909 1869 } … … 2231 2191 if (pDeviceEnum) 2232 2192 { 2193 /* Return a copy with only PDMAUDIODEVICE, none of the extra bits in COREAUDIODEVICEDATA. */ 2233 2194 rc = DrvAudioHlpDeviceEnumInit(pDeviceEnum); 2234 2195 if (RT_SUCCESS(rc)) … … 2324 2285 2325 2286 /* For now, just use the default device available. */ 2326 P PDMAUDIODEVICEpDev = fIn ? pThis->pDefaultDevIn : pThis->pDefaultDevOut;2287 PCOREAUDIODEVICEDATA pDev = fIn ? pThis->pDefaultDevIn : pThis->pDefaultDevOut; 2327 2288 2328 2289 LogFunc(("pStream=%p, pCfgReq=%p, pCfgAcq=%p, fIn=%RTbool, pDev=%p\n", pStream, pCfgReq, pCfgAcq, fIn, pDev)); … … 2331 2292 { 2332 2293 /* Sanity. */ 2333 AssertPtr(pDev->pvData); 2334 Assert(pDev->cbData); 2294 Assert(pDev->Core.cbData); 2335 2295 2336 2296 /* Init the Core Audio stream. */
Note:
See TracChangeset
for help on using the changeset viewer.