VirtualBox

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


Ignore:
Timestamp:
Feb 1, 2017 2:37:13 PM (8 years ago)
Author:
vboxsync
Message:

Audio: Make use of pvBuf/cbBuf parameters in PDMIHOSTAUDIO::pfnStreamPlay() and PDMIHOSTAUDIO::pfnStreamCapture() to further abstract the backends from the audio connector. The backends now won't be allowed to operate on the audio connector's mixing buffers directly anymore that way.

File:
1 edited

Legend:

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

    r65565 r65567  
    203203}
    204204
    205 static int coreAudioStreamCfgToASBD(PPDMAUDIOSTREAMCFG pCfg, AudioStreamBasicDescription *pASBD)
    206 {
    207     AssertPtrReturn(pCfg,  VERR_INVALID_PARAMETER);
    208     AssertPtrReturn(pASBD, VERR_INVALID_PARAMETER);
    209 
    210     PDMAUDIOPCMPROPS Props;
    211     int rc = DrvAudioHlpStreamCfgToProps(pCfg, &Props);
    212     if (RT_SUCCESS(rc))
    213         coreAudioPCMPropsToASBD(&Props, pASBD);
    214 
    215     return rc;
    216 }
    217 
    218205#ifndef VBOX_WITH_AUDIO_CALLBACKS
    219206static int coreAudioASBDToStreamCfg(AudioStreamBasicDescription *pASBD, PPDMAUDIOSTREAMCFG pCfg)
     
    408395    /** Pointer to driver instance this stream is bound to. */
    409396    PDRVHOSTCOREAUDIO           pDrv;
     397    /** The PCM properties of this stream. */
     398    PDMAUDIOPCMPROPS            Props;
    410399    /** The stream's direction. */
    411400    PDMAUDIODIR                 enmDir;
     
    16241613
    16251614    /* Create the recording device's out format based on our required audio settings. */
    1626     int rc = coreAudioStreamCfgToASBD(pCfgReq, &pCAStream->asbdStream);
     1615    int rc = DrvAudioHlpStreamCfgToProps(pCfgReq, &pCAStream->Props);
    16271616    if (RT_FAILURE(rc))
    16281617    {
    1629         LogRel(("CoreAudio: Failed to convert requested %s format to native format (%Rrc)\n",
    1630                 fIn ? "input" : "output", rc));
     1618        LogRel(("CoreAudio: Failed to convert requested %s format to native format (%Rrc)\n", fIn ? "input" : "output", rc));
    16311619        return rc;
    16321620    }
     1621
     1622    coreAudioPCMPropsToASBD(&pCAStream->Props, &pCAStream->asbdStream);
    16331623
    16341624    coreAudioPrintASBD(  fIn
     
    19351925                                                       void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead)
    19361926{
    1937     RT_NOREF(pvBuf, cbBuf); /** @todo r=bird: this looks totally weird at first glance! */
    1938 
    19391927    AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
    19401928    AssertPtrReturn(pStream,    VERR_INVALID_POINTER);
     
    19701958
    19711959    int rc = VINF_SUCCESS;
    1972     uint32_t csWrittenTotal = 0;
     1960
     1961    uint32_t cbReadTotal = 0;
    19731962
    19741963    rc = RTCritSectEnter(&pCAStream->CritSect);
     
    19771966    do
    19781967    {
    1979         size_t cbMixBuf  = AudioMixBufSizeBytes(&pStream->MixBuf);
    1980         size_t cbToWrite = RT_MIN(cbMixBuf, RTCircBufUsed(pCAStream->pCircBuf));
    1981 
    1982         uint32_t csWritten, cbWritten;
     1968        size_t cbToWrite = RT_MIN(cbBuf, RTCircBufUsed(pCAStream->pCircBuf));
    19831969
    19841970        uint8_t *pvChunk;
    19851971        size_t   cbChunk;
    19861972
    1987         Log3Func(("cbMixBuf=%zu, cbToWrite=%zu/%zu\n", cbMixBuf, cbToWrite, RTCircBufSize(pCAStream->pCircBuf)));
     1973        Log3Func(("cbToWrite=%zu/%zu\n", cbToWrite, RTCircBufSize(pCAStream->pCircBuf)));
    19881974
    19891975        while (cbToWrite)
     
    20051991                    AssertFailed();
    20061992#endif
    2007                 rc = AudioMixBufWriteCirc(&pStream->MixBuf, pvChunk, cbChunk, &csWritten);
    2008                 if (rc == VERR_BUFFER_OVERFLOW)
    2009                 {
    2010                     LogRel2(("Core Audio: Capturing host buffer full\n"));
    2011                     rc = VINF_SUCCESS;
    2012                 }
     1993                memcpy((uint8_t *)pvBuf + cbReadTotal, pvChunk, cbChunk);
    20131994            }
    20141995
     
    20192000                break;
    20202001
    2021             cbWritten = AUDIOMIXBUF_S2B(&pStream->MixBuf, csWritten);
    2022 
    2023             Assert(cbToWrite >= cbWritten);
    2024             cbToWrite      -= cbWritten;
    2025 
    2026             csWrittenTotal += csWritten;
     2002            Assert(cbToWrite >= cbChunk);
     2003            cbToWrite      -= cbChunk;
     2004
     2005            cbReadTotal    += cbChunk;
    20272006        }
    20282007    }
     
    20322011    AssertRC(rc2);
    20332012
    2034 #ifdef LOG_ENABLED
    2035     uint32_t cbWrittenTotal = AUDIOMIXBUF_S2B(&pStream->MixBuf, csWrittenTotal);
    2036     Log3Func(("csWrittenTotal=%RU32 (%RU32 bytes), rc=%Rrc\n", csWrittenTotal, cbWrittenTotal, rc));
    2037 #endif
    2038 
    20392013    if (RT_SUCCESS(rc))
    20402014    {
    2041         uint32_t csMixed = 0;
    2042 
    2043         if (csWrittenTotal)
    2044             rc = AudioMixBufMixToParent(&pStream->MixBuf, csWrittenTotal, &csMixed);
    2045 
    2046         Log3Func(("csMixed=%RU32\n", csMixed));
    2047 
    20482015        if (pcbRead)
    2049             *pcbRead = csMixed;
    2050     }
    2051 
    2052     if (RT_FAILURE(rc))
    2053         LogFunc(("Failed with rc=%Rrc\n", rc));
     2016            *pcbRead = cbReadTotal;
     2017    }
    20542018
    20552019    return rc;
     
    20632027                                                    uint32_t *pcbWritten)
    20642028{
    2065     RT_NOREF(pvBuf, cbBuf);
    2066 
    20672029    PDRVHOSTCOREAUDIO pThis     = PDMIHOSTAUDIO_2_DRVHOSTCOREAUDIO(pInterface);
    20682030    PCOREAUDIOSTREAM  pCAStream = (PCOREAUDIOSTREAM)pStream;
     
    20932055    }
    20942056
    2095     uint32_t cLive = AudioMixBufLive(&pStream->MixBuf);
    2096     if (!cLive) /* Not live samples to play? Bail out. */
    2097     {
    2098         if (pcbWritten)
    2099             *pcbWritten = 0;
    2100         return VINF_SUCCESS;
    2101     }
    2102 
    2103     size_t cbLive  = AUDIOMIXBUF_S2B(&pStream->MixBuf, cLive);
    2104 
    2105     uint32_t cbReadTotal = 0;
     2057    uint32_t cbWrittenTotal = 0;
    21062058
    21072059    int rc = VINF_SUCCESS;
     
    21102062    AssertRC(rc);
    21112063
    2112     size_t cbToRead = RT_MIN(cbLive, RTCircBufFree(pCAStream->pCircBuf));
    2113     Log3Func(("cbLive=%zu, cbToRead=%zu\n", cbLive, cbToRead));
     2064    size_t cbToWrite = RT_MIN(cbBuf, RTCircBufFree(pCAStream->pCircBuf));
     2065    Log3Func(("cbToWrite=%zu\n", cbToWrite));
    21142066
    21152067    uint8_t *pvChunk;
    21162068    size_t   cbChunk;
    21172069
    2118     while (cbToRead)
    2119     {
    2120         uint32_t cRead, cbRead;
    2121 
     2070    while (cbToWrite)
     2071    {
    21222072        /* Try to acquire the necessary space from the ring buffer. */
    2123         RTCircBufAcquireWriteBlock(pCAStream->pCircBuf, cbToRead, (void **)&pvChunk, &cbChunk);
     2073        RTCircBufAcquireWriteBlock(pCAStream->pCircBuf, cbToWrite, (void **)&pvChunk, &cbChunk);
    21242074        if (!cbChunk)
    21252075        {
     
    21282078        }
    21292079
    2130         Assert(cbChunk <= cbToRead);
    2131 
    2132         rc = AudioMixBufReadCirc(&pStream->MixBuf, pvChunk, cbChunk, &cRead);
    2133 
    2134         cbRead = AUDIOMIXBUF_S2B(&pStream->MixBuf, cRead);
     2080        Assert(cbChunk <= cbToWrite);
     2081        Assert(cbWrittenTotal + cbChunk <= cbBuf);
     2082
     2083        memcpy((uint8_t *)pvBuf + cbWrittenTotal, pvChunk, cbChunk);
    21352084
    21362085        /* Release the ring buffer, so the read thread could start reading this data. */
     
    21402089            break;
    21412090
    2142         Assert(cbToRead >= cbRead);
    2143         cbToRead -= cbRead;
    2144         cbReadTotal += cbRead;
     2091        Assert(cbToWrite >= cbChunk);
     2092        cbToWrite      -= cbChunk;
     2093
     2094        cbWrittenTotal += cbChunk;
    21452095    }
    21462096
     
    21632113    if (RT_SUCCESS(rc))
    21642114    {
    2165         uint32_t cReadTotal = AUDIOMIXBUF_B2S(&pStream->MixBuf, cbReadTotal);
    2166         if (cReadTotal)
    2167             AudioMixBufFinish(&pStream->MixBuf, cReadTotal);
    2168 
    2169         Log3Func(("cReadTotal=%RU32 (%RU32 bytes)\n", cReadTotal, cbReadTotal));
    2170 
    21712115        if (pcbWritten)
    2172             *pcbWritten = cReadTotal;
     2116            *pcbWritten = cbWrittenTotal;
    21732117    }
    21742118
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