VirtualBox

Changeset 59420 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jan 20, 2016 2:53:24 PM (9 years ago)
Author:
vboxsync
Message:

Audio/DrvAudio: Use a critical section for (most) driver callbacks.

Location:
trunk/src/VBox/Devices/Audio
Files:
2 edited

Legend:

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

    r59348 r59420  
    33 * Intermediate audio driver header.
    44 *
    5  * @remarks Intermediate audio driver having audio device as one of the sink and
    6  *          host backend as other.
     5 * @remarks Intermediate audio driver for connecting the audio device emulation
     6 *          with the host backend.
    77 */
    88
     
    388388    AssertPtrReturn(pHstStrmIn, VERR_INVALID_POINTER);
    389389
    390     int rc;
     390    int rc = RTCritSectEnter(&pHstStrmIn->CritSect);
     391    if (RT_FAILURE(rc))
     392        return rc;
    391393
    392394    switch (enmStreamCmd)
     
    475477    }
    476478
     479    int rc2 = RTCritSectLeave(&pHstStrmIn->CritSect);
     480    if (RT_SUCCESS(rc))
     481        rc = rc2;
     482
    477483    return rc;
    478484}
     
    483489    AssertPtrReturn(pHstStrmOut, VERR_INVALID_POINTER);
    484490
    485     int rc;
     491    int rc = RTCritSectEnter(&pHstStrmOut->CritSect);
     492    if (RT_FAILURE(rc))
     493        return rc;
    486494
    487495    switch (enmStreamCmd)
     
    575583    }
    576584
     585    int rc2 = RTCritSectLeave(&pHstStrmOut->CritSect);
     586    if (RT_SUCCESS(rc))
     587        rc = rc2;
     588
    577589    return rc;
    578590}
     
    595607            /* Remove from driver instance list. */
    596608            RTListNodeRemove(&pHstStrmOut->Node);
     609
     610            if (RTCritSectIsInitialized(&pHstStrmOut->CritSect))
     611            {
     612                int rc2 = RTCritSectDelete(&pHstStrmOut->CritSect);
     613                AssertRC(rc2);
     614            }
    597615
    598616            RTMemFree(pHstStrmOut);
     
    777795
    778796        rc = AudioMixBufInit(&pHstStrmOut->MixBuf, pszTemp, &pHstStrmOut->Props, cSamples);
     797        if (RT_SUCCESS(rc))
     798            rc = RTCritSectInit(&pHstStrmOut->CritSect);
     799
    779800        if (RT_SUCCESS(rc))
    780801        {
     
    10301051
    10311052        rc = AudioMixBufInit(&pHstStrmIn->MixBuf, pszTemp, &pHstStrmIn->Props, cSamples);
     1053        if (RT_SUCCESS(rc))
     1054            rc = RTCritSectInit(&pHstStrmIn->CritSect);
     1055
    10321056        if (RT_SUCCESS(rc))
    10331057        {
     
    10791103
    10801104    AssertPtrReturn(pGstStrmOut, VERR_INVALID_POINTER);
    1081     AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
    1082     AssertReturn(cbBuf, VERR_INVALID_PARAMETER);
     1105    AssertPtrReturn(pvBuf,       VERR_INVALID_POINTER);
     1106    AssertReturn(cbBuf,          VERR_INVALID_PARAMETER);
    10831107    /* pcbWritten is optional. */
    10841108
     1109    int rc = RTCritSectEnter(&pThis->CritSect);
     1110    if (RT_FAILURE(rc))
     1111        return rc;
     1112
    10851113    if (!pThis->pHostDrvAudio->pfnIsEnabled(pThis->pHostDrvAudio, PDMAUDIODIR_OUT))
     1114    {
     1115        rc = RTCritSectLeave(&pThis->CritSect);
     1116        AssertRC(rc);
     1117
    10861118        return VERR_NOT_AVAILABLE;
     1119    }
    10871120
    10881121    PPDMAUDIOHSTSTRMOUT pHstStrmOut = pGstStrmOut->pHstStrmOut;
     
    10971130        if (pcbWritten)
    10981131            *pcbWritten = 0;
    1099         return VINF_SUCCESS;
     1132
     1133        return RTCritSectLeave(&pThis->CritSect);
    11001134    }
    11011135
     
    11051139     */
    11061140    uint32_t cWritten;
    1107     int rc = AudioMixBufWriteAt(&pGstStrmOut->MixBuf, 0 /* Offset in samples */, pvBuf, cbBuf, &cWritten);
     1141    rc = AudioMixBufWriteAt(&pGstStrmOut->MixBuf, 0 /* Offset in samples */, pvBuf, cbBuf, &cWritten);
    11081142
    11091143    /*
     
    11341168                 pGstStrmOut->MixBuf.pszName, pHstStrmOut->MixBuf.pszName, pvBuf, cbBuf, cWritten,
    11351169                 AUDIOMIXBUF_S2B(&pGstStrmOut->MixBuf, cWritten), cMixed, rc));
     1170
     1171    int rc2 = RTCritSectLeave(&pThis->CritSect);
     1172    if (RT_SUCCESS(rc))
     1173        rc = rc2;
     1174
    11361175    return rc;
    11371176}
     
    11871226        {
    11881227            drvAudioHstInFreeRes(pHstStrmIn);
     1228
     1229            if (RTCritSectIsInitialized(&pHstStrmIn->CritSect))
     1230            {
     1231                int rc2 = RTCritSectDelete(&pHstStrmIn->CritSect);
     1232                AssertRC(rc2);
     1233            }
    11891234
    11901235            /* Remove from driver instance list. */
     
    12451290    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
    12461291
    1247     int rc = VINF_SUCCESS;
    1248     uint32_t cSamplesLive = 0;
     1292    int rc = RTCritSectEnter(&pThis->CritSect);
     1293    if (RT_FAILURE(rc))
     1294        return rc;
    12491295
    12501296    /*
    12511297     * Playback.
    12521298     */
    1253     uint32_t cbFreeOut = UINT32_MAX;
     1299    uint32_t cSamplesLive = 0;
     1300    uint32_t cbFreeOut    = UINT32_MAX;
    12541301
    12551302    PPDMAUDIOHSTSTRMOUT pHstStrmOut = NULL;
     
    13481395    }
    13491396
     1397    int rc2 = RTCritSectLeave(&pThis->CritSect);
     1398    if (RT_SUCCESS(rc))
     1399        rc = rc2;
     1400
    13501401    return rc;
    13511402}
     
    13581409    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
    13591410
    1360     int rc = VINF_SUCCESS;
    1361     uint32_t cSamplesPlayedMax = 0;
     1411    int rc = RTCritSectEnter(&pThis->CritSect);
     1412    if (RT_FAILURE(rc))
     1413        return rc;
    13621414
    13631415    /*
    13641416     * Process all enabled host output streams.
    13651417     */
    1366     PPDMAUDIOHSTSTRMOUT pHstStrmOut = NULL;
     1418    uint32_t            cSamplesPlayedMax = 0;
     1419    PPDMAUDIOHSTSTRMOUT pHstStrmOut       = NULL;
    13671420    while ((pHstStrmOut = drvAudioHstFindAnyEnabledOut(pThis, pHstStrmOut)))
    13681421    {
     
    14371490    }
    14381491
     1492    int rc2 = RTCritSectLeave(&pThis->CritSect);
     1493    if (RT_SUCCESS(rc))
     1494        rc = rc2;
     1495
    14391496    return rc;
    14401497}
     
    14841541
    14851542    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
    1486     int          rc = VINF_SUCCESS;
     1543
     1544    int rc = RTCritSectEnter(&pThis->CritSect);
     1545    if (RT_FAILURE(rc))
     1546        return rc;
    14871547
    14881548    for (size_t i = 0; i < cCallbacks; i++)
     
    15121572
    15131573    /** @todo Undo allocations on error. */
     1574
     1575    int rc2 = RTCritSectLeave(&pThis->CritSect);
     1576    if (RT_SUCCESS(rc))
     1577        rc = rc2;
    15141578
    15151579    return rc;
     
    16961760#endif
    16971761
    1698     int rc = VINF_SUCCESS;
     1762    int rc = RTCritSectInit(&pThis->CritSect);
    16991763
    17001764    /* Get the configuration data from the selected backend (if available). */
    17011765    AssertPtr(pThis->pHostDrvAudio);
    1702     if (RT_LIKELY(pThis->pHostDrvAudio->pfnGetConf))
     1766    if (   RT_SUCCESS(rc)
     1767        && RT_LIKELY(pThis->pHostDrvAudio->pfnGetConf))
    17031768        rc = pThis->pHostDrvAudio->pfnGetConf(pThis->pHostDrvAudio, &pThis->BackendCfg);
    17041769
     
    17351800
    17361801    AssertPtrReturn(pGstStrmIn, VERR_INVALID_POINTER);
    1737     AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
    1738     AssertReturn(cbBuf, VERR_INVALID_PARAMETER);
     1802    AssertPtrReturn(pvBuf,      VERR_INVALID_POINTER);
     1803    AssertReturn(cbBuf,         VERR_INVALID_PARAMETER);
    17391804    /* pcbWritten is optional. */
     1805
     1806    int rc = RTCritSectEnter(&pThis->CritSect);
     1807    if (RT_FAILURE(rc))
     1808        return rc;
    17401809
    17411810    if (!pThis->pHostDrvAudio->pfnIsEnabled(pThis->pHostDrvAudio, PDMAUDIODIR_IN))
     
    17431812        if (pcbRead)
    17441813            *pcbRead = 0;
    1745         return VINF_SUCCESS;
     1814
     1815        return RTCritSectLeave(&pThis->CritSect);
    17461816    }
    17471817
     
    17571827     */
    17581828    uint32_t cRead;
    1759     int rc = AudioMixBufReadCirc(&pGstStrmIn->MixBuf,
    1760                                  pvBuf, cbBuf, &cRead);
     1829    rc = AudioMixBufReadCirc(&pGstStrmIn->MixBuf, pvBuf, cbBuf, &cRead);
    17611830    if (RT_SUCCESS(rc))
    17621831    {
     
    17691838    LogFlowFunc(("cRead=%RU32 (%RU32 bytes), rc=%Rrc\n",
    17701839                 cRead, AUDIOMIXBUF_S2B(&pGstStrmIn->MixBuf, cRead), rc));
     1840
     1841    int rc2 = RTCritSectLeave(&pThis->CritSect);
     1842    if (RT_SUCCESS(rc))
     1843        rc = rc2;
     1844
    17711845    return rc;
    17721846}
     
    18871961                                          PPDMAUDIOGSTSTRMIN *ppGstStrmIn)
    18881962{
    1889     AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
     1963    AssertPtrReturn(pInterface,  VERR_INVALID_POINTER);
    18901964    AssertPtrReturn(ppGstStrmIn, VERR_INVALID_POINTER);
    1891     AssertPtrReturn(pszName, VERR_INVALID_POINTER);
    1892     AssertPtrReturn(pCfg, VERR_INVALID_POINTER);
     1965    AssertPtrReturn(pszName,     VERR_INVALID_POINTER);
     1966    AssertPtrReturn(pCfg,        VERR_INVALID_POINTER);
    18931967    AssertPtrReturn(ppGstStrmIn, VERR_INVALID_POINTER);
    18941968
    18951969    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
    18961970
     1971    int rc = RTCritSectEnter(&pThis->CritSect);
     1972    if (RT_FAILURE(rc))
     1973        return rc;
     1974
    18971975    LogFlowFunc(("pszName=%s, pCfg=%p\n", pszName, pCfg));
    18981976
     
    19001978    {
    19011979        LogFunc(("Input stream configuration is not valid, bailing out\n"));
    1902         return VERR_INVALID_PARAMETER;
     1980        rc = VERR_INVALID_PARAMETER;
    19031981    }
    19041982
    19051983    PPDMAUDIOGSTSTRMIN pGstStrmIn = *ppGstStrmIn;
    1906     if (   pGstStrmIn
     1984    if (   RT_SUCCESS(rc)
     1985        && pGstStrmIn
    19071986        && drvAudioPCMPropsAreEqual(&pGstStrmIn->Props, pCfg))
    19081987    {
    19091988        LogFunc(("[%s] Exists and matches required configuration, skipping creation\n",
    19101989                 pGstStrmIn->MixBuf.pszName));
    1911         return VWRN_ALREADY_EXISTS;
     1990        rc = VWRN_ALREADY_EXISTS;
     1991    }
     1992
     1993    if (rc != VINF_SUCCESS) /* Note: Can be VWRN_ALREADY_EXISTS, so don't use VINF_SUCCESS here. */
     1994    {
     1995        int rc2 = RTCritSectLeave(&pThis->CritSect);
     1996        AssertRC(rc2);
     1997
     1998        return rc;
    19121999    }
    19132000
     
    19192006    }
    19202007
    1921     int rc;
    1922 
    19232008    if (pGstStrmIn)
    19242009    {
     
    19322017        {
    19332018            RTMemFree(pGstStrmIn);
     2019
     2020            int rc2 = RTCritSectLeave(&pThis->CritSect);
     2021            AssertRC(rc2);
     2022
    19342023            return VERR_NO_MEMORY;
    19352024        }
     
    19452034        *ppGstStrmIn = pGstStrmIn;
    19462035
     2036    int rc2 = RTCritSectLeave(&pThis->CritSect);
     2037    if (RT_SUCCESS(rc))
     2038        rc = rc2;
     2039
    19472040    LogFlowFuncLeaveRC(rc);
    19482041    return rc;
     
    19522045                                           PPDMAUDIOSTREAMCFG pCfg, PPDMAUDIOGSTSTRMOUT *ppGstStrmOut)
    19532046{
    1954     AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
    1955     AssertPtrReturn(pszName, VERR_INVALID_POINTER);
    1956     AssertPtrReturn(pCfg, VERR_INVALID_POINTER);
     2047    AssertPtrReturn(pInterface,   VERR_INVALID_POINTER);
     2048    AssertPtrReturn(pszName,      VERR_INVALID_POINTER);
     2049    AssertPtrReturn(pCfg,         VERR_INVALID_POINTER);
    19572050    AssertPtrReturn(ppGstStrmOut, VERR_INVALID_POINTER);
    19582051
    19592052    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
    19602053
     2054    int rc = RTCritSectEnter(&pThis->CritSect);
     2055    if (RT_FAILURE(rc))
     2056        return rc;
     2057
    19612058    LogFlowFunc(("pszName=%s, pCfg=%p\n", pszName, pCfg));
    19622059
     
    19642061    {
    19652062        LogFunc(("Output stream configuration is not valid, bailing out\n"));
    1966         return VERR_INVALID_PARAMETER;
     2063        rc = VERR_INVALID_PARAMETER;
    19672064    }
    19682065
    19692066    PPDMAUDIOGSTSTRMOUT pGstStrmOut = *ppGstStrmOut;
    1970     if (   pGstStrmOut
     2067    if (   RT_SUCCESS(rc)
     2068        && pGstStrmOut
    19712069        && drvAudioPCMPropsAreEqual(&pGstStrmOut->Props, pCfg))
    19722070    {
    19732071        LogFunc(("[%s] Exists and matches required configuration, skipping creation\n",
    19742072                 pGstStrmOut->MixBuf.pszName));
    1975         return VWRN_ALREADY_EXISTS;
     2073
     2074        rc = VWRN_ALREADY_EXISTS;
     2075    }
     2076
     2077    if (rc != VINF_SUCCESS) /* Note: Can be VWRN_ALREADY_EXISTS, so don't use VINF_SUCCESS here. */
     2078    {
     2079        int rc2 = RTCritSectLeave(&pThis->CritSect);
     2080        AssertRC(rc2);
     2081
     2082        return rc;
    19762083    }
    19772084
     
    20032110    }
    20042111
    2005     int rc;
    20062112    if (pGstStrmOut)
    20072113    {
     
    20402146    }
    20412147
     2148    int rc2 = RTCritSectLeave(&pThis->CritSect);
     2149    if (RT_SUCCESS(rc))
     2150        rc = rc2;
     2151
    20422152    LogFlowFuncLeaveRC(rc);
    20432153    return rc;
     
    20462156static DECLCALLBACK(bool) drvAudioIsActiveIn(PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMIN pGstStrmIn)
    20472157{
    2048     return pGstStrmIn ? pGstStrmIn->State.fActive : false;
     2158    AssertPtrReturn(pInterface, false);
     2159    /* pGstStrmIn is optional. */
     2160
     2161    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
     2162
     2163    int rc2 = RTCritSectEnter(&pThis->CritSect);
     2164    AssertRC(rc2);
     2165
     2166    bool fRet = pGstStrmIn ? pGstStrmIn->State.fActive : false;
     2167
     2168    rc2 = RTCritSectLeave(&pThis->CritSect);
     2169    AssertRC(rc2);
     2170
     2171    return fRet;
    20492172}
    20502173
    20512174static DECLCALLBACK(bool) drvAudioIsActiveOut(PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut)
    20522175{
    2053     return pGstStrmOut ? pGstStrmOut->State.fActive : false;
     2176    AssertPtrReturn(pInterface,  false);
     2177    /* pGstStrmOut is optional. */
     2178
     2179    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
     2180
     2181    int rc2 = RTCritSectEnter(&pThis->CritSect);
     2182    AssertRC(rc2);
     2183
     2184    bool fRet = pGstStrmOut ? pGstStrmOut->State.fActive : false;
     2185
     2186    rc2 = RTCritSectLeave(&pThis->CritSect);
     2187    AssertRC(rc2);
     2188
     2189    return fRet;
    20542190}
    20552191
    20562192static DECLCALLBACK(void) drvAudioDestroyIn(PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMIN pGstStrmIn)
    20572193{
     2194    AssertPtrReturnVoid(pInterface);
     2195    /* pGstStrmIn is optional. */
     2196
    20582197    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
     2198
     2199    int rc2 = RTCritSectEnter(&pThis->CritSect);
     2200    AssertRC(rc2);
     2201
    20592202    if (pGstStrmIn)
    20602203        drvAudioDestroyGstIn(pThis, pGstStrmIn);
     2204
     2205    rc2 = RTCritSectLeave(&pThis->CritSect);
     2206    AssertRC(rc2);
    20612207}
    20622208
    20632209static DECLCALLBACK(void) drvAudioDestroyOut(PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut)
    20642210{
     2211    AssertPtrReturnVoid(pInterface);
     2212    /* pGstStrmOut is optional. */
     2213
    20652214    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
     2215
     2216    int rc2 = RTCritSectEnter(&pThis->CritSect);
     2217    AssertRC(rc2);
     2218
    20662219    if (pGstStrmOut)
    20672220        drvAudioDestroyGstOut(pThis, pGstStrmOut);
     2221
     2222    rc2 = RTCritSectLeave(&pThis->CritSect);
     2223    AssertRC(rc2);
    20682224}
    20692225
     
    22062362
    22072363/**
     2364 * Destructs an audio driver instance.
     2365 *
     2366 * @copydoc FNPDMDRVDESTRUCT
     2367 */
     2368static DECLCALLBACK(void) drvAudioDestruct(PPDMDRVINS pDrvIns)
     2369{
     2370    LogFlowFuncEnter();
     2371
     2372    PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);
     2373    PDRVAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVAUDIO);
     2374
     2375    if (RTCritSectIsInitialized(&pThis->CritSect))
     2376    {
     2377        int rc2 = RTCritSectDelete(&pThis->CritSect);
     2378        AssertRC(rc2);
     2379    }
     2380}
     2381
     2382/**
    22082383 * Suspend notification.
    22092384 *
     
    22422417    /* fFlags */
    22432418    PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
    2244     /* fClass. */
     2419    /* fClass */
    22452420    PDM_DRVREG_CLASS_AUDIO,
    22462421    /* cMaxInstances */
     
    22512426    drvAudioConstruct,
    22522427    /* pfnDestruct */
    2253     NULL,
     2428    drvAudioDestruct,
    22542429    /* pfnRelocate */
    22552430    NULL,
  • trunk/src/VBox/Devices/Audio/DrvAudio.h

    r58744 r59420  
    55
    66/*
    7  * Copyright (C) 2006-2015 Oracle Corporation
     7 * Copyright (C) 2006-2016 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    4747
    4848#include <iprt/circbuf.h>
     49#include <iprt/critsect.h>
    4950
    5051#include <VBox/vmm/pdmdev.h>
     
    7980    /** Input/output processing thread. */
    8081    RTTHREAD                hThread;
    81     /** Event for input/ouput processing. */
    82     RTSEMEVENT              hEvent;
     82    /** Critical section for serializing access. */
     83    RTCRITSECT              CritSect;
    8384    /** Shutdown indicator. */
    8485    bool                    fTerminate;
     
    8990    /** Pointer to audio driver below us. */
    9091    PPDMIHOSTAUDIO          pHostDrvAudio;
     92    /** List of host input streams. */
    9193    RTLISTANCHOR            lstHstStrmIn;
     94    /** List of host output streams. */
    9295    RTLISTANCHOR            lstHstStrmOut;
    9396    /** Max. number of free input streams. */
     
    9598    /** Max. number of free output streams. */
    9699    uint8_t                 cFreeOutputStreams;
    97     /** Audio configuration settings retrieved
    98      *  from the backend. */
     100    /** Audio configuration settings retrieved from the backend. */
    99101    PDMAUDIOBACKENDCFG      BackendCfg;
    100102#ifdef VBOX_WITH_AUDIO_CALLBACKS
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