VirtualBox

Changeset 59275 in vbox


Ignore:
Timestamp:
Jan 7, 2016 11:57:56 AM (9 years ago)
Author:
vboxsync
Message:

Audio: Don't crash if backend is unable to initialize (bugref:8180).

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

Legend:

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

    r58600 r59275  
    77
    88/*
    9  * Copyright (C) 2014-2015 Oracle Corporation
     9 * Copyright (C) 2014-2016 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    250250}
    251251
     252int AudioMixerGetDeviceFormat(PAUDIOMIXER pMixer, PPDMAUDIOSTREAMCFG pCfg)
     253{
     254    AssertPtrReturn(pMixer, VERR_INVALID_POINTER);
     255    AssertPtrReturn(pCfg, VERR_INVALID_POINTER);
     256
     257    /** @todo Perform a deep copy, if needed. */
     258    *pCfg = pMixer->devFmt;
     259
     260    return VINF_SUCCESS;
     261}
     262
    252263uint32_t AudioMixerGetStreamCount(PAUDIOMIXER pMixer)
    253264{
  • trunk/src/VBox/Devices/Audio/AudioMixer.h

    r56689 r59275  
    77
    88/*
    9  * Copyright (C) 2014-2015 Oracle Corporation
     9 * Copyright (C) 2014-2016 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    9898int AudioMixerCreate(const char *pszName, uint32_t uFlags, PAUDIOMIXER *ppMixer);
    9999void AudioMixerDestroy(PAUDIOMIXER pMixer);
     100int AudioMixerGetDeviceFormat(PAUDIOMIXER pMixer, PPDMAUDIOSTREAMCFG pCfg);
    100101uint32_t AudioMixerGetStreamCount(PAUDIOMIXER pMixer);
    101102void AudioMixerInvalidate(PAUDIOMIXER pMixer);
  • trunk/src/VBox/Devices/Audio/DevIchAc97.cpp

    r59191 r59275  
    55
    66/*
    7  * Copyright (C) 2006-2015 Oracle Corporation
     7 * Copyright (C) 2006-2016 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3636#include "AudioMixBuffer.h"
    3737#include "AudioMixer.h"
     38#include "DrvAudio.h"
    3839
    3940
     
    11731174    STAM_PROFILE_START(&pThis->StatTimer, a);
    11741175
    1175     int rc = VINF_SUCCESS;
    1176 
    11771176    uint32_t cbInMax  = 0;
    11781177    uint32_t cbOutMin = UINT32_MAX;
     
    11851184
    11861185    pThis->uTimerTS = cTicksNow;
     1186
     1187    /*
     1188     * Calculate the mixer's (fixed) sampling rate.
     1189     */
     1190    AssertPtr(pThis->pMixer);
     1191
     1192    PDMAUDIOSTREAMCFG mixerStrmCfg;
     1193    int rc = AudioMixerGetDeviceFormat(pThis->pMixer, &mixerStrmCfg);
     1194    AssertRC(rc);
     1195
     1196    PDMPCMPROPS mixerStrmProps;
     1197    rc = DrvAudioStreamCfgToProps(&mixerStrmCfg, &mixerStrmProps);
     1198    AssertRC(rc);
     1199
     1200    uint32_t cMixerSamplesMin  = (int)((2 * cTicksElapsed * mixerStrmCfg.uHz + cTicksPerSec) / cTicksPerSec / 2);
     1201    uint32_t cbMixerSamplesMin = cMixerSamplesMin << mixerStrmProps.cShift;
    11871202
    11881203    RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node)
     
    11991214        LogFlowFunc(("LUN#%RU8: rc=%Rrc, cbIn=%RU32, cbOut=%RU32\n", pDrv->uLUN, rc, cbIn, cbOut));
    12001215#endif
    1201         const bool fIsActiveOut = pDrv->pConnector->pfnIsActiveOut(pDrv->pConnector, pDrv->Out.pStrmOut);
    1202 
    12031216        /* If we there was an error handling (available) output or there simply is no output available,
    12041217         * then calculate the minimum data rate which must be processed by the device emulation in order
     
    12071220         * This is not the optimal solution, but as we have to deal with this on a timer-based approach
    12081221         * (until we have the audio callbacks) we need to have device' DMA engines running. */
     1222        if (!pDrv->pConnector->pfnIsValidOut(pDrv->pConnector, pDrv->Out.pStrmOut))
     1223        {
     1224            /* Use the mixer's (fixed) sampling rate. */
     1225            cbOut = RT_MAX(cbOut, cbMixerSamplesMin);
     1226            continue;
     1227        }
     1228
     1229        const bool fIsActiveOut = pDrv->pConnector->pfnIsActiveOut(pDrv->pConnector, pDrv->Out.pStrmOut);
    12091230        if (   RT_FAILURE(rc)
    12101231            || !fIsActiveOut)
     
    24202441
    24212442            uint8_t cFailed = 0;
    2422             if (!pCon->pfnIsInputOK (pCon, pDrv->LineIn.pStrmIn))
     2443            if (!pCon->pfnIsValidIn (pCon, pDrv->LineIn.pStrmIn))
    24232444                cFailed++;
    2424             if (!pCon->pfnIsInputOK (pCon, pDrv->MicIn.pStrmIn))
     2445            if (!pCon->pfnIsValidIn (pCon, pDrv->MicIn.pStrmIn))
    24252446                cFailed++;
    2426             if (!pCon->pfnIsOutputOK(pCon, pDrv->Out.pStrmOut))
     2447            if (!pCon->pfnIsValidOut(pCon, pDrv->Out.pStrmOut))
    24272448                cFailed++;
    24282449
     
    24432464            else if (cFailed)
    24442465            {
    2445                 if (!pDrv->pConnector->pfnIsInputOK(pDrv->pConnector, pDrv->LineIn.pStrmIn))
     2466                if (!pDrv->pConnector->pfnIsValidIn (pDrv->pConnector, pDrv->LineIn.pStrmIn))
    24462467                    LogRel(("AC97: WARNING: Unable to open PCM line input for LUN #%RU32!\n",       pDrv->uLUN));
    2447                 if (!pDrv->pConnector->pfnIsInputOK(pDrv->pConnector, pDrv->MicIn.pStrmIn))
     2468                if (!pDrv->pConnector->pfnIsValidIn (pDrv->pConnector, pDrv->MicIn.pStrmIn))
    24482469                    LogRel(("AC97: WARNING: Unable to open PCM microphone input for LUN #%RU32!\n", pDrv->uLUN));
    2449                 if (!pDrv->pConnector->pfnIsOutputOK(pDrv->pConnector, pDrv->Out.pStrmOut))
     2470                if (!pDrv->pConnector->pfnIsValidOut(pDrv->pConnector, pDrv->Out.pStrmOut))
    24502471                    LogRel(("AC97: WARNING: Unable to open PCM output for LUN #%RU32!\n",           pDrv->uLUN));
    24512472
    24522473                char   szMissingStreams[255];
    24532474                size_t len = 0;
    2454                 if (!pCon->pfnIsInputOK (pCon, pDrv->LineIn.pStrmIn))
     2475                if (!pCon->pfnIsValidIn (pCon, pDrv->LineIn.pStrmIn))
    24552476                    len = RTStrPrintf(szMissingStreams,
    24562477                                      sizeof(szMissingStreams), "PCM Input");
    2457                 if (!pCon->pfnIsOutputOK(pCon, pDrv->Out.pStrmOut))
     2478                if (!pCon->pfnIsValidIn (pCon, pDrv->MicIn.pStrmIn))
     2479                    len += RTStrPrintf(szMissingStreams + len,
     2480                                       sizeof(szMissingStreams) - len, len ? ", PCM Microphone" : "PCM Microphone");
     2481                if (!pCon->pfnIsValidOut(pCon, pDrv->Out.pStrmOut))
    24582482                    len += RTStrPrintf(szMissingStreams + len,
    24592483                                       sizeof(szMissingStreams) - len, len ? ", PCM Output" : "PCM Output");
    2460                 if (!pCon->pfnIsInputOK (pCon, pDrv->MicIn.pStrmIn))
    2461                     len += RTStrPrintf(szMissingStreams + len,
    2462                                        sizeof(szMissingStreams) - len, len ? ", PCM Microphone" : "PCM Microphone");
    24632484
    24642485                PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "HostAudioNotResponding",
  • trunk/src/VBox/Devices/Audio/DevIchHda.cpp

    r59272 r59275  
    99
    1010/*
    11  * Copyright (C) 2006-2015 Oracle Corporation
     11 * Copyright (C) 2006-2016 Oracle Corporation
    1212 *
    1313 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    4646#include "AudioMixer.h"
    4747#include "DevIchHdaCodec.h"
     48#include "DrvAudio.h"
    4849
    4950
     
    21332134
    21342135#ifdef IN_RING3
    2135 static int hdaSdFmtToAudSettings(uint32_t u32SdFmt, PPDMAUDIOSTREAMCFG pCfg)
     2136static int hdaSDFMTToStrmCfg(uint32_t u32SdFmt, PPDMAUDIOSTREAMCFG pCfg)
    21362137{
    21372138    AssertPtrReturn(pCfg, VERR_INVALID_POINTER);
     
    22252226        return VINF_SUCCESS;
    22262227
    2227     PDMAUDIOSTREAMCFG as;
    2228     int rc = hdaSdFmtToAudSettings(u32Value, &as);
     2228    PDMAUDIOSTREAMCFG strmCfg;
     2229    int rc = hdaSDFMTToStrmCfg(u32Value, &strmCfg);
    22292230    if (RT_FAILURE(rc))
    22302231        return rc;
     
    22352236        case HDA_REG_SD0FMT:
    22362237            RTListForEach(&pThis->lstDrv, pDrv, HDADRIVER, Node)
    2237                 rc = hdaCodecOpenStream(pThis->pCodec, PI_INDEX, &as);
     2238                rc = hdaCodecOpenStream(pThis->pCodec, PI_INDEX, &strmCfg);
    22382239            break;
    22392240#  ifdef VBOX_WITH_HDA_MIC_IN
    22402241        case HDA_REG_SD2FMT:
    22412242            RTListForEach(&pThis->lstDrv, pDrv, HDADRIVER, Node)
    2242                 rc = hdaCodecOpenStream(pThis->pCodec, MC_INDEX, &as);
     2243                rc = hdaCodecOpenStream(pThis->pCodec, MC_INDEX, &strmCfg);
    22432244            break;
    22442245#  endif
     
    30213022    pThis->uTimerTS = cTicksNow;
    30223023
     3024    /*
     3025     * Calculate the codec's (fixed) sampling rate.
     3026     */
     3027    AssertPtr(pThis->pCodec);
     3028    PDMPCMPROPS codecStrmProps;
     3029
     3030    int rc = DrvAudioStreamCfgToProps(&pThis->pCodec->strmCfg, &codecStrmProps);
     3031    AssertRC(rc);
     3032
     3033    uint32_t cCodecSamplesMin  = (int)((2 * cTicksElapsed * pThis->pCodec->strmCfg.uHz + cTicksPerSec) / cTicksPerSec / 2);
     3034    uint32_t cbCodecSamplesMin = cCodecSamplesMin << codecStrmProps.cShift;
     3035
     3036    /*
     3037     * Process all driver nodes.
     3038     */
    30233039    RTListForEach(&pThis->lstDrv, pDrv, HDADRIVER, Node)
    30243040    {
     
    30263042        uint32_t cbOut = 0;
    30273043
    3028         int rc = pDrv->pConnector->pfnQueryStatus(pDrv->pConnector, &cbIn, &cbOut, NULL /* pcSamplesLive */);
     3044        rc = pDrv->pConnector->pfnQueryStatus(pDrv->pConnector, &cbIn, &cbOut, NULL /* pcSamplesLive */);
    30293045        if (RT_SUCCESS(rc))
    30303046            rc = pDrv->pConnector->pfnPlayOut(pDrv->pConnector, NULL /* pcSamplesPlayed */);
     
    30333049        LogFlowFunc(("LUN#%RU8: rc=%Rrc, cbIn=%RU32, cbOut=%RU32\n", pDrv->uLUN, rc, cbIn, cbOut));
    30343050#endif
    3035         const bool fIsActiveOut = pDrv->pConnector->pfnIsActiveOut(pDrv->pConnector, pDrv->Out.pStrmOut);
    3036 
    30373051        /* If we there was an error handling (available) output or there simply is no output available,
    30383052         * then calculate the minimum data rate which must be processed by the device emulation in order
     
    30413055         * This is not the optimal solution, but as we have to deal with this on a timer-based approach
    30423056         * (until we have the audio callbacks) we need to have device' DMA engines running. */
     3057        if (!pDrv->pConnector->pfnIsValidOut(pDrv->pConnector, pDrv->Out.pStrmOut))
     3058        {
     3059            /* Use the codec's (fixed) sampling rate. */
     3060            cbOut = RT_MAX(cbOut, cbCodecSamplesMin);
     3061            continue;
     3062        }
     3063
     3064        const bool fIsActiveOut = pDrv->pConnector->pfnIsActiveOut(pDrv->pConnector, pDrv->Out.pStrmOut);
    30433065        if (   RT_FAILURE(rc)
    30443066            || !fIsActiveOut)
     
    38163838
    38173839                /* Load BDLE states. */
    3818                 HDABDLESTATE  StateDummy;
    3819                 PHDABDLESTATE pState;
    38203840                for (uint32_t a = 0; a < pStrm->State.cBDLE; a++)
    38213841                {
  • trunk/src/VBox/Devices/Audio/DevIchHdaCodec.cpp

    r59257 r59275  
    99
    1010/*
    11  * Copyright (C) 2006-2015 Oracle Corporation
     11 * Copyright (C) 2006-2016 Oracle Corporation
    1212 *
    1313 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    26072607
    26082608    int rc;
    2609 
    26102609    switch (enmSoundSource)
    26112610    {
    26122611        case PI_INDEX:
    2613             rc = pThis->pfnOpenIn(pThis->pHDAState, "hda.in", PDMAUDIORECSOURCE_LINE_IN, pCfg);
     2612            rc = pThis->pfnOpenIn(pThis->pHDAState,  "hda.in", PDMAUDIORECSOURCE_LINE_IN, pCfg);
    26142613            break;
    2615 
     2614#ifdef VBOX_WITH_HDA_MIC_IN
     2615        case MC_INDEX:
     2616            rc = pThis->pfnOpenIn(pThis->pHDAState,  "hda.mc", PDMAUDIORECSOURCE_MIC, pCfg);
     2617            break;
     2618#endif
    26162619        case PO_INDEX:
    26172620            rc = pThis->pfnOpenOut(pThis->pHDAState, "hda.out", pCfg);
    26182621            break;
    26192622
    2620 #ifdef VBOX_WITH_HDA_MIC_IN
    2621         case MC_INDEX:
    2622             rc = pThis->pfnOpenIn(pThis->pHDAState, "hda.mc", PDMAUDIORECSOURCE_MIC, pCfg);
    2623             break;
    2624 #endif
    26252623        default:
    26262624            AssertMsgFailed(("Index %ld not implemented\n", enmSoundSource));
     
    27312729    pThis->paVerbs   = &g_aCodecVerbs[0];
    27322730    pThis->cVerbs    = RT_ELEMENTS(g_aCodecVerbs);
     2731
    27332732    pThis->pfnLookup       = codecLookup;
    27342733#ifdef DEBUG
     
    27472746    pThis->paNodes[1].afg.u32F20_param = CODEC_MAKE_F20(pThis->u16VendorId, pThis->u8BSKU, pThis->u8AssemblyId);
    27482747
    2749     /* 44.1 kHz. */
    2750     PDMAUDIOSTREAMCFG as;
    2751     as.uHz           = 44100;
    2752     as.cChannels     = 2;
    2753     as.enmFormat     = AUD_FMT_S16;
    2754     as.enmEndianness = PDMAUDIOHOSTENDIANNESS;
    2755 
    2756     pThis->paNodes[1].node.au32F00_param[0xA] = CODEC_F00_0A_16_BIT;
    2757 
    2758     hdaCodecOpenStream(pThis, PI_INDEX, &as);
    2759     hdaCodecOpenStream(pThis, PO_INDEX, &as);
     2748    /* This codec uses a fixed setting (44.1 kHz, 16-bit signed, 2 channels). */
     2749    pThis->strmCfg.uHz           = 44100;
     2750    pThis->strmCfg.cChannels     = 2;
     2751    pThis->strmCfg.enmFormat     = AUD_FMT_S16;
     2752    pThis->strmCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
     2753
     2754    hdaCodecOpenStream(pThis, PI_INDEX, &pThis->strmCfg);
    27602755#ifdef VBOX_WITH_HDA_MIC_IN
    2761     hdaCodecOpenStream(pThis, MC_INDEX, &as);
     2756    hdaCodecOpenStream(pThis, MC_INDEX, &pThis->strmCfg);
    27622757#endif
    2763 
    2764     pThis->paNodes[1].node.au32F00_param[0xA] |= CODEC_F00_0A_44_1KHZ;
    2765 
    2766     uint8_t i;
    2767     Assert(pThis->paNodes);
    2768     Assert(pThis->pfnCodecNodeReset);
    2769 
    2770     for (i = 0; i < pThis->cTotalNodes; ++i)
     2758    hdaCodecOpenStream(pThis, PO_INDEX, &pThis->strmCfg);
     2759
     2760    /* Initialize the AFG node with the fixed setting. */
     2761    pThis->paNodes[1].node.au32F00_param[0xA] = CODEC_F00_0A_44_1KHZ | CODEC_F00_0A_16_BIT;
     2762
     2763    AssertPtr(pThis->paNodes);
     2764    AssertPtr(pThis->pfnCodecNodeReset);
     2765
     2766    for (uint8_t i = 0; i < pThis->cTotalNodes; i++)
    27712767        pThis->pfnCodecNodeReset(pThis, i, &pThis->paNodes[i]);
    27722768
    2773     hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].dac.B_params, PDMAUDIOMIXERCTL_PCM);
     2769    hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].dac.B_params,       PDMAUDIOMIXERCTL_PCM);
    27742770    hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8AdcVolsLineIn].adcvol.B_params, PDMAUDIOMIXERCTL_LINE_IN);
    27752771
  • trunk/src/VBox/Devices/Audio/DevIchHdaCodec.h

    r59212 r59275  
    55
    66/*
    7  * Copyright (C) 2006-2015 Oracle Corporation
     7 * Copyright (C) 2006-2016 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    7777    uint8_t                 u8AssemblyId;
    7878    /** List of assigned HDA drivers to this codec.
    79      * A driver only can be assigned to one codec
    80      * at a time. */
     79     * A driver only can be assigned to one codec at a time. */
    8180    RTLISTANCHOR            lstDrv;
     81    /** The codec's current audio stream configuration. */
     82    PDMAUDIOSTREAMCFG       strmCfg;
    8283
    8384#ifndef VBOX_WITH_HDA_CODEC_EMU
  • trunk/src/VBox/Devices/Audio/DevSB16.cpp

    r59191 r59275  
    77
    88/*
    9  * Copyright (C) 2015 Oracle Corporation
     9 * Copyright (C) 2015-2016 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    5757#include "AudioMixBuffer.h"
    5858#include "AudioMixer.h"
     59#include "DrvAudio.h"
    5960
    6061/** Current saved state version. */
     
    16471648    AssertPtr(pThis);
    16481649
    1649     int rc = VINF_SUCCESS;
    1650 
    16511650    uint32_t cbInMax  = 0;
    16521651    uint32_t cbOutMin = UINT32_MAX;
     
    16591658
    16601659    pThis->uTimerTSIO = cTicksNow;
     1660
     1661    /*
     1662     * Calculate the mixer's (fixed) sampling rate.
     1663     */
     1664    AssertPtr(pThis->pMixer);
     1665
     1666    PDMAUDIOSTREAMCFG mixerStrmCfg;
     1667    int rc = AudioMixerGetDeviceFormat(pThis->pMixer, &mixerStrmCfg);
     1668    AssertRC(rc);
     1669
     1670    PDMPCMPROPS mixerStrmProps;
     1671    rc = DrvAudioStreamCfgToProps(&mixerStrmCfg, &mixerStrmProps);
     1672    AssertRC(rc);
     1673
     1674    uint32_t cMixerSamplesMin  = (int)((2 * cTicksElapsed * mixerStrmCfg.uHz + cTicksPerSec) / cTicksPerSec / 2);
     1675    uint32_t cbMixerSamplesMin = cMixerSamplesMin << mixerStrmProps.cShift;
    16611676
    16621677    RTListForEach(&pThis->lstDrv, pDrv, SB16DRIVER, Node)
     
    16701685            rc = pDrv->pConnector->pfnPlayOut(pDrv->pConnector, NULL /* cSamplesPlayed */);
    16711686
    1672         Log2Func(("LUN#%RU8: rc=%Rrc, cbIn=%RU32, cbOut=%RU32\n", pDrv->uLUN, rc, cbIn, cbOut));
    1673 
    1674         const bool fIsActiveOut = pDrv->pConnector->pfnIsActiveOut(pDrv->pConnector, pDrv->Out.pStrmOut);
    1675 
     1687#ifdef DEBUG_TIMER
     1688        LogFlowFunc(("LUN#%RU8: rc=%Rrc, cbIn=%RU32, cbOut=%RU32\n", pDrv->uLUN, rc, cbIn, cbOut));
     1689#endif
    16761690        /* If we there was an error handling (available) output or there simply is no output available,
    16771691         * then calculate the minimum data rate which must be processed by the device emulation in order
     
    16801694         * This is not the optimal solution, but as we have to deal with this on a timer-based approach
    16811695         * (until we have the audio callbacks) we need to have device' DMA engines running. */
     1696        if (!pDrv->pConnector->pfnIsValidOut(pDrv->pConnector, pDrv->Out.pStrmOut))
     1697        {
     1698            /* Use the mixer's (fixed) sampling rate. */
     1699            cbOut = RT_MAX(cbOut, cbMixerSamplesMin);
     1700            continue;
     1701        }
     1702
     1703        const bool fIsActiveOut = pDrv->pConnector->pfnIsActiveOut(pDrv->pConnector, pDrv->Out.pStrmOut);
    16821704        if (   RT_FAILURE(rc)
    16831705            || !fIsActiveOut)
  • trunk/src/VBox/Devices/Audio/DrvAudio.cpp

    r59102 r59275  
    18821882}
    18831883
    1884 static DECLCALLBACK(bool) drvAudioIsInputOK(PPDMIAUDIOCONNECTOR pInterface,
     1884static DECLCALLBACK(bool) drvAudioIsValidIn(PPDMIAUDIOCONNECTOR pInterface,
    18851885                                            PPDMAUDIOGSTSTRMIN  pGstStrmIn)
    18861886{
     
    18881888}
    18891889
    1890 static DECLCALLBACK(bool) drvAudioIsOutputOK(PPDMIAUDIOCONNECTOR pInterface,
     1890static DECLCALLBACK(bool) drvAudioIsValidOut(PPDMIAUDIOCONNECTOR pInterface,
    18911891                                             PPDMAUDIOGSTSTRMOUT pGstStrmOut)
    18921892{
     
    21672167    pThis->IAudioConnector.pfnIsActiveIn             = drvAudioIsActiveIn;
    21682168    pThis->IAudioConnector.pfnIsActiveOut            = drvAudioIsActiveOut;
    2169     pThis->IAudioConnector.pfnIsInputOK              = drvAudioIsInputOK;
    2170     pThis->IAudioConnector.pfnIsOutputOK             = drvAudioIsOutputOK;
     2169    pThis->IAudioConnector.pfnIsValidIn              = drvAudioIsValidIn;
     2170    pThis->IAudioConnector.pfnIsValidOut             = drvAudioIsValidOut;
    21712171    pThis->IAudioConnector.pfnInitNull               = drvAudioInitNull;
    21722172    pThis->IAudioConnector.pfnEnableOut              = drvAudioEnableOut;
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