Changeset 88389 in vbox
- Timestamp:
- Apr 7, 2021 10:30:32 AM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DrvHostAudioCoreAudio.cpp
r88380 r88389 111 111 PPDMIAUDIONOTIFYFROMHOST pIAudioNotifyFromHost; 112 112 #endif 113 /** Indicates whether we've registered default input device change listener. */ 114 bool fRegisteredDefaultInputListener; 115 /** Indicates whether we've registered default output device change listener. */ 116 bool fRegisteredDefaultOutputListener; 113 117 } DRVHOSTCOREAUDIO, *PDRVHOSTCOREAUDIO; 114 118 … … 255 259 256 260 /* Fetch the translation from the UID to the device ID. */ 257 AudioObjectPropertyAddress propAdr = { kAudioHardwarePropertyDeviceForUID, kAudioObjectPropertyScopeGlobal, 258 kAudioObjectPropertyElementMaster }; 261 AudioObjectPropertyAddress PropAddr = 262 { 263 kAudioHardwarePropertyDeviceForUID, 264 kAudioObjectPropertyScopeGlobal, 265 kAudioObjectPropertyElementMaster 266 }; 259 267 260 268 UInt32 uSize = sizeof(AudioValueTranslation); 261 OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, & propAdr, 0, NULL, &uSize, &translation);269 OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &PropAddr, 0, NULL, &uSize, &translation); 262 270 263 271 /* Release the temporary CFString */ … … 507 515 508 516 /* Fetch the default audio device currently in use. */ 509 AudioObjectPropertyAddress propAdrDefaultDev = { enmUsage == PDMAUDIODIR_IN 510 ? kAudioHardwarePropertyDefaultInputDevice 511 : kAudioHardwarePropertyDefaultOutputDevice, 512 kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; 517 AudioObjectPropertyAddress PropAddrDefaultDev = 518 { 519 enmUsage == PDMAUDIODIR_IN ? kAudioHardwarePropertyDefaultInputDevice : kAudioHardwarePropertyDefaultOutputDevice, 520 kAudioObjectPropertyScopeGlobal, 521 kAudioObjectPropertyElementMaster 522 }; 513 523 UInt32 uSize = sizeof(defaultDeviceID); 514 OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, & propAdrDefaultDev, 0, NULL, &uSize, &defaultDeviceID);524 OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &PropAddrDefaultDev, 0, NULL, &uSize, &defaultDeviceID); 515 525 if (err != noErr) 516 526 { … … 526 536 } 527 537 528 AudioObjectPropertyAddress propAdrDevList = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, 529 kAudioObjectPropertyElementMaster }; 530 531 err = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &propAdrDevList, 0, NULL, &uSize); 538 AudioObjectPropertyAddress PropAddrDevList = 539 { 540 kAudioHardwarePropertyDevices, 541 kAudioObjectPropertyScopeGlobal, 542 kAudioObjectPropertyElementMaster 543 }; 544 545 err = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &PropAddrDevList, 0, NULL, &uSize); 532 546 if (err != kAudioHardwareNoError) 533 547 break; … … 537 551 break; 538 552 539 err = AudioObjectGetPropertyData(kAudioObjectSystemObject, & propAdrDevList, 0, NULL, &uSize, pDevIDs);553 err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &PropAddrDevList, 0, NULL, &uSize, pDevIDs); 540 554 if (err != kAudioHardwareNoError) 541 555 break; … … 571 585 pDev->Core.fFlags |= PDMAUDIOHOSTDEV_F_DEFAULT; 572 586 573 AudioObjectPropertyAddress propAddrCfg = { kAudioDevicePropertyStreamConfiguration, 574 enmUsage == PDMAUDIODIR_IN 575 ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput, 576 kAudioObjectPropertyElementMaster }; 577 578 err = AudioObjectGetPropertyDataSize(curDevID, &propAddrCfg, 0, NULL, &uSize); 587 AudioObjectPropertyAddress PropAddrCfg = 588 { 589 kAudioDevicePropertyStreamConfiguration, 590 enmUsage == PDMAUDIODIR_IN ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput, 591 kAudioObjectPropertyElementMaster 592 }; 593 err = AudioObjectGetPropertyDataSize(curDevID, &PropAddrCfg, 0, NULL, &uSize); 579 594 if (err != noErr) 580 595 continue; … … 584 599 continue; 585 600 586 err = AudioObjectGetPropertyData(curDevID, & propAddrCfg, 0, NULL, &uSize, pBufList);601 err = AudioObjectGetPropertyData(curDevID, &PropAddrCfg, 0, NULL, &uSize, pBufList); 587 602 if (err == noErr) 588 603 { … … 608 623 609 624 /* Resolve the device's name. */ 610 AudioObjectPropertyAddress propAddrName = { kAudioObjectPropertyName, 611 enmUsage == PDMAUDIODIR_IN 612 ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput, 613 kAudioObjectPropertyElementMaster }; 625 AudioObjectPropertyAddress PropAddrName = 626 { 627 kAudioObjectPropertyName, 628 enmUsage == PDMAUDIODIR_IN ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput, 629 kAudioObjectPropertyElementMaster 630 }; 614 631 uSize = sizeof(CFStringRef); 615 632 CFStringRef pcfstrName = NULL; 616 633 617 err = AudioObjectGetPropertyData(curDevID, & propAddrName, 0, NULL, &uSize, &pcfstrName);634 err = AudioObjectGetPropertyData(curDevID, &PropAddrName, 0, NULL, &uSize, &pcfstrName); 618 635 if (err != kAudioHardwareNoError) 619 636 continue; … … 639 656 640 657 /* Check if the device is alive for the intended usage. */ 641 AudioObjectPropertyAddress propAddrAlive = { kAudioDevicePropertyDeviceIsAlive, 642 enmUsage == PDMAUDIODIR_IN 643 ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput, 644 kAudioObjectPropertyElementMaster }; 658 AudioObjectPropertyAddress PropAddrAlive = 659 { 660 kAudioDevicePropertyDeviceIsAlive, 661 enmUsage == PDMAUDIODIR_IN ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput, 662 kAudioObjectPropertyElementMaster 663 }; 645 664 646 665 UInt32 uAlive = 0; 647 666 uSize = sizeof(uAlive); 648 667 649 err = AudioObjectGetPropertyData(curDevID, & propAddrAlive, 0, NULL, &uSize, &uAlive);668 err = AudioObjectGetPropertyData(curDevID, &PropAddrAlive, 0, NULL, &uSize, &uAlive); 650 669 if ( (err == noErr) 651 670 && !uAlive) … … 655 674 656 675 /* Check if the device is being hogged by someone else. */ 657 AudioObjectPropertyAddress propAddrHogged = { kAudioDevicePropertyHogMode, 658 kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; 676 AudioObjectPropertyAddress PropAddrHogged = 677 { 678 kAudioDevicePropertyHogMode, 679 kAudioObjectPropertyScopeGlobal, 680 kAudioObjectPropertyElementMaster 681 }; 659 682 660 683 pid_t pid = 0; 661 684 uSize = sizeof(pid); 662 685 663 err = AudioObjectGetPropertyData(curDevID, & propAddrHogged, 0, NULL, &uSize, &pid);686 err = AudioObjectGetPropertyData(curDevID, &PropAddrHogged, 0, NULL, &uSize, &pid); 664 687 if ( (err == noErr) 665 688 && (pid != -1)) … … 872 895 873 896 /* Get the device UUID. */ 874 AudioObjectPropertyAddress propAdrDevUUID = { kAudioDevicePropertyDeviceUID, 875 fIsInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput, 876 kAudioObjectPropertyElementMaster }; 897 AudioObjectPropertyAddress PropAddrDevUUID = 898 { 899 kAudioDevicePropertyDeviceUID, 900 fIsInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput, 901 kAudioObjectPropertyElementMaster 902 }; 877 903 UInt32 uSize = sizeof(pDevData->UUID); 878 OSStatus err = AudioObjectGetPropertyData(pDevData->deviceID, & propAdrDevUUID, 0, NULL, &uSize, &pDevData->UUID);904 OSStatus err = AudioObjectGetPropertyData(pDevData->deviceID, &PropAddrDevUUID, 0, NULL, &uSize, &pDevData->UUID); 879 905 if (err != noErr) 880 906 LogRel(("CoreAudio: Failed to retrieve device UUID for device %RU32 (%RI32)\n", deviceID, err)); … … 937 963 UInt32 uSize = sizeof(UInt32); 938 964 939 AudioObjectPropertyAddress propAdr = { kAudioDevicePropertyDeviceIsAlive, kAudioObjectPropertyScopeGlobal, 940 kAudioObjectPropertyElementMaster }; 965 AudioObjectPropertyAddress PropAddr = 966 { 967 kAudioDevicePropertyDeviceIsAlive, 968 kAudioObjectPropertyScopeGlobal, 969 kAudioObjectPropertyElementMaster 970 }; 941 971 942 972 AudioDeviceID deviceID = pDev->deviceID; 943 973 944 OSStatus err = AudioObjectGetPropertyData(deviceID, & propAdr, 0, NULL, &uSize, &uAlive);974 OSStatus err = AudioObjectGetPropertyData(deviceID, &PropAddr, 0, NULL, &uSize, &uAlive); 945 975 946 976 bool fIsDead = false; … … 1683 1713 * Register device callbacks. 1684 1714 */ 1685 AudioObjectPropertyAddress propAdr = { kAudioDevicePropertyDeviceIsAlive, kAudioObjectPropertyScopeGlobal, 1686 kAudioObjectPropertyElementMaster }; 1687 OSStatus err = AudioObjectAddPropertyListener(deviceID, &propAdr, 1688 coreAudioDeviceStateChangedCb, pDev /* pvUser */); 1715 AudioObjectPropertyAddress PropAddr = 1716 { 1717 kAudioDevicePropertyDeviceIsAlive, 1718 kAudioObjectPropertyScopeGlobal, 1719 kAudioObjectPropertyElementMaster 1720 }; 1721 OSStatus err = AudioObjectAddPropertyListener(deviceID, &PropAddr, coreAudioDeviceStateChangedCb, pDev /* pvUser */); 1689 1722 if ( err != noErr 1690 1723 && err != kAudioHardwareIllegalOperationError) 1691 {1692 1724 LogRel(("CoreAudio: Failed to add the recording device state changed listener (%RI32)\n", err)); 1693 } 1694 1695 propAdr.mSelector = kAudioDeviceProcessorOverload; 1696 propAdr.mScope = kAudioUnitScope_Global; 1697 err = AudioObjectAddPropertyListener(deviceID, &propAdr, 1698 coreAudioDevPropChgCb, pDev /* pvUser */); 1725 1726 PropAddr.mSelector = kAudioDeviceProcessorOverload; 1727 PropAddr.mScope = kAudioUnitScope_Global; 1728 err = AudioObjectAddPropertyListener(deviceID, &PropAddr, coreAudioDevPropChgCb, pDev /* pvUser */); 1699 1729 if (err != noErr) 1700 1730 LogRel(("CoreAudio: Failed to register processor overload listener (%RI32)\n", err)); 1701 1731 1702 propAdr.mSelector = kAudioDevicePropertyNominalSampleRate; 1703 propAdr.mScope = kAudioUnitScope_Global; 1704 err = AudioObjectAddPropertyListener(deviceID, &propAdr, 1705 coreAudioDevPropChgCb, pDev /* pvUser */); 1732 PropAddr.mSelector = kAudioDevicePropertyNominalSampleRate; 1733 PropAddr.mScope = kAudioUnitScope_Global; 1734 err = AudioObjectAddPropertyListener(deviceID, &PropAddr, coreAudioDevPropChgCb, pDev /* pvUser */); 1706 1735 if (err != noErr) 1707 1736 LogRel(("CoreAudio: Failed to register sample rate changed listener (%RI32)\n", err)); … … 1734 1763 * Unregister per-device callbacks. 1735 1764 */ 1736 AudioObjectPropertyAddress propAdr = { kAudioDeviceProcessorOverload, kAudioObjectPropertyScopeGlobal, 1737 kAudioObjectPropertyElementMaster }; 1738 OSStatus err = AudioObjectRemovePropertyListener(deviceID, &propAdr, 1739 coreAudioDevPropChgCb, pDev /* pvUser */); 1765 AudioObjectPropertyAddress PropAddr = 1766 { 1767 kAudioDeviceProcessorOverload, 1768 kAudioObjectPropertyScopeGlobal, 1769 kAudioObjectPropertyElementMaster 1770 }; 1771 OSStatus err = AudioObjectRemovePropertyListener(deviceID, &PropAddr, coreAudioDevPropChgCb, pDev /* pvUser */); 1740 1772 if ( err != noErr 1741 1773 && err != kAudioHardwareBadObjectError) 1742 {1743 1774 LogRel(("CoreAudio: Failed to remove the recording processor overload listener (%RI32)\n", err)); 1744 } 1745 1746 propAdr.mSelector = kAudioDevicePropertyNominalSampleRate; 1747 err = AudioObjectRemovePropertyListener(deviceID, &propAdr, 1748 coreAudioDevPropChgCb, pDev /* pvUser */); 1775 1776 PropAddr.mSelector = kAudioDevicePropertyNominalSampleRate; 1777 err = AudioObjectRemovePropertyListener(deviceID, &PropAddr, coreAudioDevPropChgCb, pDev /* pvUser */); 1749 1778 if ( err != noErr 1750 1779 && err != kAudioHardwareBadObjectError) 1751 {1752 1780 LogRel(("CoreAudio: Failed to remove the sample rate changed listener (%RI32)\n", err)); 1753 } 1754 1755 propAdr.mSelector = kAudioDevicePropertyDeviceIsAlive; 1756 err = AudioObjectRemovePropertyListener(deviceID, &propAdr, 1757 coreAudioDeviceStateChangedCb, pDev /* pvUser */); 1781 1782 PropAddr.mSelector = kAudioDevicePropertyDeviceIsAlive; 1783 err = AudioObjectRemovePropertyListener(deviceID, &PropAddr, coreAudioDeviceStateChangedCb, pDev /* pvUser */); 1758 1784 if ( err != noErr 1759 1785 && err != kAudioHardwareBadObjectError) 1760 {1761 1786 LogRel(("CoreAudio: Failed to remove the device alive listener (%RI32)\n", err)); 1762 }1763 1787 } 1764 1788 … … 2430 2454 2431 2455 /** 2432 * @interface_method_impl{PDMIHOSTAUDIO,pfnInit} 2433 */ 2434 static DECLCALLBACK(int) drvHostCoreAudioHA_Init(PPDMIHOSTAUDIO pInterface) 2435 { 2436 PDRVHOSTCOREAUDIO pThis = PDMIHOSTAUDIO_2_DRVHOSTCOREAUDIO(pInterface); 2437 2438 PDMAudioHostEnumInit(&pThis->Devices); 2439 /* Do the first (initial) internal device enumeration. */ 2440 int rc = coreAudioEnumerateDevices(pThis); 2441 if (RT_SUCCESS(rc)) 2442 { 2443 /* Register system callbacks. */ 2444 AudioObjectPropertyAddress propAdr = { kAudioHardwarePropertyDefaultInputDevice, kAudioObjectPropertyScopeGlobal, 2445 kAudioObjectPropertyElementMaster }; 2446 2447 OSStatus err = AudioObjectAddPropertyListener(kAudioObjectSystemObject, &propAdr, 2448 coreAudioDefaultDeviceChangedCb, pThis /* pvUser */); 2449 if ( err != noErr 2450 && err != kAudioHardwareIllegalOperationError) 2451 { 2452 LogRel(("CoreAudio: Failed to add the input default device changed listener (%RI32)\n", err)); 2453 } 2454 2455 propAdr.mSelector = kAudioHardwarePropertyDefaultOutputDevice; 2456 err = AudioObjectAddPropertyListener(kAudioObjectSystemObject, &propAdr, 2457 coreAudioDefaultDeviceChangedCb, pThis /* pvUser */); 2458 if ( err != noErr 2459 && err != kAudioHardwareIllegalOperationError) 2460 { 2461 LogRel(("CoreAudio: Failed to add the output default device changed listener (%RI32)\n", err)); 2462 } 2463 } 2464 2465 LogFlowFunc(("Returning %Rrc\n", rc)); 2466 return rc; 2467 } 2468 2469 2470 /** 2471 * @interface_method_impl{PDMIHOSTAUDIO,pfnShutdown} 2472 */ 2473 static DECLCALLBACK(void) drvHostCoreAudioHA_Shutdown(PPDMIHOSTAUDIO pInterface) 2474 { 2475 PDRVHOSTCOREAUDIO pThis = PDMIHOSTAUDIO_2_DRVHOSTCOREAUDIO(pInterface); 2476 2456 * @interface_method_impl{PDMIBASE,pfnQueryInterface} 2457 */ 2458 static DECLCALLBACK(void *) drvHostCoreAudioQueryInterface(PPDMIBASE pInterface, const char *pszIID) 2459 { 2460 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface); 2461 PDRVHOSTCOREAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTCOREAUDIO); 2462 2463 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase); 2464 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIHOSTAUDIO, &pThis->IHostAudio); 2465 2466 return NULL; 2467 } 2468 2469 /** 2470 * Worker for the power off and destructor callbacks. 2471 */ 2472 static void drvHostCoreAudioRemoveDefaultDeviceListners(PDRVHOSTCOREAUDIO pThis) 2473 { 2477 2474 /* 2478 2475 * Unregister system callbacks. 2479 2476 */ 2480 AudioObjectPropertyAddress propAdr = { kAudioHardwarePropertyDefaultInputDevice, kAudioObjectPropertyScopeGlobal, 2481 kAudioObjectPropertyElementMaster }; 2482 2483 OSStatus err = AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &propAdr, 2484 coreAudioDefaultDeviceChangedCb, pThis /* pvUser */); 2485 if ( err != noErr 2486 && err != kAudioHardwareBadObjectError) 2487 { 2488 LogRel(("CoreAudio: Failed to remove the default input device changed listener (%RI32)\n", err)); 2489 } 2490 2491 propAdr.mSelector = kAudioHardwarePropertyDefaultOutputDevice; 2492 err = AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &propAdr, 2493 coreAudioDefaultDeviceChangedCb, pThis /* pvUser */); 2494 if ( err != noErr 2495 && err != kAudioHardwareBadObjectError) 2496 { 2497 LogRel(("CoreAudio: Failed to remove the default output device changed listener (%RI32)\n", err)); 2477 AudioObjectPropertyAddress PropAddr = 2478 { 2479 kAudioHardwarePropertyDefaultInputDevice, 2480 kAudioObjectPropertyScopeGlobal, 2481 kAudioObjectPropertyElementMaster 2482 }; 2483 2484 OSStatus orc; 2485 if (pThis->fRegisteredDefaultInputListener) 2486 { 2487 orc = AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &PropAddr, coreAudioDefaultDeviceChangedCb, pThis); 2488 if ( orc != noErr 2489 && orc != kAudioHardwareBadObjectError) 2490 LogRel(("CoreAudio: Failed to remove the default input device changed listener: %d (%#x))\n", orc, orc)); 2491 pThis->fRegisteredDefaultInputListener = false; 2492 } 2493 2494 if (pThis->fRegisteredDefaultOutputListener) 2495 { 2496 2497 PropAddr.mSelector = kAudioHardwarePropertyDefaultOutputDevice; 2498 orc = AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &PropAddr, coreAudioDefaultDeviceChangedCb, pThis); 2499 if ( orc != noErr 2500 && orc != kAudioHardwareBadObjectError) 2501 LogRel(("CoreAudio: Failed to remove the default output device changed listener: %d (%#x))\n", orc, orc)); 2502 pThis->fRegisteredDefaultOutputListener = false; 2498 2503 } 2499 2504 … … 2503 2508 2504 2509 /** 2505 * @interface_method_impl{PDMIBASE,pfnQueryInterface} 2506 */ 2507 static DECLCALLBACK(void *) drvHostCoreAudioQueryInterface(PPDMIBASE pInterface, const char *pszIID) 2508 { 2509 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface); 2510 PDRVHOSTCOREAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTCOREAUDIO); 2511 2512 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase); 2513 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIHOSTAUDIO, &pThis->IHostAudio); 2514 2515 return NULL; 2510 * @interface_method_impl{PDMDRVREG,pfnPowerOff} 2511 */ 2512 static DECLCALLBACK(void) drvHostCoreAudioPowerOff(PPDMDRVINS pDrvIns) 2513 { 2514 PDRVHOSTCOREAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTCOREAUDIO); 2515 drvHostCoreAudioRemoveDefaultDeviceListners(pThis); 2516 } 2517 2518 2519 /** 2520 * @callback_method_impl{FNPDMDRVDESTRUCT} 2521 */ 2522 static DECLCALLBACK(void) drvHostCoreAudioDestruct(PPDMDRVINS pDrvIns) 2523 { 2524 PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns); 2525 PDRVHOSTCOREAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTCOREAUDIO); 2526 2527 drvHostCoreAudioRemoveDefaultDeviceListners(pThis); 2528 2529 int rc2 = RTCritSectDelete(&pThis->CritSect); 2530 AssertRC(rc2); 2531 2532 LogFlowFuncLeaveRC(rc2); 2516 2533 } 2517 2534 … … 2532 2549 */ 2533 2550 pThis->pDrvIns = pDrvIns; 2551 PDMAudioHostEnumInit(&pThis->Devices); 2534 2552 /* IBase */ 2535 2553 pDrvIns->IBase.pfnQueryInterface = drvHostCoreAudioQueryInterface; 2536 2554 /* IHostAudio */ 2537 pThis->IHostAudio.pfnInit = drvHostCoreAudioHA_Init;2538 pThis->IHostAudio.pfnShutdown = drvHostCoreAudioHA_Shutdown;2555 pThis->IHostAudio.pfnInit = NULL; 2556 pThis->IHostAudio.pfnShutdown = NULL; 2539 2557 pThis->IHostAudio.pfnGetConfig = drvHostCoreAudioHA_GetConfig; 2540 2558 pThis->IHostAudio.pfnGetStatus = drvHostCoreAudioHA_GetStatus; … … 2553 2571 AssertRCReturn(rc, rc); 2554 2572 2573 /* 2574 * Enumerate audio devices. 2575 */ 2576 rc = coreAudioEnumerateDevices(pThis); 2577 AssertRCReturn(rc, rc); 2578 2579 /* 2580 * Register callbacks for default device input and output changes. 2581 * We just ignore errors here it seems. 2582 */ 2583 AudioObjectPropertyAddress PropAddr = 2584 { 2585 /* .mSelector = */ kAudioHardwarePropertyDefaultInputDevice, 2586 /* .mScope = */ kAudioObjectPropertyScopeGlobal, 2587 /* .mElement = */ kAudioObjectPropertyElementMaster 2588 }; 2589 2590 OSStatus orc = AudioObjectAddPropertyListener(kAudioObjectSystemObject, &PropAddr, coreAudioDefaultDeviceChangedCb, pThis); 2591 pThis->fRegisteredDefaultInputListener = orc == noErr; 2592 if ( orc != noErr 2593 && orc != kAudioHardwareIllegalOperationError) 2594 LogRel(("CoreAudio: Failed to add the input default device changed listener: %d (%#x)\n", orc, orc)); 2595 2596 PropAddr.mSelector = kAudioHardwarePropertyDefaultOutputDevice; 2597 orc = AudioObjectAddPropertyListener(kAudioObjectSystemObject, &PropAddr, coreAudioDefaultDeviceChangedCb, pThis); 2598 pThis->fRegisteredDefaultOutputListener = orc == noErr; 2599 if ( orc != noErr 2600 && orc != kAudioHardwareIllegalOperationError) 2601 LogRel(("CoreAudio: Failed to add the output default device changed listener: %d (%#x)\n", orc, orc)); 2602 2555 2603 #ifdef VBOX_WITH_AUDIO_CALLBACKS 2556 2604 /* … … 2568 2616 LogFlowFuncLeaveRC(rc); 2569 2617 return rc; 2570 }2571 2572 2573 /**2574 * @callback_method_impl{FNPDMDRVDESTRUCT}2575 */2576 static DECLCALLBACK(void) drvHostCoreAudioDestruct(PPDMDRVINS pDrvIns)2577 {2578 PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);2579 PDRVHOSTCOREAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTCOREAUDIO);2580 2581 int rc2 = RTCritSectDelete(&pThis->CritSect);2582 AssertRC(rc2);2583 2584 LogFlowFuncLeaveRC(rc2);2585 2618 } 2586 2619 … … 2630 2663 NULL, 2631 2664 /* pfnPowerOff */ 2632 NULL,2665 drvHostCoreAudioPowerOff, 2633 2666 /* pfnSoftReset */ 2634 2667 NULL,
Note:
See TracChangeset
for help on using the changeset viewer.