VirtualBox

Changeset 88033 in vbox


Ignore:
Timestamp:
Mar 9, 2021 1:31:33 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
143162
Message:

Audio: Converted the core audio code to extending PDMAUDIODEVICE rather than the pvData scheme. Eliminated PDMAUDIODEVICE::pvData and added a magic. Untested. bugref:9890

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pdmaudioifs.h

    r88032 r88033  
    356356    /** List entry (like PDMAUDIODEVICEENUM::LstDevices). */
    357357    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;
    361360    /** Size of the additional data. */
    362     size_t              cbData;
     361    uint32_t            cbData;
    363362    /** The device type. */
    364363    PDMAUDIODEVICETYPE  enmType;
     
    385384            uint16_t    idProduct;
    386385        } USB;
    387         uint64_t        uPadding[2];
     386        uint64_t        uPadding[ARCH_BITS >= 64 ? 3 : 4];
    388387    } Type;
    389388    /** Friendly name of the device, if any. */
    390389    char                szName[64];
    391390} PDMAUDIODEVICE;
    392 AssertCompileSizeAlignment(PDMAUDIODEVICE, ARCH_BITS >= 64 ? 32 : 16);
     391AssertCompileSizeAlignment(PDMAUDIODEVICE, 32);
    393392/** Pointer to audio device info (enum result). */
    394393typedef PDMAUDIODEVICE *PPDMAUDIODEVICE;
    395394/** Pointer to a const audio device info (enum result). */
    396395typedef 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
    397402
    398403/**
  • trunk/src/VBox/Devices/Audio/DrvAudio.h

    r88031 r88033  
    212212void            PDMAudioDeviceFree(PPDMAUDIODEVICE pDev);
    213213PPDMAUDIODEVICE PDMAudioDeviceDup(const PPDMAUDIODEVICE pDev, bool fCopyUserData);
    214 
    215 PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData);
    216214/** @}  */
    217215
  • trunk/src/VBox/Devices/Audio/DrvAudioCommon.cpp

    r88031 r88033  
    160160    if (pDev)
    161161    {
    162         pDev->pvData = pDev + 1;
    163         pDev->cbData = cb - sizeof(PDMAUDIODEVICE);
     162        pDev->uMagic == PDMAUDIODEVICE_MAGIC;
     163        pDev->cbData = (uint32_t)(cb - sizeof(PDMAUDIODEVICE));
    164164        RTListInit(&pDev->Node);
    165165
     
    171171
    172172/**
    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 provide
    177  *                              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 /**
    187173 * Frees an audio device allocated by PDMAudioDeviceAlloc.
    188174 *
     
    193179    if (pDev)
    194180    {
     181        Assert(pDev->uMagic == PDMAUDIODEVICE_MAGIC);
    195182        Assert(pDev->cRefCount == 0);
    196 
    197         pDev->pvData = NULL;
     183        pDev->uMagic = PDMAUDIODEVICE_MAGIC_DEAD;
    198184        pDev->cbData = 0;
    199185
     
    464450
    465451        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));
    471457
    472458        if (pszFlags)
  • trunk/src/VBox/Devices/Audio/DrvHostCoreAudio.cpp

    r88031 r88033  
    6666
    6767/**
    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!
    7071 */
    7172typedef struct COREAUDIODEVICEDATA
    7273{
     74    /** The core PDM structure. */
     75    PDMAUDIODEVICE      Core;
     76
    7377    /** Pointer to driver instance this device is bound to. */
    74     PDRVHOSTCOREAUDIO pDrv;
     78    PDRVHOSTCOREAUDIO   pDrv;
    7579    /** 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;
    7984    /** List of attached (native) Core Audio streams attached to this device. */
    80     RTLISTANCHOR      lstStreams;
    81 } COREAUDIODEVICEDATA, *PCOREAUDIODEVICEDATA;
     85    RTLISTANCHOR        lstStreams;
     86} COREAUDIODEVICEDATA;
     87typedef COREAUDIODEVICEDATA *PCOREAUDIODEVICEDATA;
    8288
    8389/**
     
    97103    /** Pointer to the currently used input device in the device enumeration.
    98104     *  Can be NULL if none assigned. */
    99     PPDMAUDIODEVICE         pDefaultDevIn;
     105    PCOREAUDIODEVICEDATA    pDefaultDevIn;
    100106    /** Pointer to the currently used output device in the device enumeration.
    101107     *  Can be NULL if none assigned. */
    102     PPDMAUDIODEVICE         pDefaultDevOut;
     108    PCOREAUDIODEVICEDATA    pDefaultDevOut;
    103109#ifdef VBOX_WITH_AUDIO_CALLBACKS
    104110    /** Callback function to the upper driver.
     
    119125    /** Pointer to the device this audio unit is bound to.
    120126     *  Can be NULL if not bound to a device (anymore). */
    121     PPDMAUDIODEVICE             pDevice;
     127    PCOREAUDIODEVICEDATA        pDevice;
    122128    /** The actual audio unit object. */
    123129    AudioUnit                   audioUnit;
     
    133139DECLHIDDEN(int) coreAudioInputPermissionCheck(void);
    134140
    135 /*******************************************************************************
    136  *
    137  * Helper function section
    138  *
    139  ******************************************************************************/
     141
     142/*********************************************************************************************************************************
     143*   Helper function section                                                                                                      *
     144*********************************************************************************************************************************/
    140145
    141146/* Move these down below the internal function prototypes... */
     
    261266
    262267/*********************************************************************************************************************************
    263 *   Defined Constants And Macros                                                                                                 *
     268*   Structures and Typedefs                                                                                                      *
    264269*********************************************************************************************************************************/
    265270
     
    393398} COREAUDIOSTREAM, *PCOREAUDIOSTREAM;
    394399
    395 static int coreAudioStreamInit(PCOREAUDIOSTREAM pCAStream, PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev);
     400
     401/*********************************************************************************************************************************
     402*   Internal Functions                                                                                                           *
     403*********************************************************************************************************************************/
     404static int coreAudioStreamInit(PCOREAUDIOSTREAM pCAStream, PDRVHOSTCOREAUDIO pThis, PCOREAUDIODEVICEDATA pDev);
    396405#ifndef VBOX_WITH_AUDIO_CALLBACKS
    397 static int coreAudioStreamReinit(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, PPDMAUDIODEVICE pDev);
     406static int coreAudioStreamReinit(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, PCOREAUDIODEVICEDATA pDev);
    398407#endif
    399408static int coreAudioStreamUninit(PCOREAUDIOSTREAM pCAStream);
     
    401410static int coreAudioStreamControl(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, PDMAUDIOSTREAMCMD enmStreamCmd);
    402411
    403 static int coreAudioDeviceRegisterCallbacks(PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev);
    404 static int coreAudioDeviceUnregisterCallbacks(PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev);
    405412static void coreAudioDeviceDataInit(PCOREAUDIODEVICEDATA pDevData, AudioDeviceID deviceID, bool fIsInput, PDRVHOSTCOREAUDIO pDrv);
    406413
     
    414421static DECLCALLBACK(void) coreAudioOutputQueueCb(void *pvUser, AudioQueueRef audioQueue, AudioQueueBufferRef audioBuffer);
    415422
     423
    416424#ifdef VBOX_WITH_AUDIO_CA_CONVERTER
     425
    417426/**
    418427 * Initializes a conversion callback context.
     
    432441    AssertPtrReturn(pASBDDst,   VERR_INVALID_POINTER);
    433442
    434 #ifdef DEBUG
     443# ifdef DEBUG
    435444    coreAudioPrintASBD("CbCtx: Src", pASBDSrc);
    436445    coreAudioPrintASBD("CbCtx: Dst", pASBDDst);
    437 #endif
     446# endif
    438447
    439448    pConvCbCtx->pStream = pStream;
     
    467476    pConvCbCtx->cErrors    = 0;
    468477}
     478
    469479#endif /* VBOX_WITH_AUDIO_CA_CONVERTER */
    470 
    471480
    472481/**
     
    485494    int rc = VINF_SUCCESS;
    486495
    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.) */
    488497    {
    489498        AudioDeviceID defaultDeviceID = kAudioDeviceUnknown;
     
    530539        UInt16 cDevices = uSize / sizeof(AudioDeviceID);
    531540
    532         PPDMAUDIODEVICE pDev = NULL;
     541        PCOREAUDIODEVICEDATA pDev = NULL;
    533542        for (UInt16 i = 0; i < cDevices; i++)
    534543        {
    535544            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));
    539548            if (!pDev)
    540549            {
     
    544553
    545554            /* Set usage. */
    546             pDev->enmUsage = enmUsage;
     555            pDev->Core.enmUsage = enmUsage;
    547556
    548557            /* 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);
    552559
    553560            /* Check if the device is valid. */
    554             AudioDeviceID curDevID = pDevData->deviceID;
     561            AudioDeviceID curDevID = pDev->deviceID;
    555562
    556563            /* Is the device the default device? */
    557564            if (curDevID == defaultDeviceID)
    558                 pDev->fFlags |= PDMAUDIODEV_FLAGS_DEFAULT;
     565                pDev->Core.fFlags |= PDMAUDIODEV_FLAGS_DEFAULT;
    559566
    560567            AudioObjectPropertyAddress propAddrCfg = { kAudioDevicePropertyStreamConfiguration,
     
    577584                {
    578585                    if (enmUsage == PDMAUDIODIR_IN)
    579                         pDev->cMaxInputChannels  += pBufList->mBuffers[a].mNumberChannels;
     586                        pDev->Core.cMaxInputChannels  += pBufList->mBuffers[a].mNumberChannels;
    580587                    else if (enmUsage == PDMAUDIODIR_OUT)
    581                         pDev->cMaxOutputChannels += pBufList->mBuffers[a].mNumberChannels;
     588                        pDev->Core.cMaxOutputChannels += pBufList->mBuffers[a].mNumberChannels;
    582589                }
    583590            }
    584591
    585             if (pBufList)
    586             {
    587                 RTMemFree(pBufList);
    588                 pBufList = NULL;
    589             }
     592            RTMemFree(pBufList);
     593            pBufList = NULL;
    590594
    591595            /* Check if the device is valid, e.g. has any input/output channels according to its usage. */
    592596            if (   enmUsage == PDMAUDIODIR_IN
    593                 && !pDev->cMaxInputChannels)
     597                && !pDev->Core.cMaxInputChannels)
    594598                continue;
    595599            if (   enmUsage == PDMAUDIODIR_OUT
    596                 && !pDev->cMaxOutputChannels)
     600                && !pDev->Core.cMaxOutputChannels)
    597601                continue;
    598602
     
    615619                if (   pszName
    616620                    && CFStringGetCString(pcfstrName, pszName, cbName, kCFStringEncodingUTF8))
    617                     RTStrCopy(pDev->szName, sizeof(pDev->szName), pszName);
     621                    RTStrCopy(pDev->Core.szName, sizeof(pDev->Core.szName), pszName);
    618622
    619623                LogFunc(("Device '%s': %RU32\n", pszName, curDevID));
     
    641645                && !uAlive)
    642646            {
    643                 pDev->fFlags |= PDMAUDIODEV_FLAGS_DEAD;
     647                pDev->Core.fFlags |= PDMAUDIODEV_FLAGS_DEAD;
    644648            }
    645649
     
    655659                && (pid != -1))
    656660            {
    657                 pDev->fFlags |= PDMAUDIODEV_FLAGS_LOCKED;
     661                pDev->Core.fFlags |= PDMAUDIODEV_FLAGS_LOCKED;
    658662            }
    659663
    660664            /* Add the device to the enumeration. */
    661             rc = DrvAudioHlpDeviceEnumAdd(pDevEnm, pDev);
     665            rc = DrvAudioHlpDeviceEnumAdd(pDevEnm, &pDev->Core);
    662666            if (RT_FAILURE(rc))
    663667                break;
     
    669673        if (RT_FAILURE(rc))
    670674        {
    671             PDMAudioDeviceFree(pDev);
     675            PDMAudioDeviceFree(&pDev->Core);
    672676            pDev = NULL;
    673677        }
     
    702706bool coreAudioDevicesHasDevice(PPDMAUDIODEVICEENUM pEnmSrc, AudioDeviceID deviceID)
    703707{
    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)
    711712            return true;
    712713    }
     
    745746            if (RT_SUCCESS(rc))
    746747            {
    747                 PPDMAUDIODEVICE pDevSrcIn;
    748                 RTListForEach(&devEnmIn.LstDevices, pDevSrcIn, PDMAUDIODEVICE, Node)
     748                PCOREAUDIODEVICEDATA pDevSrcIn;
     749                RTListForEach(&devEnmIn.LstDevices, pDevSrcIn, COREAUDIODEVICEDATA, Core.Node)
    749750                {
    750                     PCOREAUDIODEVICEDATA pDevSrcInData = (PCOREAUDIODEVICEDATA)pDevSrcIn->pvData;
    751                     AssertPtr(pDevSrcInData);
    752 
    753                     PPDMAUDIODEVICE pDevDst = DrvAudioHlpDeviceAlloc(sizeof(COREAUDIODEVICEDATA));
     751                    PCOREAUDIODEVICEDATA pDevDst = (PCOREAUDIODEVICEDATA)PDMAudioDeviceAlloc(sizeof(*pDevDst));
    754752                    if (!pDevDst)
    755753                    {
     
    758756                    }
    759757
    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;
    768764
    769765                    /* 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;
    772768                    /** @todo Handle hot plugging? */
    773769
     
    778774                     * If found, this means we have to treat that device as a duplex device then.
    779775                     */
    780                     PPDMAUDIODEVICE pDevSrcOut;
    781                     RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, PDMAUDIODEVICE, Node)
     776                    PCOREAUDIODEVICEDATA pDevSrcOut;
     777                    RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, COREAUDIODEVICEDATA, Core.Node)
    782778                    {
    783                         PCOREAUDIODEVICEDATA pDevSrcOutData = (PCOREAUDIODEVICEDATA)pDevSrcOut->pvData;
    784                         AssertPtr(pDevSrcOutData);
    785 
    786                         if (pDevSrcInData->deviceID == pDevSrcOutData->deviceID)
     779                        if (pDevSrcIn->deviceID == pDevSrcOut->deviceID)
    787780                        {
    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;
    793786                            break;
    794787                        }
     
    796789
    797790                    if (RT_SUCCESS(rc))
    798                     {
    799                         rc = DrvAudioHlpDeviceEnumAdd(pEnmDst, pDevDst);
    800                     }
     791                        rc = DrvAudioHlpDeviceEnumAdd(pEnmDst, &pDevDst->Core);
    801792                    else
    802793                    {
    803                         PDMAudioDeviceFree(pDevDst);
     794                        PDMAudioDeviceFree(&pDevDst->Core);
    804795                        pDevDst = NULL;
    805796                    }
     
    812803                     * that is, all output devices which operate in simplex mode.
    813804                     */
    814                     PPDMAUDIODEVICE pDevSrcOut;
    815                     RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, PDMAUDIODEVICE, Node)
     805                    PCOREAUDIODEVICEDATA pDevSrcOut;
     806                    RTListForEach(&devEnmOut.LstDevices, pDevSrcOut, COREAUDIODEVICEDATA, Core.Node)
    816807                    {
    817                         PCOREAUDIODEVICEDATA pDevSrcOutData = (PCOREAUDIODEVICEDATA)pDevSrcOut->pvData;
    818                         AssertPtr(pDevSrcOutData);
    819 
    820                         if (coreAudioDevicesHasDevice(pEnmDst, pDevSrcOutData->deviceID))
     808                        if (coreAudioDevicesHasDevice(pEnmDst, pDevSrcOut->deviceID))
    821809                            continue; /* Already in our list, skip. */
    822810
    823                         PPDMAUDIODEVICE pDevDst = DrvAudioHlpDeviceAlloc(sizeof(COREAUDIODEVICEDATA));
     811                        PCOREAUDIODEVICEDATA pDevDst = (PCOREAUDIODEVICEDATA)PDMAudioDeviceAlloc(sizeof(*pDevDst));
    824812                        if (!pDevDst)
    825813                        {
     
    828816                        }
    829817
    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;
    840826
    841827                        /* 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;
    844830                        /** @todo Handle hot plugging? */
    845831
    846                         rc = DrvAudioHlpDeviceEnumAdd(pEnmDst, pDevDst);
     832                        rc = DrvAudioHlpDeviceEnumAdd(pEnmDst, &pDevDst->Core);
    847833                        if (RT_FAILURE(rc))
    848834                        {
    849                             PDMAudioDeviceFree(pDevDst);
     835                            PDMAudioDeviceFree(&pDevDst->Core);
    850836                            break;
    851837                        }
     
    910896 * @param  enmSts               Status to propagate.
    911897 */
    912 static int coreAudioDevicePropagateStatus(PPDMAUDIODEVICE pDev, COREAUDIOSTATUS enmSts)
     898static int coreAudioDevicePropagateStatus(PCOREAUDIODEVICEDATA pDev, COREAUDIOSTATUS enmSts)
    913899{
    914900    AssertPtrReturn(pDev, VERR_INVALID_POINTER);
    915901
    916     PCOREAUDIODEVICEDATA pDevData = (PCOREAUDIODEVICEDATA)pDev->pvData;
    917     AssertPtrReturn(pDevData, VERR_INVALID_POINTER);
    918902
    919903    /* Sanity. */
    920     AssertPtr(pDevData->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));
    923907
    924908    PCOREAUDIOSTREAM pCAStream;
    925     RTListForEach(&pDevData->lstStreams, pCAStream, COREAUDIOSTREAM, Node)
     909    RTListForEach(&pDev->lstStreams, pCAStream, COREAUDIOSTREAM, Node)
    926910    {
    927911        LogFlowFunc(("pCAStream=%p\n", pCAStream));
     
    946930    LogFlowFunc(("propertyID=%u, nAddresses=%u, pvUser=%p\n", propertyID, nAddresses, pvUser));
    947931
    948     PPDMAUDIODEVICE pDev = (PPDMAUDIODEVICE)pvUser;
     932    PCOREAUDIODEVICEDATA pDev = (PCOREAUDIODEVICEDATA)pvUser;
    949933    AssertPtr(pDev);
    950934
    951     PCOREAUDIODEVICEDATA pData = (PCOREAUDIODEVICEDATA)pDev->pvData;
    952     AssertPtrReturn(pData, VERR_INVALID_POINTER);
    953 
    954     PDRVHOSTCOREAUDIO pThis = pData->pDrv;
     935    PDRVHOSTCOREAUDIO pThis = pDev->pDrv;
    955936    AssertPtr(pThis);
    956937
     
    964945                                           kAudioObjectPropertyElementMaster };
    965946
    966     AudioDeviceID deviceID = pData->deviceID;
     947    AudioDeviceID deviceID = pDev->deviceID;
    967948
    968949    OSStatus err = AudioObjectGetPropertyData(deviceID, &propAdr, 0, NULL, &uSize, &uAlive);
     
    977958    if (fIsDead)
    978959    {
    979         LogRel2(("CoreAudio: Device '%s' stopped functioning\n", pDev->szName));
     960        LogRel2(("CoreAudio: Device '%s' stopped functioning\n", pDev->Core.szName));
    980961
    981962        /* Mark device as dead. */
     
    991972
    992973/* Callback for getting notified when the default recording/playback device has been changed. */
     974/** @todo r=bird: Why DECLCALLBACK? */
    993975static DECLCALLBACK(OSStatus) coreAudioDefaultDeviceChangedCb(AudioObjectID propertyID,
    994976                                                              UInt32 nAddresses,
     
    1008990    for (UInt32 idxAddress = 0; idxAddress < nAddresses; idxAddress++)
    1009991    {
    1010         PPDMAUDIODEVICE pDev = NULL;
     992        PCOREAUDIODEVICEDATA pDev = NULL;
    1011993
    1012994        /*
     
    10361018        if (pDev)
    10371019        {
    1038             PCOREAUDIODEVICEDATA pData = (PCOREAUDIODEVICEDATA)pDev->pvData;
    1039             AssertPtr(pData);
    1040 
    10411020            /* This listener is called on every change of the hardware
    10421021             * device. So check if the default device has really changed. */
     
    10471026            if (err == noErr)
    10481027            {
    1049                 if (pData->deviceID != uResp) /* Has the device ID changed? */
     1028                if (pDev->deviceID != uResp) /* Has the device ID changed? */
    10501029                {
    10511030                    rc2 = coreAudioDevicePropagateStatus(pDev, COREAUDIOSTATUS_REINIT);
     
    10671046#ifdef VBOX_WITH_AUDIO_CALLBACKS
    10681047    if (pfnCallback)
    1069         /* Ignore rc */ pfnCallback(pThis->pDrvIns, PDMAUDIOBACKENDCBTYPE_DEVICES_CHANGED, NULL, 0);
     1048        pfnCallback(pThis->pDrvIns, PDMAUDIOBACKENDCBTYPE_DEVICES_CHANGED, NULL, 0); /* Ignore rc */
    10701049#endif
    10711050
     
    10741053
    10751054#ifndef VBOX_WITH_AUDIO_CALLBACKS
     1055
    10761056/**
    10771057 * Re-initializes a Core Audio stream with a specific audio device and stream configuration.
     
    10831063 * @param  pCfg                 Stream configuration to use for re-initialization.
    10841064 */
    1085 static int coreAudioStreamReinitEx(PDRVHOSTCOREAUDIO pThis,
    1086                                    PCOREAUDIOSTREAM pCAStream, PPDMAUDIODEVICE pDev, PPDMAUDIOSTREAMCFG pCfg)
     1065static int coreAudioStreamReinitEx(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream,
     1066                                   PCOREAUDIODEVICEDATA pDev, PPDMAUDIOSTREAMCFG pCfg)
    10871067{
    10881068    LogFunc(("pCAStream=%p\n", pCAStream));
     
    11201100 * @param  pDev                 Audio device to use for re-initialization.
    11211101 */
    1122 static int coreAudioStreamReinit(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, PPDMAUDIODEVICE pDev)
     1102static int coreAudioStreamReinit(PDRVHOSTCOREAUDIO pThis, PCOREAUDIOSTREAM pCAStream, PCOREAUDIODEVICEDATA pDev)
    11231103{
    11241104    int rc = coreAudioStreamUninit(pCAStream);
     
    11351115    return rc;
    11361116}
     1117
    11371118#endif /* !VBOX_WITH_AUDIO_CALLBACKS */
    11381119
     
    12341215 * @param  pDev                 Audio device to use for this stream.
    12351216 */
    1236 static int coreAudioStreamInit(PCOREAUDIOSTREAM pCAStream, PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev)
     1217static int coreAudioStreamInit(PCOREAUDIOSTREAM pCAStream, PDRVHOSTCOREAUDIO pThis, PCOREAUDIODEVICEDATA pDev)
    12371218{
    12381219    AssertPtrReturn(pCAStream, VERR_INVALID_POINTER);
     
    12411222
    12421223    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));
    12501227
    12511228    pCAStream->Unit.pDevice = pDev;
     
    12981275     * Assign device to queue.
    12991276     */
    1300     PCOREAUDIODEVICEDATA pData = (PCOREAUDIODEVICEDATA)pCAStream->Unit.pDevice->pvData;
    1301     AssertPtr(pData);
    1302 
    1303     UInt32 uSize = sizeof(pData->UUID);
    1304     err = AudioQueueSetProperty(pCAStream->audioQueue, kAudioQueueProperty_CurrentDevice, &pData->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);
    13051282    if (err != noErr)
    13061283        return VERR_GENERAL_FAILURE; /** @todo Fudge! */
     
    16981675 * @param  pDev                 Audio device to use for the registered callbacks.
    16991676 */
    1700 static int coreAudioDeviceRegisterCallbacks(PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev)
     1677static int coreAudioDeviceRegisterCallbacks(PDRVHOSTCOREAUDIO pThis, PCOREAUDIODEVICEDATA pDev)
    17011678{
    17021679    RT_NOREF(pThis);
    17031680
    17041681    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;
    17091684
    17101685    if (deviceID != kAudioDeviceUnknown)
     
    17501725 * @param  pDev                 Audio device to use for the registered callbacks.
    17511726 */
    1752 static int coreAudioDeviceUnregisterCallbacks(PDRVHOSTCOREAUDIO pThis, PPDMAUDIODEVICE pDev)
     1727static int coreAudioDeviceUnregisterCallbacks(PDRVHOSTCOREAUDIO pThis, PCOREAUDIODEVICEDATA pDev)
    17531728{
    17541729    RT_NOREF(pThis);
    17551730
    17561731    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;
    17641734
    17651735    if (deviceID != kAudioDeviceUnknown)
     
    18101780    RT_NOREF(cAddresses, properties, pvUser);
    18111781
    1812     PPDMAUDIODEVICE pDev = (PPDMAUDIODEVICE)pvUser;
     1782    PCOREAUDIODEVICEDATA pDev = (PCOREAUDIODEVICEDATA)pvUser;
    18131783    AssertPtr(pDev);
    18141784
     
    18781848         * Default input device.
    18791849         */
    1880         pThis->pDefaultDevIn = DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->Devices, PDMAUDIODIR_IN);
     1850        pThis->pDefaultDevIn = (PCOREAUDIODEVICEDATA)DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->Devices, PDMAUDIODIR_IN);
    18811851        if (pThis->pDefaultDevIn)
    18821852        {
    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));
    18901855            rc = coreAudioDeviceRegisterCallbacks(pThis, pThis->pDefaultDevIn);
    18911856        }
     
    18961861         * Default output device.
    18971862         */
    1898         pThis->pDefaultDevOut = DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->Devices, PDMAUDIODIR_OUT);
     1863        pThis->pDefaultDevOut = (PCOREAUDIODEVICEDATA)DrvAudioHlpDeviceEnumGetDefaultDevice(&pThis->Devices, PDMAUDIODIR_OUT);
    18991864        if (pThis->pDefaultDevOut)
    19001865        {
    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));
    19081868            rc = coreAudioDeviceRegisterCallbacks(pThis, pThis->pDefaultDevOut);
    19091869        }
     
    22312191            if (pDeviceEnum)
    22322192            {
     2193                /* Return a copy with only PDMAUDIODEVICE, none of the extra bits in COREAUDIODEVICEDATA. */
    22332194                rc = DrvAudioHlpDeviceEnumInit(pDeviceEnum);
    22342195                if (RT_SUCCESS(rc))
     
    23242285
    23252286    /* For now, just use the default device available. */
    2326     PPDMAUDIODEVICE pDev = fIn ? pThis->pDefaultDevIn : pThis->pDefaultDevOut;
     2287    PCOREAUDIODEVICEDATA pDev = fIn ? pThis->pDefaultDevIn : pThis->pDefaultDevOut;
    23272288
    23282289    LogFunc(("pStream=%p, pCfgReq=%p, pCfgAcq=%p, fIn=%RTbool, pDev=%p\n", pStream, pCfgReq, pCfgAcq, fIn, pDev));
     
    23312292    {
    23322293        /* Sanity. */
    2333         AssertPtr(pDev->pvData);
    2334         Assert(pDev->cbData);
     2294        Assert(pDev->Core.cbData);
    23352295
    23362296        /* Init the Core Audio stream. */
Note: See TracChangeset for help on using the changeset viewer.

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