VirtualBox

Changeset 89500 in vbox for trunk/include/VBox/vmm


Ignore:
Timestamp:
Jun 4, 2021 10:30:47 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
144857
Message:

Audio: Changed PDMAUDIOHOSTDEV::szName into a pszName so we don't have to truncate anything. Made PDMAudioHostDevAlloc capable of allocating both pszName and pszId as part of the device allocation. bugref:9890

Location:
trunk/include/VBox/vmm
Files:
2 edited

Legend:

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

    r89232 r89500  
    6262 *                  the PDMAUDIOHOSTDEV structure and appends additional data
    6363 *                  after it in its private structure.
    64  */
    65 DECLINLINE(PPDMAUDIOHOSTDEV) PDMAudioHostDevAlloc(size_t cb)
     64 * @param   cbName  The number of bytes to allocate for the name field
     65 *                  (including the terminator). Pass zero if RTStrAlloc and
     66 *                  friends will be used.
     67 * @param   cbId    The number of bytes to allocate for the ID field. Pass
     68 *                  zero if RTStrAlloc and friends will be used.
     69 */
     70DECLINLINE(PPDMAUDIOHOSTDEV) PDMAudioHostDevAlloc(size_t cb, size_t cbName, size_t cbId)
    6671{
    6772    AssertReturn(cb >= sizeof(PDMAUDIOHOSTDEV), NULL);
    6873    AssertReturn(cb < _4M, NULL);
    69 
    70     PPDMAUDIOHOSTDEV pDev = (PPDMAUDIOHOSTDEV)RTMemAllocZ(RT_ALIGN_Z(cb, 64));
     74    AssertReturn(cbName < _4K, NULL);
     75    AssertReturn(cbId < _16K, NULL);
     76
     77    PPDMAUDIOHOSTDEV pDev = (PPDMAUDIOHOSTDEV)RTMemAllocZ(RT_ALIGN_Z(cb + cbName + cbId, 64));
    7178    if (pDev)
    7279    {
    73         pDev->uMagic = PDMAUDIOHOSTDEV_MAGIC;
    74         pDev->cbSelf = (uint32_t)cb;
     80        pDev->uMagic  = PDMAUDIOHOSTDEV_MAGIC;
     81        pDev->cbSelf  = (uint32_t)cb;
    7582        RTListInit(&pDev->ListEntry);
    76 
    77         //pDev->cMaxInputChannels  = 0;
    78         //pDev->cMaxOutputChannels = 0;
     83        if (cbName)
     84            pDev->pszName = (char *)pDev + cb;
     85        if (cbId)
     86            pDev->pszId   = (char *)pDev + cb + cbName;
    7987    }
    8088    return pDev;
     
    94102        pDev->cbSelf = 0;
    95103
     104        if (pDev->fFlags & PDMAUDIOHOSTDEV_F_NAME_ALLOC)
     105        {
     106            RTStrFree(pDev->pszName);
     107            pDev->pszName = NULL;
     108        }
     109
    96110        if (pDev->fFlags & PDMAUDIOHOSTDEV_F_ID_ALLOC)
    97111        {
     
    120134    AssertReturn(cbToDup >= sizeof(*pDev), NULL);
    121135
    122     PPDMAUDIOHOSTDEV pDevDup = PDMAudioHostDevAlloc(cbToDup);
     136    PPDMAUDIOHOSTDEV pDevDup = PDMAudioHostDevAlloc(cbToDup, 0, 0);
    123137    if (pDevDup)
    124138    {
     
    126140        RTListInit(&pDevDup->ListEntry);
    127141        pDevDup->cbSelf = cbToDup;
     142
     143        if (pDev->pszName)
     144        {
     145            uintptr_t off;
     146            if (   (pDevDup->fFlags & PDMAUDIOHOSTDEV_F_NAME_ALLOC)
     147                || (off = (uintptr_t)pDev->pszName - (uintptr_t)pDev) >= pDevDup->cbSelf)
     148            {
     149                pDevDup->fFlags |= PDMAUDIOHOSTDEV_F_NAME_ALLOC;
     150                pDevDup->pszName = RTStrDup(pDev->pszName);
     151                AssertReturnStmt(pDevDup->pszName, PDMAudioHostDevFree(pDevDup), NULL);
     152            }
     153            else
     154                pDevDup->pszName = (char *)pDevDup + off;
     155        }
     156
    128157        if (pDev->pszId)
    129158        {
    130             pDevDup->fFlags |= PDMAUDIOHOSTDEV_F_ID_ALLOC;
    131             pDevDup->pszId   = RTStrDup(pDev->pszId);
    132             AssertReturnStmt(pDevDup->pszId, RTMemFree(pDevDup), NULL);
     159            uintptr_t off;
     160            if (   (pDevDup->fFlags & PDMAUDIOHOSTDEV_F_ID_ALLOC)
     161                || (off = (uintptr_t)pDev->pszId - (uintptr_t)pDev) >= pDevDup->cbSelf)
     162            {
     163                pDevDup->fFlags |= PDMAUDIOHOSTDEV_F_ID_ALLOC;
     164                pDevDup->pszId   = RTStrDup(pDev->pszId);
     165                AssertReturnStmt(pDevDup->pszId, PDMAudioHostDevFree(pDevDup), NULL);
     166            }
     167            else
     168                pDevDup->pszId = (char *)pDevDup + off;
    133169        }
    134170    }
     
    334370/** The max string length for all PDMAUDIOHOSTDEV_F_XXX.
    335371 * @sa PDMAudioHostDevFlagsToString */
    336 #define PDMAUDIOHOSTDEV_MAX_FLAGS_STRING_LEN sizeof("DEFAULT_OUT DEFAULT_IN HOTPLUG BUGGY IGNORE LOCKED DEAD ID_ALLOC NO_DUP ")
     372#define PDMAUDIOHOSTDEV_MAX_FLAGS_STRING_LEN sizeof("DEFAULT_OUT DEFAULT_IN HOTPLUG BUGGY IGNORE LOCKED DEAD NAME_ALLOC ID_ALLOC NO_DUP ")
    337373
    338374/**
     
    356392        { RT_STR_TUPLE("LOCKED "),      PDMAUDIOHOSTDEV_F_LOCKED  },
    357393        { RT_STR_TUPLE("DEAD "),        PDMAUDIOHOSTDEV_F_DEAD    },
    358         { RT_STR_TUPLE("ID_ALLOC "),    PDMAUDIOHOSTDEV_F_ID_ALLOC  },
     394        { RT_STR_TUPLE("NAME_ALLOC "),  PDMAUDIOHOSTDEV_F_NAME_ALLOC },
     395        { RT_STR_TUPLE("ID_ALLOC "),    PDMAUDIOHOSTDEV_F_ID_ALLOC },
    359396        { RT_STR_TUPLE("NO_DUP "),      PDMAUDIOHOSTDEV_F_NO_DUP  },
    360397    };
     
    398435        {
    399436            char szFlags[PDMAUDIOHOSTDEV_MAX_FLAGS_STRING_LEN];
    400             LogFunc(("Device '%s':\n", pDev->szName));
     437            LogFunc(("Device '%s':\n", pDev->pszName));
     438            LogFunc(("  ID              = %s\n",             pDev->pszId ? pDev->pszId : "<none>"));
    401439            LogFunc(("  Usage           = %s\n",             PDMAudioDirGetName(pDev->enmUsage)));
    402440            LogFunc(("  Flags           = %s\n",             PDMAudioHostDevFlagsToString(szFlags, pDev->fFlags)));
  • trunk/include/VBox/vmm/pdmaudioifs.h

    r89489 r89500  
    291291/** The device is present but not in an alive state (dead). */
    292292#define PDMAUDIOHOSTDEV_F_DEAD              RT_BIT_32(6)
     293/** Set if the PDMAUDIOHOSTDEV::pszName is allocated. */
     294#define PDMAUDIOHOSTDEV_F_NAME_ALLOC        RT_BIT_32(29)
    293295/** Set if the PDMAUDIOHOSTDEV::pszId is allocated. */
    294296#define PDMAUDIOHOSTDEV_F_ID_ALLOC          RT_BIT_32(30)
     
    342344    /** Maximum number of output audio channels the device supports. */
    343345    uint8_t             cMaxOutputChannels;
    344     uint8_t             abAlignment[ARCH_BITS == 32 ? 2 + 12 : 2];
     346    uint8_t             abAlignment[ARCH_BITS == 32 ? 2 + 8 : 2 + 8];
    345347    /** Backend specific device identifier, can be NULL, used to select device.
    346348     * This can either point into some non-public part of this structure or to a
     
    349351     * @sa PDMIHOSTAUDIO::pfnSetDevice */
    350352    char               *pszId;
    351     /** Friendly name of the device, if any. Could be truncated. */
    352     char                szName[64];
     353    /** The friendly device name. */
     354    char               *pszName;
    353355} PDMAUDIOHOSTDEV;
    354356AssertCompileSizeAlignment(PDMAUDIOHOSTDEV, 16);
     
    359361
    360362/** Magic value for PDMAUDIOHOSTDEV.  */
    361 #define PDMAUDIOHOSTDEV_MAGIC       PDM_VERSION_MAKE(0xa0d0, 2, 0)
     363#define PDMAUDIOHOSTDEV_MAGIC       PDM_VERSION_MAKE(0xa0d0, 3, 0)
    362364
    363365
     
    13871389
    13881390/** PDMIHOSTAUDIO interface ID. */
    1389 #define PDMIHOSTAUDIO_IID                           "147dedd7-cac1-469b-b545-335dbe90abf6"
     1391#define PDMIHOSTAUDIO_IID                           "2d57627f-6f47-4669-a2fa-93a5f1cb6e51"
    13901392
    13911393
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