VirtualBox

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


Ignore:
Timestamp:
Aug 17, 2015 3:33:05 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
102162
Message:

Audio: Fixed playing/recording deprecated/left over samples when starting a new input/output stream.

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

Legend:

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

    r57393 r57398  
    318318        return;
    319319
     320    Log2Func(("pPCMInfo=%p, pvBuf=%p, cbBuf=%zu, fSigned=%RTbool, cBits=%RU8, cShift=%RU8\n",
     321              pPCMInfo, pvBuf, cbBuf, pPCMInfo->fSigned, pPCMInfo->cBits, pPCMInfo->cShift));
     322
    320323    if (pPCMInfo->fSigned)
    321324    {
     
    368371        }
    369372    }
     373}
     374
     375static int drvAudioControlHstIn(PDRVAUDIO pThis, PPDMAUDIOHSTSTRMIN pHstStrmIn, PDMAUDIOSTREAMCMD enmStreamCmd,
     376                                uint32_t uFlags)
     377{
     378    AssertPtrReturn(pThis, VERR_INVALID_POINTER);
     379    AssertPtrReturn(pHstStrmIn, VERR_INVALID_POINTER);
     380
     381    int rc;
     382
     383    switch (enmStreamCmd)
     384    {
     385        case PDMAUDIOSTREAMCMD_ENABLE:
     386        {
     387            if (!pHstStrmIn->fEnabled)
     388            {
     389                rc = pThis->pHostDrvAudio->pfnControlIn(pThis->pHostDrvAudio, pHstStrmIn, PDMAUDIOSTREAMCMD_ENABLE);
     390                if (RT_SUCCESS(rc))
     391                {
     392                    pHstStrmIn->fEnabled = true;
     393                }
     394                else
     395                    LogFlowFunc(("Backend reported an error when opening input stream, rc=%Rrc\n", rc));
     396            }
     397            else
     398                rc = VINF_SUCCESS;
     399
     400            break;
     401        }
     402
     403        case PDMAUDIOSTREAMCMD_DISABLE:
     404        {
     405            if (pHstStrmIn->fEnabled)
     406            {
     407                rc = pThis->pHostDrvAudio->pfnControlIn(pThis->pHostDrvAudio, pHstStrmIn, PDMAUDIOSTREAMCMD_DISABLE);
     408                if (RT_SUCCESS(rc))
     409                {
     410                    pHstStrmIn->fEnabled = false;
     411                    AudioMixBufClear(&pHstStrmIn->MixBuf);
     412                }
     413                else
     414                    LogFlowFunc(("Backend vetoed closing output stream, rc=%Rrc\n", rc));
     415            }
     416            else
     417                rc = VINF_SUCCESS;
     418
     419            break;
     420        }
     421
     422        default:
     423            AssertMsgFailed(("Command %ld not implemented\n", enmStreamCmd));
     424            rc = VERR_NOT_IMPLEMENTED;
     425            break;
     426    }
     427
     428    return rc;
     429}
     430
     431static int drvAudioControlHstOut(PDRVAUDIO pThis, PPDMAUDIOHSTSTRMOUT pHstStrmOut, PDMAUDIOSTREAMCMD enmStreamCmd,
     432                                 uint32_t uFlags)
     433{
     434    AssertPtrReturn(pThis, VERR_INVALID_POINTER);
     435    AssertPtrReturn(pHstStrmOut, VERR_INVALID_POINTER);
     436
     437    int rc;
     438
     439    switch (enmStreamCmd)
     440    {
     441        case PDMAUDIOSTREAMCMD_ENABLE:
     442        {
     443            if (!pHstStrmOut->fEnabled)
     444            {
     445                rc = pThis->pHostDrvAudio->pfnControlOut(pThis->pHostDrvAudio, pHstStrmOut, PDMAUDIOSTREAMCMD_ENABLE);
     446                if (RT_SUCCESS(rc))
     447                {
     448                    pHstStrmOut->fEnabled = true;
     449                }
     450                else
     451                    LogFlowFunc(("Backend reported an error when opening output stream, rc=%Rrc\n", rc));
     452            }
     453            else
     454                rc = VINF_SUCCESS;
     455
     456            break;
     457        }
     458
     459        case PDMAUDIOSTREAMCMD_DISABLE:
     460        {
     461            if (pHstStrmOut->fEnabled)
     462            {
     463                rc = pThis->pHostDrvAudio->pfnControlOut(pThis->pHostDrvAudio, pHstStrmOut, PDMAUDIOSTREAMCMD_DISABLE);
     464                if (RT_SUCCESS(rc))
     465                {
     466                    pHstStrmOut->fEnabled = false;
     467                    AudioMixBufClear(&pHstStrmOut->MixBuf);
     468                }
     469                else
     470                    LogFlowFunc(("Backend vetoed closing output stream, rc=%Rrc\n", rc));
     471            }
     472            else
     473                rc = VINF_SUCCESS;
     474
     475            break;
     476        }
     477
     478        default:
     479            AssertMsgFailed(("Command %ld not implemented\n", enmStreamCmd));
     480            rc = VERR_NOT_IMPLEMENTED;
     481            break;
     482    }
     483
     484    return rc;
    370485}
    371486
     
    10451160        {
    10461161            /* Stop playing the current (pending) stream. */
    1047             int rc2 = pThis->pHostDrvAudio->pfnControlOut(pThis->pHostDrvAudio, pHstStrmOut,
    1048                                                           PDMAUDIOSTREAMCMD_DISABLE);
     1162            int rc2 = drvAudioControlHstOut(pThis, pHstStrmOut, PDMAUDIOSTREAMCMD_DISABLE, 0 /* Flags */);
    10491163            if (RT_SUCCESS(rc2))
    10501164            {
    1051                 pHstStrmOut->fEnabled        = false;
    10521165                pHstStrmOut->fPendingDisable = false;
    10531166
     
    12941407    PPDMAUDIOHSTSTRMOUT pHstStrmOut = NULL;
    12951408    while ((pHstStrmOut = drvAudioHstFindAnyEnabledOut(pThis, pHstStrmOut)))
    1296         pThis->pHostDrvAudio->pfnControlOut(pThis->pHostDrvAudio, pHstStrmOut, enmCmd);
     1409        drvAudioControlHstOut(pThis, pHstStrmOut, enmCmd, 0 /* Flags */);
    12971410
    12981411    PPDMAUDIOHSTSTRMIN pHstStrmIn = NULL;
    12991412    while ((pHstStrmIn = drvAudioFindNextEnabledHstIn(pThis, pHstStrmIn)))
    1300         pThis->pHostDrvAudio->pfnControlIn(pThis->pHostDrvAudio, pHstStrmIn, enmCmd);
     1413        drvAudioControlHstIn(pThis, pHstStrmIn, enmCmd, 0 /* Flags */);
    13011414}
    13021415
     
    14511564    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
    14521565
     1566    int rc = VINF_SUCCESS;
     1567
    14531568    if (pGstStrmOut)
    14541569    {
    14551570        PPDMAUDIOHSTSTRMOUT pHstStrmOut = pGstStrmOut->pHstStrmOut;
    14561571        AssertPtr(pHstStrmOut);
    1457 
    1458         LogFlowFunc(("%s: fEnable=%RTbool\n", pGstStrmOut->MixBuf.pszName, fEnable));
    14591572
    14601573        if (pGstStrmOut->State.fActive != fEnable)
     
    14641577                pHstStrmOut->fPendingDisable = false;
    14651578                if (!pHstStrmOut->fEnabled)
    1466                 {
    1467                     pHstStrmOut->fEnabled = true;
    1468                     pThis->pHostDrvAudio->pfnControlOut(pThis->pHostDrvAudio, pHstStrmOut,
    1469                                                         PDMAUDIOSTREAMCMD_ENABLE);
    1470                     /** @todo Check rc. */
    1471                 }
     1579                    rc = drvAudioControlHstOut(pThis, pHstStrmOut, PDMAUDIOSTREAMCMD_ENABLE, 0 /* Flags */);
    14721580            }
    14731581            else
     
    14881596            }
    14891597
    1490             pGstStrmOut->State.fActive = fEnable;
    1491         }
    1492     }
    1493 
    1494     return VINF_SUCCESS;
     1598            if (RT_SUCCESS(rc))
     1599                pGstStrmOut->State.fActive = fEnable;
     1600
     1601            LogFlowFunc(("%s: fEnable=%RTbool, rc=%Rrc\n", pGstStrmOut->MixBuf.pszName, fEnable, rc));
     1602        }
     1603    }
     1604
     1605    return rc;
    14951606}
    14961607
     
    15031614    PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
    15041615
     1616    int rc = VINF_SUCCESS;
     1617
    15051618    if (pGstStrmIn)
    15061619    {
     
    15121625        if (pGstStrmIn->State.fActive != fEnable)
    15131626        {
    1514             if (fEnable)
    1515             {
    1516                 if (!pHstStrmIn->fEnabled)
    1517                 {
    1518                     int rc2 = pThis->pHostDrvAudio->pfnControlIn(pThis->pHostDrvAudio, pHstStrmIn,
    1519                                                                  PDMAUDIOSTREAMCMD_ENABLE);
    1520                     if (RT_LIKELY(RT_SUCCESS(rc2)))
    1521                         pHstStrmIn->fEnabled = true;
    1522                     else
    1523                         LogFlowFunc(("Error opening host input stream in backend, rc=%Rrc\n", rc2));
    1524                 }
    1525             }
    1526             else
    1527             {
    1528                 if (pHstStrmIn->fEnabled)
    1529                 {
    1530                     int rc2 = pThis->pHostDrvAudio->pfnControlIn(pThis->pHostDrvAudio, pHstStrmIn,
    1531                                                                  PDMAUDIOSTREAMCMD_DISABLE);
    1532                     if (RT_LIKELY(RT_SUCCESS(rc2))) /* Did the backend veto? */
    1533                         pHstStrmIn->fEnabled = false;
    1534                     else
    1535                         LogFlowFunc(("Backend vetoed closing input stream, rc=%Rrc\n", rc2));
    1536                 }
    1537             }
    1538 
    1539             pGstStrmIn->State.fActive = fEnable;
    1540         }
    1541     }
    1542 
    1543     return VINF_SUCCESS;
     1627            rc = drvAudioControlHstIn(pThis, pHstStrmIn,
     1628                                      fEnable ? PDMAUDIOSTREAMCMD_ENABLE : PDMAUDIOSTREAMCMD_DISABLE, 0 /* Flags */);
     1629            if (RT_SUCCESS(rc))
     1630                pGstStrmIn->State.fActive = fEnable;
     1631
     1632            LogFlowFunc(("%s: fEnable=%RTbool, rc=%Rrc\n", pGstStrmIn->MixBuf.pszName, fEnable, rc));
     1633        }
     1634    }
     1635
     1636    return rc;
    15441637}
    15451638
     
    17781871    while ((pHstStrmOut = drvAudioFindAnyHstOut(pThis, pHstStrmOut)))
    17791872    {
    1780         pThis->pHostDrvAudio->pfnControlOut(pThis->pHostDrvAudio, pHstStrmOut, PDMAUDIOSTREAMCMD_DISABLE);
     1873        drvAudioControlHstOut(pThis, pHstStrmOut, PDMAUDIOSTREAMCMD_DISABLE, 0 /* Flags */);
    17811874        pThis->pHostDrvAudio->pfnFiniOut(pThis->pHostDrvAudio, pHstStrmOut);
    17821875    }
     
    17861879    while ((pHstStrmIn = drvAudioFindNextHstIn(pThis, pHstStrmIn)))
    17871880    {
    1788         pThis->pHostDrvAudio->pfnControlIn(pThis->pHostDrvAudio, pHstStrmIn, PDMAUDIOSTREAMCMD_DISABLE);
     1881        drvAudioControlHstIn(pThis, pHstStrmIn, PDMAUDIOSTREAMCMD_DISABLE, 0 /* Flags */);
    17891882        pThis->pHostDrvAudio->pfnFiniIn(pThis->pHostDrvAudio, pHstStrmIn);
    17901883    }
  • trunk/src/VBox/Devices/Audio/DrvHostDSound.cpp

    r57383 r57398  
    549549    if (pDSoundStrmOut->pDSB != NULL)
    550550    {
    551         DWORD dwStatus;
    552551        /* This performs some restore, so call it anyway and ignore result. */
    553         dsoundPlayGetStatus(pDSoundStrmOut->pDSB, &dwStatus);
     552        dsoundPlayGetStatus(pDSoundStrmOut->pDSB, NULL /* Status */);
    554553
    555554        LogFlowFunc(("Playback stopped\n"));
    556555
    557556        HRESULT hr = IDirectSoundBuffer8_Stop(pDSoundStrmOut->pDSB);
    558         if (FAILED(hr))
     557        if (SUCCEEDED(hr))
     558        {
     559            dsoundPlayClearSamples(pDSoundStrmOut);
     560        }
     561        else
    559562            LogRelMax(s_cMaxRelLogEntries, ("DSound: Errpor stopping playback buffer: %Rhrc\n", hr));
    560563    }
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