VirtualBox

Changeset 88467 in vbox


Ignore:
Timestamp:
Apr 12, 2021 12:06:58 PM (4 years ago)
Author:
vboxsync
Message:

DrvHostAudioPulseAudio: Some more cleaning up. bugref:9890

File:
1 edited

Legend:

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

    r88466 r88467  
    3636
    3737#include <pulse/pulseaudio.h>
     38#ifndef PA_STREAM_NOFLAGS
     39# define PA_STREAM_NOFLAGS  (pa_context_flags_t)0x0000U /* since 0.9.19 */
     40#endif
     41#ifndef PA_CONTEXT_NOFLAGS
     42# define PA_CONTEXT_NOFLAGS (pa_context_flags_t)0x0000U /* since 0.9.19 */
     43#endif
    3844
    3945#include "VBoxDD.h"
     
    4349*   Defines                                                                                                                      *
    4450*********************************************************************************************************************************/
    45 #define VBOX_PULSEAUDIO_MAX_LOG_REL_ERRORS 32 /** @todo Make this configurable thru driver options. */
    46 
    47 #ifndef PA_STREAM_NOFLAGS
    48 # define PA_STREAM_NOFLAGS (pa_context_flags_t)0x0000U /* since 0.9.19 */
    49 #endif
    50 
    51 #ifndef PA_CONTEXT_NOFLAGS
    52 # define PA_CONTEXT_NOFLAGS (pa_context_flags_t)0x0000U /* since 0.9.19 */
    53 #endif
     51/** Max number of errors reported by drvHostAudioPaError per instance.
     52 * @todo Make this configurable thru driver config. */
     53#define VBOX_PULSEAUDIO_MAX_LOG_REL_ERRORS  64
    5454
    5555/** No flags specified. */
     
    5757/** (Release) log found devices. */
    5858#define PULSEAUDIOENUMCBFLAGS_LOG           RT_BIT(0)
    59 
    60 /** Makes DRVHOSTPULSEAUDIO out of PDMIHOSTAUDIO. */
    61 #define PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface) \
    62     ( (PDRVHOSTPULSEAUDIO)((uintptr_t)pInterface - RT_UOFFSETOF(DRVHOSTPULSEAUDIO, IHostAudio)) )
    6359
    6460
     
    197193    AssertPtrReturn(szMsg, VERR_INVALID_POINTER);
    198194
    199     if (pThis->cLogErrors++ < VBOX_PULSEAUDIO_MAX_LOG_REL_ERRORS)
    200     {
     195    if (   pThis->cLogErrors < VBOX_PULSEAUDIO_MAX_LOG_REL_ERRORS
     196        && LogRelIs2Enabled())
     197    {
     198        pThis->cLogErrors++;
    201199        int rc2 = pa_context_errno(pThis->pContext);
    202200        LogRel2(("PulseAudio: %s: %s\n", szMsg, pa_strerror(rc2)));
     
    523521static DECLCALLBACK(int) drvHostAudioPaHA_GetConfig(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDCFG pBackendCfg)
    524522{
    525     AssertPtrReturn(pInterface,  VERR_INVALID_POINTER);
     523    PDRVHOSTPULSEAUDIO pThis = RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio);
    526524    AssertPtrReturn(pBackendCfg, VERR_INVALID_POINTER);
    527     PDRVHOSTPULSEAUDIO pThis = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
    528525
    529526    return drvHostAudioPaEnumerate(pThis, pBackendCfg, PULSEAUDIOENUMCBFLAGS_LOG /* fEnum */);
     
    937934                                                       PPDMAUDIOSTREAMCFG pCfgReq, PPDMAUDIOSTREAMCFG pCfgAcq)
    938935{
    939     AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
    940     AssertPtrReturn(pStream,    VERR_INVALID_POINTER);
    941     AssertPtrReturn(pCfgReq,    VERR_INVALID_POINTER);
    942     AssertPtrReturn(pCfgAcq,    VERR_INVALID_POINTER);
    943 
    944     PDRVHOSTPULSEAUDIO pThis     = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
     936    PDRVHOSTPULSEAUDIO pThis     = RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio);
    945937    PPULSEAUDIOSTREAM  pStreamPA = (PPULSEAUDIOSTREAM)pStream;
     938    AssertPtrReturn(pStreamPA, VERR_INVALID_POINTER);
     939    AssertPtrReturn(pCfgReq, VERR_INVALID_POINTER);
     940    AssertPtrReturn(pCfgAcq, VERR_INVALID_POINTER);
     941
    946942
    947943    int rc;
     
    969965static DECLCALLBACK(int) drvHostAudioPaHA_StreamDestroy(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    970966{
    971     AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
    972     AssertPtrReturn(pStream,    VERR_INVALID_POINTER);
    973 
    974     PDRVHOSTPULSEAUDIO pThis     = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
     967    PDRVHOSTPULSEAUDIO pThis     = RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio);
    975968    PPULSEAUDIOSTREAM  pStreamPA = (PPULSEAUDIOSTREAM)pStream;
     969    AssertPtrReturn(pStreamPA, VERR_INVALID_POINTER);
    976970
    977971    if (pStreamPA->pStream)
     
    11291123                                                        PPDMAUDIOBACKENDSTREAM pStream, PDMAUDIOSTREAMCMD enmStreamCmd)
    11301124{
    1131     AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
    1132     AssertPtrReturn(pStream,    VERR_INVALID_POINTER);
    1133 
    1134     PDRVHOSTPULSEAUDIO pThis     = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
     1125    PDRVHOSTPULSEAUDIO pThis     = RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio);
    11351126    PPULSEAUDIOSTREAM  pStreamPA = (PPULSEAUDIOSTREAM)pStream;
     1127    AssertPtrReturn(pStreamPA, VERR_INVALID_POINTER);
    11361128
    11371129    if (!pStreamPA->pCfg) /* Not (yet) configured? Skip. */
     
    11911183static DECLCALLBACK(uint32_t) drvHostAudioPaHA_StreamGetReadable(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    11921184{
    1193     PDRVHOSTPULSEAUDIO pThis     = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
    1194     PPULSEAUDIOSTREAM  pStreamPA = (PPULSEAUDIOSTREAM)pStream;
    1195 
    1196     return drvHostAudioPaStreamGetAvailable(pThis, pStreamPA);
     1185    return drvHostAudioPaStreamGetAvailable(RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio),
     1186                                            (PPULSEAUDIOSTREAM)pStream);
    11971187}
    11981188
     
    12031193static DECLCALLBACK(uint32_t) drvHostAudioPaHA_StreamGetWritable(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    12041194{
    1205     PDRVHOSTPULSEAUDIO pThis     = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
    1206     PPULSEAUDIOSTREAM  pStreamPA = (PPULSEAUDIOSTREAM)pStream;
    1207 
    1208     return drvHostAudioPaStreamGetAvailable(pThis, pStreamPA);
     1195    return drvHostAudioPaStreamGetAvailable(RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio),
     1196                                            (PPULSEAUDIOSTREAM)pStream);
    12091197}
    12101198
     
    12151203static DECLCALLBACK(PDMAUDIOSTREAMSTS) drvHostAudioPaHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    12161204{
    1217     AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
     1205    PDRVHOSTPULSEAUDIO pThis = RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio);
    12181206    RT_NOREF(pStream);
    12191207
    1220     PDRVHOSTPULSEAUDIO pThis = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
    1221 
     1208    /* Check PulseAudio's general status. */
    12221209    PDMAUDIOSTREAMSTS fStrmSts = PDMAUDIOSTREAMSTS_FLAGS_NONE;
    1223 
    1224     /* Check PulseAudio's general status. */
    12251210    if (   pThis->pContext
    12261211        && PA_CONTEXT_IS_GOOD(pa_context_get_state(pThis->pContext)))
     
    12351220 */
    12361221static DECLCALLBACK(int) drvHostAudioPaHA_StreamPlay(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream,
    1237                                                         const void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten)
    1238 {
    1239     PDRVHOSTPULSEAUDIO pThis = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
    1240     AssertPtr(pThis);
    1241     PPULSEAUDIOSTREAM pPAStream = (PPULSEAUDIOSTREAM)pStream;
    1242     AssertPtrReturn(pPAStream, VERR_INVALID_POINTER);
     1222                                                     const void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten)
     1223{
     1224    PDRVHOSTPULSEAUDIO pThis     = RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio);
     1225    PPULSEAUDIOSTREAM  pStreamPA = (PPULSEAUDIOSTREAM)pStream;
     1226    AssertPtrReturn(pStreamPA, VERR_INVALID_POINTER);
    12431227    AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
    12441228    AssertReturn(cbBuf, VERR_INVALID_PARAMETER);
     
    12491233#ifdef LOG_ENABLED
    12501234    const pa_usec_t tsNowUs         = pa_rtclock_now();
    1251     const pa_usec_t tsDeltaPlayedUs = tsNowUs - pPAStream->tsLastReadWrittenUs;
    1252     pPAStream->tsLastReadWrittenUs  = tsNowUs;
     1235    const pa_usec_t tsDeltaPlayedUs = tsNowUs - pStreamPA->tsLastReadWrittenUs;
     1236    pStreamPA->tsLastReadWrittenUs  = tsNowUs;
    12531237    Log3Func(("tsDeltaPlayedMs=%RU64\n", tsDeltaPlayedUs / RT_US_1MS));
    12541238#endif
    12551239
    12561240    int          rc;
    1257     size_t const cbWriteable = pa_stream_writable_size(pPAStream->pStream);
     1241    size_t const cbWriteable = pa_stream_writable_size(pStreamPA->pStream);
    12581242    if (cbWriteable != (size_t)-1)
    12591243    {
    12601244        size_t cbLeft = RT_MIN(cbWriteable, cbBuf);
    12611245        Assert(cbLeft > 0 /* At this point we better have *something* to write (DrvAudio checked before calling). */);
    1262         if (pa_stream_write(pPAStream->pStream, pvBuf, cbLeft, NULL /*pfnFree*/, 0 /*offset*/, PA_SEEK_RELATIVE) >= 0)
     1246        if (pa_stream_write(pStreamPA->pStream, pvBuf, cbLeft, NULL /*pfnFree*/, 0 /*offset*/, PA_SEEK_RELATIVE) >= 0)
    12631247        {
    12641248            *pcbWritten = (uint32_t)cbLeft;
     
    12661250        }
    12671251        else
    1268             rc = drvHostAudioPaError(pPAStream->pDrv, "Failed to write to output stream");
     1252            rc = drvHostAudioPaError(pStreamPA->pDrv, "Failed to write to output stream");
    12691253    }
    12701254    else
    1271         rc = drvHostAudioPaError(pPAStream->pDrv, "Failed to determine output data size");
     1255        rc = drvHostAudioPaError(pStreamPA->pDrv, "Failed to determine output data size");
    12721256
    12731257    pa_threaded_mainloop_unlock(pThis->pMainLoop);
     
    12801264 */
    12811265static DECLCALLBACK(int) drvHostAudioPaHA_StreamCapture(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream,
    1282                                                            void *pvBuf, uint32_t uBufSize, uint32_t *puRead)
    1283 {
    1284     AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
    1285     AssertPtrReturn(pStream,    VERR_INVALID_POINTER);
    1286     AssertPtrReturn(pvBuf,      VERR_INVALID_POINTER);
    1287     AssertReturn(uBufSize,      VERR_INVALID_PARAMETER);
    1288     /* pcbRead is optional. */
    1289 
    1290     PDRVHOSTPULSEAUDIO pThis     = PDMIHOSTAUDIO_2_DRVHOSTPULSEAUDIO(pInterface);
     1266                                                        void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead)
     1267{
     1268    PDRVHOSTPULSEAUDIO pThis     = RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio);
    12911269    PPULSEAUDIOSTREAM  pStreamPA = (PPULSEAUDIOSTREAM)pStream;
     1270    AssertPtrReturn(pStreamPA, VERR_INVALID_POINTER);
     1271    AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
     1272    AssertReturn(cbBuf, VERR_INVALID_PARAMETER);
     1273    AssertPtrReturn(pcbRead, VERR_INVALID_POINTER);
    12921274
    12931275    /* We should only call pa_stream_readable_size() once and trust the first value. */
     
    13101292    if (!cbAvail) /* No data? Bail out. */
    13111293    {
    1312         if (puRead)
    1313             *puRead = 0;
     1294        *pcbRead = 0;
    13141295        return VINF_SUCCESS;
    13151296    }
     
    13171298    int rc = VINF_SUCCESS;
    13181299
    1319     size_t cbToRead = RT_MIN(cbAvail, uBufSize);
     1300    size_t cbToRead = RT_MIN(cbAvail, cbBuf);
    13201301
    13211302    Log3Func(("cbToRead=%zu, cbAvail=%zu, offPeekBuf=%zu, cbPeekBuf=%zu\n",
     
    13841365
    13851366    if (RT_SUCCESS(rc))
    1386     {
    1387         if (puRead)
    1388             *puRead = cbReadTotal;
    1389     }
    1390 
     1367        *pcbRead = cbReadTotal;
    13911368    return rc;
    13921369}
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