VirtualBox

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


Ignore:
Timestamp:
Mar 4, 2014 7:21:18 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
92630
Message:

src/VBox/Devices/Audio, src/VBox/Main/src-client, include/VBox/vmm:

src/VBox/Devices/Audio: part of restructuring of audio code. Devices files correspondin to Hda, AC97 and SB16 audio. The structure of files have been modifed as per PDM specs. The modified code is under #ifdef VBOX_WITH_PDM_AUDIO_DRIVER

src/VBox/Main/src-client: Driver for the VRDE that interacts with DrvAudio. Enhancement of the CFGM tree for audio.

Config.kmk : addition of one configuration parameter that will control whether new audio code is disabled or enabled. "VBOX_WITH_PDM_AUDIO_DRIVER"

pdmaudioifs.h: common header file between Device , Intermediate audio driver and Backends specific to audio.

Location:
trunk/src/VBox/Devices
Files:
11 edited

Legend:

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

    r45025 r50686  
    2121#define LOG_GROUP LOG_GROUP_DEV_AUDIO
    2222#include <VBox/vmm/pdmdev.h>
     23#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     24#include <VBox/vmm/pdmaudioifs.h>
     25#endif
    2326#include <iprt/assert.h>
    2427#include <iprt/uuid.h>
     
    2629
    2730#include "VBoxDD.h"
    28 
     31#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    2932extern "C" {
    3033#include "audio.h"
    3134}
     35#endif
    3236
    3337
     
    194198
    195199    /** Audio stuff.  */
    196     QEMUSoundCard           card;
    197 
     200#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
     201    QEMUSoundCard card;
     202#endif
    198203    /** Global Control (Bus Master Control Register) */
    199204    uint32_t                glob_cnt;
     
    206211    AC97BusMasterRegs       bm_regs[3];
    207212    uint8_t                 mixer_data[256];
     213#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     214    /** PCM in */
     215    PPDMGSTVOICEIN          voice_pi[2];
     216    /** PCM out */
     217    PPDMGSTVOICEOUT         voice_po[2];
     218    /** Mic in */
     219    PPDMGSTVOICEIN          voice_mc[2];
     220#else
    208221    /** PCM in */
    209222    SWVoiceIn              *voice_pi;
     
    212225    /** Mic in */
    213226    SWVoiceIn              *voice_mc;
     227#endif
    214228    uint8_t                 silence[128];
    215229    int                     bup_flag;
     
    217231    PPDMDEVINSR3            pDevIns;
    218232    /** Pointer to the connector of the attached audio driver. */
     233#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     234    PPDMIAUDIOCONNECTOR     pDrv[2];
     235#else
    219236    PPDMIAUDIOCONNECTOR     pDrv;
     237#endif
    220238    /** Pointer to the attached audio driver. */
    221239    PPDMIBASE               pDrvBase;
     
    355373    switch (bm_index)
    356374    {
     375#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     376        uint32_t lun;
     377        case PI_INDEX:
     378            for (lun = 0; lun < 2; lun++)
     379                pThis->pDrv[lun]->pfnEnableIn(pThis->pDrv[lun], pThis->voice_pi[lun], on);
     380            break;
     381        case PO_INDEX:
     382            for (lun = 0; lun < 2; lun++)
     383                pThis->pDrv[lun]->pfnEnableOut(pThis->pDrv[lun], pThis->voice_po[lun], on);
     384        break;
     385        case MC_INDEX:
     386            for (lun = 0; lun < 2; lun++)
     387                pThis->pDrv[lun]->pfnEnableIn(pThis->pDrv[lun], pThis->voice_mc[lun], on);
     388            break;
     389#else
    357390        case PI_INDEX: AUD_set_active_in( pThis->voice_pi, on); break;
    358391        case PO_INDEX: AUD_set_active_out(pThis->voice_po, on); break;
    359392        case MC_INDEX: AUD_set_active_in( pThis->voice_mc, on); break;
     393#endif
    360394        default:       AssertFailed (); break;
    361395    }
     
    374408    pReg->cr       = pReg->cr & CR_DONT_CLEAR_MASK;
    375409    pReg->bd_valid = 0;
    376 
    377410    voice_set_active(pThis, pReg - pThis->bm_regs, 0);
    378411    memset(pThis->silence, 0, sizeof(pThis->silence));
     
    408441static void open_voice(PAC97STATE pThis, int index, int freq)
    409442{
    410     audsettings_t as;
    411 
     443#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     444    int rc;
     445#endif
     446    LogFlow(("DevIchAC97: open_voice freq = %d\n", freq));
    412447    if (freq)
    413448    {
     449#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
     450        audsettings_t as;
    414451        as.freq       = freq;
    415452        as.nchannels  = 2;
    416453        as.fmt        = AUD_FMT_S16;
    417454        as.endianness = 0;
    418 
     455        uint32_t lun;
     456#endif
    419457        switch (index)
    420458        {
    421459            case PI_INDEX: /* PCM in */
     460#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     461                for (uint32_t lun = 0; lun < 2; lun++)
     462                    rc = pThis->pDrv[lun]->pfnOpenIn(pThis->pDrv[lun], &pThis->voice_pi[lun], "ac97.pi",
     463                                                     pThis, pi_callback, freq, 2, AUD_FMT_S16, 0);
     464#else
    422465                pThis->voice_pi = AUD_open_in(&pThis->card, pThis->voice_pi, "ac97.pi", pThis, pi_callback, &as);
     466#endif
    423467#ifdef LOG_VOICES
    424468                LogRel(("AC97: open PI freq=%d (%s)\n", freq, pThis->voice_pi ? "ok" : "FAIL"));
     
    427471
    428472            case PO_INDEX: /* PCM out */
     473#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     474                for (int lun = 0; lun < 2; lun++)
     475                {
     476                    LogFlow(("LUN###%d\n", lun));
     477                    rc = pThis->pDrv[lun]->pfnOpenOut(pThis->pDrv[lun], &pThis->voice_po[lun], "ac97.po",
     478                                                      pThis, po_callback, freq, 2, AUD_FMT_S16, 0);
     479                }
     480#else
    429481                pThis->voice_po = AUD_open_out(&pThis->card, pThis->voice_po, "ac97.po", pThis, po_callback, &as);
     482#endif
    430483#ifdef LOG_VOICES
    431484                LogRel(("AC97: open PO freq=%d (%s)\n", freq, pThis->voice_po ? "ok" : "FAIL"));
     
    434487
    435488            case MC_INDEX: /* Mic in */
     489#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     490                for (uint32_t lun = 0; lun < 2; lun++)
     491                    rc = pThis->pDrv[lun]->pfnOpenIn(pThis->pDrv[lun], &pThis->voice_mc[lun], "ac97.mc",
     492                                                     pThis, mc_callback, freq, 2, AUD_FMT_S16, 0);
     493#else
    436494                pThis->voice_mc = AUD_open_in(&pThis->card, pThis->voice_mc, "ac97.mc", pThis, mc_callback, &as);
     495#endif
    437496#ifdef LOG_VOICES
    438497                LogRel(("AC97: open MC freq=%d (%s)\n", freq, pThis->voice_mc ? "ok" : "FAIL"));
     
    446505        {
    447506            case PI_INDEX:
     507#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     508                for (uint32_t lun = 0; lun < 2; lun++)
     509                {
     510                    pThis->pDrv[lun]->pfnCloseIn(pThis->pDrv[lun], pThis->voice_pi[lun]);
     511                    pThis->voice_pi[lun] = NULL;
     512                }
     513#else
    448514                AUD_close_in(&pThis->card, pThis->voice_pi);
     515                pThis->voice_pi = NULL;
     516#endif
    449517#ifdef LOG_VOICES
    450518                LogRel(("AC97: Closing PCM IN\n"));
    451519#endif
    452                 pThis->voice_pi = NULL;
    453520                break;
    454521
    455522            case PO_INDEX:
     523#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     524                for (uint32_t lun = 0; lun < 2; lun++)
     525                {
     526                    pThis->pDrv[lun]->pfnCloseOut(pThis->pDrv[lun], pThis->voice_po[lun]);
     527                    pThis->voice_po[lun] = NULL;
     528                }
     529#else
    456530                AUD_close_out(&pThis->card, pThis->voice_po);
     531                pThis->voice_po = NULL;
     532#endif
    457533#ifdef LOG_VOICES
    458534                LogRel(("AC97: Closing PCM OUT\n"));
    459535#endif
    460                 pThis->voice_po = NULL;
    461536                break;
    462537
    463538            case MC_INDEX:
     539#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     540                for (uint32_t lun = 0; lun < 2; lun++)
     541                {
     542                    pThis->pDrv[lun]->pfnCloseIn(pThis->pDrv[lun], pThis->voice_mc[lun]);
     543                    pThis->voice_mc[lun] = NULL;
     544                }
     545#else
    464546                AUD_close_in(&pThis->card, pThis->voice_mc);
     547                pThis->voice_mc = NULL;
     548#endif
    465549#ifdef LOG_VOICES
    466550                LogRel(("AC97: Closing MIC IN\n"));
    467551#endif
    468                 pThis->voice_mc = NULL;
    469552                break;
    470553        }
     
    478561    freq = mixer_load(pThis, AC97_PCM_LR_ADC_Rate);
    479562    open_voice(pThis, PI_INDEX, freq);
     563#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     564    for (uint32_t lun = 0; lun < 2; lun++)
     565        pThis->pDrv[lun]->pfnEnableIn(pThis->pDrv[lun], pThis->voice_pi[lun], active[PI_INDEX]);
     566#else
    480567    AUD_set_active_in(pThis->voice_pi, active[PI_INDEX]);
    481 
     568#endif
    482569    freq = mixer_load(pThis, AC97_PCM_Front_DAC_Rate);
     570    LogFlow(("DevIchAC97: reset_voices calling open_voice freq = %d\n", freq));
    483571    open_voice(pThis, PO_INDEX, freq);
     572#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     573    for (uint32_t lun = 0; lun < 2; lun++)
     574        pThis->pDrv[lun]->pfnEnableOut(pThis->pDrv[lun], pThis->voice_po[lun], active[PO_INDEX]);
     575#else
    484576    AUD_set_active_out(pThis->voice_po, active[PO_INDEX]);
     577#endif
    485578
    486579    freq = mixer_load(pThis, AC97_MIC_ADC_Rate);
    487580    open_voice(pThis, MC_INDEX, freq);
     581#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     582    for (uint32_t lun = 0; lun < 2; lun++)
     583        pThis->pDrv[lun]->pfnEnableIn(pThis->pDrv[lun], pThis->voice_mc[lun], active[MC_INDEX]);
     584#else
    488585    AUD_set_active_in(pThis->voice_mc, active[MC_INDEX]);
     586#endif
    489587}
    490588
     
    501599# ifdef SOFT_VOLUME
    502600    if (index == AC97_Master_Volume_Mute)
     601    {
     602#  ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     603    for (uint32_t lun = 0; lun < 1; lun++)
     604        pThis->pDrv[lun]->pfnIsSetOutVolume(pThis->pDrv[lun], pThis->voice_po[lun], mute, lvol, rvol);
     605#  else
    503606        AUD_set_volume_out(pThis->voice_po, mute, lvol, rvol);
     607#  endif
     608    }
    504609    else
     610    {
     611#  ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     612        for (uint32_t lun = 0; lun < 1; lun++)
     613            /* @tod0 in SetVolume no passing audmixerctl_in as its not used in DrvAudio.c */
     614            pThis->pDrv[lun]->pfnSetVolume(pThis->pDrv[lun], &mute, &lvol, &rvol);
     615#  else
    505616        AUD_set_volume(mt, &mute, &lvol, &rvol);
     617#  endif
     618    }
    506619# else
     620#  ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     621    for (uint32_t lun = 0; lun < 1; lun++)
     622        pThis->pDrv[lun]->pfnSetVolume(pThis->pDrv[lun], &mute, &lvol, &rvol);
     623#  else
    507624    AUD_set_volume(mt, &mute, &lvol, &rvol);
     625#  endif
    508626# endif
    509627
     
    565683    audrecsource_t ars = ac97_to_aud_record_source(rs);
    566684    audrecsource_t als = ac97_to_aud_record_source(ls);
    567     AUD_set_record_source(&als, &ars);
     685    //AUD_set_record_source(&als, &ars);
    568686    rs = aud_to_ac97_record_source(ars);
    569687    ls = aud_to_ac97_record_source(als);
     
    607725    mixer_store(pThis, AC97_MIC_ADC_Rate            , 0xbb80);
    608726
     727
     728
    609729#ifdef USE_MIXER
    610730    record_select(pThis, 0);
     
    630750    uint32_t    written = 0;
    631751    int         to_copy = 0;
     752#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     753    /* count of bytes left in buf to read = samples left in buffer (each of 16 bit) to read denoted by picb * 2) */
     754    uint32_t    cbToRead = pReg->picb << 1;
     755    uint32_t    cbMinToRead;
     756    uint8_t     tmpbufCopy[4096];
     757    int    lun = 0;
     758    uint32_t    slowestLun;
     759    uint32_t    cSamplesLeft;
     760#endif
    632761
    633762    temp = audio_MIN(temp, (uint32_t)max);
     
    643772        to_copy = audio_MIN(temp, sizeof(tmpbuf));
    644773        PDMDevHlpPhysRead(pDevIns, addr, tmpbuf, to_copy);
     774#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     775        /* save a copy of the audio samples read */
     776        memcpy(tmpbufCopy, tmpbuf, to_copy);
     777        uint32_t slowlun = 0;
     778        for (lun = 0; lun < 2; lun++)
     779        {
     780            LogFlow(("DevIchAC97: write_audio to_copy = %d LUN##%d\n", to_copy, lun));
     781            copied = pThis->pDrv[lun]->pfnWrite(pThis->pDrv[lun], pThis->voice_po[lun], tmpbuf, to_copy);
     782            /* call pfnwrite with the same data that has been read from the guest physical memory */
     783            LogFlow(("DevIchAC97: write_audio copied = %d\n", copied));
     784        }
     785#else
    645786        copied = AUD_write(pThis->voice_po, tmpbuf, to_copy);
    646         Log(("ac97: write_audio max=%x to_copy=%x copied=%x\n", max, to_copy, copied));
     787#endif
    647788        if (!copied)
    648789        {
     
    673814{
    674815    int written = 0;
    675 
    676816    Log(("ac97: write_bup\n"));
    677817    if (!(pThis->bup_flag & BUP_SET))
     
    693833    {
    694834        unsigned int temp = audio_MIN((unsigned int)elapsed, sizeof(pThis->silence));
     835        int copied;
    695836        while (temp)
    696837        {
     838#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     839            for (int lun = 0; lun < 2; lun++)
     840            {
     841                LogFlow(("DevIchAC97: write_silence LUN##%d , to_copy=%d\n", lun, temp));
     842                copied = pThis->pDrv[lun]->pfnWrite(pThis->pDrv[lun], pThis->voice_po[lun], pThis->silence, temp);
     843                LogFlow(("DevIchAC97: write_silence LUN##%d , copied=%d\n", lun, copied));
     844            }
     845#else
    697846            int copied = AUD_write(pThis->voice_po, pThis->silence, temp);
     847#endif
    698848            if (!copied)
    699849                return;
     
    708858{
    709859    PPDMDEVINS  pDevIns = ICHAC97STATE_2_DEVINS(pThis);
    710     uint8_t     tmpbuf[4096];
     860
    711861    uint32_t    addr = pReg->bd.addr;
    712862    uint32_t    temp = pReg->picb << 1;
    713863    uint32_t    nread = 0;
    714864    int         to_copy = 0;
     865#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     866    uint8_t     u8DupBuf[4096];
     867    PDMHOSTSTEREOSAMPLE     tmpbuf[4096];
     868    PDMHOSTSTEREOSAMPLE MixBuf[2000];
     869    PDMHOSTSTEREOSAMPLE InputBuf[2000];
     870    PPDMHOSTSTEREOSAMPLE SrcBuf;
     871    uint32_t    cSamplesMixed = 0;
     872    uint32_t    cTotalSamplesMixed = 0;
     873    uint32_t    cSamplesRead = 0;
     874    uint32_t    offRead = 0;
     875    uint32_t    offWrite = 0;
     876    uint32_t    cTotalSamplesRead = 0;
     877    uint32_t isamp = 0, osamp = 0;
     878    uint32_t lun =0;
     879    PPDMGSTVOICEIN voice[2];
     880    memset(MixBuf, 0, sizeof(MixBuf));
     881    memset(InputBuf, 0, sizeof(InputBuf));
     882    memset(u8DupBuf, 0, sizeof(u8DupBuf));
     883    void * rate[2];
     884
     885    for (lun = 0; lun < 2; lun++)
     886        voice[lun] = (pReg - pThis->bm_regs) == MC_INDEX ? pThis->voice_mc[lun] : pThis->voice_pi[lun];
     887#else
    715888    SWVoiceIn  *voice = (pReg - pThis->bm_regs) == MC_INDEX ? pThis->voice_mc : pThis->voice_pi;
     889#endif
    716890
    717891    temp = audio_MIN(temp, (uint32_t)max);
     
    722896    }
    723897
     898#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     899    rate[0] = pThis->pDrv[0]->pfnPrepareAudioConversion(pThis->pDrv[0], 48000, 48000);
     900    //rate[1] = pThis->pDrv[1]->pfnPrepareAudioConversion(pThis->pDrv[1], 22100, 22100);
     901    rate[1] = pThis->pDrv[1]->pfnPrepareAudioConversion(pThis->pDrv[1], 48000, 48000);
     902    for (lun = 0; lun < 2; lun++)
     903    {
     904        temp = pReg->picb << 1;
     905        temp = audio_MIN(temp, (uint32_t)max);
     906        LogFlow(("DevIchAC97: temp = %d and max = %d\n", temp, max));
     907        if (!temp)
     908        {
     909            *stop = 1;
     910            return 0;
     911        }
     912        memset(tmpbuf, 0, sizeof(tmpbuf));
     913        offRead = 0;
     914        offWrite = 0;
     915        cSamplesMixed = 0;
     916        nread = 0;
     917        while (temp)
     918        {
     919            int acquired;
     920            to_copy = audio_MIN(temp, sizeof(tmpbuf));
     921            acquired = pThis->pDrv[lun]->pfnRead(pThis->pDrv[lun], voice[lun], tmpbuf, to_copy);
     922            cSamplesRead = acquired >> voice[lun]->Props.cShift;
     923            while (cSamplesRead)
     924            {
     925                SrcBuf = tmpbuf + offRead;
     926                isamp = cSamplesRead;
     927                if (!isamp)
     928                {
     929                    LogFlow(("DevichAC97: No Input samples \n"));
     930                    break;
     931                }
     932                osamp = cSamplesRead - cSamplesMixed; /*sizeof(MixBuf)*/;
     933                pThis->pDrv[lun]->pfnDoRateConvAndMix(pThis->pDrv[lun], rate[lun], SrcBuf,
     934                                                    MixBuf, &isamp, &osamp);
     935                cSamplesRead -= isamp;
     936                offRead += isamp;
     937                offWrite += osamp;
     938                cSamplesMixed += isamp;
     939            }
     940            if (!acquired)
     941            {
     942                *stop = 1;
     943                break;
     944            }
     945            pThis->pDrv[lun]->pfnConvStSampleToDevFmt(pThis->pDrv[lun], u8DupBuf, MixBuf, cSamplesMixed);
     946            temp  -= acquired;
     947            //addr  += acquired;
     948            //addr  += (ctotalSamplexMixed << voice->Props.cShift);
     949            //nread += (cSamplesMixed << voice->Props.cShift);
     950            nread += acquired;
     951            LogFlow(("DevIchAC97: looping temp = %d\n", temp));
     952            cTotalSamplesRead = audio_MAX(cTotalSamplesRead, nread);
     953            cTotalSamplesMixed = audio_MAX(cTotalSamplesMixed, cSamplesMixed);
     954        }
     955    }
     956    if (cTotalSamplesMixed)
     957        PDMDevHlpPCIPhysWrite(pDevIns, addr, u8DupBuf, (cTotalSamplesMixed << voice[0]->Props.cShift));
     958    addr  += (cTotalSamplesMixed << voice[0]->Props.cShift);
     959    nread = cTotalSamplesRead;
     960#else
     961    uint8_t tmpbuf[4096];
    724962    while (temp)
    725963    {
     
    737975        nread += acquired;
    738976    }
    739 
     977#endif
    740978    pReg->bd.addr = addr;
    741979    return nread;
     
    8061044                break;
    8071045        }
    808 
    8091046        Log(("pReg->picb = %d\n", pReg->picb));
    8101047
     
    8141051
    8151052            if (pReg->bd.ctl_len & BD_IOC)
     1053            {
    8161054                new_sr |= SR_BCIS;
     1055            }
    8171056
    8181057            if (pReg->civ == pReg->lvi)
     
    12621501                    {
    12631502                        mixer_store(pThis, AC97_MIC_ADC_Rate, 0xbb80);
    1264                         open_voice(pThis, MC_INDEX, 48000);
     1503                         open_voice(pThis, MC_INDEX, 48000);
    12651504                    }
    12661505                    Log(("ac97: Setting extended audio control to %#x\n", u32));
     
    13781617
    13791618    uint8_t active[LAST_INDEX];
     1619#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1620    /* writing only host backend values here and ignoring for webm and VRDE */
     1621    active[PI_INDEX] = pThis->pDrv[0]->pfnIsActiveIn(pThis->pDrv[0],  pThis->voice_pi[0]) ? 1 : 0;
     1622    active[PO_INDEX] = pThis->pDrv[0]->pfnIsActiveOut(pThis->pDrv[0], pThis->voice_po[0]) ? 1 : 0;
     1623    active[MC_INDEX] = pThis->pDrv[0]->pfnIsActiveIn(pThis->pDrv[0],  pThis->voice_mc[0]) ? 1 : 0;
     1624#else
    13801625    active[PI_INDEX] = AUD_is_active_in( pThis->voice_pi) ? 1 : 0;
    13811626    active[PO_INDEX] = AUD_is_active_out(pThis->voice_po) ? 1 : 0;
    13821627    active[MC_INDEX] = AUD_is_active_in( pThis->voice_mc) ? 1 : 0;
     1628#endif
    13831629    SSMR3PutMem(pSSM, active, sizeof(active));
    13841630
     
    15431789     * Attach driver.
    15441790     */
     1791#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1792    for (uint32_t lun = 0; lun < 2; lun++)
     1793    {
     1794        rc = PDMDevHlpDriverAttach(pDevIns, lun, &pThis->IBase, &pThis->pDrvBase, "Audio Driver Port");
     1795        if (RT_SUCCESS(rc))
     1796        {
     1797            pThis->pDrv[lun] = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIAUDIOCONNECTOR);
     1798            AssertMsgReturn(pThis->pDrv[lun],
     1799                            ("Configuration error: instance %d has no host audio interface!\n", iInstance),
     1800                            VERR_PDM_MISSING_INTERFACE);
     1801        }
     1802        else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
     1803            Log(("ac97: No attached driver!\n"));
     1804        else if (RT_FAILURE(rc))
     1805        {
     1806            AssertMsgFailed(("Failed to attach AC97 LUN #%d! rc=%Rrc\n", lun, rc));
     1807            return rc;
     1808        }
     1809    }
     1810#else
    15451811    rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThis->IBase, &pThis->pDrvBase, "Audio Driver Port");
    15461812    if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
     
    15511817        return rc;
    15521818    }
    1553 
     1819#endif
     1820
     1821
     1822#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1823    pThis->pDrv[0]->pfnRegisterCard(pThis->pDrv[0], "ICH0" );
     1824#else
    15541825    AUD_register_card("ICH0", &pThis->card);
    1555 
     1826#endif
    15561827    ac97Reset(pDevIns);
    15571828
     1829#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1830    for (uint32_t lun =0; lun < 2; lun++)
     1831    {
     1832        if (!pThis->pDrv[lun]->pfnIsHostVoiceInOK(pThis->pDrv[lun], pThis->voice_pi[lun]))
     1833            LogRel(("AC97: WARNING: Unable to open PCM IN!\n"));
     1834        if (!pThis->pDrv[lun]->pfnIsHostVoiceInOK(pThis->pDrv[lun], pThis->voice_mc[lun]))
     1835            LogRel(("AC97: WARNING: Unable to open PCM MC!\n"));
     1836        if (!pThis->pDrv[lun]->pfnIsHostVoiceOutOK(pThis->pDrv[lun], pThis->voice_po[lun]))
     1837            LogRel(("AC97: WARNING: Unable to open PCM OUT!\n"));
     1838    }
     1839#else
    15581840    if (!AUD_is_host_voice_in_ok(pThis->voice_pi))
    15591841        LogRel(("AC97: WARNING: Unable to open PCM IN!\n"));
     
    15631845        LogRel(("AC97: WARNING: Unable to open PCM OUT!\n"));
    15641846
     1847#endif
     1848
     1849#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1850    for (uint32_t lun = 0; lun < 2; lun++)
     1851    {
     1852        if (   !pThis->pDrv[lun]->pfnIsHostVoiceInOK(pThis->pDrv[lun], pThis->voice_pi[lun])
     1853            && !pThis->pDrv[lun]->pfnIsHostVoiceOutOK(pThis->pDrv[lun], pThis->voice_po[lun])
     1854            && !pThis->pDrv[lun]->pfnIsHostVoiceInOK(pThis->pDrv[lun], pThis->voice_mc[lun]))
     1855        {
     1856        /* Was not able initialize *any* voice. Select the NULL audio driver instead */
     1857            pThis->pDrv[lun]->pfnCloseIn(pThis->pDrv[lun], pThis->voice_pi[lun]);
     1858            pThis->pDrv[lun]->pfnCloseOut(pThis->pDrv[lun], pThis->voice_po[lun]);
     1859            pThis->pDrv[lun]->pfnCloseIn(pThis->pDrv[lun], pThis->voice_mc[lun]);
     1860
     1861            pThis->voice_po[lun] = NULL;
     1862            pThis->voice_pi[lun] = NULL;
     1863            pThis->voice_mc[lun] = NULL;
     1864
     1865            pThis->pDrv[lun]->pfnInitNull(pThis->pDrv[lun]);
     1866            ac97Reset(pDevIns);
     1867
     1868            PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "HostAudioNotResponding",
     1869                N_("No audio devices could be opened. Selecting the NULL audio backend "
     1870                   "with the consequence that no sound is audible"));
     1871        }
     1872        else if (   !pThis->pDrv[lun]->pfnIsHostVoiceInOK(pThis->pDrv[lun], pThis->voice_pi[lun])
     1873                 || !pThis->pDrv[lun]->pfnIsHostVoiceOutOK(pThis->pDrv[lun], pThis->voice_po[lun])
     1874                 || !pThis->pDrv[lun]->pfnIsHostVoiceInOK(pThis->pDrv[lun], pThis->voice_mc[lun]))
     1875        {
     1876            char   szMissingVoices[128];
     1877            size_t len = 0;
     1878            if (!pThis->pDrv[lun]->pfnIsHostVoiceInOK(pThis->pDrv[lun], pThis->voice_pi[lun]))
     1879                len = RTStrPrintf(szMissingVoices, sizeof(szMissingVoices), "PCM_in");
     1880            if (!pThis->pDrv[lun]->pfnIsHostVoiceOutOK(pThis->pDrv[lun], pThis->voice_po[lun]))
     1881                len += RTStrPrintf(szMissingVoices + len, sizeof(szMissingVoices) - len, len ? ", PCM_out" : "PCM_out");
     1882            if (!pThis->pDrv[lun]->pfnIsHostVoiceInOK(pThis->pDrv[lun], pThis->voice_mc[lun]))
     1883                len += RTStrPrintf(szMissingVoices + len, sizeof(szMissingVoices) - len, len ? ", PCM_mic" : "PCM_mic");
     1884
     1885            PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "HostAudioNotResponding",
     1886                N_("Some audio devices (%s) could not be opened. Guest applications generating audio "
     1887                "output or depending on audio input may hang. Make sure your host audio device "
     1888                "is working properly. Check the logfile for error messages of the audio "
     1889                "subsystem"), szMissingVoices);
     1890        }
     1891    }
     1892#else
    15651893    if (   !AUD_is_host_voice_in_ok( pThis->voice_pi)
    15661894        && !AUD_is_host_voice_out_ok(pThis->voice_po)
    15671895        && !AUD_is_host_voice_in_ok( pThis->voice_mc))
    15681896    {
    1569         /* Was not able initialize *any* voice. Select the NULL audio driver instead */
    1570         AUD_close_in( &pThis->card, pThis->voice_pi);
     1897        AUD_close_in(&pThis->card, pThis->voice_pi);
    15711898        AUD_close_out(&pThis->card, pThis->voice_po);
    1572         AUD_close_in( &pThis->card, pThis->voice_mc);
     1899        AUD_close_in(&pThis->card, pThis->voice_mc);
     1900
    15731901        pThis->voice_po = NULL;
    15741902        pThis->voice_pi = NULL;
     
    16001928               "subsystem"), szMissingVoices);
    16011929    }
    1602 
     1930#endif
    16031931    return VINF_SUCCESS;
    16041932}
  • trunk/src/VBox/Devices/Audio/DevIchHda.cpp

    r49305 r50686  
    2525#define LOG_GROUP LOG_GROUP_DEV_AUDIO
    2626#include <VBox/vmm/pdmdev.h>
     27#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     28#include <VBox/vmm/pdmaudioifs.h>
     29#endif
    2730#include <VBox/version.h>
    2831
     
    3841#include "VBoxDD.h"
    3942
     43#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    4044extern "C" {
    4145#include "audio.h"
    4246}
     47#endif
    4348#include "DevIchHdaCodec.h"
    4449
     
    547552
    548553    /** Pointer to the connector of the attached audio driver. */
     554#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     555    R3PTRTYPE(PPDMIAUDIOCONNECTOR)     pDrv[2];
     556#else
    549557    R3PTRTYPE(PPDMIAUDIOCONNECTOR)     pDrv;
     558#endif
    550559    /** Pointer to the attached audio driver. */
    551560    R3PTRTYPE(PPDMIBASE)               pDrvBase;
     
    577586    /** Flag whether the RC part is enabled. */
    578587    bool                               fRCEnabled;
     588#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    579589    /** The HDA codec state. */
     590    R3PTRTYPE(PHDACODEC)               pCodec[2];
     591#else
    580592    R3PTRTYPE(PHDACODEC)               pCodec;
     593#endif
    581594    uint64_t                           u64BaseTS;
    582595    /** 1.2.3.4.5.6.7. - someone please tell me what I'm counting! - .8.9.10... */
     
    11081121        corbRp++;
    11091122        cmd = pThis->pu32CorbBuf[corbRp];
     1123#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1124        for (uint32_t lun = 0; lun < 1; lun++)
     1125            rc = pThis->pCodec[lun]->pfnLookup(pThis->pCodec[lun], cmd, &pfn);
     1126#else
    11101127        rc = pThis->pCodec->pfnLookup(pThis->pCodec, cmd, &pfn);
     1128#endif
    11111129        if (RT_FAILURE(rc))
    11121130            AssertRCReturn(rc, rc);
     
    11151133
    11161134        if (RT_LIKELY(pfn))
     1135#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1136        {
     1137            for (uint32_t lun = 0; lun < 1; lun++)
     1138                rc = pfn(pThis->pCodec[lun], cmd, &resp);
     1139        }
     1140#else
    11171141            rc = pfn(pThis->pCodec, cmd, &resp);
     1142#endif
    11181143        else
    11191144            rc = VERR_INVALID_FUNCTION;
     
    14331458            {
    14341459                case HDA_REG_SD0CTL:
     1460 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1461                    for (uint32_t lun = 0; lun < 1; lun++)
     1462                        pThis->pDrv[lun]->pfnEnableIn(pThis->pDrv[lun], pThis->pCodec[lun]->SwVoiceIn, fRun);
     1463 #else
    14351464                    AUD_set_active_in(pThis->pCodec->SwVoiceIn, fRun);
     1465 #endif
    14361466                    break;
    14371467                case HDA_REG_SD4CTL:
     1468 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1469                    for (uint32_t lun = 0; lun < 1; lun++)
     1470                        pThis->pDrv[lun]->pfnEnableOut(pThis->pDrv[lun], pThis->pCodec[lun]->SwVoiceOut, fRun);
     1471 #else
    14381472                    AUD_set_active_out(pThis->pCodec->SwVoiceOut, fRun);
     1473 #endif
    14391474                    break;
    14401475                default:
     
    15241559
    15251560#ifdef IN_RING3
     1561# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1562static void hdaSdFmtToAudSettings(uint32_t u32SdFmt, uint32_t * pFrequency, uint32_t * pChannels, audfmt_e *pFormat, uint32_t *pEndian)
     1563# else
    15261564static void hdaSdFmtToAudSettings(uint32_t u32SdFmt, audsettings_t *pAudSetting)
    1527 {
     1565# endif
     1566{
     1567# ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    15281568    Assert((pAudSetting));
    1529 #define EXTRACT_VALUE(v, mask, shift) ((v & ((mask) << (shift))) >> (shift))
     1569# endif
     1570# define EXTRACT_VALUE(v, mask, shift) ((v & ((mask) << (shift))) >> (shift))
    15301571    uint32_t u32Hz = (u32SdFmt & HDA_SDFMT_BASE_RATE_SHIFT) ? 44100 : 48000;
    15311572    uint32_t u32HzMult = 1;
     
    15511592        case 7: u32HzDiv = 8; break;
    15521593    }
     1594# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1595    *pFrequency = u32Hz * u32HzMult / u32HzDiv;
     1596# else
    15531597    pAudSetting->freq = u32Hz * u32HzMult / u32HzDiv;
     1598# endif
    15541599
    15551600    switch (EXTRACT_VALUE(u32SdFmt, HDA_SDFMT_BITS_MASK, HDA_SDFMT_BITS_SHIFT))
     
    15571602        case 0:
    15581603            Log(("hda: %s requested 8-bit\n", __FUNCTION__));
     1604# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1605            *pFormat = AUD_FMT_S8;
     1606# else
    15591607            pAudSetting->fmt = AUD_FMT_S8;
     1608# endif
    15601609            break;
    15611610        case 1:
    15621611            Log(("hda: %s requested 16-bit\n", __FUNCTION__));
     1612# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1613            *pFormat = AUD_FMT_S16;
     1614# else
    15631615            pAudSetting->fmt = AUD_FMT_S16;
     1616# endif
    15641617            break;
    15651618        case 2:
     
    15711624        case 4:
    15721625            Log(("hda: %s requested 32-bit\n", __FUNCTION__));
     1626# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1627            *pFormat = AUD_FMT_S32;
     1628# else
    15731629            pAudSetting->fmt = AUD_FMT_S32;
     1630# endif
    15741631            break;
    15751632        default:
    15761633            AssertMsgFailed(("Unsupported"));
    15771634    }
     1635# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1636    *pChannels = (u32SdFmt & 0xf) + 1;
     1637    *pFormat = AUD_FMT_S16;
     1638    *pEndian = 0;
     1639# else
    15781640    pAudSetting->nchannels = (u32SdFmt & 0xf) + 1;
    15791641    pAudSetting->fmt = AUD_FMT_S16;
    15801642    pAudSetting->endianness = 0;
    1581 #undef EXTRACT_VALUE
     1643# endif
     1644# undef EXTRACT_VALUE
    15821645}
    15831646#endif
     
    15891652    /** @todo a bit more investigation is required here. */
    15901653    int rc = 0;
    1591     audsettings_t as;
    15921654    /* no reason to reopen voice with same settings */
    15931655    if (u32Value == HDA_REG_IND(pThis, iReg))
    15941656        return VINF_SUCCESS;
     1657# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1658    uint32_t uFrequency;
     1659    uint32_t cChannels;
     1660    audfmt_e Format;
     1661    uint32_t Endian;
     1662    hdaSdFmtToAudSettings(u32Value, &uFrequency, &cChannels, &Format, &Endian);
     1663# else
     1664    audsettings_t as;
    15951665    hdaSdFmtToAudSettings(u32Value, &as);
     1666# endif
    15961667    switch (iReg)
    15971668    {
    15981669        case HDA_REG_SD0FMT:
     1670# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1671            for (uint32_t lun = 0; lun < 1; lun++)
     1672                rc = hdaCodecOpenVoice(pThis->pCodec[lun], PI_INDEX, uFrequency, cChannels, Format, Endian);
     1673# else
    15991674            rc = hdaCodecOpenVoice(pThis->pCodec, PI_INDEX, &as);
     1675# endif
    16001676            break;
    16011677        case HDA_REG_SD4FMT:
     1678# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1679            for (uint32_t lun = 0; lun < 1; lun++)
     1680                rc = hdaCodecOpenVoice(pThis->pCodec[lun], PO_INDEX, uFrequency, cChannels, Format, Endian);
     1681# else
    16021682            rc = hdaCodecOpenVoice(pThis->pCodec, PO_INDEX, &as);
     1683# endif
    16031684            break;
    16041685        default:
     
    16681749        HDA_REG(pThis, IRS) = HDA_REG_FIELD_FLAG_MASK(IRS, ICB);  /* busy */
    16691750        Log(("hda: IC:%x\n", cmd));
     1751# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1752        for (uint32_t lun = 0; lun < 1; lun++)
     1753            rc = pThis->pCodec[lun]->pfnLookup(pThis->pCodec[lun], cmd, &pfn);
     1754# else
    16701755        rc = pThis->pCodec->pfnLookup(pThis->pCodec, cmd, &pfn);
     1756# endif
    16711757        if (RT_FAILURE(rc))
    16721758            AssertRCReturn(rc, rc);
     1759#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1760        for (uint32_t lun = 0; lun < 1; lun++)
     1761            rc = pfn(pThis->pCodec[lun], cmd, &resp);
     1762#else
    16731763        rc = pfn(pThis->pCodec, cmd, &resp);
     1764#endif
    16741765        if (RT_FAILURE(rc))
    16751766            AssertRCReturn(rc, rc);
     
    19742065         * read from backend input line to the last unreported position or at the begining.
    19752066         */
     2067#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2068        //cbBackendCopy = pThis->pDrv[0]->pfnRead(pThis->pDrv[0], pThis->pCodec[0]->SwVoiceIn, pBdle->au8HdaBuffer, cb2Copy);
     2069        //cbBackendCopy = pThis->pDrv[0]->pfnRead(pThis->pDrv[0], pThis->pCodec[1]->SwVoiceIn, pBdle->au8HdaBuffer, cb2Copy);
     2070#else
    19762071        cbBackendCopy = AUD_read(pThis->pCodec->SwVoiceIn, pBdle->au8HdaBuffer, cb2Copy);
     2072#endif
    19772073        /*
    19782074         * write the HDA DMA buffer
     
    20252121             * Feed the newly fetched samples, including unreported ones, to the backend.
    20262122             */
     2123#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2124            for (uint32_t lun = 0; lun < 1; lun++)
     2125                cbBackendCopy = pThis->pDrv[lun]->pfnWrite(pThis->pDrv[lun], pThis->pCodec[lun]->SwVoiceOut, pBdle->au8HdaBuffer, cb2Copy + pBdle->cbUnderFifoW);
     2126            LogFlow(("cbBackendCopy write %d bytes \n", cbBackendCopy));
     2127#else
    20272128            cbBackendCopy = AUD_write (pThis->pCodec->SwVoiceOut, pBdle->au8HdaBuffer, cb2Copy + pBdle->cbUnderFifoW);
     2129#endif
    20282130            hdaBackendWriteTransferReported(pBdle, cb2Copy, cbBackendCopy, &cbTransferred, pu32Avail);
    20292131        }
     
    25482650    PHDASTATE pThis = PDMINS_2_DATA(pDevIns, PHDASTATE);
    25492651    /* Save Codec nodes states */
     2652#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2653    hdaCodecSaveState(pThis->pCodec[0], pSSM);
     2654#else
    25502655    hdaCodecSaveState(pThis->pCodec, pSSM);
     2656#endif
    25512657
    25522658    /* Save MMIO registers */
     
    25752681     * Load Codec nodes states.
    25762682     */
     2683#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2684    int rc = hdaCodecLoadState(pThis->pCodec[0], pSSM, uVersion);
     2685#else
    25772686    int rc = hdaCodecLoadState(pThis->pCodec, pSSM, uVersion);
     2687#endif
    25782688    if (RT_FAILURE(rc))
    25792689        return rc;
     
    26372747     * Update stuff after the state changes.
    26382748     */
     2749#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2750    for (uint32_t lun = 0; lun < 1; lun++)
     2751    {
     2752        pThis->pDrv[lun]->pfnEnableIn(pThis->pDrv[lun], pThis->pCodec[lun]->SwVoiceIn, SDCTL(pThis, 0) & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN));
     2753        pThis->pDrv[lun]->pfnEnableOut(pThis->pDrv[lun], pThis->pCodec[lun]->SwVoiceOut, SDCTL(pThis, 4) & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN));
     2754    }
     2755#else
    26392756    AUD_set_active_in(pThis->pCodec->SwVoiceIn, SDCTL(pThis, 0) & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN));
    26402757    AUD_set_active_out(pThis->pCodec->SwVoiceOut, SDCTL(pThis, 4) & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN));
     2758#endif
    26412759
    26422760    pThis->u64CORBBase = RT_MAKE_U64(HDA_REG(pThis, CORBLBASE), HDA_REG(pThis, CORBUBASE));
     
    28132931{
    28142932    PHDASTATE pThis = PDMINS_2_DATA(pDevIns, PHDASTATE);
     2933#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2934    for (uint32_t lun = 0; lun < 1; lun++)
     2935        if (pThis->pCodec[lun]->pfnCodecDbgListNodes)
     2936            pThis->pCodec[lun]->pfnCodecDbgListNodes(pThis->pCodec[lun], pHlp, pszArgs);
     2937        else
     2938            pHlp->pfnPrintf(pHlp, "Codec implementation doesn't provide corresponding callback.\n");
     2939#else
    28152940    if (pThis->pCodec->pfnCodecDbgListNodes)
    28162941        pThis->pCodec->pfnCodecDbgListNodes(pThis->pCodec, pHlp, pszArgs);
    28172942    else
    28182943        pHlp->pfnPrintf(pHlp, "Codec implementation doesn't provide corresponding callback.\n");
     2944#endif
    28192945}
    28202946
     
    28262952{
    28272953    PHDASTATE pThis = PDMINS_2_DATA(pDevIns, PHDASTATE);
     2954#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2955    for (uint32_t lun = 0; lun < 1; lun++)
     2956        if (pThis->pCodec[lun]->pfnCodecDbgSelector)
     2957            pThis->pCodec[lun]->pfnCodecDbgSelector(pThis->pCodec[lun], pHlp, pszArgs);
     2958        else
     2959            pHlp->pfnPrintf(pHlp, "Codec implementation doesn't provide corresponding callback.\n");
     2960#else
    28282961    if (pThis->pCodec->pfnCodecDbgSelector)
    28292962        pThis->pCodec->pfnCodecDbgSelector(pThis->pCodec, pHlp, pszArgs);
    28302963    else
    28312964        pHlp->pfnPrintf(pHlp, "Codec implementation doesn't provide corresponding callback.\n");
     2965#endif
    28322966}
    28332967
     
    29223056    PHDASTATE pThis = PDMINS_2_DATA(pDevIns, PHDASTATE);
    29233057
     3058#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     3059    for (uint32_t lun = 0; lun < 1; lun++)
     3060    {
     3061        if (pThis->pCodec[lun])
     3062        {
     3063            int rc = hdaCodecDestruct(pThis->pCodec[lun]);
     3064            AssertRC(rc);
     3065            RTMemFree(pThis->pCodec[lun]);
     3066            pThis->pCodec[lun] = NULL;
     3067        }
     3068    }
     3069#else
    29243070    if (pThis->pCodec)
    29253071    {
     
    29303076        pThis->pCodec = NULL;
    29313077    }
     3078#endif
    29323079
    29333080    RTMemFree(pThis->pu32CorbBuf);
     
    30823229    if (RT_FAILURE(rc))
    30833230        return rc;
    3084 
     3231#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     3232    //for (iter = 0; i < 3; i++)
     3233    {
     3234        /*
     3235        * Attach driver.
     3236        */
     3237        rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThis->IBase, &pThis->pDrvBase, "Audio Driver Port");
     3238        if (RT_SUCCESS(rc))
     3239        {
     3240            pThis->pDrv[0] = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIAUDIOCONNECTOR);
     3241            AssertMsgReturn(pThis->pDrv,
     3242                            ("Configuration error: instance %d has no host audio interface!\n", iInstance),
     3243                            VERR_PDM_MISSING_INTERFACE);
     3244        }
     3245        else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
     3246        {
     3247            Log(("ac97: No attached driver!\n"));
     3248        }
     3249        else if (RT_FAILURE(rc))
     3250        {
     3251            AssertMsgFailed(("Failed to attach AC97 LUN #0! rc=%Rrc\n", rc));
     3252            return rc;
     3253        }
     3254        rc = PDMDevHlpDriverAttach(pDevIns, 1, &pThis->IBase, &pThis->pDrvBase, "Audio Driver Port");
     3255        if (RT_SUCCESS(rc))
     3256        {
     3257            pThis->pDrv[1] = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIAUDIOCONNECTOR);
     3258            AssertMsgReturn(pThis->pDrv[1],
     3259                            ("Configuration error: instance %d has no host audio interface!\n", iInstance),
     3260                            VERR_PDM_MISSING_INTERFACE);
     3261        }
     3262        else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
     3263        {
     3264            Log(("ac97: No attached driver! LUN#1\n"));
     3265        }
     3266        else if (RT_FAILURE(rc))
     3267        {
     3268            AssertMsgFailed(("Failed to attach AC97 LUN #1! rc=%Rrc\n", rc));
     3269            return rc;
     3270        }
     3271    }
     3272#else
    30853273    /*
    30863274     * Attach driver.
     
    30943282        return rc;
    30953283    }
    3096 
     3284#endif
    30973285    /* Construct codec state. */
     3286#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     3287    pThis->pCodec[0] = (PHDACODEC)RTMemAllocZ(sizeof(HDACODEC));
     3288    if (!pThis->pCodec[0])
     3289        return PDMDEV_SET_ERROR(pDevIns, VERR_NO_MEMORY, N_("HDA: Out of memory allocating codec state"));
     3290    pThis->pCodec[1] = (PHDACODEC)RTMemAllocZ(sizeof(HDACODEC));
     3291    if (!pThis->pCodec[1])
     3292        return PDMDEV_SET_ERROR(pDevIns, VERR_NO_MEMORY, N_("HDA: Out of memory allocating codec state"));
     3293
     3294    pThis->pCodec[0]->pvHDAState = pThis;
     3295    pThis->pCodec[1]->pvHDAState = pThis;
     3296#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     3297    pThis->pCodec[0]->pDrv = pThis->pDrv[0];
     3298    //pThis->pCodec[1]->pDrv = pThis->pDrv[1];
     3299#endif
     3300    rc = hdaCodecConstruct(pDevIns, pThis->pCodec[0], pCfgHandle);
     3301    if (RT_FAILURE(rc))
     3302        AssertRCReturn(rc, rc);
     3303    rc = hdaCodecConstruct(pDevIns, pThis->pCodec[1], pCfgHandle);
     3304    if (RT_FAILURE(rc))
     3305        AssertRCReturn(rc, rc);
     3306
     3307    /* ICH6 datasheet defines 0 values for SVID and SID (18.1.14-15), which together with values returned for
     3308       verb F20 should provide device/codec recognition. */
     3309    Assert(pThis->pCodec[0]->u16VendorId);
     3310    Assert(pThis->pCodec[0]->u16DeviceId);
     3311    Assert(pThis->pCodec[1]->u16VendorId);
     3312    Assert(pThis->pCodec[1]->u16DeviceId);
     3313    PCIDevSetSubSystemVendorId(&pThis->PciDev, pThis->pCodec[0]->u16VendorId); /* 2c ro - intel.) */
     3314    PCIDevSetSubSystemId(      &pThis->PciDev, pThis->pCodec[0]->u16DeviceId); /* 2e ro. */
     3315    PCIDevSetSubSystemVendorId(&pThis->PciDev, pThis->pCodec[1]->u16VendorId); /* 2c ro - intel.) */
     3316    PCIDevSetSubSystemId(      &pThis->PciDev, pThis->pCodec[1]->u16DeviceId); /* 2e ro. */
     3317
     3318    hdaReset(pDevIns);
     3319    pThis->pCodec[0]->id = 0;
     3320    pThis->pCodec[0]->pfnTransfer = hdaTransfer;
     3321    pThis->pCodec[0]->pfnReset = hdaCodecReset;
     3322    pThis->pCodec[1]->id = 0;
     3323    pThis->pCodec[1]->pfnTransfer = hdaTransfer;
     3324    pThis->pCodec[1]->pfnReset = hdaCodecReset;
     3325#else
     3326
    30983327    pThis->pCodec = (PHDACODEC)RTMemAllocZ(sizeof(HDACODEC));
    30993328    if (!pThis->pCodec)
     
    31233352    HDA_REG(pThis, WAKEEN)   = 0x0;
    31243353    HDA_REG(pThis, STATESTS) = 0x0;
    3125 
     3354#endif
    31263355    /*
    31273356     * Debug and string formatter types.
  • trunk/src/VBox/Devices/Audio/DevIchHdaCodec.cpp

    r44669 r50686  
    2626#define LOG_GROUP LOG_GROUP_DEV_AUDIO
    2727#include <VBox/vmm/pdmdev.h>
     28#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     29#include <VBox/vmm/pdmaudioifs.h>
     30#endif
    2831#include <iprt/assert.h>
    2932#include <iprt/uuid.h>
     
    3437
    3538#include "VBoxDD.h"
     39#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    3640extern "C" {
    3741#include "audio.h"
    3842}
     43#endif
    3944#include "DevIchHdaCodec.h"
    4045
     
    696701} CODECNODE, *PCODECNODE;
    697702AssertNodeSize(CODECNODE, 60 + 6);
    698 
    699 
    700703/*******************************************************************************
    701704*   Global Variables                                                           *
     
    11601163 * Misc helpers.
    11611164 */
    1162 
     1165#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1166static int hdaCodecToAudVolume(PHDACODEC pThis, AMPLIFIER *pAmp, audmixerctl_t mt)
     1167#else
    11631168static int hdaCodecToAudVolume(AMPLIFIER *pAmp, audmixerctl_t mt)
     1169#endif
    11641170{
    11651171    uint32_t dir = AMPLIFIER_OUT;
     
    11801186    uint8_t lVol = AMPLIFIER_REGISTER(*pAmp, dir, AMPLIFIER_LEFT, 0) & 0x7f;
    11811187    uint8_t rVol = AMPLIFIER_REGISTER(*pAmp, dir, AMPLIFIER_RIGHT, 0) & 0x7f;
     1188#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1189     /* @todo in SetVolume no passing audmixerctl_in as its not used in DrvAudio.c */
     1190    pThis->pDrv->pfnSetVolume(pThis->pDrv, &mute, &lVol, &rVol);
     1191#else
    11821192    AUD_set_volume(mt, &mute, &lVol, &rVol);
     1193#endif
    11831194    return VINF_SUCCESS;
    11841195}
     
    13281339    }
    13291340    if (CODEC_NID(cmd) == pThis->u8DacLineOut)
     1341#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1342        hdaCodecToAudVolume(pThis, pAmplifier, AUD_MIXER_VOLUME);
     1343#else
    13301344        hdaCodecToAudVolume(pAmplifier, AUD_MIXER_VOLUME);
     1345#endif
    13311346    if (CODEC_NID(cmd) == pThis->u8AdcVolsLineIn) /* Microphone */
     1347#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1348        hdaCodecToAudVolume(pThis, pAmplifier, AUD_MIXER_LINE_IN);
     1349#else
    13321350        hdaCodecToAudVolume(pAmplifier, AUD_MIXER_LINE_IN);
     1351#endif
    13331352    return VINF_SUCCESS;
    13341353}
     
    22382257
    22392258
    2240 
    22412259/*
    22422260 * APIs exposed to DevHDA.
     
    22522270 *       format) before enabling.
    22532271 */
     2272#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2273int hdaCodecOpenVoice(PHDACODEC pThis, ENMSOUNDSOURCE enmSoundSource, uint32_t uFrequency, uint32_t cChannels,
     2274                      audfmt_e fmt, uint32_t Endian)
     2275#else
    22542276int hdaCodecOpenVoice(PHDACODEC pThis, ENMSOUNDSOURCE enmSoundSource, audsettings_t *pAudioSettings)
     2277#endif
    22552278{
    22562279    int rc;
     2280#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2281    Assert(pThis);
     2282    if (!pThis)
     2283        return -1;
     2284#else
    22572285    Assert(pThis && pAudioSettings);
    22582286    if (   !pThis
    22592287        || !pAudioSettings)
    22602288        return -1;
     2289#endif
    22612290    switch (enmSoundSource)
    22622291    {
    22632292        case PI_INDEX:
     2293#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2294            /* old and new stream settings are not same. Then only call open */
     2295
     2296            //if (!hdaCodecCompareAudioSettings(&(pThis->SwVoiceIn)->info, pAudioSettings) && !pThis->SwVoiceIn)
     2297                rc = pThis->pDrv->pfnOpenIn(pThis->pDrv, &pThis->SwVoiceIn, "hda.in", pThis, pi_callback, uFrequency,
     2298                                            cChannels, fmt, Endian);
     2299#else
    22642300            pThis->SwVoiceIn = AUD_open_in(&pThis->card, pThis->SwVoiceIn, "hda.in", pThis, pi_callback, pAudioSettings);
     2301#endif
    22652302            rc = pThis->SwVoiceIn ? 0 : 1;
    22662303            break;
    22672304        case PO_INDEX:
     2305#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2306            rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, &pThis->SwVoiceOut, "hda.out", pThis, po_callback, uFrequency,
     2307                                         cChannels, fmt, Endian);
     2308#else
    22682309            pThis->SwVoiceOut = AUD_open_out(&pThis->card, pThis->SwVoiceOut, "hda.out", pThis, po_callback, pAudioSettings);
     2310#endif
    22692311            rc = pThis->SwVoiceOut ? 0 : 1;
    22702312            break;
     
    22732315    }
    22742316    if (!rc)
     2317#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2318        LogRel(("HdaCodec: can't open %s fmt(freq: %d)\n", enmSoundSource == PI_INDEX? "in" : "out", uFrequency));
     2319#else
    22752320        LogRel(("HdaCodec: can't open %s fmt(freq: %d)\n", enmSoundSource == PI_INDEX? "in" : "out", pAudioSettings->freq));
     2321#endif
    22762322    return rc;
    22772323}
     
    23442390     */
    23452391    if (hdaCodecIsDacNode(pThis, pThis->u8DacLineOut))
     2392#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2393        hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME);
     2394#else
    23462395        hdaCodecToAudVolume(&pThis->paNodes[pThis->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME);
     2396#endif
    23472397    else if (hdaCodecIsSpdifOutNode(pThis, pThis->u8DacLineOut))
     2398#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2399        hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].spdifout.B_params, AUD_MIXER_VOLUME);
     2400    hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8AdcVolsLineIn].adcvol.B_params, AUD_MIXER_LINE_IN);
     2401#else
    23482402        hdaCodecToAudVolume(&pThis->paNodes[pThis->u8DacLineOut].spdifout.B_params, AUD_MIXER_VOLUME);
    23492403    hdaCodecToAudVolume(&pThis->paNodes[pThis->u8AdcVolsLineIn].adcvol.B_params, AUD_MIXER_LINE_IN);
     2404#endif
    23502405
    23512406    return VINF_SUCCESS;
     
    23682423    int rc = stac9220Construct(pThis);
    23692424    AssertRC(rc);
     2425
    23702426
    23712427    /* common root node initializers */
     
    23782434
    23792435    /// @todo r=michaln: Was this meant to be 'HDA' or something like that? (AC'97 was on ICH0)
    2380     AUD_register_card ("ICH0", &pThis->card);
     2436#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2437    pThis->pDrv->pfnRegisterCard(pThis->pDrv, "ICH0");
     2438#else
     2439    AUD_register_card("ICH0", &pThis->card);
    23812440
    23822441    /* 44.1 kHz */
     
    23862445    as.fmt = AUD_FMT_S16;
    23872446    as.endianness = 0;
     2447#endif
    23882448
    23892449    pThis->paNodes[1].node.au32F00_param[0xA] = CODEC_F00_0A_16_BIT;
     2450#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2451    hdaCodecOpenVoice(pThis, PI_INDEX, 44100, 2, AUD_FMT_S16, 0);
     2452    hdaCodecOpenVoice(pThis, PO_INDEX, 44100, 2, AUD_FMT_S16, 0);
     2453#else
    23902454    hdaCodecOpenVoice(pThis, PI_INDEX, &as);
    23912455    hdaCodecOpenVoice(pThis, PO_INDEX, &as);
     2456#endif
     2457
    23922458    pThis->paNodes[1].node.au32F00_param[0xA] |= CODEC_F00_0A_44_1KHZ;
    23932459
     
    23992465        pThis->pfnCodecNodeReset(pThis, i, &pThis->paNodes[i]);
    24002466    }
    2401 
     2467#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2468    hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME);
     2469    hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8AdcVolsLineIn].adcvol.B_params, AUD_MIXER_LINE_IN);
     2470#else
    24022471    hdaCodecToAudVolume(&pThis->paNodes[pThis->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME);
    24032472    hdaCodecToAudVolume(&pThis->paNodes[pThis->u8AdcVolsLineIn].adcvol.B_params, AUD_MIXER_LINE_IN);
     2473#endif
    24042474
    24052475    /* If no host voices were created, then fallback to nul audio. */
     2476#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2477    if (!pThis->pDrv->pfnIsHostVoiceInOK(pThis->pDrv, pThis->SwVoiceIn))
     2478        LogRel (("HDA: pfnIsHostVoiceInOK WARNING: Unable to open PCM IN!\n"));
     2479    if (!pThis->pDrv->pfnIsHostVoiceOutOK(pThis->pDrv, pThis->SwVoiceOut))
     2480        LogRel (("HDA: pfnIsHostVoiceOutOK WARNING: Unable to open PCM OUT!\n"));
     2481#else
    24062482    if (!AUD_is_host_voice_in_ok(pThis->SwVoiceIn))
    24072483        LogRel (("HDA: WARNING: Unable to open PCM IN!\n"));
    24082484    if (!AUD_is_host_voice_out_ok(pThis->SwVoiceOut))
    24092485        LogRel (("HDA: WARNING: Unable to open PCM OUT!\n"));
    2410 
     2486#endif
     2487
     2488#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2489    if (   !pThis->pDrv->pfnIsHostVoiceInOK(pThis->pDrv, pThis->SwVoiceIn)
     2490        && !pThis->pDrv->pfnIsHostVoiceOutOK(pThis->pDrv, pThis->SwVoiceOut))
     2491#else
    24112492    if (   !AUD_is_host_voice_in_ok(pThis->SwVoiceIn)
    24122493        && !AUD_is_host_voice_out_ok(pThis->SwVoiceOut))
     2494#endif
    24132495    {
    24142496        /* Was not able initialize *any* voice. Select the NULL audio driver instead */
    2415         AUD_close_in  (&pThis->card, pThis->SwVoiceIn);
    2416         AUD_close_out (&pThis->card, pThis->SwVoiceOut);
     2497#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2498        pThis->pDrv->pfnCloseIn(pThis->pDrv, pThis->SwVoiceIn);
     2499        pThis->pDrv->pfnCloseOut(pThis->pDrv, pThis->SwVoiceOut);
     2500#else
     2501        AUD_close_in(&pThis->card, pThis->SwVoiceIn);
     2502        AUD_close_out(&pThis->card, pThis->SwVoiceOut);
     2503#endif
    24172504        pThis->SwVoiceOut = NULL;
    24182505        pThis->SwVoiceIn = NULL;
     2506#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2507        pThis->pDrv->pfnInitNull(pThis->pDrv);
     2508#else
    24192509        AUD_init_null ();
     2510#endif
    24202511
    24212512        PDMDevHlpVMSetRuntimeError (pDevIns, 0 /*fFlags*/, "HostAudioNotResponding",
     
    24232514                "with the consequence that no sound is audible"));
    24242515    }
     2516#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2517    else if (   !pThis->pDrv->pfnIsHostVoiceInOK(pThis->pDrv, pThis->SwVoiceIn)
     2518             || !pThis->pDrv->pfnIsHostVoiceOutOK(pThis->pDrv, pThis->SwVoiceOut))
     2519
     2520#else
    24252521    else if (   !AUD_is_host_voice_in_ok(pThis->SwVoiceIn)
    24262522             || !AUD_is_host_voice_out_ok(pThis->SwVoiceOut))
     2523#endif
    24272524    {
    24282525        char   szMissingVoices[128];
    24292526        size_t len = 0;
     2527 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2528        if (!pThis->pDrv->pfnIsHostVoiceInOK(pThis->pDrv, pThis->SwVoiceIn))
     2529            len = RTStrPrintf (szMissingVoices, sizeof(szMissingVoices), "PCM_in");
     2530        if (!pThis->pDrv->pfnIsHostVoiceOutOK(pThis->pDrv, pThis->SwVoiceOut))
     2531            len += RTStrPrintf (szMissingVoices + len, sizeof(szMissingVoices) - len, len ? ", PCM_out" : "PCM_out");
     2532 #else
    24302533        if (!AUD_is_host_voice_in_ok(pThis->SwVoiceIn))
    24312534            len = RTStrPrintf (szMissingVoices, sizeof(szMissingVoices), "PCM_in");
     
    24332536            len += RTStrPrintf (szMissingVoices + len, sizeof(szMissingVoices) - len, len ? ", PCM_out" : "PCM_out");
    24342537
     2538 #endif
    24352539        PDMDevHlpVMSetRuntimeError (pDevIns, 0 /*fFlags*/, "HostAudioNotResponding",
    24362540            N_ ("Some audio devices (%s) could not be opened. Guest applications generating audio "
  • trunk/src/VBox/Devices/Audio/DevIchHdaCodec.h

    r44669 r50686  
    1818#ifndef DEV_CODEC_H
    1919#define DEV_CODEC_H
    20 
     20//#include <VBox/vmm/pdmdev.h>
    2121/** The ICH HDA (Intel) codec state. */
    2222typedef struct HDACODEC HDACODEC;
    2323/** Pointer to the Intel ICH HDA codec state. */
    2424typedef HDACODEC *PHDACODEC;
    25 
     25#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     26typedef struct PDMIAUDIOCONNECTOR * PPDMIAUDIOCONNECTOR;
     27typedef struct PDMGSTVOICEOUT *PPDMGSTVOICEOUT;
     28typedef struct PDMGSTVOICEIN  *PPDMGSTVOICEIN;
     29#endif
    2630/**
    2731 * Verb processor method.
     
    7276    uint8_t                 u8BSKU;
    7377    uint8_t                 u8AssemblyId;
     78#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     79    R3PTRTYPE(PPDMIAUDIOCONNECTOR)     pDrv;
     80    /** Pointer to the attached audio driver. */
     81    R3PTRTYPE(PPDMIBASE)               pDrvBase;
     82#endif
     83
    7484#ifndef VBOX_WITH_HDA_CODEC_EMU
    7585    CODECVERB const        *paVerbs;
     
    7989#endif
    8090    PCODECNODE              paNodes;
     91
     92#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     93    /** PCM in */
     94    R3PTRTYPE(PPDMGSTVOICEIN)         SwVoiceIn;
     95    /** PCM out */
     96    R3PTRTYPE(PPDMGSTVOICEOUT)        SwVoiceOut;
     97#else
    8198    QEMUSoundCard           card;
    8299    /** PCM in */
     
    84101    /** PCM out */
    85102    SWVoiceOut              *SwVoiceOut;
     103#endif
    86104    void                   *pvHDAState;
    87105    bool                    fInReset;
  • trunk/src/VBox/Devices/Audio/DevSB16.cpp

    r45025 r50686  
    3434#define LOG_GROUP LOG_GROUP_DEV_AUDIO
    3535#include <VBox/vmm/pdmdev.h>
     36#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     37#include <VBox/vmm/pdmaudioifs.h>
     38#endif
    3639#include <iprt/assert.h>
    3740#include <iprt/string.h>
     
    3942#include "vl_vbox.h"
    4043
     44#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    4145extern "C" {
    4246#include "audio.h"
    4347}
    44 
    45 #ifndef VBOX
    46 
     48#endif
     49
     50#ifndef VBOX
    4751#define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))
    48 
    49 #define dolog(...) AUD_log ("sb16", __VA_ARGS__)
    50 
    51 /* #define DEBUG */
    52 /* #define DEBUG_SB16_MOST */
    53 
    54 #ifdef DEBUG
    55 #define ldebug(...) dolog (__VA_ARGS__)
    56 #else
    57 #define ldebug(...)
    58 #endif
    59 
    6052#else /* VBOX */
    61 
    6253/** Current saved state version. */
    6354#define SB16_SAVE_STATE_VERSION         2
     
    6556 * the config dump. */
    6657#define SB16_SAVE_STATE_VERSION_VBOX_30 1
    67 
    68 DECLINLINE(void) dolog (const char *fmt, ...)
    69 {
    70     va_list ap;
    71     va_start (ap, fmt);
    72     AUD_vlog ("sb16", fmt, ap);
    73     va_end (ap);
    74 }
    75 
    76 # ifdef DEBUG
    77 static void ldebug (const char *fmt, ...)
    78 {
    79     va_list ap;
    80 
    81     va_start (ap, fmt);
    82     AUD_vlog ("sb16", fmt, ap);
    83     va_end (ap);
    84 }
    85 # else
    86 DECLINLINE(void) ldebug (const char *fmt, ...)
    87 {
    88     (void)fmt;
    89 }
    90 # endif
    91 
    9258#endif /* VBOX */
    9359
     
    12288typedef struct SB16State {
    12389#ifdef VBOX
     90    /** Pointer to the device instance. */
    12491    PPDMDEVINSR3 pDevIns;
    125 #endif
     92# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     93    /** Pointer to the connector of the attached audio driver. */
     94    PPDMIAUDIOCONNECTOR     pDrv;
     95# endif
     96#endif
     97#ifndef VBOX
     98    qemu_irq *pic;
     99#endif
     100#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    126101    QEMUSoundCard card;
    127 #ifndef VBOX
    128     qemu_irq *pic;
    129102#endif
    130103#ifdef VBOX /* lazy bird */
     
    182155    int align;
    183156    int audio_free;
     157#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     158    PPDMGSTVOICEOUT voice;
     159#else
    184160    SWVoiceOut *voice;
     161#endif
    185162
    186163#ifndef VBOX
     
    211188        return 8;
    212189    default:
    213         dolog ("bad irq %d\n", irq);
     190        LogFlow(("SB16: bad irq %d\n", irq));
    214191        return 2;
    215192    }
     
    228205        return 10;
    229206    default:
    230         dolog ("bad irq magic %d\n", magic);
     207        LogFlow(("SB16: bad irq magic %d\n", magic));
    231208        return -1;
    232209    }
     
    259236    s->dma_running = hold;
    260237
    261     ldebug ("hold %d high %d dma %d\n", hold, s->use_hdma, dma);
     238    LogFlow(("SB16: hold %d high %d dma %d\n", hold, s->use_hdma, dma));
    262239
    263240#ifndef VBOX
     
    275252        PDMDevHlpDMASetDREQ (s->pDevIns, dma, 1);
    276253        PDMDevHlpDMASchedule (s->pDevIns);
     254#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     255        s->pDrv->pfnEnableOut(s->pDrv, s->voice, 1);
     256#else
    277257        AUD_set_active_out (s->voice, 1);
     258#endif
    278259    }
    279260    else
    280261    {
    281262        PDMDevHlpDMASetDREQ (s->pDevIns, dma, 0);
     263#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     264        s->pDrv->pfnEnableOut(s->pDrv, s->voice, 0);
     265#else
    282266        AUD_set_active_out (s->voice, 0);
     267#endif
    283268    }
    284269#endif /* VBOX */
     
    306291static void continue_dma8 (SB16State *s)
    307292{
     293#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     294    int rc;
     295#endif
    308296    if (s->freq > 0) {
     297
     298        s->audio_free = 0;
     299
     300
     301#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     302        rc = s->pDrv->pfnOpenOut(s->pDrv, &s->voice, "sb16", s, SB_audio_callback, s->freq, 1 << s->fmt_stereo,
     303                                 s->fmt, 0);
     304#else
    309305        audsettings_t as;
    310 
    311         s->audio_free = 0;
    312 
    313306        as.freq = s->freq;
    314307        as.nchannels = 1 << s->fmt_stereo;
    315308        as.fmt = s->fmt;
    316309        as.endianness = 0;
    317 
    318310        s->voice = AUD_open_out (
    319311            &s->card,
     
    324316            &as
    325317            );
     318#endif
    326319    }
    327320
     
    367360
    368361    if (s->block_size & s->align) {
    369         dolog ("warning: misaligned block size %d, alignment %d\n",
    370                s->block_size, s->align + 1);
    371     }
    372 
    373     ldebug ("freq %d, stereo %d, sign %d, bits %d, "
     362        LogFlow(("SB16: warning: misaligned block size %d, alignment %d\n",
     363               s->block_size, s->align + 1));
     364    }
     365
     366    LogFlow(("SB16: freq %d, stereo %d, sign %d, bits %d, "
    374367            "dma %d, auto %d, fifo %d, high %d\n",
    375368            s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,
    376             s->block_size, s->dma_auto, s->fifo, s->highspeed);
     369            s->block_size, s->dma_auto, s->fifo, s->highspeed));
    377370
    378371    continue_dma8 (s);
     
    419412    }
    420413
    421     ldebug ("freq %d, stereo %d, sign %d, bits %d, "
     414    LogFlow(("SB16: freq %d, stereo %d, sign %d, bits %d, "
    422415            "dma %d, auto %d, fifo %d, high %d\n",
    423416            s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,
    424             s->block_size, s->dma_auto, s->fifo, s->highspeed);
     417            s->block_size, s->dma_auto, s->fifo, s->highspeed));
    425418
    426419    if (16 == s->fmt_bits) {
     
    447440    s->align = (1 << (s->fmt_stereo + (s->fmt_bits == 16))) - 1;
    448441    if (s->block_size & s->align) {
    449         dolog ("warning: misaligned block size %d, alignment %d\n",
    450                s->block_size, s->align + 1);
     442        LogFlow(("SB16: warning: misaligned block size %d, alignment %d\n",
     443               s->block_size, s->align + 1));
    451444    }
    452445
    453446    if (s->freq) {
     447
     448        s->audio_free = 0;
     449
     450
     451#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     452    int rc;
     453        rc = s->pDrv->pfnOpenOut(s->pDrv, &s->voice, "sb16", s,SB_audio_callback, s->freq, 1 << s->fmt_stereo, s->fmt, 0);
     454#else
    454455        audsettings_t as;
    455 
    456         s->audio_free = 0;
    457 
    458456        as.freq = s->freq;
    459457        as.nchannels = 1 << s->fmt_stereo;
    460458        as.fmt = s->fmt;
    461459        as.endianness = 0;
    462 
    463460        s->voice = AUD_open_out (
    464461            &s->card,
     
    469466            &as
    470467            );
     468#endif
    471469    }
    472470
     
    477475static inline void dsp_out_data (SB16State *s, uint8_t val)
    478476{
    479     ldebug ("outdata %#x\n", val);
     477    LogFlow(("SB16: outdata %#x\n", val));
    480478    if ((size_t) s->out_data_len < sizeof (s->out_data)) {
    481479        s->out_data[s->out_data_len++] = val;
     
    489487    }
    490488    else {
    491         dolog ("buffer underflow\n");
     489        LogFlow(("SB16: buffer underflow\n"));
    492490        return 0;
    493491    }
     
    496494static void command (SB16State *s, uint8_t cmd)
    497495{
    498     ldebug ("command %#x\n", cmd);
     496    LogFlow(("SB16: command %#x\n", cmd));
    499497
    500498    if (cmd > 0xaf && cmd < 0xd0) {
    501499        if (cmd & 8) {
    502             dolog ("ADC not yet supported (command %#x)\n", cmd);
     500            LogFlow(("SB16: ADC not yet supported (command %#x)\n", cmd));
    503501        }
    504502
     
    508506            break;
    509507        default:
    510             dolog ("%#x wrong bits\n", cmd);
     508            LogFlow(("SB16: %#x wrong bits\n", cmd));
    511509        }
    512510        s->needed_bytes = 3;
     
    562560
    563561        case 0x35:
    564             dolog ("0x35 - MIDI command not implemented\n");
     562            LogFlow(("SB16: 0x35 - MIDI command not implemented\n"));
    565563            break;
    566564
     
    596594        case 0x74:
    597595            s->needed_bytes = 2; /* DMA DAC, 4-bit ADPCM */
    598             dolog ("0x75 - DMA DAC, 4-bit ADPCM not implemented\n");
     596            LogFlow(("SB16: 0x75 - DMA DAC, 4-bit ADPCM not implemented\n"));
    599597            break;
    600598
    601599        case 0x75:              /* DMA DAC, 4-bit ADPCM Reference */
    602600            s->needed_bytes = 2;
    603             dolog ("0x74 - DMA DAC, 4-bit ADPCM Reference not implemented\n");
     601            LogFlow(("SB16: 0x74 - DMA DAC, 4-bit ADPCM Reference not implemented\n"));
    604602            break;
    605603
    606604        case 0x76:              /* DMA DAC, 2.6-bit ADPCM */
    607605            s->needed_bytes = 2;
    608             dolog ("0x74 - DMA DAC, 2.6-bit ADPCM not implemented\n");
     606            LogFlow(("SB16: 0x74 - DMA DAC, 2.6-bit ADPCM not implemented\n"));
    609607            break;
    610608
    611609        case 0x77:              /* DMA DAC, 2.6-bit ADPCM Reference */
    612610            s->needed_bytes = 2;
    613             dolog ("0x74 - DMA DAC, 2.6-bit ADPCM Reference not implemented\n");
     611            LogFlow(("SB16: 0x74 - DMA DAC, 2.6-bit ADPCM Reference not implemented\n"));
    614612            break;
    615613
    616614        case 0x7d:
    617             dolog ("0x7d - Autio-Initialize DMA DAC, 4-bit ADPCM Reference\n");
    618             dolog ("not implemented\n");
     615            LogFlow(("SB16: 0x7d - Autio-Initialize DMA DAC, 4-bit ADPCM Reference\n"));
     616            LogFlow(("SB16: not implemented\n"));
    619617            break;
    620618
    621619        case 0x7f:
    622             dolog (
    623                 "0x7d - Autio-Initialize DMA DAC, 2.6-bit ADPCM Reference\n"
    624                 );
    625             dolog ("not implemented\n");
     620            LogFlow(("SB16: 0x7d - Autio-Initialize DMA DAC, 2.6-bit ADPCM Reference\n"));
     621            LogFlow(("SB16: not implemented\n"));
    626622            break;
    627623
     
    695691
    696692        case 0xe7:
    697             dolog ("Attempt to probe for ESS (0xe7)?\n");
     693            LogFlow(("SB16: Attempt to probe for ESS (0xe7)?\n"));
    698694            break;
    699695
     
    726722
    727723        default:
    728             dolog ("Unrecognized command %#x\n", cmd);
     724            LogFlow(("SB16: Unrecognized command %#x\n", cmd));
    729725            break;
    730726        }
     
    732728
    733729    if (!s->needed_bytes) {
    734         ldebug ("\n");
     730        LogFlow(("\n"));
    735731    }
    736732
     
    745741
    746742 warn:
    747     dolog ("warning: command %#x,%d is not truly understood yet\n",
    748            cmd, s->needed_bytes);
     743    LogFlow(("SB16: warning: command %#x,%d is not truly understood yet\n",
     744           cmd, s->needed_bytes));
    749745    goto exit;
    750746
     
    768764{
    769765    int d0, d1, d2;
    770     ldebug ("complete command %#x, in_index %d, needed_bytes %d\n",
    771             s->cmd, s->in_index, s->needed_bytes);
     766    LogFlow(("SB16: complete command %#x, in_index %d, needed_bytes %d\n",
     767            s->cmd, s->in_index, s->needed_bytes));
    772768
    773769    if (s->cmd > 0xaf && s->cmd < 0xd0) {
     
    777773
    778774        if (s->cmd & 8) {
    779             dolog ("ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
    780                    s->cmd, d0, d1, d2);
     775            LogFlow(("SB16: ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
     776                   s->cmd, d0, d1, d2));
    781777        }
    782778        else {
    783             ldebug ("cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
    784                     s->cmd, d0, d1, d2);
     779            LogFlow(("SB16: cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
     780                    s->cmd, d0, d1, d2));
    785781            dma_cmd (s, s->cmd, d0, d1 + (d2 << 8));
    786782        }
     
    792788            s->csp_reg83r = 0;
    793789            s->csp_reg83w = 0;
    794             ldebug ("CSP command 0x04: mode=%#x\n", s->csp_mode);
     790            LogFlow(("SB16: CSP command 0x04: mode=%#x\n", s->csp_mode));
    795791            break;
    796792
     
    798794            s->csp_param = dsp_get_data (s);
    799795            s->csp_value = dsp_get_data (s);
    800             ldebug ("CSP command 0x05: param=%#x value=%#x\n",
     796            LogFlow(("SB16: CSP command 0x05: param=%#x value=%#x\n",
    801797                    s->csp_param,
    802                     s->csp_value);
     798                    s->csp_value));
    803799            break;
    804800
     
    806802            d0 = dsp_get_data (s);
    807803            d1 = dsp_get_data (s);
    808             ldebug ("write CSP register %d <- %#x\n", d1, d0);
     804            LogFlow(("SB16: write CSP register %d <- %#x\n", d1, d0));
    809805            if (d1 == 0x83) {
    810                 ldebug ("0x83[%d] <- %#x\n", s->csp_reg83r, d0);
     806                LogFlow(("SB16: 0x83[%d] <- %#x\n", s->csp_reg83r, d0));
    811807                s->csp_reg83[s->csp_reg83r % 4] = d0;
    812808                s->csp_reg83r += 1;
     
    819815        case 0x0f:
    820816            d0 = dsp_get_data (s);
    821             ldebug ("read CSP register %#x -> %#x, mode=%#x\n",
    822                     d0, s->csp_regs[d0], s->csp_mode);
     817            LogFlow(("SB16: read CSP register %#x -> %#x, mode=%#x\n",
     818                    d0, s->csp_regs[d0], s->csp_mode));
    823819            if (d0 == 0x83) {
    824                 ldebug ("0x83[%d] -> %#x\n",
     820                LogFlow(("SB16: 0x83[%d] -> %#x\n",
    825821                        s->csp_reg83w,
    826                         s->csp_reg83[s->csp_reg83w % 4]);
     822                        s->csp_reg83[s->csp_reg83w % 4]));
    827823                dsp_out_data (s, s->csp_reg83[s->csp_reg83w % 4]);
    828824                s->csp_reg83w += 1;
     
    835831        case 0x10:
    836832            d0 = dsp_get_data (s);
    837             dolog ("cmd 0x10 d0=%#x\n", d0);
     833            LogFlow(("SB16: cmd 0x10 d0=%#x\n", d0));
    838834            break;
    839835
     
    844840        case 0x40:
    845841            s->time_const = dsp_get_data (s);
    846             ldebug ("set time const %d\n", s->time_const);
     842            LogFlow(("SB16: set time const %d\n", s->time_const));
    847843            break;
    848844
     
    853849        case 0x41:
    854850            s->freq = dsp_get_hilo (s);
    855             ldebug ("set freq %d\n", s->freq);
     851            LogFlow(("SB16: set freq %d\n", s->freq));
    856852            break;
    857853
    858854        case 0x48:
    859855            s->block_size = dsp_get_lohi (s) + 1;
    860             ldebug ("set dma block len %d\n", s->block_size);
     856            LogFlow(("SB16: set dma block len %d\n", s->block_size));
    861857            break;
    862858
     
    889885                    }
    890886                }
    891                 ldebug ("mix silence %d %d %" PRId64 "\n", samples, bytes, ticks);
     887                LogFlow(("SB16: mix silence %d %d %" PRId64 "\n", samples, bytes, ticks));
    892888#else  /* VBOX */
    893889                ticks = (bytes * TMTimerGetFreq(s->pTimer)) / freq;
     
    896892                else
    897893                    TMTimerSet(s->pTimer, TMTimerGet(s->pTimer) + ticks);
    898                 ldebug ("mix silence %d %d % %RU64\n", samples, bytes, ticks);
     894                LogFlow(("SB16: mix silence %d %d % %RU64\n", samples, bytes, ticks));
    899895#endif /* VBOX */
    900896            }
     
    904900            d0 = dsp_get_data (s);
    905901            s->out_data_len = 0;
    906             ldebug ("E0 data = %#x\n", d0);
     902            LogFlow(("SB16: E0 data = %#x\n", d0));
    907903            dsp_out_data (s, ~d0);
    908904            break;
     
    910906        case 0xe2:
    911907            d0 = dsp_get_data (s);
    912             ldebug ("E2 = %#x\n", d0);
     908            LogFlow(("SB16:E2 = %#x\n", d0));
    913909            break;
    914910
     
    919915        case 0xf9:
    920916            d0 = dsp_get_data (s);
    921             ldebug ("command 0xf9 with %#x\n", d0);
     917            LogFlow(("SB16: command 0xf9 with %#x\n", d0));
    922918            switch (d0) {
    923919            case 0x0e:
     
    940936
    941937        default:
    942             dolog ("complete: unrecognized command %#x\n", s->cmd);
     938            LogFlow(("SB16: complete: unrecognized command %#x\n", s->cmd));
    943939            return;
    944940        }
    945941    }
    946942
    947     ldebug ("\n");
     943    LogFlow(("\n"));
    948944    s->cmd = -1;
    949945    return;
     
    952948static void legacy_reset (SB16State *s)
    953949{
    954     audsettings_t as;
    955950
    956951    s->freq = 11025;
     
    959954    s->fmt_stereo = 0;
    960955
     956#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     957    int rc;
     958    rc = s->pDrv->pfnOpenOut(s->pDrv, &s->voice, "sb16", s, SB_audio_callback, 11025, 1, AUD_FMT_U8, 0);
     959#else
     960    audsettings_t as;
    961961    as.freq = s->freq;
    962962    as.nchannels = 1;
    963963    as.fmt = AUD_FMT_U8;
    964964    as.endianness = 0;
    965 
    966965    s->voice = AUD_open_out (
    967966        &s->card,
     
    973972        );
    974973
     974#endif
    975975    /* Not sure about that... */
    976976    /* AUD_set_active_out (s->voice, 1); */
     
    10161016    int iport = nport - s->port;
    10171017
    1018     ldebug ("write %#x <- %#x\n", nport, val);
     1018    LogFlow(("SB16: write %#x <- %#x\n", nport, val));
    10191019    switch (iport) {
    10201020    case 0x06:
     
    10771077        else {
    10781078            if (s->in_index == sizeof (s->in2_data)) {
    1079                 dolog ("in data overrun\n");
     1079                LogFlow(("SB16: in data overrun\n"));
    10801080            }
    10811081            else {
     
    10931093
    10941094    default:
    1095         ldebug ("(nport=%#x, val=%#x)\n", nport, val);
     1095        LogFlow(("SB16: nport=%#x, val=%#x)\n", nport, val));
    10961096        break;
    10971097    }
     
    11251125        else {
    11261126            if (s->cmd != -1) {
    1127                 dolog ("empty output buffer for command %#x\n",
    1128                        s->cmd);
     1127                LogFlow(("SB16: empty output buffer for command %#x\n",
     1128                       s->cmd));
    11291129            }
    11301130            retval = s->last_read_byte;
     
    11731173
    11741174    if (!ack) {
    1175         ldebug ("read %#x -> %#x\n", nport, retval);
     1175        LogFlow(("SB16: read %#x -> %#x\n", nport, retval));
    11761176    }
    11771177
     
    11841184
    11851185 error:
    1186     dolog ("warning: dsp_read %#x error\n", nport);
     1186    LogFlow(("SB16: warning: dsp_read %#x error\n", nport));
    11871187#ifndef VBOX
    11881188    return 0xff;
     
    12321232#endif
    12331233}
     1234#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1235uint32_t popcount (uint32_t u)
     1236{
     1237    u = ((u&0x55555555) + ((u>>1)&0x55555555));
     1238    u = ((u&0x33333333) + ((u>>2)&0x33333333));
     1239    u = ((u&0x0f0f0f0f) + ((u>>4)&0x0f0f0f0f));
     1240    u = ((u&0x00ff00ff) + ((u>>8)&0x00ff00ff));
     1241    u = ( u&0x0000ffff) + (u>>16);
     1242    return u;
     1243}
     1244
     1245uint32_t lsbindex (uint32_t u)
     1246{
     1247    return popcount ((u&-u)-1);
     1248}
     1249#endif
    12341250
    12351251static IO_WRITE_PROTO(mixer_write_datab)
     
    12401256
    12411257    (void) nport;
    1242     ldebug ("mixer_write [%#x] <- %#x\n", s->mixer_nreg, val);
     1258    LogFlow(("SB16: mixer_write [%#x] <- %#x\n", s->mixer_nreg, val));
    12431259
    12441260    switch (s->mixer_nreg) {
     
    12911307        {
    12921308            int irq = irq_of_magic (val);
    1293             ldebug ("setting irq to %d (val=%#x)\n", irq, val);
     1309            LogFlow(("SB16: setting irq to %d (val=%#x)\n", irq, val));
    12941310            if (irq > 0) {
    12951311                s->irq = irq;
     
    13051321            hdma = lsbindex (val & 0xf0);
    13061322            if (dma != s->dma || hdma != s->hdma) {
    1307                 dolog (
    1308                     "attempt to change DMA "
     1323                LogFlow((
     1324                    "SB16: attempt to change DMA "
    13091325                    "8bit %d(%d), 16bit %d(%d) (val=%#x)\n",
    1310                     dma, s->dma, hdma, s->hdma, val);
     1326                    dma, s->dma, hdma, s->hdma, val));
    13111327            }
    13121328#if 0
     
    13181334
    13191335    case 0x82:
    1320         dolog ("attempt to write into IRQ status register (val=%#x)\n",
    1321                val);
     1336        LogFlow(("SB16: attempt to write into IRQ status register (val=%#x)\n",
     1337               val));
    13221338#ifdef VBOX
    13231339        return VINF_SUCCESS;
     
    13261342    default:
    13271343        if (s->mixer_nreg >= 0x80) {
    1328             ldebug ("attempt to write mixer[%#x] <- %#x\n", s->mixer_nreg, val);
     1344            LogFlow(("SB16: attempt to write mixer[%#x] <- %#x\n", s->mixer_nreg, val));
    13291345        }
    13301346        break;
     
    13401356        uint8_t lvol = s->mixer_regs[0x30];
    13411357        uint8_t rvol = s->mixer_regs[0x31];
     1358#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1359        /*@todo not passinga audmixer_Ctl values as its not used in DrvAudio.c */
     1360        s->pDrv->pfnSetVolume(s->pDrv, &mute, &lvol, &rvol);
     1361#else
    13421362        AUD_set_volume(AUD_MIXER_VOLUME, &mute, &lvol, &rvol);
     1363#endif
    13431364    }
    13441365    /* Update the voice (PCM) volume. */
     
    13481369        uint8_t lvol = s->mixer_regs[0x32];
    13491370        uint8_t rvol = s->mixer_regs[0x33];
     1371#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1372        s->pDrv->pfnSetVolume(s->pDrv, &mute, &lvol, &rvol);
     1373#else
    13501374        AUD_set_volume(AUD_MIXER_PCM, &mute, &lvol, &rvol);
     1375#endif
    13511376    }
    13521377#endif /* VBOX */
     
    13971422#ifndef DEBUG_SB16_MOST
    13981423    if (s->mixer_nreg != 0x82) {
    1399         ldebug ("mixer_read[%#x] -> %#x\n",
    1400                 s->mixer_nreg, s->mixer_regs[s->mixer_nreg]);
    1401     }
    1402 #else
    1403     ldebug ("mixer_read[%#x] -> %#x\n",
    1404             s->mixer_nreg, s->mixer_regs[s->mixer_nreg]);
     1424        LogFlow(("SB16: mixer_read[%#x] -> %#x\n",
     1425                s->mixer_nreg, s->mixer_regs[s->mixer_nreg]));
     1426    }
     1427#else
     1428    LogFlow(("SB16: mixer_read[%#x] -> %#x\n",
     1429            s->mixer_nreg, s->mixer_regs[s->mixer_nreg]));
    14051430#endif
    14061431#ifndef VBOX
     
    14441469#endif
    14451470
     1471#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1472        copied = s->pDrv->pfnWrite(s->pDrv, s->voice, tmpbuf, copied);
     1473#else
    14461474        copied = AUD_write (s->voice, tmpbuf, copied);
     1475#endif
    14471476
    14481477        temp -= copied;
     
    14681497
    14691498    if (s->block_size <= 0) {
    1470         dolog ("invalid block size=%d nchan=%d dma_pos=%d dma_len=%d\n",
    1471                s->block_size, nchan, dma_pos, dma_len);
     1499        LogFlow(("SB16: invalid block size=%d nchan=%d dma_pos=%d dma_len=%d\n",
     1500               s->block_size, nchan, dma_pos, dma_len));
    14721501        return dma_pos;
    14731502    }
     
    14911520
    14921521#ifdef DEBUG_SB16_MOST
    1493     dolog ("pos:%06d %d till:%d len:%d\n",
    1494            dma_pos, free, till, dma_len);
     1522    LogFlow(("SB16: pos:%06d %d till:%d len:%d\n",
     1523           dma_pos, free, till, dma_len));
    14951524#endif
    14961525
     
    15231552
    15241553#ifdef DEBUG_SB16_MOST
    1525     ldebug ("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n",
     1554    LogFlow(("SB16: pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n",
    15261555            dma_pos, free, dma_len, s->left_till_irq, copy, written,
    1527             s->block_size);
     1556            s->block_size));
    15281557#endif
    15291558
     
    16631692
    16641693    if (s->voice) {
     1694#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1695        s->pDrv->pfnCloseOut(s->pDrv, s->voice);
     1696#else
    16651697        AUD_close_out (&s->card, s->voice);
     1698#endif
    16661699        s->voice = NULL;
    16671700    }
     
    16691702    if (s->dma_running) {
    16701703        if (s->freq) {
     1704
     1705            s->audio_free = 0;
     1706
     1707#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1708            int rc;
     1709            rc = s->pDrv->pfnOpenOut(s->pDrv, &s->voice, "sb16", s, SB_audio_callback, s->freq, 1 << s->fmt_stereo, s->fmt, 0);
     1710#else
    16711711            audsettings_t as;
    1672 
    1673             s->audio_free = 0;
    1674 
    16751712            as.freq = s->freq;
    16761713            as.nchannels = 1 << s->fmt_stereo;
    16771714            as.fmt = s->fmt;
    16781715            as.endianness = 0;
    1679 
    16801716            s->voice = AUD_open_out (
    16811717                &s->card,
     
    16861722                &as
    16871723                );
     1724#endif
    16881725        }
    16891726
     
    17061743
    17071744    if (!audio) {
    1708         dolog ("No audio state\n");
     1745        LogFlow(("SB16: No audio state\n"));
    17091746        return -1;
    17101747    }
     
    17121749    s = qemu_mallocz (sizeof (*s));
    17131750    if (!s) {
    1714         dolog ("Could not allocate memory for SB16 (%zu bytes)\n",
    1715                sizeof (*s));
     1751        LogFlow(("SB16: Could not allocate memory for SB16 (%zu bytes)\n",
     1752               sizeof (*s)));
    17161753        return -1;
    17171754    }
     
    17351772    s->aux_ts = qemu_new_timer (vm_clock, aux_timer, s);
    17361773    if (!s->aux_ts) {
    1737         dolog ("warning: Could not create auxiliary timer\n");
     1774        LogFlow(("SB16: warning: Could not create auxiliary timer\n"));
    17381775    }
    17391776
     
    17561793
    17571794    register_savevm ("sb16", 0, 1, SB_save, SB_load, s);
    1758     AUD_register_card (audio, "sb16", &s->card);
     1795    AUD_register_card (audio, "sb16");
    17591796    return 0;
    17601797}
     
    19431980
    19441981    rc = PDMDevHlpDriverAttach(pDevIns, 0, &s->IBase, &s->pDrvBase, "Audio Driver Port");
     1982#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1983    if(RT_SUCCESS(rc))
     1984    {
     1985        s->pDrv = PDMIBASE_QUERY_INTERFACE(s->pDrvBase, PDMIAUDIOCONNECTOR);
     1986        AssertMsgReturn(s->pDrv,
     1987                        ("Configuration error: instance %d has no host audio interface!\n", iInstance),
     1988                        VERR_PDM_MISSING_INTERFACE);
     1989    }
     1990    else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
     1991#else
    19451992    if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
    1946         Log(("sb16: No attached driver!\n"));
     1993#endif
     1994        Log(("ac97: No attached driver!\n"));
    19471995    else if (RT_FAILURE(rc))
    1948         AssertMsgFailedReturn(("Failed to attach SB16 LUN #0! rc=%Rrc\n", rc), rc);
    1949 
     1996    {
     1997        AssertMsgFailed(("Failed to attach AC97 LUN #0! rc=%Rrc\n", rc));
     1998        return rc;
     1999    }
     2000
     2001#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2002     s->pDrv->pfnRegisterCard(s->pDrv, "sb16");
     2003#else
    19502004    AUD_register_card("sb16", &s->card);
     2005#endif
    19512006    legacy_reset(s);
    19522007
     2008#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2009    if (!s->pDrv->pfnIsHostVoiceOutOK(s->pDrv,s->voice))
     2010#else
    19532011    if (!AUD_is_host_voice_out_ok(s->voice))
     2012#endif
    19542013    {
    19552014        LogRel (("SB16: WARNING: Unable to open PCM OUT!\n"));
    1956         AUD_close_out(&s->card, s->voice);
     2015#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2016        s->pDrv->pfnCloseOut(s->pDrv, s->voice );
     2017#else
     2018        AUD_close_out (&s->card, s->voice);
     2019#endif
    19572020        s->voice = NULL;
     2021#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     2022        s->pDrv->pfnInitNull(s->pDrv);
     2023#else
    19582024        AUD_init_null();
     2025#endif
    19592026        PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "HostAudioNotResponding",
    19602027            N_("No audio devices could be opened. Selecting the NULL audio backend "
  • trunk/src/VBox/Devices/Audio/mixeng.c

    r35353 r50686  
    2626#include "VBoxDD.h"
    2727#include "vl_vbox.h"
    28 #include "audio.h"
    2928#ifdef VBOX
    3029# include <iprt/asm-math.h>
     
    3332
    3433#define AUDIO_CAP "mixeng"
     34#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     35#include "DrvAudio.h"
     36#else
     37#include "audio.h"
    3538#include "audio_int.h"
     39#endif
    3640
    3741#ifndef VBOX
     
    309313void *st_rate_start (int inrate, int outrate)
    310314{
     315#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     316    struct rate *rate = (struct rate *)RTMemAllocZ(1 * sizeof (*rate));
     317#else
    311318    struct rate *rate = audio_calloc (AUDIO_FUNC, 1, sizeof (*rate));
     319#endif
    312320
    313321    if (!rate) {
    314         dolog ("Could not allocate resampler (%" FMTZ "u bytes)\n",
    315                sizeof (*rate));
     322        LogFlow(("Could not allocate resampler %u bytes)\n", sizeof (*rate)));
    316323        return NULL;
    317324    }
     
    338345void st_rate_stop (void *opaque)
    339346{
     347#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     348    RTMemFree(opaque);
     349#else
    340350    qemu_free (opaque);
    341 }
    342 
     351#endif
     352}
     353
     354#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     355void mixeng_clear(PPDMHOSTSTEREOSAMPLE buf, int len)
     356{
     357    memset (buf, 0, len * sizeof (PDMHOSTSTEREOSAMPLE));
     358}
     359#else
    343360void mixeng_clear (st_sample_t *buf, int len)
    344361{
    345362    memset (buf, 0, len * sizeof (st_sample_t));
    346363}
    347 
     364#endif
     365
     366#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     367void mixeng_sniff_and_clear (PPDMHOSTVOICEOUT hw, PPDMHOSTSTEREOSAMPLE src, int len)
     368#else
    348369void mixeng_sniff_and_clear (HWVoiceOut *hw, st_sample_t *src, int len)
    349 {
     370#endif
     371{
     372#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
     373    LogFlow(("mixeng: sniffer_run_out\n"));
    350374    sniffer_run_out (hw, src, len);
     375#endif
    351376    mixeng_clear (src, len);
    352377}
  • trunk/src/VBox/Devices/Audio/mixeng.h

    r6521 r50686  
    2929#ifdef VBOX
    3030/* use faster ASMMult2xS32RetS64 */
     31#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    3132typedef struct { int mute;  uint32_t r; uint32_t l; } volume_t;
     33#endif
    3234typedef struct { int64_t l; int64_t r; } st_sample_t;
    3335#else /* !VBOX */
     
    4143#endif
    4244#endif /* VBOX */
    43 
     45#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    4446typedef void (t_sample) (st_sample_t *dst, const void *src,
    4547                         int samples, volume_t *vol);
     48#endif
    4649typedef void (f_sample) (void *dst, const st_sample_t *src, int samples);
    4750
     
    5558                       int *isamp, int *osamp);
    5659void st_rate_stop (void *opaque);
     60# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     61void mixeng_clear(PPDMHOSTSTEREOSAMPLE buf, int len);
     62void mixeng_sniff_and_clear(PPDMHOSTVOICEOUT hw, PPDMHOSTSTEREOSAMPLE src, int len);
     63# else
    5764void mixeng_clear (st_sample_t *buf, int len);
    5865void mixeng_sniff_and_clear (struct HWVoiceOut *hw, st_sample_t *src, int len);
     66# endif
    5967
    6068#endif  /* mixeng.h */
  • trunk/src/VBox/Devices/Audio/mixeng_template.h

    r6521 r50686  
    114114
    115115static void glue (glue (conv_, ET), _to_stereo)
     116#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     117    (PPDMHOSTSTEREOSAMPLE dst, const void *src, int samples, volume_t *vol)
     118#else
    116119    (st_sample_t *dst, const void *src, int samples, volume_t *vol)
    117 {
     120#endif
     121{
     122#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     123    PPDMHOSTSTEREOSAMPLE out = dst;
     124#else
    118125    st_sample_t *out = dst;
     126#endif
    119127    IN_T *in = (IN_T *) src;
    120128#ifndef NOVOL
     
    127135#endif
    128136    while (samples--) {
     137#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     138        out->u64LSample = VOL (glue (conv_, ET) (*in++), vol->l);
     139        out->u64RSample = VOL (glue (conv_, ET) (*in++), vol->r);
     140#else
    129141        out->l = VOL (glue (conv_, ET) (*in++), vol->l);
    130142        out->r = VOL (glue (conv_, ET) (*in++), vol->r);
     143#endif
    131144        out += 1;
    132145    }
     
    134147
    135148static void glue (glue (conv_, ET), _to_mono)
     149#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     150    (PPDMHOSTSTEREOSAMPLE dst, const void *src, int samples, volume_t *vol)
     151#else
    136152    (st_sample_t *dst, const void *src, int samples, volume_t *vol)
    137 {
     153#endif
     154{
     155#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     156    PPDMHOSTSTEREOSAMPLE out = dst;
     157#else
    138158    st_sample_t *out = dst;
     159#endif
    139160    IN_T *in = (IN_T *) src;
    140161#ifndef NOVOL
     
    147168#endif
    148169    while (samples--) {
     170#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     171        out->u64LSample = VOL (glue (conv_, ET) (in[0]), vol->l);
     172        out->u64RSample = out->u64LSample;
     173#else
    149174        out->l = VOL (glue (conv_, ET) (in[0]), vol->l);
    150175        out->r = out->l;
     176
     177#endif
    151178        out += 1;
    152179        in += 1;
  • trunk/src/VBox/Devices/Makefile.kmk

    r50674 r50686  
    165165        Parallel/DevParallel.cpp \
    166166        \
    167         Audio/audio.c \
    168         Audio/audiosniffer.c \
    169167        Audio/mixeng.c \
    170         Audio/noaudio.c \
    171         Audio/filteraudio.c \
    172168        Input/DrvKeyboardQueue.cpp \
    173169        Input/DrvMouseQueue.cpp \
     
    497493 # --- Audio bits. ---
    498494
     495 ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     496   VBoxDD_DEFS         +=VBOX_WITH_PDM_AUDIO_DRIVER
     497 endif
     498 ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     499   VBoxDD_SOURCES += Audio/DrvAudio.c \
     500         Audio/DrvAudioUtil.c \
     501         Audio/DrvHostNullAudio.c
     502 else
     503   VBoxDD_SOURCES += Audio/audio.c \
     504         Audio/audiosniffer.c \
     505         Audio/noaudio.c \
     506         Audio/filteraudio.c
     507 endif
     508
    499509 ifdef VBOX_WITH_ALSA
    500510  VBoxDD_DEFS.linux     += VBOX_WITH_ALSA
    501   VBoxDD_SOURCES.linux  += \
    502         Audio/alsaaudio.c \
    503         Audio/alsa_stubs.c
     511  ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     512    VBoxDD_DEFS.linux     += VBOX_WITH_WITH_PDM_AUDIO_DRIVER
     513    VBoxDD_SOURCES.linux  += \
     514          Audio/DrvHostAlsaAudio.c \
     515      Audio/alsa_stubs.c
     516  else
     517    VBoxDD_SOURCES.linux  += \
     518          Audio/alsaaudio.c \
     519          Audio/alsa_stubs.c
     520  endif
    504521 endif
    505522
    506523 ifdef VBOX_WITH_PULSE
    507524  VBoxDD_DEFS.linux     += VBOX_WITH_PULSE
    508   VBoxDD_SOURCES.linux  += \
    509         Audio/pulseaudio.c \
    510         Audio/pulse_stubs.c
     525  ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     526    VBoxDD_DEFS.linux     += VBOX_WITH_PDM_AUDIO_DRIVER
     527    VBoxDD_SOURCES.linux  += \
     528          Audio/DrvHostPulseAudio.c \
     529      Audio/pulse_stubs.c
     530  else
     531    VBoxDD_SOURCES.linux  += \
     532          Audio/pulseaudio.c \
     533          Audio/pulse_stubs.c
     534  endif
    511535  VBoxDD_DEFS.freebsd   += VBOX_WITH_PULSE
    512   VBoxDD_SOURCES.freebsd+= \
    513         Audio/pulseaudio.c \
    514         Audio/pulse_stubs.c
     536  ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     537    VBoxDD_SOURCES.freebsd+= \
     538          Audio/DrvHostPulseAudio.c \
     539          Audio/pulse_stubs.c
     540  else
     541    VBoxDD_SOURCES.freebsd+= \
     542          Audio/pulseaudio.c \
     543          Audio/pulse_stubs.c
     544  endif
    515545 endif
    516546
     
    631661
    632662 ifeq ($(KBUILD_TARGET),freebsd)
    633   VBoxDD_SOURCES        := \
    634         $(filter-out Storage/DrvHostFloppy%, $(VBoxDD_SOURCES)) \
    635         Audio/ossaudio.c \
    636         Serial/DrvHostSerial.cpp
    637   VBoxDD_SOURCES.freebsd += \
    638         Network/DrvTAP.cpp
     663  ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     664    VBoxDD_SOURCES        := \
     665          $(filter-out Storage/DrvHostFloppy%, $(VBoxDD_SOURCES)) \
     666          Audio/DrvHostOssAudio.c \
     667          Serial/DrvHostSerial.cpp
     668    VBoxDD_SOURCES.freebsd += \
     669          Network/DrvTAP.cpp
     670  else
     671    VBoxDD_SOURCES        := \
     672          $(filter-out Storage/DrvHostFloppy%, $(VBoxDD_SOURCES)) \
     673          Audio/ossaudio.c \
     674          Serial/DrvHostSerial.cpp
     675    VBoxDD_SOURCES.freebsd += \
     676          Network/DrvTAP.cpp
     677  endif
    639678 endif # freebsd
    640679
    641680 VBoxDD_SOURCES.linux  += \
    642681        Network/DrvTAP.cpp \
    643         Audio/ossaudio.c \
    644682        Parallel/DrvHostParallel.cpp \
    645683        Serial/DrvHostSerial.cpp
    646684
     685 ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     686  VBoxDD_SOURCES.linux  += \
     687    Audio/DrvHostOssAudio.c
     688 else
     689   VBoxDD_SOURCES.linux  += \
     690         Audio/ossaudio.c
     691 endif
     692 
    647693 ifeq ($(KBUILD_TARGET),os2)
    648694 VBoxDD_SOURCES        := $(filter-out Storage/DrvHost%, $(VBoxDD_SOURCES))
     
    650696
    651697 ifeq ($(KBUILD_TARGET),solaris)
    652  VBoxDD_SOURCES        := $(filter-out Storage/DrvHostFloppy%, $(VBoxDD_SOURCES))
    653  VBoxDD_SOURCES.solaris += \
    654         Audio/solaudio.c \
     698  VBoxDD_SOURCES        := $(filter-out Storage/DrvHostFloppy%, $(VBoxDD_SOURCES))
     699  VBoxDD_SOURCES.solaris += \
    655700        Serial/DrvHostSerial.cpp
     701  ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     702    VBoxDD_SOURCES.solaris += \
     703          Audio/DrvHostSolAudio.c
     704  else
     705    VBoxDD_SOURCES.solaris += \
     706          Audio/solaudio.c
     707  endif
    656708  ifdef VBOX_WITH_SOLARIS_OSS
    657    VBoxDD_SOURCES += Audio/ossaudio.c
    658    VBoxDD_DEFS += VBOX_WITH_SOLARIS_OSS
     709    ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     710      VBoxDD_SOURCES += Audio/DrvHostOssAudio.c
     711    else
     712      VBoxDD_SOURCES += Audio/ossaudio.c
     713    endif
     714    VBoxDD_DEFS += VBOX_WITH_SOLARIS_OSS
    659715  endif
    660716  ifdef VBOX_WITH_SUID_WRAPPER
     
    664720
    665721 VBoxDD_DEFS.win       += VBOX_WITH_WIN_PARPORT_SUP
     722 ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     723   VBoxDD_DEFS.win       += VBOX_WITH_PDM_AUDIO_DRIVER
     724 endif
    666725 VBoxDD_SOURCES.win    += \
    667         Audio/dsoundaudio.c \
    668726        Serial/DrvHostSerial.cpp \
    669727        Parallel/DrvHostParallel.cpp
     728
     729 ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     730 VBoxDD_SOURCES.win    += \
     731   Audio/DrvHostDSound.c
     732 else
     733 VBoxDD_SOURCES.win    += \
     734   Audio/dsoundaudio.c
     735 endif
    670736
    671737 if defined(VBOX_WITH_NETFLT)
  • trunk/src/VBox/Devices/build/VBoxDD.cpp

    r49316 r50686  
    127127    if (RT_FAILURE(rc))
    128128        return rc;
     129#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     130    //rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceAudioVRDE);
     131    //if (RT_FAILURE(rc))
     132    //    return rc;
     133#else
    129134    rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceAudioSniffer);
    130135    if (RT_FAILURE(rc))
    131136        return rc;
     137#endif
    132138#ifdef VBOX_WITH_VUSB
    133139    rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceOHCI);
     
    266272    if (RT_FAILURE(rc))
    267273        return rc;
     274#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     275# if defined(RT_OS_WINDOWS)
     276    rc = pCallbacks->pfnRegister(pCallbacks, &g_DrvHostDSound);
     277    if (RT_FAILURE(rc))
     278        return rc;
     279# endif
     280# if defined(RT_OS_LINUX)
     281    rc = pCallbacks->pfnRegister(pCallbacks, &g_DrvHostPulseAudio);
     282    if (RT_FAILURE(rc))
     283        return rc;
     284# endif
     285# if defined(RT_OS_FREEBSD)
     286    rc = pCallbacks->pfnRegister(pCallbacks, &g_DrvHostOssAudio);
     287    if (RT_FAILURE(rc))
     288        return rc;
     289# endif
     290# if defined(RT_OS_DARWIN)
     291    rc = pCallbacks->pfnRegister(pCallbacks, &g_DrvHostCoreAudio);
     292    if (RT_FAILURE(rc))
     293        return rc;
     294# endif
     295# if defined(RT_OS_SOLARIS)
     296    rc = pCallbacks->pfnRegister(pCallbacks, &g_DrvHostSolAudio);
     297    if (RT_FAILURE(rc))
     298        return rc;
     299# endif
     300#endif
    268301    rc = pCallbacks->pfnRegister(pCallbacks, &g_DrvACPI);
    269302    if (RT_FAILURE(rc))
  • trunk/src/VBox/Devices/build/VBoxDD.h

    r49316 r50686  
    5656extern const PDMDEVREG g_DeviceSB16;
    5757extern const PDMDEVREG g_DeviceICH6_HDA;
     58#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    5859extern const PDMDEVREG g_DeviceAudioSniffer;
     60#endif
    5961extern const PDMDEVREG g_DeviceOHCI;
    6062extern const PDMDEVREG g_DeviceEHCI;
     
    111113extern const PDMDRVREG g_DrvNetSniffer;
    112114extern const PDMDRVREG g_DrvAUDIO;
     115#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     116# if defined(RT_OS_WINDOWS)
     117extern const PDMDRVREG g_DrvHostDSound;
     118# endif
     119# if defined(RT_OS_LINUX)
     120extern const PDMDRVREG g_DrvHostPulseAudio;
     121# endif
     122# if defined(RT_OS_DARWIN)
     123extern const PDMDRVREG g_DrvHostCoreAudio;
     124# endif
     125# if defined(RT_OS_SOLARIS)
     126extern const PDMDRVREG g_DrvHostSolAudio;
     127# endif
     128# if defined(RT_OS_FREEBSD)
     129extern const PDMDRVREG g_DrvHostOssAudio;
     130# endif
     131#endif
    113132extern const PDMDRVREG g_DrvACPI;
    114133extern const PDMDRVREG g_DrvAcpiCpu;
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