VirtualBox

Changeset 88389 in vbox


Ignore:
Timestamp:
Apr 7, 2021 10:30:32 AM (4 years ago)
Author:
vboxsync
Message:

DrvHostAudioCoreAudio: Moved the drvHostCoreAudioHA_Init code into the constructor and drvHostCoreAudioHA_Shutdown into a common worker for the power off and destructor callbacks. bugref:9890

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DrvHostAudioCoreAudio.cpp

    r88380 r88389  
    111111    PPDMIAUDIONOTIFYFROMHOST pIAudioNotifyFromHost;
    112112#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;
    113117} DRVHOSTCOREAUDIO, *PDRVHOSTCOREAUDIO;
    114118
     
    255259
    256260    /* 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    };
    259267
    260268    UInt32 uSize = sizeof(AudioValueTranslation);
    261     OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propAdr, 0, NULL, &uSize, &translation);
     269    OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &PropAddr, 0, NULL, &uSize, &translation);
    262270
    263271    /* Release the temporary CFString */
     
    507515
    508516        /* 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        };
    513523        UInt32 uSize = sizeof(defaultDeviceID);
    514         OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propAdrDefaultDev, 0, NULL, &uSize, &defaultDeviceID);
     524        OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &PropAddrDefaultDev, 0, NULL, &uSize, &defaultDeviceID);
    515525        if (err != noErr)
    516526        {
     
    526536        }
    527537
    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);
    532546        if (err != kAudioHardwareNoError)
    533547            break;
     
    537551            break;
    538552
    539         err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propAdrDevList, 0, NULL, &uSize, pDevIDs);
     553        err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &PropAddrDevList, 0, NULL, &uSize, pDevIDs);
    540554        if (err != kAudioHardwareNoError)
    541555            break;
     
    571585                pDev->Core.fFlags |= PDMAUDIOHOSTDEV_F_DEFAULT;
    572586
    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);
    579594            if (err != noErr)
    580595                continue;
     
    584599                continue;
    585600
    586             err = AudioObjectGetPropertyData(curDevID, &propAddrCfg, 0, NULL, &uSize, pBufList);
     601            err = AudioObjectGetPropertyData(curDevID, &PropAddrCfg, 0, NULL, &uSize, pBufList);
    587602            if (err == noErr)
    588603            {
     
    608623
    609624            /* 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            };
    614631            uSize = sizeof(CFStringRef);
    615632            CFStringRef pcfstrName = NULL;
    616633
    617             err = AudioObjectGetPropertyData(curDevID, &propAddrName, 0, NULL, &uSize, &pcfstrName);
     634            err = AudioObjectGetPropertyData(curDevID, &PropAddrName, 0, NULL, &uSize, &pcfstrName);
    618635            if (err != kAudioHardwareNoError)
    619636                continue;
     
    639656
    640657            /* 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            };
    645664
    646665            UInt32 uAlive = 0;
    647666            uSize = sizeof(uAlive);
    648667
    649             err = AudioObjectGetPropertyData(curDevID, &propAddrAlive, 0, NULL, &uSize, &uAlive);
     668            err = AudioObjectGetPropertyData(curDevID, &PropAddrAlive, 0, NULL, &uSize, &uAlive);
    650669            if (   (err == noErr)
    651670                && !uAlive)
     
    655674
    656675            /* 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            };
    659682
    660683            pid_t pid = 0;
    661684            uSize = sizeof(pid);
    662685
    663             err = AudioObjectGetPropertyData(curDevID, &propAddrHogged, 0, NULL, &uSize, &pid);
     686            err = AudioObjectGetPropertyData(curDevID, &PropAddrHogged, 0, NULL, &uSize, &pid);
    664687            if (   (err == noErr)
    665688                && (pid != -1))
     
    872895
    873896    /* 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    };
    877903    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);
    879905    if (err != noErr)
    880906        LogRel(("CoreAudio: Failed to retrieve device UUID for device %RU32 (%RI32)\n", deviceID, err));
     
    937963    UInt32 uSize  = sizeof(UInt32);
    938964
    939     AudioObjectPropertyAddress propAdr = { kAudioDevicePropertyDeviceIsAlive, kAudioObjectPropertyScopeGlobal,
    940                                            kAudioObjectPropertyElementMaster };
     965    AudioObjectPropertyAddress PropAddr =
     966    {
     967        kAudioDevicePropertyDeviceIsAlive,
     968        kAudioObjectPropertyScopeGlobal,
     969        kAudioObjectPropertyElementMaster
     970    };
    941971
    942972    AudioDeviceID deviceID = pDev->deviceID;
    943973
    944     OSStatus err = AudioObjectGetPropertyData(deviceID, &propAdr, 0, NULL, &uSize, &uAlive);
     974    OSStatus err = AudioObjectGetPropertyData(deviceID, &PropAddr, 0, NULL, &uSize, &uAlive);
    945975
    946976    bool fIsDead = false;
     
    16831713         * Register device callbacks.
    16841714         */
    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 */);
    16891722        if (   err != noErr
    16901723            && err != kAudioHardwareIllegalOperationError)
    1691         {
    16921724            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 */);
    16991729        if (err != noErr)
    17001730            LogRel(("CoreAudio: Failed to register processor overload listener (%RI32)\n", err));
    17011731
    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 */);
    17061735        if (err != noErr)
    17071736            LogRel(("CoreAudio: Failed to register sample rate changed listener (%RI32)\n", err));
     
    17341763         * Unregister per-device callbacks.
    17351764         */
    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 */);
    17401772        if (   err != noErr
    17411773            && err != kAudioHardwareBadObjectError)
    1742         {
    17431774            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 */);
    17491778        if (   err != noErr
    17501779            && err != kAudioHardwareBadObjectError)
    1751         {
    17521780            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 */);
    17581784        if (   err != noErr
    17591785            && err != kAudioHardwareBadObjectError)
    1760         {
    17611786            LogRel(("CoreAudio: Failed to remove the device alive listener (%RI32)\n", err));
    1762         }
    17631787    }
    17641788
     
    24302454
    24312455/**
    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 */
     2458static 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 */
     2472static void drvHostCoreAudioRemoveDefaultDeviceListners(PDRVHOSTCOREAUDIO pThis)
     2473{
    24772474    /*
    24782475     * Unregister system callbacks.
    24792476     */
    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;
    24982503    }
    24992504
     
    25032508
    25042509/**
    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 */
     2512static 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 */
     2522static 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);
    25162533}
    25172534
     
    25322549     */
    25332550    pThis->pDrvIns                   = pDrvIns;
     2551    PDMAudioHostEnumInit(&pThis->Devices);
    25342552    /* IBase */
    25352553    pDrvIns->IBase.pfnQueryInterface = drvHostCoreAudioQueryInterface;
    25362554    /* IHostAudio */
    2537     pThis->IHostAudio.pfnInit               = drvHostCoreAudioHA_Init;
    2538     pThis->IHostAudio.pfnShutdown           = drvHostCoreAudioHA_Shutdown;
     2555    pThis->IHostAudio.pfnInit               = NULL;
     2556    pThis->IHostAudio.pfnShutdown           = NULL;
    25392557    pThis->IHostAudio.pfnGetConfig          = drvHostCoreAudioHA_GetConfig;
    25402558    pThis->IHostAudio.pfnGetStatus          = drvHostCoreAudioHA_GetStatus;
     
    25532571    AssertRCReturn(rc, rc);
    25542572
     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
    25552603#ifdef VBOX_WITH_AUDIO_CALLBACKS
    25562604    /*
     
    25682616    LogFlowFuncLeaveRC(rc);
    25692617    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);
    25852618}
    25862619
     
    26302663    NULL,
    26312664    /* pfnPowerOff */
    2632     NULL,
     2665    drvHostCoreAudioPowerOff,
    26332666    /* pfnSoftReset */
    26342667    NULL,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette