VirtualBox

Changeset 88887 in vbox for trunk


Ignore:
Timestamp:
May 5, 2021 11:38:58 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
144222
Message:

Audio: Changed PDMIHOSTAUDIO::pfnStreamGetStatus into pfnStreamGetState and defined a simpler state enum (PDMHOSTAUDIOSTREAMSTATE) that fits what DrvAudio needs and the backends actually want to tell us. Fixes one VRDE issue. bugref:9890

Location:
trunk
Files:
15 edited

Legend:

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

    r88884 r88887  
    13081308#define PDMAUDIOBACKENDSTREAM_MAGIC PDM_VERSION_MAKE(0xa0d4, 1, 0)
    13091309
     1310/**
     1311 * Host audio (backend) stream state returned by PDMIHOSTAUDIO::pfnStreamGetState.
     1312 */
     1313typedef enum PDMHOSTAUDIOSTREAMSTATE
     1314{
     1315    /** Invalid zero value, as per usual.   */
     1316    PDMHOSTAUDIOSTREAMSTATE_INVALID = 0,
     1317    /** The stream is being initialized.
     1318     * This should also be used when switching to a new device and the stream
     1319     * stops to work with the old device while the new one being configured.  */
     1320    PDMHOSTAUDIOSTREAMSTATE_INITIALIZING,
     1321    /** The stream does not work (async init failed, audio subsystem gone
     1322     *  fishing, or similar). */
     1323    PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING,
     1324    /** Backend is working okay. */
     1325    PDMHOSTAUDIOSTREAMSTATE_OKAY,
     1326    /** Backend is working but doesn't want any commands or data reads/writes. */
     1327    PDMHOSTAUDIOSTREAMSTATE_INACTIVE,
     1328    /** End of valid values. */
     1329    PDMHOSTAUDIOSTREAMSTATE_END,
     1330    /** Blow the type up to 32 bits. */
     1331    PDMHOSTAUDIOSTREAMSTATE_32BIT_HACK = 0x7fffffff
     1332} PDMHOSTAUDIOSTREAMSTATE;
     1333
    13101334
    13111335/** Pointer to a host audio interface. */
     
    15001524
    15011525    /**
    1502      * Returns the current status of the given backend stream.
    1503      *
    1504      * @returns PDMAUDIOSTREAM_STS_XXX
     1526     * Returns the current state of the given backend stream.
     1527     *
     1528     * @returns PDMHOSTAUDIOSTREAMSTATE value.
     1529     * @retval  PDMHOSTAUDIOSTREAMSTATE_INVALID if invalid stream.
    15051530     * @param   pInterface          Pointer to the interface structure containing the called function pointer.
    15061531     * @param   pStream             Pointer to audio stream.
    15071532     */
    1508     DECLR3CALLBACKMEMBER(uint32_t, pfnStreamGetStatus, (PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream));
     1533    DECLR3CALLBACKMEMBER(PDMHOSTAUDIOSTREAMSTATE, pfnStreamGetState, (PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream));
    15091534
    15101535    /**
     
    15331558    DECLR3CALLBACKMEMBER(int, pfnStreamCapture, (PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream,
    15341559                                                 void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead));
    1535 
    15361560} PDMIHOSTAUDIO;
    15371561
    15381562/** PDMIHOSTAUDIO interface ID. */
    1539 #define PDMIHOSTAUDIO_IID                           "b320d6ab-6cbc-46a8-8011-57e7f7eb0e25"
     1563#define PDMIHOSTAUDIO_IID                           "53949a0a-ca2d-4d25-869f-2a8357991293"
    15401564
    15411565
  • trunk/include/VBox/vmm/pdmaudioinline.h

    r88884 r88887  
    11071107
    11081108/**
     1109 * Converts a audio stream state enum value to a string.
     1110 *
     1111 * @returns Pointer to read-only audio stream state string on success,
     1112 *          "illegal" if invalid command value.
     1113 * @param   enmStreamState  The state to convert.
     1114 */
     1115DECLINLINE(const char *) PDMAudioStreamStateGetName(PDMAUDIOSTREAMSTATE enmStreamState)
     1116{
     1117    switch (enmStreamState)
     1118    {
     1119        case PDMAUDIOSTREAMSTATE_INVALID:           return "invalid";
     1120        case PDMAUDIOSTREAMSTATE_NOT_WORKING:       return "not-working";
     1121        case PDMAUDIOSTREAMSTATE_NEED_REINIT:       return "need-reinit";
     1122        case PDMAUDIOSTREAMSTATE_INACTIVE:          return "inactive";
     1123        case PDMAUDIOSTREAMSTATE_ENABLED:           return "enabled";
     1124        case PDMAUDIOSTREAMSTATE_ENABLED_READABLE:  return "enabled-readable";
     1125        case PDMAUDIOSTREAMSTATE_ENABLED_WRITABLE:  return "enabled-writable";
     1126        /* no default: */
     1127        case PDMAUDIOSTREAMSTATE_END:
     1128        case PDMAUDIOSTREAMSTATE_32BIT_HACK:
     1129            break;
     1130    }
     1131    AssertMsgFailedReturn(("Invalid audio stream state: %d\n", enmStreamState), "illegal");
     1132}
     1133
     1134/**
     1135 * Converts a host audio (backend) stream state enum value to a string.
     1136 *
     1137 * @returns Pointer to read-only host audio stream state string on success,
     1138 *          "illegal" if invalid command value.
     1139 * @param   enmHostAudioStreamState The state to convert.
     1140 */
     1141DECLINLINE(const char *) PDMHostAudioStreamStateGetName(PDMHOSTAUDIOSTREAMSTATE enmHostAudioStreamState)
     1142{
     1143    switch (enmHostAudioStreamState)
     1144    {
     1145        case PDMHOSTAUDIOSTREAMSTATE_INVALID:       return "invalid";
     1146        case PDMHOSTAUDIOSTREAMSTATE_INITIALIZING:  return "initializing";
     1147        case PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING:   return "not-working";
     1148        case PDMHOSTAUDIOSTREAMSTATE_OKAY:          return "okay";
     1149        case PDMHOSTAUDIOSTREAMSTATE_INACTIVE:      return "inactive";
     1150        /* no default: */
     1151        case PDMHOSTAUDIOSTREAMSTATE_END:
     1152        case PDMHOSTAUDIOSTREAMSTATE_32BIT_HACK:
     1153            break;
     1154    }
     1155    AssertMsgFailedReturn(("Invalid host audio stream state: %d\n", enmHostAudioStreamState), "illegal");
     1156}
     1157
     1158/**
    11091159 * Checks if the stream status is one that can be read from.
    11101160 *
     
    11211171                       | PDMAUDIOSTREAM_STS_PAUSED
    11221172                       | PDMAUDIOSTREAM_STS_NEED_REINIT))
    1123         == (  PDMAUDIOSTREAM_STS_INITIALIZED
    1124             | PDMAUDIOSTREAM_STS_ENABLED);
    1125 }
    1126 
    1127 /**
    1128  * Checks if the stream status is one that can be read from.
    1129  *
    1130  * @returns @c true if ready to be read from, @c false if not.
    1131  * @param   fStatus     Stream status to evaluate, PDMAUDIOSTREAM_STS_XXX.
    1132  * @note    Only for backend statuses.
    1133  */
    1134 DECLINLINE(bool) PDMAudioStrmStatusBackendCanRead(uint32_t fStatus)
    1135 {
    1136     PDMAUDIOSTREAM_STS_ASSERT_VALID_BACKEND(fStatus);
    1137     AssertReturn(!(fStatus & ~PDMAUDIOSTREAM_STS_VALID_MASK_BACKEND), false);
    1138     return (fStatus & (  PDMAUDIOSTREAM_STS_INITIALIZED
    1139                        | PDMAUDIOSTREAM_STS_ENABLED
    1140                        | PDMAUDIOSTREAM_STS_PAUSED
    1141                        | PDMAUDIOSTREAM_STS_NEED_REINIT ))
    11421173        == (  PDMAUDIOSTREAM_STS_INITIALIZED
    11431174            | PDMAUDIOSTREAM_STS_ENABLED);
     
    11651196
    11661197/**
    1167  * Checks if the stream status is one that can be written to, backend edition.
    1168  *
    1169  * @returns @c true if ready to be written to, @c false if not.
    1170  * @param   fStatus     Stream status to evaluate, PDMAUDIOSTREAM_STS_XXX.
    1171  * @note    Only for backend statuses.
    1172  */
    1173 DECLINLINE(bool) PDMAudioStrmStatusBackendCanWrite(uint32_t fStatus)
    1174 {
    1175     PDMAUDIOSTREAM_STS_ASSERT_VALID_BACKEND(fStatus);
    1176     AssertReturn(!(fStatus & ~PDMAUDIOSTREAM_STS_VALID_MASK_BACKEND), false);
    1177     return (fStatus & (  PDMAUDIOSTREAM_STS_INITIALIZED
    1178                        | PDMAUDIOSTREAM_STS_ENABLED
    1179                        | PDMAUDIOSTREAM_STS_PAUSED
    1180                        | PDMAUDIOSTREAM_STS_PENDING_DISABLE))
    1181         == (  PDMAUDIOSTREAM_STS_INITIALIZED
    1182             | PDMAUDIOSTREAM_STS_ENABLED);
    1183 }
    1184 
    1185 /**
    11861198 * Checks if the stream status is a ready-to-operate one.
    11871199 *
  • trunk/src/VBox/Devices/Audio/AudioMixer.cpp

    r88884 r88887  
    744744    }
    745745
     746/** @todo r=bird: There almost serious issue here.  One stupid/buggy audio
     747 *        driver chain will mess up the whole thing.  Either we or DrvAudio
     748 *        need to take note of this and somehow gloss over it...  DevHDA with a
     749 *        linux guest completely freezes up the audio in the guest if we fail
     750 *        here. (Buggy VRDE code.) */
    746751    PAUDMIXSTREAM pStream;
    747752    if (   pSink->enmDir == AUDMIXSINKDIR_INPUT
     
    21122117            int rc = pConn->pfnStreamReInit(pConn, pStream);
    21132118            enmState = pConn->pfnStreamGetState(pConn, pStream);
    2114             LogFunc(("[%s] re-init returns %Rrc and %d.\n", pMixStream->pszName, rc, enmState));
     2119            LogFunc(("[%s] re-init returns %Rrc and %s.\n", pMixStream->pszName, rc, PDMAudioStreamStateGetName(enmState)));
    21152120
    21162121            PAUDMIXSINK const pSink = pMixStream->pSink;
  • trunk/src/VBox/Devices/Audio/DrvAudio.cpp

    r88884 r88887  
    131131    uint32_t                cTriesReInit;
    132132
    133     /** The backend status at the last play or capture call.
    134      * This is used to detect state changes.  */
    135     uint32_t                fLastBackendStatus;
     133    /** The backend state at the last play or capture call.
     134     * This is used to detect state changes (for what that is worth).  */
     135    PDMHOSTAUDIOSTREAMSTATE enmLastBackendState;
    136136
    137137    /** The pfnStreamInitAsync request handle. */
     
    436436 * Wrapper around PDMIHOSTAUDIO::pfnStreamGetStatus and checks the result.
    437437 *
    438  * @returns PDMAUDIOSTREAM_STS_XXX
     438 * @returns A PDMHOSTAUDIOSTREAMSTATE value.
    439439 * @param   pThis       Pointer to the DrvAudio instance data.
    440440 * @param   pStreamEx   The stream to get the backend status for.
    441441 */
    442 DECLINLINE(uint32_t) drvAudioStreamGetBackendStatus(PDRVAUDIO pThis, PDRVAUDIOSTREAM pStreamEx)
    443 {
    444     uint32_t fBackendStatus = pThis->pHostDrvAudio
    445                             ? pThis->pHostDrvAudio->pfnStreamGetStatus(pThis->pHostDrvAudio, pStreamEx->pBackend)
    446                             : 0;
    447     PDMAUDIOSTREAM_STS_ASSERT_VALID_BACKEND(fBackendStatus);
    448     return fBackendStatus;
     442DECLINLINE(PDMHOSTAUDIOSTREAMSTATE) drvAudioStreamGetBackendState(PDRVAUDIO pThis, PDRVAUDIOSTREAM pStreamEx)
     443{
     444    if (pThis->pHostDrvAudio)
     445    {
     446        PDMHOSTAUDIOSTREAMSTATE enmState = pThis->pHostDrvAudio->pfnStreamGetState(pThis->pHostDrvAudio, pStreamEx->pBackend);
     447        Assert(enmState > PDMHOSTAUDIOSTREAMSTATE_INVALID && enmState < PDMHOSTAUDIOSTREAMSTATE_END);
     448        return enmState;
     449    }
     450    return PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING;
    449451}
    450452
     
    598600                        if (!(fStatus & PDMAUDIOSTREAM_STS_PENDING_DISABLE))
    599601                        {
     602                            /** @todo r=bird: We need to redo pre-buffering OR switch to
     603                             *        DRVAUDIOPLAYSTATE_PREBUF_SWITCHING playback mode when disabling
     604                             *        output streams.  The former is preferred if associated with
     605                             *        reporting the stream as INACTIVE. */
    600606                            rc2 = drvAudioStreamControlInternalBackend(pThis, pStreamEx, PDMAUDIOSTREAMCMD_ENABLE);
    601607                            pszOperation = "enable";
     
    10781084
    10791085        /*
    1080          * Tweak the last backend status to asserting in
    1081          * drvAudioStreamPlayProcessBackendStateChange().
     1086         * Update the last backend state.
    10821087         */
    1083         pStreamEx->fLastBackendStatus |=   drvAudioStreamGetBackendStatus(pThis, pStreamEx)
    1084                                          & PDMAUDIOSTREAM_STS_INITIALIZED;
     1088        pStreamEx->enmLastBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
    10851089    }
    10861090    /*
     
    11631167    if (RT_SUCCESS(rc))
    11641168    {
     1169        pStreamEx->enmLastBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
     1170
    11651171        AssertLogRelReturn(pStreamEx->pBackend->uMagic  == PDMAUDIOBACKENDSTREAM_MAGIC, VERR_INTERNAL_ERROR_3);
    11661172        AssertLogRelReturn(pStreamEx->pBackend->pStream == &pStreamEx->Core, VERR_INTERNAL_ERROR_3);
     
    11701176           several possible early return paths before it). */
    11711177        pStreamEx->fStatus |= PDMAUDIOSTREAM_STS_INITIALIZED;
    1172 
    1173         pStreamEx->fLastBackendStatus = drvAudioStreamGetBackendStatus(pThis, pStreamEx);
    1174         PDMAUDIOSTREAM_STS_ASSERT_VALID(pStreamEx->fStatus);
    11751178    }
    11761179    else
     
    11891192    AssertStmt(rc != VINF_AUDIO_STREAM_ASYNC_INIT_NEEDED || pThis->pHostDrvAudio->pfnStreamInitAsync != NULL,
    11901193               pStreamEx->fNeedAsyncInit = false);
    1191     Assert(rc != VINF_AUDIO_STREAM_ASYNC_INIT_NEEDED || !(pStreamEx->fLastBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED));
     1194    AssertMsg(   rc != VINF_AUDIO_STREAM_ASYNC_INIT_NEEDED
     1195              || pStreamEx->enmLastBackendState == PDMHOSTAUDIOSTREAMSTATE_INITIALIZING,
     1196             ("rc=%Rrc %s\n", rc, PDMHostAudioStreamStateGetName(pStreamEx->enmLastBackendState)));
    11921197
    11931198    /* Validate acquired configuration. */
     
    18721877        if (pStreamEx->cRefs > 0 && pStreamEx->cRefs < UINT32_MAX / 4)
    18731878        {
    1874             char szStatus[DRVAUDIO_STATUS_STR_MAX], szBackendStatus[DRVAUDIO_STATUS_STR_MAX];
     1879            char szStatus[DRVAUDIO_STATUS_STR_MAX];
    18751880            LogRel2(("Audio: Destroying stream '%s': cRefs=%u; status: %s; backend: %s; hReqInitAsync=%p\n",
    18761881                     pStreamEx->Core.szName, pStreamEx->cRefs, drvAudioStreamStatusToStr(szStatus, pStreamEx->fStatus),
    1877                      drvAudioStreamStatusToStr(szBackendStatus, drvAudioStreamGetBackendStatus(pThis, pStreamEx)),
     1882                     PDMHostAudioStreamStateGetName(drvAudioStreamGetBackendState(pThis, pStreamEx)),
    18781883                     pStreamEx->hReqInitAsync));
    18791884
     
    21982203     *         finish initializing the stream, we'll update it about the stream state.
    21992204     */
    2200     int             rc             = VINF_SUCCESS;
    2201     uint32_t const  fBackendStatus = drvAudioStreamGetBackendStatus(pThis, pStreamEx); /* (checks pThis->pHostDrvAudio too) */
    2202     bool const      fDirEnabled    = pStreamEx->Core.enmDir == PDMAUDIODIR_IN ? pThis->In.fEnabled : pThis->Out.fEnabled;
    2203 
    2204     char szStreamSts[DRVAUDIO_STATUS_STR_MAX], szBackendStreamSts[DRVAUDIO_STATUS_STR_MAX];
     2205    int                            rc              = VINF_SUCCESS;
     2206    bool const                     fDirEnabled     = pStreamEx->Core.enmDir == PDMAUDIODIR_IN
     2207                                                   ? pThis->In.fEnabled : pThis->Out.fEnabled;
     2208    PDMHOSTAUDIOSTREAMSTATE const  enmBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
     2209                                                     /* ^^^ (checks pThis->pHostDrvAudio != NULL too) */
     2210
     2211    char szStreamSts[DRVAUDIO_STATUS_STR_MAX];
    22052212    LogRel2(("Audio: %s stream '%s' backend (%s is %s; status: %s; backend-status: %s)\n",
    22062213             PDMAudioStrmCmdGetName(enmStreamCmd), pStreamEx->Core.szName, PDMAudioDirGetName(pStreamEx->Core.enmDir),
    22072214             fDirEnabled ? "enabled" : "disabled",  drvAudioStreamStatusToStr(szStreamSts, pStreamEx->fStatus),
    2208              drvAudioStreamStatusToStr(szBackendStreamSts, fBackendStatus) ));
     2215             PDMHostAudioStreamStateGetName(enmBackendState) ));
    22092216
    22102217    if (fDirEnabled)
    22112218    {
    2212         if (   (pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY)
    2213             && (fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED))
     2219        if (   (pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY /* don't really need this check, do we? */)
     2220            && enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY)
    22142221        {
    22152222            /** @todo Backend will change to explicit methods here, so please don't simplify
     
    22562263            }
    22572264        }
    2258     }
     2265        else
     2266            LogFlowFunc(("enmBackendStat(=%s) != OKAY || !(fStatus(=%#x) & BACKEND_READY)\n",
     2267                         PDMHostAudioStreamStateGetName(enmBackendState), pStreamEx->fStatus));
     2268    }
     2269    else
     2270        LogFlowFunc(("fDirEnabled=false\n"));
    22592271    return rc;
    22602272}
     
    23702382                {
    23712383                    /* Reset the play state before we try to start. */
    2372                     pStreamEx->fLastBackendStatus = drvAudioStreamGetBackendStatus(pThis, pStreamEx);
     2384                    PDMHOSTAUDIOSTREAMSTATE const enmBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
     2385                    pStreamEx->enmLastBackendState = enmBackendState;
    23732386                    if (pStreamEx->Core.enmDir == PDMAUDIODIR_OUT)
    23742387                    {
    23752388                        pStreamEx->Out.cbPreBuffered = 0;
    23762389                        pStreamEx->Out.offPreBuf     = 0;
    2377                         pStreamEx->Out.enmPlayState  = pStreamEx->Out.cbPreBufThreshold > 0
    2378                                                      ? DRVAUDIOPLAYSTATE_PREBUF
    2379                                                      :    (pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY)
    2380                                                        && (pStreamEx->fLastBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED)
    2381                                                      ? DRVAUDIOPLAYSTATE_PLAY
    2382                                                      : DRVAUDIOPLAYSTATE_NOPLAY;
    2383                         LogFunc(("ENABLE: fLastBackendStatus=%#x enmPlayState=%s\n",
    2384                                  pStreamEx->fLastBackendStatus, drvAudioPlayStateName(pStreamEx->Out.enmPlayState)));
     2390                        pStreamEx->Out.enmPlayState  = DRVAUDIOPLAYSTATE_NOPLAY;
     2391                        switch (enmBackendState)
     2392                        {
     2393                            case PDMHOSTAUDIOSTREAMSTATE_INITIALIZING:
     2394                                if (pStreamEx->Out.cbPreBufThreshold > 0)
     2395                                    pStreamEx->Out.enmPlayState = DRVAUDIOPLAYSTATE_PREBUF;
     2396                                break;
     2397                            case PDMHOSTAUDIOSTREAMSTATE_OKAY:
     2398                                pStreamEx->Out.enmPlayState = pStreamEx->Out.cbPreBufThreshold > 0
     2399                                                            ? DRVAUDIOPLAYSTATE_PREBUF : DRVAUDIOPLAYSTATE_PLAY;
     2400                                break;
     2401                            case PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING:
     2402                            case PDMHOSTAUDIOSTREAMSTATE_INACTIVE:
     2403                                break;
     2404                            /* no default */
     2405                            case PDMHOSTAUDIOSTREAMSTATE_INVALID:
     2406                            case PDMHOSTAUDIOSTREAMSTATE_END:
     2407                            case PDMHOSTAUDIOSTREAMSTATE_32BIT_HACK:
     2408                                break;
     2409                        }
     2410                        LogFunc(("ENABLE: enmBackendState=%s enmPlayState=%s\n", PDMHostAudioStreamStateGetName(enmBackendState),
     2411                                 drvAudioPlayStateName(pStreamEx->Out.enmPlayState)));
    23852412                    }
    23862413                    else
    2387                         LogFunc(("ENABLE: fLastBackendStatus=%#x\n", pStreamEx->fLastBackendStatus));
     2414                        LogFunc(("ENABLE: enmBackendState=%s\n", PDMHostAudioStreamStateGetName(enmBackendState)));
    23882415
    23892416                    rc = drvAudioStreamControlInternalBackend(pThis, pStreamEx, PDMAUDIOSTREAMCMD_ENABLE);
     
    28032830                    /* Must check the backend state here first and only try commit the
    28042831                       pre-buffered samples if the backend is in working order. */
    2805                     uint32_t const fBackendStatus = drvAudioStreamGetBackendStatus(pThis, pStreamEx); /* (checks pThis->pHostDrvAudio too) */
     2832                    PDMHOSTAUDIOSTREAMSTATE const enmBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
     2833                                                                     /* ^^^ (checks pThis->pHostDrvAudio != NULL too) */
    28062834                    if (   (pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY)
    2807                         && (fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED))
     2835                        && enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY)
    28082836                    {
    28092837                        uint32_t cbIgnored = 0;
     
    28122840                    }
    28132841                    else
    2814                         Log3Func(("[%s] Skipping committing pre-buffered samples, backend not initialized (%#x)!\n",
    2815                                   pStreamEx->Core.szName, fBackendStatus));
     2842                        Log3Func(("[%s] Skipping committing pre-buffered samples (status: %#x backend: %s)!\n",
     2843                                  pStreamEx->Core.szName, pStreamEx->fStatus, PDMHostAudioStreamStateGetName(enmBackendState)));
    28162844                }
    28172845                break;
     
    29292957       )
    29302958    {
    2931         uint32_t const fBackendStatus = drvAudioStreamGetBackendStatus(pThis, pStreamEx);
    2932 
     2959        PDMHOSTAUDIOSTREAMSTATE const enmBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
    29332960        if (pStreamEx->fNoMixBufs)
    29342961            cbReadable =    pThis->pHostDrvAudio
    29352962                         && (pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY)
    2936                          && (fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED)
     2963                         && enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY
    29372964                         && !fDisabled
    29382965                       ? pThis->pHostDrvAudio->pfnStreamGetReadable(pThis->pHostDrvAudio, pStreamEx->pBackend)
     
    29532980             * Reading the actual data from a stream then will return silence then.
    29542981             */
    2955             if (   !PDMAudioStrmStatusBackendCanRead(fBackendStatus)
     2982            if (   enmBackendState != PDMHOSTAUDIOSTREAMSTATE_OKAY /** @todo probably not correct.  OTOH, I'm not sure if we do what the above comment claims either. */
    29562983                || fDisabled)
    29572984            {
     
    29632990                        LogRel(("Audio: Input for driver '%s' has been disabled, returning silence\n", pThis->szName));
    29642991                    else
    2965                         LogRel(("Audio: Warning: Input for stream '%s' of driver '%s' not ready (current input status is %#x), returning silence\n",
    2966                                 pStreamEx->Core.szName, pThis->szName, fBackendStatus));
     2992                        LogRel(("Audio: Warning: Input for stream '%s' of driver '%s' not ready (current input status is %s), returning silence\n",
     2993                                pStreamEx->Core.szName, pThis->szName, PDMHostAudioStreamStateGetName(enmBackendState) ));
    29672994
    29682995                    pStreamEx->Core.fWarningsShown |= PDMAUDIOSTREAM_WARN_FLAGS_DISABLED;
     
    30163043            case DRVAUDIOPLAYSTATE_PLAY_PREBUF:
    30173044                Assert(pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY);
    3018                 Assert(drvAudioStreamGetBackendStatus(pThis, pStreamEx) & PDMAUDIOSTREAM_STS_INITIALIZED);
     3045                Assert(drvAudioStreamGetBackendState(pThis, pStreamEx) == PDMHOSTAUDIOSTREAMSTATE_OKAY /* potential unplug race */);
    30193046                cbWritable = pThis->pHostDrvAudio->pfnStreamGetWritable(pThis->pHostDrvAudio, pStreamEx->pBackend);
    30203047                break;
     
    30543081                   to move the data. */
    30553082                Assert(pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY);
    3056                 Assert(drvAudioStreamGetBackendStatus(pThis, pStreamEx) & PDMAUDIOSTREAM_STS_INITIALIZED);
     3083                Assert(drvAudioStreamGetBackendState(pThis, pStreamEx) == PDMHOSTAUDIOSTREAMSTATE_OKAY /* potential unplug race */);
    30573084                uint32_t const cbMin = PDMAudioPropsFramesToBytes(&pStreamEx->Core.Props, 8);
    30583085                cbWritable = pThis->pHostDrvAudio->pfnStreamGetWritable(pThis->pHostDrvAudio, pStreamEx->pBackend);
     
    31013128    AssertRCReturn(rc, PDMAUDIOSTREAMSTATE_INVALID);
    31023129
    3103     uint32_t const    fStrmStatus = pStreamEx->fStatus;
    3104     PDMAUDIODIR const enmDir      = pStreamEx->Guest.Cfg.enmDir;
     3130    PDMHOSTAUDIOSTREAMSTATE const enmBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
     3131    uint32_t const                fStrmStatus     = pStreamEx->fStatus;
     3132    PDMAUDIODIR const             enmDir          = pStreamEx->Guest.Cfg.enmDir;
     3133    Assert(enmDir == PDMAUDIODIR_IN || enmDir == PDMAUDIODIR_OUT);
    31053134
    31063135    RTCritSectLeave(&pThis->CritSect);
     
    31143143        if (fStrmStatus & PDMAUDIOSTREAM_STS_INITIALIZED)
    31153144        {
    3116             if (fStrmStatus & PDMAUDIOSTREAM_STS_ENABLED)
     3145            if (   (fStrmStatus & PDMAUDIOSTREAM_STS_ENABLED)
     3146                && (enmDir == PDMAUDIODIR_IN ? pThis->In.fEnabled : pThis->Out.fEnabled)
     3147                && (   enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY
     3148                    || enmBackendState == PDMHOSTAUDIOSTREAMSTATE_INITIALIZING ))
    31173149                enmState = enmDir == PDMAUDIODIR_IN ? PDMAUDIOSTREAMSTATE_ENABLED_READABLE : PDMAUDIOSTREAMSTATE_ENABLED_WRITABLE;
    31183150            else
     
    31283160    char szStreamSts[DRVAUDIO_STATUS_STR_MAX];
    31293161#endif
    3130     Log3Func(("[%s] returns %d (%s)\n", pStreamEx->Core.szName, enmState, drvAudioStreamStatusToStr(szStreamSts, fStrmStatus)));
     3162    Log3Func(("[%s] returns %s (status: %s)\n", pStreamEx->Core.szName, PDMAudioStreamStateGetName(enmState),
     3163              drvAudioStreamStatusToStr(szStreamSts, fStrmStatus)));
    31313164    return enmState;
    31323165}
     
    31563189
    31573190/**
    3158  * Processes backend status change.
    3159  *
    3160  * @todo bird: I'm more and more of the opinion that the backend should
    3161  *       explicitly notify us about these changes, rather that we polling them
    3162  *       via PDMIHOSTAUDIO::pfnStreamGetStatus...
    3163  */
    3164 static void drvAudioStreamPlayProcessBackendStateChange(PDRVAUDIOSTREAM pStreamEx, uint32_t fNewState, uint32_t fOldState)
    3165 {
     3191 * Processes backend state change.
     3192 */
     3193static void drvAudioStreamPlayProcessBackendStateChange(PDRVAUDIOSTREAM pStreamEx, PDMHOSTAUDIOSTREAMSTATE enmNewState,
     3194                                                        PDMHOSTAUDIOSTREAMSTATE enmOldState)
     3195{
     3196#ifdef LOG_ENABLED
    31663197    DRVAUDIOPLAYSTATE const enmPlayState = pStreamEx->Out.enmPlayState;
    3167 
    3168     /*
    3169      * Did PDMAUDIOSTREAM_STS_INITIALIZED change?
    3170      */
    3171     if ((fOldState ^ fNewState) & PDMAUDIOSTREAM_STS_INITIALIZED)
    3172     {
    3173         if (fOldState & PDMAUDIOSTREAM_STS_INITIALIZED)
    3174         {
    3175             /* Pulse audio clear INITIALIZED. */
    3176             switch (enmPlayState)
     3198#endif
     3199    Assert(enmNewState != enmOldState);
     3200    Assert(enmOldState > PDMHOSTAUDIOSTREAMSTATE_INVALID && enmOldState < PDMHOSTAUDIOSTREAMSTATE_END);
     3201    AssertReturnVoid(enmNewState > PDMHOSTAUDIOSTREAMSTATE_INVALID && enmNewState < PDMHOSTAUDIOSTREAMSTATE_END);
     3202
     3203    /*
     3204     * Figure out what happend and how that reflects on the playback state and stuff.
     3205     */
     3206    switch (enmNewState)
     3207    {
     3208        case PDMHOSTAUDIOSTREAMSTATE_INITIALIZING:
     3209            /* Guess we're switching device. Nothing to do because the backend will tell us, right? */
     3210            break;
     3211
     3212        case PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING:
     3213            /* The stream has stopped working.  Switch to noplay mode. */
     3214            pStreamEx->Out.enmPlayState = DRVAUDIOPLAYSTATE_NOPLAY;
     3215            break;
     3216
     3217        case PDMHOSTAUDIOSTREAMSTATE_OKAY:
     3218            switch (enmOldState)
    31773219            {
    3178                 case DRVAUDIOPLAYSTATE_PLAY:
    3179                 case DRVAUDIOPLAYSTATE_PREBUF_COMMITTING:
    3180                     pStreamEx->Out.enmPlayState = DRVAUDIOPLAYSTATE_NOPLAY;
    3181                     /** @todo We could enter PREBUF here and hope for the device to re-appear in
    3182                      *        initialized state... */
     3220                case PDMHOSTAUDIOSTREAMSTATE_INITIALIZING:
     3221                    /* Should be taken care of elsewhere, so do nothing. */
    31833222                    break;
    3184                 case DRVAUDIOPLAYSTATE_PLAY_PREBUF:
    3185                     pStreamEx->Out.enmPlayState = DRVAUDIOPLAYSTATE_PREBUF_SWITCHING;
     3223
     3224                case PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING:
     3225                case PDMHOSTAUDIOSTREAMSTATE_INACTIVE:
     3226                    /* Go back to pre-buffering/playing depending on whether it is enabled
     3227                       or not, resetting the stream state. */
     3228                    drvAudioStreamResetInternal(pStreamEx);
    31863229                    break;
    3187                 case DRVAUDIOPLAYSTATE_PREBUF:
    3188                     break;
    3189                 case DRVAUDIOPLAYSTATE_PREBUF_OVERDUE:
    3190                 case DRVAUDIOPLAYSTATE_PREBUF_SWITCHING:
    3191                     AssertFailedBreak();
    3192                 /* no default */
    3193                 case DRVAUDIOPLAYSTATE_NOPLAY:
    3194                 case DRVAUDIOPLAYSTATE_END:
    3195                 case DRVAUDIOPLAYSTATE_INVALID:
     3230
     3231                /* no default: */
     3232                case PDMHOSTAUDIOSTREAMSTATE_OKAY: /* impossible */
     3233                case PDMHOSTAUDIOSTREAMSTATE_INVALID:
     3234                case PDMHOSTAUDIOSTREAMSTATE_END:
     3235                case PDMHOSTAUDIOSTREAMSTATE_32BIT_HACK:
    31963236                    break;
    31973237            }
    3198             LogFunc(("PDMAUDIOSTREAM_STS_INITIALIZED was cleared: %s -> %s\n",
    3199                      drvAudioPlayStateName(enmPlayState), drvAudioPlayStateName(pStreamEx->Out.enmPlayState) ));
    3200         }
    3201         else
    3202         {
    3203             if (pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY)
    3204             {
    3205     /** @todo We need to resync the stream status somewhere...  */
    3206                 switch (enmPlayState)
    3207                 {
    3208                     case DRVAUDIOPLAYSTATE_PREBUF:
    3209                     case DRVAUDIOPLAYSTATE_PREBUF_SWITCHING:
    3210                         break;
    3211                     case DRVAUDIOPLAYSTATE_PREBUF_OVERDUE:
    3212                         pStreamEx->Out.enmPlayState = DRVAUDIOPLAYSTATE_PREBUF_COMMITTING;
    3213                         break;
    3214                     case DRVAUDIOPLAYSTATE_NOPLAY:
    3215                         pStreamEx->Out.enmPlayState = DRVAUDIOPLAYSTATE_PREBUF;
    3216                         break;
    3217                     case DRVAUDIOPLAYSTATE_PLAY:
    3218                     case DRVAUDIOPLAYSTATE_PLAY_PREBUF:
    3219                     case DRVAUDIOPLAYSTATE_PREBUF_COMMITTING:
    3220                         AssertFailedBreak();
    3221                     /* no default */
    3222                     case DRVAUDIOPLAYSTATE_END:
    3223                     case DRVAUDIOPLAYSTATE_INVALID:
    3224                         break;
    3225                 }
    3226                 LogFunc(("PDMAUDIOSTREAM_STS_INITIALIZED was set: %s -> %s\n",
    3227                          drvAudioPlayStateName(enmPlayState), drvAudioPlayStateName(pStreamEx->Out.enmPlayState) ));
    3228             }
    3229             else
    3230                 LogFunc(("PDMAUDIOSTREAM_STS_INITIALIZED was set (enmPlayState=%s), but PDMAUDIOSTREAM_STS_BACKEND_READY is not.\n",
    3231                          drvAudioPlayStateName(enmPlayState) ));
    3232         }
    3233     }
     3238            break;
     3239
     3240        case PDMHOSTAUDIOSTREAMSTATE_INACTIVE:
     3241            /* Stream is now inactive. Switch to noplay mode. */
     3242            pStreamEx->Out.enmPlayState = DRVAUDIOPLAYSTATE_NOPLAY;
     3243            break;
     3244
     3245        /* no default: */
     3246        case PDMHOSTAUDIOSTREAMSTATE_INVALID:
     3247        case PDMHOSTAUDIOSTREAMSTATE_END:
     3248        case PDMHOSTAUDIOSTREAMSTATE_32BIT_HACK:
     3249            break;
     3250    }
     3251
     3252    LogFunc(("Stream '%s': %s/%s -> %s/%s\n", pStreamEx->Guest.Cfg.szName,
     3253             PDMHostAudioStreamStateGetName(enmOldState), drvAudioPlayStateName(enmPlayState),
     3254             PDMHostAudioStreamStateGetName(enmNewState), drvAudioPlayStateName(pStreamEx->Out.enmPlayState) ));
    32343255}
    32353256
     
    32793300            && pThis->pHostDrvAudio != NULL)
    32803301        {
    3281 #ifdef LOG_ENABLED
    3282             char szState[DRVAUDIO_STATUS_STR_MAX];
    3283 #endif
    32843302            /*
    3285              * Get the backend state and check if we've changed to "initialized" or
    3286              * to switch prep mode.
    3287              *
    3288              * We don't really need to watch ENABLE or PAUSE here as these should be
    3289              * in sync between our state and the backend (there is a tiny tiny chance
    3290              * that we are resumed before the backend driver, but AIO threads really
    3291              * shouldn't be getting here that fast I hope).
     3303             * Get the backend state and check if it changed.
    32923304             */
    3293             /** @todo
    3294              * The PENDING_DISABLE (== draining) is not reported by most backend and it's an
    3295              * open question whether we should still allow writes even when the backend
    3296              * is draining anyway.  We currently don't.  Maybe we just re-define it as
    3297              * a non-backend status flag.
    3298              */
    3299             uint32_t const fBackendStatus = drvAudioStreamGetBackendStatus(pThis, pStreamEx);
    3300             Assert(      (fBackendStatus     & (PDMAUDIOSTREAM_STS_ENABLED | PDMAUDIOSTREAM_STS_PAUSED))
    3301                       == (pStreamEx->fStatus & (PDMAUDIOSTREAM_STS_ENABLED | PDMAUDIOSTREAM_STS_PAUSED))
    3302                    || !(pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY)
    3303                    || !(fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED));
    3304 
    3305             if (!((pStreamEx->fLastBackendStatus ^ fBackendStatus) & PDMAUDIOSTREAM_STS_INITIALIZED))
     3305            PDMHOSTAUDIOSTREAMSTATE const enmBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
     3306            if (enmBackendState == pStreamEx->enmLastBackendState)
    33063307            { /* no relevant change - likely */ }
    33073308            else
    33083309            {
    3309                 drvAudioStreamPlayProcessBackendStateChange(pStreamEx, fBackendStatus, pStreamEx->fLastBackendStatus);
    3310                 pStreamEx->fLastBackendStatus = fBackendStatus;
     3310                drvAudioStreamPlayProcessBackendStateChange(pStreamEx, enmBackendState, pStreamEx->enmLastBackendState);
     3311                pStreamEx->enmLastBackendState = enmBackendState;
    33113312            }
    33123313
     
    33183319                case DRVAUDIOPLAYSTATE_PLAY:
    33193320                    Assert(pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY);
    3320                     Assert(fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED);
     3321                    Assert(enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY);
    33213322                    rc = drvAudioStreamPlayLocked(pThis, pStreamEx, (uint8_t const *)pvBuf, cbBuf, pcbWritten);
    33223323                    break;
     
    33243325                case DRVAUDIOPLAYSTATE_PLAY_PREBUF:
    33253326                    Assert(pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY);
    3326                     Assert(fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED);
     3327                    Assert(enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY);
    33273328                    rc = drvAudioStreamPlayLocked(pThis, pStreamEx, (uint8_t const *)pvBuf, cbBuf, pcbWritten);
    33283329                    drvAudioStreamPreBuffer(pStreamEx, (uint8_t const *)pvBuf, *pcbWritten, pStreamEx->Out.cbPreBufThreshold);
     
    33323333                    if (cbBuf + pStreamEx->Out.cbPreBuffered < pStreamEx->Out.cbPreBufThreshold)
    33333334                        rc = drvAudioStreamPlayToPreBuffer(pStreamEx, pvBuf, cbBuf, pStreamEx->Out.cbPreBufThreshold, pcbWritten);
    3334                     else if (   (fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED)
     3335                    else if (   enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY
    33353336                             && (pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY))
    33363337                    {
     
    33523353                case DRVAUDIOPLAYSTATE_PREBUF_OVERDUE:
    33533354                    Assert(   !(pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY)
    3354                            || !(fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED));
     3355                           || enmBackendState != PDMHOSTAUDIOSTREAMSTATE_OKAY);
    33553356                    RT_FALL_THRU();
    33563357                case DRVAUDIOPLAYSTATE_PREBUF_SWITCHING:
     
    33603361                case DRVAUDIOPLAYSTATE_PREBUF_COMMITTING:
    33613362                    Assert(pStreamEx->fStatus & PDMAUDIOSTREAM_STS_BACKEND_READY);
    3362                     Assert(fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED);
     3363                    Assert(enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY);
    33633364                    rc = drvAudioStreamPreBufComitting(pThis, pStreamEx, (uint8_t const *)pvBuf, cbBuf, pcbWritten);
    33643365                    break;
     
    33683369                    pStreamEx->offInternal += cbBuf;
    33693370                    Log3Func(("[%s] Discarding the data, backend state: %s\n", pStreamEx->Core.szName,
    3370                               drvAudioStreamStatusToStr(szState, fBackendStatus) ));
     3371                              PDMHostAudioStreamStateGetName(enmBackendState) ));
    33713372                    break;
    33723373
     
    37253726        }
    37263727
    3727         uint32_t const fBackendStatus = drvAudioStreamGetBackendStatus(pThis, pStreamEx);
    3728         if (fBackendStatus & PDMAUDIOSTREAM_STS_INITIALIZED)
     3728        PDMHOSTAUDIOSTREAMSTATE const enmBackendState = drvAudioStreamGetBackendState(pThis, pStreamEx);
     3729        if (enmBackendState == PDMHOSTAUDIOSTREAMSTATE_OKAY)
    37293730        {
    37303731            /*
     
    38893890            if (pThis->pHostDrvAudio->pfnStreamNotifyDeviceChanged)
    38903891            {
    3891                 LogFlowFunc(("Calling pfnStreamNotifyDeviceChanged on %s, old backend status: %#x...\n", pStreamEx->Core.szName,
    3892                               drvAudioStreamGetBackendStatus(pThis, pStreamEx) ));
     3892                LogFlowFunc(("Calling pfnStreamNotifyDeviceChanged on %s, old backend state: %s...\n", pStreamEx->Core.szName,
     3893                             PDMHostAudioStreamStateGetName(drvAudioStreamGetBackendState(pThis, pStreamEx)) ));
    38933894                pThis->pHostDrvAudio->pfnStreamNotifyDeviceChanged(pThis->pHostDrvAudio, pStreamEx->pBackend, pvUser);
    3894                 LogFlowFunc(("New stream backend status: %#x.\n", drvAudioStreamGetBackendStatus(pThis, pStreamEx) ));
     3895                LogFlowFunc(("New stream backend state: %s\n",
     3896                             PDMHostAudioStreamStateGetName(drvAudioStreamGetBackendState(pThis, pStreamEx)) ));
    38953897            }
    38963898            else
     
    42164218    AssertPtrReturn(pIHostDrvAudio->pfnStreamGetWritable, VERR_INVALID_POINTER);
    42174219    AssertPtrNullReturn(pIHostDrvAudio->pfnStreamGetPending, VERR_INVALID_POINTER);
    4218     AssertPtrReturn(pIHostDrvAudio->pfnStreamGetStatus, VERR_INVALID_POINTER);
     4220    AssertPtrReturn(pIHostDrvAudio->pfnStreamGetState, VERR_INVALID_POINTER);
    42194221    AssertPtrReturn(pIHostDrvAudio->pfnStreamPlay, VERR_INVALID_POINTER);
    42204222    AssertPtrReturn(pIHostDrvAudio->pfnStreamCapture, VERR_INVALID_POINTER);
  • trunk/src/VBox/Devices/Audio/DrvHostAudioAlsa.cpp

    r88819 r88887  
    11181118
    11191119/**
    1120  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    1121  */
    1122 static DECLCALLBACK(uint32_t) drvHostAlsaAudioHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    1123 {
    1124     RT_NOREF(pInterface, pStream);
    1125 
    1126     return PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED;
     1120 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     1121 */
     1122static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostAlsaAudioHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     1123                                                                               PPDMAUDIOBACKENDSTREAM pStream)
     1124{
     1125    RT_NOREF(pInterface);
     1126    AssertPtrReturn(pStream, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     1127
     1128    return PDMHOSTAUDIOSTREAMSTATE_OKAY;
    11271129}
    11281130
     
    14181420    pThis->IHostAudio.pfnStreamGetWritable          = drvHostAlsaAudioHA_StreamGetWritable;
    14191421    pThis->IHostAudio.pfnStreamGetPending           = drvHostAlsaAudioHA_StreamGetPending;
    1420     pThis->IHostAudio.pfnStreamGetStatus            = drvHostAlsaAudioHA_StreamGetStatus;
     1422    pThis->IHostAudio.pfnStreamGetState             = drvHostAlsaAudioHA_StreamGetState;
    14211423    pThis->IHostAudio.pfnStreamPlay                 = drvHostAlsaAudioHA_StreamPlay;
    14221424    pThis->IHostAudio.pfnStreamCapture              = drvHostAlsaAudioHA_StreamCapture;
  • trunk/src/VBox/Devices/Audio/DrvHostAudioCoreAudio.cpp

    r88820 r88887  
    24242424
    24252425/**
    2426  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    2427  */
    2428 static DECLCALLBACK(uint32_t) drvHostCoreAudioHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
     2426 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     2427 */
     2428static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostCoreAudioHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     2429                                                                               PPDMAUDIOBACKENDSTREAM pStream)
    24292430{
    24302431    RT_NOREF(pInterface);
    2431     AssertPtrReturn(pStream, VERR_INVALID_POINTER);
    2432 
    2433     PCOREAUDIOSTREAM pCAStream = (PCOREAUDIOSTREAM)pStream;
    2434 
    2435     uint32_t fStrmStatus = PDMAUDIOSTREAM_STS_NONE;
    2436 
    2437     if (pCAStream->pCfg) /* Configured?  */
    2438     {
    2439         if (ASMAtomicReadU32(&pCAStream->enmStatus) == COREAUDIOSTATUS_INIT)
    2440             fStrmStatus |= PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED;
    2441     }
    2442 
    2443     return fStrmStatus;
     2432    PCOREAUDIOSTREAM pStreamCa = (PCOREAUDIOSTREAM)pStream;
     2433    AssertPtrReturn(pStreamCa, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     2434
     2435    if (pStreamCa->pCfg) /* Configured?  */
     2436    {
     2437        if (ASMAtomicReadU32(&pStreamCa->enmStatus) == COREAUDIOSTATUS_INIT)
     2438            return PDMHOSTAUDIOSTREAMSTATE_OKAY;
     2439    }
     2440
     2441    return PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING; /** @todo ?? */
    24442442}
    24452443
     
    25572555    pThis->IHostAudio.pfnStreamGetWritable          = drvHostCoreAudioHA_StreamGetWritable;
    25582556    pThis->IHostAudio.pfnStreamGetPending           = NULL;
    2559     pThis->IHostAudio.pfnStreamGetStatus            = drvHostCoreAudioHA_StreamGetStatus;
     2557    pThis->IHostAudio.pfnStreamGetState             = drvHostCoreAudioHA_StreamGetState;
    25602558    pThis->IHostAudio.pfnStreamPlay                 = drvHostCoreAudioHA_StreamPlay;
    25612559    pThis->IHostAudio.pfnStreamCapture              = drvHostCoreAudioHA_StreamCapture;
  • trunk/src/VBox/Devices/Audio/DrvHostAudioDSound.cpp

    r88853 r88887  
    24022402
    24032403/**
    2404  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    2405  */
    2406 static DECLCALLBACK(uint32_t) drvHostDSoundHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
     2404 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     2405 */
     2406static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostDSoundHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     2407                                                                            PPDMAUDIOBACKENDSTREAM pStream)
    24072408{
    24082409    RT_NOREF(pInterface);
    24092410    PDSOUNDSTREAM pStreamDS = (PDSOUNDSTREAM)pStream;
    2410     AssertPtrReturn(pStreamDS, PDMAUDIOSTREAM_STS_NONE);
    2411 
    2412     uint32_t fStrmStatus = PDMAUDIOSTREAM_STS_INITIALIZED;
    2413     if (pStreamDS->fEnabled)
    2414         fStrmStatus |= PDMAUDIOSTREAM_STS_ENABLED;
    2415 
    2416     LogFlowFunc(("returns %#x for '%s' {%s}\n", fStrmStatus, pStreamDS->Cfg.szName, drvHostDSoundStreamStatusString(pStreamDS)));
    2417     return fStrmStatus;
     2411    AssertPtrReturn(pStreamDS, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     2412
     2413    LogFlowFunc(("returns OKAY for '%s' {%s}\n", pStreamDS->Cfg.szName, drvHostDSoundStreamStatusString(pStreamDS)));
     2414    return PDMHOSTAUDIOSTREAMSTATE_OKAY;
    24182415}
    24192416
     
    27712768    pThis->IHostAudio.pfnStreamGetWritable          = drvHostDSoundHA_StreamGetWritable;
    27722769    pThis->IHostAudio.pfnStreamGetPending           = NULL;
    2773     pThis->IHostAudio.pfnStreamGetStatus            = drvHostDSoundHA_StreamGetStatus;
     2770    pThis->IHostAudio.pfnStreamGetState             = drvHostDSoundHA_StreamGetState;
    27742771    pThis->IHostAudio.pfnStreamPlay                 = drvHostDSoundHA_StreamPlay;
    27752772    pThis->IHostAudio.pfnStreamCapture              = drvHostDSoundHA_StreamCapture;
  • trunk/src/VBox/Devices/Audio/DrvHostAudioDebug.cpp

    r88868 r88887  
    261261
    262262/**
    263  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    264  */
    265 static DECLCALLBACK(uint32_t) drvHostDebugAudioHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    266 {
    267     RT_NOREF(pInterface, pStream);
    268     return PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED;
     263 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     264 */
     265static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostDebugAudioHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     266                                                                                PPDMAUDIOBACKENDSTREAM pStream)
     267{
     268    RT_NOREF(pInterface);
     269    AssertPtrReturn(pStream, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     270    return PDMHOSTAUDIOSTREAMSTATE_OKAY;
    269271}
    270272
     
    448450    pThis->IHostAudio.pfnStreamGetWritable          = drvHostDebugAudioHA_StreamGetWritable;
    449451    pThis->IHostAudio.pfnStreamGetPending           = drvHostDebugAudioHA_StreamGetPending;
    450     pThis->IHostAudio.pfnStreamGetStatus            = drvHostDebugAudioHA_StreamGetStatus;
     452    pThis->IHostAudio.pfnStreamGetState             = drvHostDebugAudioHA_StreamGetState;
    451453    pThis->IHostAudio.pfnStreamPlay                 = drvHostDebugAudioHA_StreamPlay;
    452454    pThis->IHostAudio.pfnStreamCapture              = drvHostDebugAudioHA_StreamCapture;
  • trunk/src/VBox/Devices/Audio/DrvHostAudioNull.cpp

    r88819 r88887  
    181181
    182182/**
    183  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    184  */
    185 static DECLCALLBACK(uint32_t) drvHostNullAudioHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    186 {
    187     RT_NOREF(pInterface, pStream);
    188     return PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED;
     183 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     184 */
     185static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostNullAudioHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     186                                                                               PPDMAUDIOBACKENDSTREAM pStream)
     187{
     188    RT_NOREF(pInterface);
     189    AssertPtrReturn(pStream, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     190#if 0
     191    /* Bit bucket appraoch where we ignore the output and silence the input buffers.  */
     192    return PDMHOSTAUDIOSTREAMSTATE_OKAY;
     193#else
     194    /* Approach where the mixer in the devices skips us and saves a few CPU cycles. */
     195    return PDMHOSTAUDIOSTREAMSTATE_INACTIVE;
     196#endif
    189197}
    190198
     
    242250    /* .pfnStreamGetWritable         =*/ drvHostNullAudioHA_StreamGetWritable,
    243251    /* .pfnStreamGetPending          =*/ drvHostNullAudioHA_StreamGetPending,
    244     /* .pfnStreamGetStatus           =*/ drvHostNullAudioHA_StreamGetStatus,
     252    /* .pfnStreamGetState            =*/ drvHostNullAudioHA_StreamGetState,
    245253    /* .pfnStreamPlay                =*/ drvHostNullAudioHA_StreamPlay,
    246254    /* .pfnStreamCapture             =*/ drvHostNullAudioHA_StreamCapture,
  • trunk/src/VBox/Devices/Audio/DrvHostAudioOss.cpp

    r88819 r88887  
    699699
    700700/**
    701  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    702  */
    703 static DECLCALLBACK(uint32_t) drvHostOssAudioHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    704 {
    705     RT_NOREF(pInterface, pStream);
    706     return PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED;
     701 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     702 */
     703static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostOssAudioHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     704                                                                              PPDMAUDIOBACKENDSTREAM pStream)
     705{
     706    RT_NOREF(pInterface);
     707    AssertPtrReturn(pStream, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     708    return PDMHOSTAUDIOSTREAMSTATE_OKAY;
    707709}
    708710
     
    871873    pThis->IHostAudio.pfnStreamGetWritable          = drvHostOssAudioHA_StreamGetWritable;
    872874    pThis->IHostAudio.pfnStreamGetPending           = NULL;
    873     pThis->IHostAudio.pfnStreamGetStatus            = drvHostOssAudioHA_StreamGetStatus;
     875    pThis->IHostAudio.pfnStreamGetState             = drvHostOssAudioHA_StreamGetState;
    874876    pThis->IHostAudio.pfnStreamPlay                 = drvHostOssAudioHA_StreamPlay;
    875877    pThis->IHostAudio.pfnStreamCapture              = drvHostOssAudioHA_StreamCapture;
  • trunk/src/VBox/Devices/Audio/DrvHostAudioPulseAudio.cpp

    r88848 r88887  
    15471547
    15481548/**
    1549  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    1550  */
    1551 static DECLCALLBACK(uint32_t) drvHostAudioPaHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
     1549 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     1550 */
     1551static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostAudioPaHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     1552                                                                             PPDMAUDIOBACKENDSTREAM pStream)
    15521553{
    15531554    PDRVHOSTPULSEAUDIO pThis = RT_FROM_MEMBER(pInterface, DRVHOSTPULSEAUDIO, IHostAudio);
    1554     RT_NOREF(pStream);
     1555    AssertPtrReturn(pStream, PDMHOSTAUDIOSTREAMSTATE_INVALID);
    15551556
    15561557    /* Check PulseAudio's general status. */
     
    15611562        {
    15621563            /** @todo should we check the actual stream state? */
    1563             return PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED;
     1564            return PDMHOSTAUDIOSTREAMSTATE_OKAY;
    15641565        }
    15651566        LogFunc(("non-good context state: %d\n", enmState));
     
    15671568    else
    15681569        LogFunc(("No context!\n"));
    1569     return PDMAUDIOSTREAM_STS_NONE;
     1570    return PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING;
    15701571}
    15711572
     
    19121913    pThis->IHostAudio.pfnStreamGetWritable          = drvHostAudioPaHA_StreamGetWritable;
    19131914    pThis->IHostAudio.pfnStreamGetPending           = NULL;
    1914     pThis->IHostAudio.pfnStreamGetStatus            = drvHostAudioPaHA_StreamGetStatus;
     1915    pThis->IHostAudio.pfnStreamGetState             = drvHostAudioPaHA_StreamGetState;
    19151916    pThis->IHostAudio.pfnStreamPlay                 = drvHostAudioPaHA_StreamPlay;
    19161917    pThis->IHostAudio.pfnStreamCapture              = drvHostAudioPaHA_StreamCapture;
  • trunk/src/VBox/Devices/Audio/DrvHostAudioValidationKit.cpp

    r88819 r88887  
    332332
    333333/**
    334  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    335  */
    336 static DECLCALLBACK(uint32_t) drvHostValKitAudioHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    337 {
    338     RT_NOREF(pInterface, pStream);
    339     return PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED;
     334 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     335 */
     336static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostValKitAudioHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     337                                                                                 PPDMAUDIOBACKENDSTREAM pStream)
     338{
     339    RT_NOREF(pInterface);
     340    AssertPtrReturn(pStream, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     341    return PDMHOSTAUDIOSTREAMSTATE_OKAY;
    340342}
    341343
     
    445447    pThis->IHostAudio.pfnStreamGetWritable          = drvHostValKitAudioHA_StreamGetWritable;
    446448    pThis->IHostAudio.pfnStreamGetPending           = NULL;
    447     pThis->IHostAudio.pfnStreamGetStatus            = drvHostValKitAudioHA_StreamGetStatus;
     449    pThis->IHostAudio.pfnStreamGetState             = drvHostValKitAudioHA_StreamGetState;
    448450    pThis->IHostAudio.pfnStreamPlay                 = drvHostValKitAudioHA_StreamPlay;
    449451    pThis->IHostAudio.pfnStreamCapture              = drvHostValKitAudioHA_StreamCapture;
  • trunk/src/VBox/Devices/Audio/DrvHostAudioWasApi.cpp

    r88878 r88887  
    25192519
    25202520/**
    2521  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    2522  */
    2523 static DECLCALLBACK(uint32_t) drvHostAudioWasHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
     2521 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     2522 */
     2523static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvHostAudioWasHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     2524                                                                              PPDMAUDIOBACKENDSTREAM pStream)
    25242525{
    25252526    RT_NOREF(pInterface);
    25262527    PDRVHOSTAUDIOWASSTREAM pStreamWas = (PDRVHOSTAUDIOWASSTREAM)pStream;
    2527     AssertPtrReturn(pStreamWas, PDMAUDIOSTREAM_STS_NONE);
    2528 
    2529     uint32_t fStrmStatus = 0;
     2528    AssertPtrReturn(pStreamWas, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     2529
     2530    PDMHOSTAUDIOSTREAMSTATE enmState;
    25302531    AssertPtr(pStreamWas->pDevCfg);
    25312532    if (pStreamWas->pDevCfg /*paranoia*/)
    25322533    {
    25332534        if (RT_SUCCESS(pStreamWas->pDevCfg->rcSetup))
    2534             fStrmStatus |= PDMAUDIOSTREAM_STS_INITIALIZED;
    2535         else if (pStreamWas->pDevCfg->rcSetup != VERR_AUDIO_STREAM_INIT_IN_PROGRESS)
    2536         {
    2537             /** @todo trigger device reset? Probably won't help, so what to do?  */
    2538         }
    2539     }
    2540     if (pStreamWas->fEnabled)
    2541     {
    2542         fStrmStatus |= PDMAUDIOSTREAM_STS_ENABLED;
    2543         if (pStreamWas->fDraining)
    2544             fStrmStatus |= PDMAUDIOSTREAM_STS_PENDING_DISABLE;
    2545         if (pStreamWas->fRestartOnResume)
    2546             fStrmStatus |= PDMAUDIOSTREAM_STS_PAUSED;
    2547     }
    2548     if (pStreamWas->fSwitchingDevice)
    2549         fStrmStatus |= PDMAUDIOSTREAM_STS_PREPARING_SWITCH;
    2550 
    2551     LogFlowFunc(("returns %#x for '%s' {%s}\n", fStrmStatus, pStreamWas->Cfg.szName, drvHostWasStreamStatusString(pStreamWas)));
    2552     return fStrmStatus;
     2535            enmState = PDMHOSTAUDIOSTREAMSTATE_OKAY;
     2536        else if (   pStreamWas->pDevCfg->rcSetup == VERR_AUDIO_STREAM_INIT_IN_PROGRESS
     2537                 || pStreamWas->fSwitchingDevice )
     2538            enmState = PDMHOSTAUDIOSTREAMSTATE_INITIALIZING;
     2539        else
     2540            enmState = PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING;
     2541    }
     2542    else if (pStreamWas->fSwitchingDevice)
     2543        enmState = PDMHOSTAUDIOSTREAMSTATE_INITIALIZING;
     2544    else
     2545        enmState = PDMHOSTAUDIOSTREAMSTATE_NOT_WORKING;
     2546
     2547    LogFlowFunc(("returns %d for '%s' {%s}\n", enmState, pStreamWas->Cfg.szName, drvHostWasStreamStatusString(pStreamWas)));
     2548    return enmState;
    25532549}
    25542550
     
    30203016    pThis->IHostAudio.pfnStreamGetWritable          = drvHostAudioWasHA_StreamGetWritable;
    30213017    pThis->IHostAudio.pfnStreamGetPending           = drvHostAudioWasHA_StreamGetPending;
    3022     pThis->IHostAudio.pfnStreamGetStatus            = drvHostAudioWasHA_StreamGetStatus;
     3018    pThis->IHostAudio.pfnStreamGetState             = drvHostAudioWasHA_StreamGetState;
    30233019    pThis->IHostAudio.pfnStreamPlay                 = drvHostAudioWasHA_StreamPlay;
    30243020    pThis->IHostAudio.pfnStreamCapture              = drvHostAudioWasHA_StreamCapture;
  • trunk/src/VBox/Main/src-client/DrvAudioRec.cpp

    r88819 r88887  
    609609
    610610/**
    611  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    612  */
    613 static DECLCALLBACK(uint32_t) drvAudioVideoRecHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
    614 {
    615     RT_NOREF(pInterface, pStream);
    616     return PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED;
     611 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     612 */
     613static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvAudioVideoRecHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     614                                                                               PPDMAUDIOBACKENDSTREAM pStream)
     615{
     616    RT_NOREF(pInterface);
     617    AssertPtrReturn(pStream, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     618    return PDMHOSTAUDIOSTREAMSTATE_OKAY;
    617619}
    618620
     
    11121114    pThis->IHostAudio.pfnStreamGetWritable          = drvAudioVideoRecHA_StreamGetWritable;
    11131115    pThis->IHostAudio.pfnStreamGetPending           = NULL;
    1114     pThis->IHostAudio.pfnStreamGetStatus            = drvAudioVideoRecHA_StreamGetStatus;
     1116    pThis->IHostAudio.pfnStreamGetState             = drvAudioVideoRecHA_StreamGetState;
    11151117    pThis->IHostAudio.pfnStreamPlay                 = drvAudioVideoRecHA_StreamPlay;
    11161118    pThis->IHostAudio.pfnStreamCapture              = drvAudioVideoRecHA_StreamCapture;
  • trunk/src/VBox/Main/src-client/DrvAudioVRDE.cpp

    r88885 r88887  
    415415        }
    416416    }
    417     pDrv->pConsoleVRDPServer = NULL;
     417    pDrv->pConsoleVRDPServer = NULL;   /** @todo r=bird: WTF? */
    418418
    419419    return VINF_SUCCESS;
     
    595595
    596596/**
    597  * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetStatus}
    598  */
    599 static DECLCALLBACK(uint32_t) drvAudioVrdeHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
     597 * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetState}
     598 */
     599static DECLCALLBACK(PDMHOSTAUDIOSTREAMSTATE) drvAudioVrdeHA_StreamGetState(PPDMIHOSTAUDIO pInterface,
     600                                                                           PPDMAUDIOBACKENDSTREAM pStream)
    600601{
    601602    PDRVAUDIOVRDE pDrv = RT_FROM_MEMBER(pInterface, DRVAUDIOVRDE, IHostAudio);
    602     RT_NOREF(pStream);
    603 
    604     return pDrv->cClients > 0
    605          ? PDMAUDIOSTREAM_STS_INITIALIZED | PDMAUDIOSTREAM_STS_ENABLED
    606 #if 0 /* later mabye */ /** @todo r=bird: Weird backend status mess. */
    607          : PDMAUDIOSTREAM_STS_NONE /* play possum if the clients all disappears. Re-init should be underways. */;
    608 #else
    609          : PDMAUDIOSTREAM_STS_INITIALIZED /* If any clients are connected, flag the stream as enabled. */;
    610 #endif
     603    AssertPtrReturn(pStream, PDMHOSTAUDIOSTREAMSTATE_INVALID);
     604
     605    return pDrv->cClients > 0 ? PDMHOSTAUDIOSTREAMSTATE_OKAY : PDMHOSTAUDIOSTREAMSTATE_INACTIVE;
    611606}
    612607
     
    806801    pThis->IHostAudio.pfnStreamGetWritable          = drvAudioVrdeHA_StreamGetWritable;
    807802    pThis->IHostAudio.pfnStreamGetPending           = NULL;
    808     pThis->IHostAudio.pfnStreamGetStatus            = drvAudioVrdeHA_StreamGetStatus;
     803    pThis->IHostAudio.pfnStreamGetState             = drvAudioVrdeHA_StreamGetState;
    809804    pThis->IHostAudio.pfnStreamPlay                 = drvAudioVrdeHA_StreamPlay;
    810805    pThis->IHostAudio.pfnStreamCapture              = drvAudioVrdeHA_StreamCapture;
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