VirtualBox

Changeset 55005 in vbox for trunk


Ignore:
Timestamp:
Mar 30, 2015 12:07:39 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
99276
Message:

PDM/Audio: Added volume through virtual mixer.

Location:
trunk
Files:
1 deleted
9 edited

Legend:

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

    r54491 r55005  
    3030#include <iprt/list.h>
    3131
     32#ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    3233typedef struct
    3334{
     
    3637    uint32_t l;
    3738} volume_t;
     39#endif
    3840
    3941#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     
    137139    PDMAUDIOMIXERCTL_PCM,
    138140    PDMAUDIOMIXERCTL_LINE_IN,
     141    PDMAUDIOMIXERCTL_MIC_IN,
    139142    /** Hack to blow the type up to 32-bit. */
    140143    PDMAUDIOMIXERCTL_32BIT_HACK = 0x7fffffff
     
    199202    bool        fSwapEndian;
    200203} PDMPCMPROPS, *PPDMPCMPROPS;
     204
     205/**
     206 * Structure keeping an audio volume level.
     207 */
     208typedef struct PDMAUDIOVOLUME
     209{
     210    /** Set to @c true if this stream is muted, @c false if not. */
     211    bool                   fMuted;
     212    /** Left channel volume. */
     213    uint32_t               uLeft;
     214    /** Right channel volume. */
     215    uint32_t               uRight;
     216} PDMAUDIOVOLUME, *PPDMAUDIOVOLUME;
    201217
    202218/**
     
    243259     *  in the samples buffer. */
    244260    uint32_t               offReadWrite;
    245     /** Total samples already mixed down to the
    246      *  parent buffer (if any). Always starting at
    247      *  the parent's offReadWrite position.
    248      *  Note: Count always is specified in parent samples,
    249      *        as the sample count can differ between parent
    250      *        and child. */
     261    /**
     262     * Total samples already mixed down to the parent buffer (if any). Always starting at
     263     * the parent's offReadWrite position.
     264     *
     265     * Note: Count always is specified in parent samples, as the sample count can differ between parent
     266     *       and child.
     267     */
    251268    uint32_t               cMixed;
    252269    uint32_t               cProcessed;
    253270    /** Pointer to parent buffer (if any). */
    254271    PPDMAUDIOMIXBUF        pParent;
    255     /** List of children mix buffers to keep
    256      *  in sync with (if being a parent buffer). */
     272    /** List of children mix buffers to keep in sync with (if being a parent buffer). */
    257273    RTLISTANCHOR           lstBuffers;
    258     /** Intermediate structure for buffer
    259      *  conversion tasks. */
     274    /** Intermediate structure for buffer conversion tasks. */
    260275    PPDMAUDIOSTRMRATE      pRate;
     276    /** Current volume used for mixing. */
     277    PDMAUDIOVOLUME         Volume;
    261278    /** This buffer's audio format. */
    262279    PDMAUDIOMIXBUFFMT      AudioFmt;
     
    335352    /** Guest audio output stream has some samples or not. */
    336353    bool                   fEmpty;
    337     /** Set to @c true if this stream is muted, @c false if not. */
    338     bool                   fMuted;
    339354    /** Name of this stream. */
    340355    char                  *pszName;
    341     /** Left channel volume. */
    342     uint32_t               uVolumeLeft;
    343     /** Right channel volume. */
    344     uint32_t               uVolumeRight;
    345356} PDMAUDIOGSTSTRMSTATE, *PPDMAUDIOGSTSTRMSTATE;
    346357
     
    443454     */
    444455    DECLR3CALLBACKMEMBER(int, pfnInitNull, (PPDMIAUDIOCONNECTOR pInterface));
    445 
    446     /**
    447      * Sets the audio volume of a specific guest output stream.
    448      *
    449      * @returns VBox status code.
    450      * @param   pInterface      Pointer to the interface structure containing the called function pointer.
    451      * @param   pGstStrmOut     Pointer to guest output stream.
    452      * @param   fMute           Whether to mute or not.
    453      * @param   uVolLeft        Left audio stream volume.
    454      * @param   uVolRight       Right audio stream volume.
    455      */
    456     DECLR3CALLBACKMEMBER(int, pfnSetVolumeOut, (PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut,
    457                                                 bool fMute, uint8_t uVolLeft, uint8_t uVolRight));
    458 
    459     /**
    460      * Sets the overall audio volume.
    461      *
    462      * @returns VBox status code.
    463      * @param   pInterface      Pointer to the interface structure containing the called function pointer.
    464      * @param   fMute           Whether to mute or not.
    465      * @param   uVolLeft        Left audio stream volume.
    466      * @param   uVolRight       Right audio stream volume.
    467      */
    468     DECLR3CALLBACKMEMBER(int, pfnSetVolume, (PPDMIAUDIOCONNECTOR pInterface,
    469                                              bool fMute, uint8_t uVolLeft, uint8_t uVolRight));
    470456
    471457    /**
  • trunk/src/VBox/Devices/Audio/AudioMixBuffer.cpp

    r54980 r55005  
    4848#include "AudioMixBuffer.h"
    4949
    50 #if 0
     50#if 1
    5151# define AUDMIXBUF_LOG(x) LogFlowFunc(x)
    5252#else
     
    5757# endif
    5858#endif
     59
     60/**
     61 * Structure for holding sample conversion parameters for
     62 * the audioMixBufConvFromXXX / audioMixBufConvToXXX macros.
     63 */
     64typedef struct AUDMIXBUF_CONVOPTS
     65{
     66    /** Number of audio samples to convert. */
     67    uint32_t       cSamples;
     68    /** Volume to apply during conversion. Pass 0
     69     *  to convert the original values. May not apply to
     70     *  all conversion functions. */
     71    PDMAUDIOVOLUME Volume;
     72} AUDMIXBUF_CONVOPTS, *PAUDMIXBUF_CONVOPTS;
    5973
    6074/*
     
    7690static inline void audioMixBufPrint(PPDMAUDIOMIXBUF pMixBuf);
    7791
    78 typedef uint32_t (AUDMIXBUF_FN_CONVFROM) (PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, uint32_t cSamples);
     92typedef uint32_t (AUDMIXBUF_FN_CONVFROM) (PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, const PAUDMIXBUF_CONVOPTS pOpts);
    7993typedef AUDMIXBUF_FN_CONVFROM *PAUDMIXBUF_FN_CONVFROM;
    8094
    81 typedef void (AUDMIXBUF_FN_CONVTO) (void *pvDst, const PPDMAUDIOSAMPLE paSrc, uint32_t cSamples);
     95typedef void (AUDMIXBUF_FN_CONVTO) (void *pvDst, const PPDMAUDIOSAMPLE paSrc, const PAUDMIXBUF_CONVOPTS pOpts);
    8296typedef AUDMIXBUF_FN_CONVTO *PAUDMIXBUF_FN_CONVTO;
    8397
     
    186200    }
    187201
     202    if (pMixBuf->pRate)
     203    {
     204        RTMemFree(pMixBuf->pRate);
     205        pMixBuf->pRate = NULL;
     206    }
     207
    188208    audioMixBufFreeBuf(pMixBuf);
    189209}
     
    249269/**
    250270 * Macro for generating the conversion routines from/to different formats.
     271 * Be careful what to pass in/out, as most of the macros are optimized for speed and
     272 * thus don't do any bounds checking!
     273 *
    251274 * Note: Currently does not handle any endianess conversion yet!
    252275 */
     
    273296    } \
    274297    \
    275     AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Stereo(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, uint32_t cSamples) \
     298    AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Stereo(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, \
     299                                                                    const PAUDMIXBUF_CONVOPTS pOpts) \
    276300    { \
    277301        _aType *pSrc = (_aType *)pvSrc; \
    278         cSamples = (uint32_t)RT_MIN(cSamples, cbSrc / sizeof(_aType)); \
    279         AUDMIXBUF_MACRO_LOG(("cSamples=%RU32, sizeof(%zu)\n", cSamples, sizeof(_aType))); \
     302        uint32_t cSamples = (uint32_t)RT_MIN(pOpts->cSamples, cbSrc / sizeof(_aType)); \
     303        AUDMIXBUF_MACRO_LOG(("cSamples=%RU32, sizeof(%zu)\n", pOpts->cSamples, sizeof(_aType))); \
    280304        for (uint32_t i = 0; i < cSamples; i++) \
    281305        { \
    282306            AUDMIXBUF_MACRO_LOG(("%p: l=%RI16, r=%RI16\n", paDst, *pSrc, *(pSrc + 1))); \
    283             paDst->u64LSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), 0x5F000000 /* Volume */) >> 31); \
    284             paDst->u64RSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), 0x5F000000 /* Volume */) >> 31); \
     307            paDst->u64LSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uLeft ) >> 31); \
     308            paDst->u64RSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uRight) >> 31); \
    285309            AUDMIXBUF_MACRO_LOG(("\t-> l=%RI64, r=%RI64\n", paDst->u64LSample, paDst->u64RSample)); \
    286310            paDst++; \
     
    290314    } \
    291315    \
    292     AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Mono(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, uint32_t cSamples) \
     316    AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Mono(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, \
     317                                                                  const PAUDMIXBUF_CONVOPTS pOpts) \
    293318    { \
    294319        _aType *pSrc = (_aType *)pvSrc; \
    295         cSamples = (uint32_t)RT_MIN(cSamples, cbSrc / sizeof(_aType)); \
     320        uint32_t cSamples = (uint32_t)RT_MIN(pOpts->cSamples, cbSrc / sizeof(_aType)); \
    296321        AUDMIXBUF_MACRO_LOG(("cSamples=%RU32, sizeof(%zu)\n", cSamples, sizeof(_aType))); \
    297322        for (uint32_t i = 0; i < cSamples; i++) \
    298323        { \
    299             paDst->u64LSample = ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(pSrc[0]), 0x5F000000 /* Volume */); \
     324            paDst->u64LSample = ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(pSrc[0]), pOpts->Volume.uLeft); \
    300325            paDst->u64RSample = paDst->u64LSample; \
    301326            pSrc++; \
     
    306331    } \
    307332    \
    308     /* Note: Does no buffer size checking, so be careful what to do! */ \
    309     AUDMIXBUF_MACRO_FN void audioMixBufConvTo##_aName##Stereo(void *pvDst, const PPDMAUDIOSAMPLE paSrc, uint32_t cSamples) \
     333    AUDMIXBUF_MACRO_FN void audioMixBufConvTo##_aName##Stereo(void *pvDst, const PPDMAUDIOSAMPLE paSrc, \
     334                                                              const PAUDMIXBUF_CONVOPTS pOpts) \
    310335    { \
    311336        PPDMAUDIOSAMPLE pSrc = paSrc; \
    312337        _aType *pDst = (_aType *)pvDst; \
    313338        _aType l, r; \
     339        uint32_t cSamples = pOpts->cSamples; \
    314340        while (cSamples--) \
    315341        { \
     
    324350    } \
    325351    \
    326     /* Note: Does no buffer size checking, so be careful what to do! */ \
    327     AUDMIXBUF_MACRO_FN void audioMixBufConvTo##_aName##Mono(void *pvDst, const PPDMAUDIOSAMPLE paSrc, uint32_t cSamples) \
     352    AUDMIXBUF_MACRO_FN void audioMixBufConvTo##_aName##Mono(void *pvDst, const PPDMAUDIOSAMPLE paSrc, \
     353                                                            const PAUDMIXBUF_CONVOPTS pOpts) \
    328354    { \
    329355        PPDMAUDIOSAMPLE pSrc = paSrc; \
    330356        _aType *pDst = (_aType *)pvDst; \
     357        uint32_t cSamples = pOpts->cSamples; \
    331358        while (cSamples--) \
    332359        { \
     
    458485#undef AUDMIXBUF_MACRO_LOG
    459486
     487/**
     488 *
     489 ** @todo Speed up the lookup by binding it to the actual stream state.
     490 *
     491 * @return  IPRT status code.
     492 * @return  PAUDMIXBUF_FN_CONVFROM
     493 * @param   enmFmt
     494 */
    460495static inline PAUDMIXBUF_FN_CONVFROM audioMixBufConvFromLookup(PDMAUDIOMIXBUFFMT enmFmt)
    461496{
     
    510545}
    511546
     547/**
     548 *
     549 ** @todo Speed up the lookup by binding it to the actual stream state.
     550 *
     551 * @return  PAUDMIXBUF_FN_CONVTO
     552 * @param   enmFmt
     553 */
    512554static inline PAUDMIXBUF_FN_CONVTO audioMixBufConvToLookup(PDMAUDIOMIXBUFFMT enmFmt)
    513555{
     
    562604}
    563605
    564 static inline int audioMixBufConvFrom(PPDMAUDIOSAMPLE paDst,
    565                                       const void *pvSrc, size_t cbSrc,
    566                                       uint32_t cSamples, PDMAUDIOMIXBUFFMT enmFmt,
    567                                       uint32_t *pcWritten)
    568 {
    569     AssertPtrReturn(paDst, VERR_INVALID_POINTER);
    570     AssertPtrReturn(pvSrc, VERR_INVALID_POINTER);
    571     AssertReturn(cbSrc, VERR_INVALID_PARAMETER);
    572     /* pcbWritten is optional. */
    573 
    574     int rc;
    575 
    576     PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt);
    577     if (pConv)
    578     {
    579         uint32_t cWritten = pConv(paDst, pvSrc, cbSrc, cSamples);
    580 
    581         if (pcWritten)
    582             *pcWritten = (uint32_t )cWritten;
    583 
    584         rc = VINF_SUCCESS;
    585     }
    586     else
    587         rc = VERR_INVALID_PARAMETER;
    588 
    589     return rc;
    590 }
    591 
    592 /**
    593  * TODO
    594  *
    595  * Note: This routine does not do any bounds checking for speed
    596  *       reasons, so be careful what you do with it.
    597  *
    598  * @return  IPRT status code.
    599  * @param   pvDst
    600  * @param   paSrc
    601  * @param   cSamples
    602  * @param   pCfg
    603  */
    604 static inline int audioMixBufConvTo(void *pvDst, const PPDMAUDIOSAMPLE paSrc, uint32_t cSamples,
    605                                     PDMAUDIOMIXBUFFMT enmFmt)
    606 {
    607     AssertPtrReturn(pvDst, VERR_INVALID_POINTER);
    608     AssertPtrReturn(paSrc, VERR_INVALID_POINTER);
    609 
    610     int rc;
    611 
    612     PAUDMIXBUF_FN_CONVTO pConv = audioMixBufConvToLookup(enmFmt);
    613     if (pConv)
    614     {
    615         pConv(pvDst, paSrc, cSamples);
    616         rc = VINF_SUCCESS;
    617     }
    618     else
    619         rc = VERR_INVALID_PARAMETER;
    620 
    621     return rc;
    622 }
    623 
    624606static void audioMixBufFreeBuf(PPDMAUDIOMIXBUF pMixBuf)
    625607{
     
    636618}
    637619
    638 int audioMixBufInit(PPDMAUDIOMIXBUF pMixBuf, const char *pszName,
    639                     PPDMPCMPROPS pProps, uint32_t cSamples)
     620int audioMixBufInit(PPDMAUDIOMIXBUF pMixBuf, const char *pszName, PPDMPCMPROPS pProps, uint32_t cSamples)
    640621{
    641622    AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER);
    642623    AssertPtrReturn(pszName, VERR_INVALID_POINTER);
    643     AssertPtrReturn(pProps, VERR_INVALID_POINTER);
     624    AssertPtrReturn(pProps,  VERR_INVALID_POINTER);
    644625
    645626    pMixBuf->pParent = NULL;
     
    652633    pMixBuf->cMixed       = 0;
    653634    pMixBuf->cProcessed   = 0;
     635
     636    /* Set initial volume to max. */
     637    pMixBuf->Volume.fMuted = false;
     638    pMixBuf->Volume.uLeft  = UINT32_MAX;
     639    pMixBuf->Volume.uRight = UINT32_MAX;
    654640
    655641    /* Prevent division by zero.
     
    974960    if (cToProcess)
    975961    {
    976         rc = audioMixBufConvTo(pvBuf, pMixBuf->pSamples + offSamples,
    977                                cToProcess, enmFmt);
     962        PAUDMIXBUF_FN_CONVTO pConv = audioMixBufConvToLookup(enmFmt);
     963        if (pConv)
     964        {
     965            AUDMIXBUF_CONVOPTS convOpts = { cToProcess, pMixBuf->Volume };
     966            pConv(pvBuf, pMixBuf->pSamples + offSamples, &convOpts);
     967
     968            rc = VINF_SUCCESS;
     969        }
     970        else
     971            rc = VERR_INVALID_PARAMETER;
    978972
    979973        audioMixBufPrint(pMixBuf);
     
    982976        rc = VINF_SUCCESS;
    983977
    984     if (pcbRead)
    985         *pcbRead = AUDIOMIXBUF_S2B(pMixBuf, cToProcess);
     978    if (RT_SUCCESS(rc))
     979    {
     980        if (pcbRead)
     981            *pcbRead = AUDIOMIXBUF_S2B(pMixBuf, cToProcess);
     982    }
    986983
    987984    AUDMIXBUF_LOG(("cbRead=%RU32, rc=%Rrc\n", AUDIOMIXBUF_S2B(pMixBuf, cToProcess), rc));
     
    10201017        return VINF_SUCCESS;
    10211018    }
     1019
     1020    PAUDMIXBUF_FN_CONVTO pConv = audioMixBufConvToLookup(enmFmt);
     1021    if (!pConv) /* Audio format not supported. */
     1022        return VERR_NOT_SUPPORTED;
    10221023
    10231024    PPDMAUDIOSAMPLE pSamplesSrc1 = pMixBuf->pSamples + pMixBuf->offReadWrite;
     
    10471048    }
    10481049
     1050    AUDMIXBUF_CONVOPTS convOpts;
     1051    convOpts.Volume = pMixBuf->Volume;
     1052
    10491053    /* Anything to do at all? */
    10501054    int rc = VINF_SUCCESS;
    10511055    if (cLenSrc1)
    10521056    {
     1057        convOpts.cSamples = cLenSrc1;
     1058
    10531059        AUDMIXBUF_LOG(("P1: offRead=%RU32, cToRead=%RU32\n", pMixBuf->offReadWrite, cLenSrc1));
    1054         rc = audioMixBufConvTo(pvBuf, pSamplesSrc1, cLenSrc1, enmFmt);
     1060        pConv(pvBuf, pSamplesSrc1, &convOpts);
    10551061    }
    10561062
     
    10611067        AssertPtr(pSamplesSrc2);
    10621068
     1069        convOpts.cSamples = cLenSrc2;
     1070
    10631071        AUDMIXBUF_LOG(("P2: cToRead=%RU32, offWrite=%RU32 (%zu bytes)\n", cLenSrc2, cLenSrc1,
    10641072                       AUDIOMIXBUF_S2B(pMixBuf, cLenSrc1)));
    1065         rc = audioMixBufConvTo((uint8_t *)pvBuf + AUDIOMIXBUF_S2B(pMixBuf, cLenSrc1),
    1066                                pSamplesSrc2, cLenSrc2, enmFmt);
     1073        pConv((uint8_t *)pvBuf + AUDIOMIXBUF_S2B(pMixBuf, cLenSrc1), pSamplesSrc2, &convOpts);
    10671074    }
    10681075
     
    10791086        }
    10801087#endif
    1081         pMixBuf->offReadWrite = offRead % pMixBuf->cSamples;
    1082         pMixBuf->cProcessed -= RT_MIN(cLenSrc1 + cLenSrc2, pMixBuf->cProcessed);
     1088        pMixBuf->offReadWrite  = offRead % pMixBuf->cSamples;
     1089        pMixBuf->cProcessed   -= RT_MIN(cLenSrc1 + cLenSrc2, pMixBuf->cProcessed);
    10831090
    10841091        if (pcRead)
     
    11061113    if (pMixBuf->cSamples)
    11071114        RT_BZERO(pMixBuf->pSamples, pMixBuf->cSamples * sizeof(PDMAUDIOSAMPLE));
     1115}
     1116
     1117void audioMixBufSetVolume(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOVOLUME pVol)
     1118{
     1119    AssertPtrReturnVoid(pMixBuf);
     1120    AssertPtrReturnVoid(pVol);
     1121
     1122    AUDMIXBUF_LOG(("%s: lVol=%RU32, rVol=%RU32\n", pMixBuf->pszName, pVol->uLeft, pVol->uRight));
     1123
     1124    pMixBuf->Volume = *pVol;
    11081125}
    11091126
     
    12101227        return VERR_BUFFER_OVERFLOW;
    12111228
     1229    PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt);
     1230    if (!pConv)
     1231        return VERR_NOT_SUPPORTED;
     1232
    12121233    int rc;
    12131234    uint32_t cWritten;
     
    12261247    if (cToProcess)
    12271248    {
    1228         rc = audioMixBufConvFrom(pMixBuf->pSamples + offSamples, pvBuf, cbBuf,
    1229                                  cToProcess, enmFmt, &cWritten);
    1230 
     1249        AUDMIXBUF_CONVOPTS convOpts = { cToProcess, pMixBuf->Volume };
     1250
     1251        cWritten = pConv(pMixBuf->pSamples + offSamples, pvBuf, cbBuf, &convOpts);
    12311252        audioMixBufPrint(pMixBuf);
     1253
     1254        rc = cWritten ? VINF_SUCCESS : VERR_GENERAL_FAILURE; /** @todo Fudge! */
    12321255    }
    12331256    else
     
    12851308        return VINF_SUCCESS;
    12861309    }
     1310
     1311    PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt);
     1312    if (!pConv)
     1313        return VERR_NOT_SUPPORTED;
    12871314
    12881315    int rc = VINF_SUCCESS;
     
    13171344    }
    13181345
     1346    uint32_t cWrittenTotal = 0;
     1347
    13191348    /* Anything to do at all? */
    13201349    if (cLenDst1)
    1321         rc = audioMixBufConvFrom(pSamplesDst1, pvBuf, cbBuf, cLenDst1, enmFmt, NULL);
     1350    {
     1351        AUDMIXBUF_CONVOPTS convOpts = { cLenDst1, pMixBuf->Volume };
     1352        cWrittenTotal = pConv(pSamplesDst1, pvBuf, cbBuf, &convOpts);
     1353    }
    13221354
    13231355    /* Second part present? */
     
    13261358    {
    13271359        AssertPtr(pSamplesDst2);
    1328         rc = audioMixBufConvFrom(pSamplesDst2,
    1329                                  (uint8_t *)pvBuf + AUDIOMIXBUF_S2B(pMixBuf, cLenDst1), cbBuf,
    1330                                  cLenDst2, enmFmt, NULL);
     1360
     1361        AUDMIXBUF_CONVOPTS convOpts = { cLenDst2, pMixBuf->Volume };
     1362        cWrittenTotal += pConv(pSamplesDst2, (uint8_t *)pvBuf + AUDIOMIXBUF_S2B(pMixBuf, cLenDst1), cbBuf, &convOpts);
    13311363    }
    13321364
     
    13581390    return rc;
    13591391}
    1360 
  • trunk/src/VBox/Devices/Audio/AudioMixBuffer.h

    r54230 r55005  
    6767int audioMixBufReadCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, void *pvBuf, size_t cbBuf, uint32_t *pcRead);
    6868void audioMixBufReset(PPDMAUDIOMIXBUF pMixBuf);
     69void audioMixBufSetVolume(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOVOLUME pVol);
    6970uint32_t audioMixBufSize(PPDMAUDIOMIXBUF pMixBuf);
    7071size_t audioMixBufSizeBytes(PPDMAUDIOMIXBUF pMixBuf);
  • trunk/src/VBox/Devices/Audio/AudioMixer.cpp

    r53442 r55005  
    77
    88/*
    9  * Copyright (C) 2014 Oracle Corporation
     9 * Copyright (C) 2014-2015 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1919
    2020#include "AudioMixer.h"
     21#include "AudioMixBuffer.h"
    2122
    2223#include <VBox/vmm/pdm.h>
     
    3637#include <VBox/log.h>
    3738
    38 int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, PAUDMIXSINK *ppSink)
     39int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, AUDMIXSINKDIR enmDir, PAUDMIXSINK *ppSink)
    3940{
    4041    AssertPtrReturn(pMixer, VERR_INVALID_POINTER);
     
    5354        if (RT_SUCCESS(rc))
    5455        {
    55             pSink->pParent = pMixer;
     56            pSink->pParent  = pMixer;
    5657            pSink->cStreams = 0;
     58            pSink->enmDir   = enmDir;
    5759            RTListInit(&pSink->lstStreams);
     60
     61            /* Set initial volume to max. */
     62            pSink->Volume.fMuted = false;
     63            pSink->Volume.uLeft  = UINT32_MAX;
     64            pSink->Volume.uRight = UINT32_MAX;
    5865
    5966            RTListAppend(&pMixer->lstSinks, &pSink->Node);
     
    8592    int rc;
    8693
    87     if (pSink->cStreams == INT8_MAX) /* 255 streams per sink max. */
     94    if (pSink->cStreams == UINT8_MAX) /* 255 streams per sink max. */
    8895        return VERR_TOO_MUCH_DATA;
    8996
     
    93100    {
    94101        pMixStream->pConn = pConnector;
    95         pMixStream->pStrm = pStream;
     102        pMixStream->pIn   = pStream;
     103        /** @todo Process flags. */
     104
     105        RTListAppend(&pSink->lstStreams, &pMixStream->Node);
     106        pSink->cStreams++;
     107
     108        LogFlowFunc(("pSink=%p, pStream=%p, cStreams=%RU8\n",
     109                     pSink, pMixStream, pSink->cStreams));
     110
     111        if (ppStream)
     112            *ppStream = pMixStream;
     113
     114        rc = VINF_SUCCESS;
     115    }
     116    else
     117        rc = VERR_NO_MEMORY;
     118
     119    return rc;
     120}
     121
     122int audioMixerAddStreamOut(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMOUT pStream,
     123                           uint32_t uFlags, PAUDMIXSTREAM *ppStream)
     124{
     125    AssertPtrReturn(pSink, VERR_INVALID_POINTER);
     126    AssertPtrReturn(pStream, VERR_INVALID_POINTER);
     127    /** @todo Add flag validation. */
     128    /* ppStream is optional. */
     129
     130    int rc;
     131
     132    if (pSink->cStreams == UINT8_MAX) /* 255 streams per sink max. */
     133        return VERR_TOO_MUCH_DATA;
     134
     135    PAUDMIXSTREAM pMixStream
     136        = (PAUDMIXSTREAM)RTMemAllocZ(sizeof(AUDMIXSTREAM));
     137    if (pMixStream)
     138    {
     139        pMixStream->pConn = pConnector;
     140        pMixStream->pOut  = pStream;
    96141        /** @todo Process flags. */
    97142
     
    137182            pMixer->cSinks = 0;
    138183            RTListInit(&pMixer->lstSinks);
     184
     185            pMixer->VolMaster.fMuted = false;
     186            pMixer->VolMaster.uLeft  = UINT32_MAX;
     187            pMixer->VolMaster.uRight = UINT32_MAX;
    139188
    140189            LogFlowFunc(("Created %p ...\n", pMixer));
     
    213262}
    214263
    215 int audioMixerProcessSinkIn(PAUDMIXSINK pSink, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed)
     264int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed)
    216265{
    217266    AssertPtrReturn(pSink, VERR_INVALID_POINTER);
     
    220269    /* pcbProcessed is optional. */
    221270
     271    /** @todo Handle mixing operation enmOp! */
     272
    222273    uint8_t *pvMixBuf = (uint8_t *)RTMemAlloc(cbBuf);
    223274    if (!pvMixBuf)
     
    233284    {
    234285        /** @todo Support output sinks as well! */
    235         if (!pStream->pConn->pfnIsActiveIn(pStream->pConn, pStream->pStrm))
     286        if (!pStream->pConn->pfnIsActiveIn(pStream->pConn, pStream->pIn))
    236287            continue;
    237288
     
    243294            uint32_t cbRead;
    244295            AssertPtr(pStream->pConn);
    245             rc = pStream->pConn->pfnRead(pStream->pConn, pStream->pStrm,
     296            rc = pStream->pConn->pfnRead(pStream->pConn, pStream->pIn,
    246297                                         (uint8_t *)pvMixBuf + cbTotalRead, cbToRead, &cbRead);
    247298            if (   RT_FAILURE(rc)
     
    274325}
    275326
     327int audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed)
     328{
     329    return VERR_NOT_IMPLEMENTED;
     330}
     331
    276332void audioMixerRemoveSink(PAUDIOMIXER pMixer, PAUDMIXSINK pSink)
    277333{
     
    312368        return;
    313369
     370    Assert(pSink->cStreams);
    314371    RTListNodeRemove(&pStream->Node);
    315     Assert(pSink->cStreams);
    316372    pSink->cStreams--;
    317373
     
    333389}
    334390
     391static PDMAUDIOVOLUME audioMixerTranslateVolume(const PPDMAUDIOVOLUME pVolMaster, PPDMAUDIOVOLUME pVol)
     392{
     393    PDMAUDIOVOLUME volMaster = *pVolMaster;
     394
     395    uint32_t u32VolumeLeft  = (uint32_t)pVol->uLeft;
     396    uint32_t u32VolumeRight = (uint32_t)pVol->uRight;
     397    /* 0x00..0xff => 0x01..0x100 */
     398    if (u32VolumeLeft)
     399        u32VolumeLeft++;
     400    if (u32VolumeRight)
     401        u32VolumeRight++;
     402
     403    volMaster.uLeft  = u32VolumeLeft  * 0x800000; /* Maximum is 0x80000000 */
     404    volMaster.uRight = u32VolumeRight * 0x800000; /* Maximum is 0x80000000 */
     405
     406    PDMAUDIOVOLUME volOut;
     407    volOut.fMuted = volMaster.fMuted || pVol->fMuted;
     408    volOut.uLeft  = ASMMultU64ByU32DivByU32(volMaster.uLeft,  pVol->uLeft,  0x80000000U); /* Maximum is 0x80000000U */
     409    volOut.uRight = ASMMultU64ByU32DivByU32(volMaster.uRight, pVol->uRight, 0x80000000U); /* Maximum is 0x80000000U */
     410
     411    LogFlowFunc(("pMaster=%p, lVol=%RU32, rVol=%RU32\n",
     412                 pVolMaster, pVolMaster->uLeft, pVolMaster->uRight));
     413    LogFlowFunc(("pVol=%p, lVol=%RU32, rVol=%RU32 => lVol=%RU32, rVol=%RU32\n",
     414                 pVol, pVol->uLeft, pVol->uRight, volOut.uLeft, volOut.uRight));
     415
     416    return volOut;
     417}
     418
     419int audioMixerSetMasterVolume(PAUDIOMIXER pMixer, PPDMAUDIOVOLUME pVol)
     420{
     421    AssertPtrReturn(pMixer, VERR_INVALID_POINTER);
     422    AssertPtrReturn(pVol, VERR_INVALID_POINTER);
     423
     424    pMixer->VolMaster = audioMixerTranslateVolume(&pMixer->VolMaster,  pVol);
     425#if 0
     426        .uLeft  = pVol->uLeft  * 0x800000; /* maximum is 0x80000000 */
     427    pMixer->VolMaster.uRight = pVol->uRight * 0x800000; /* maximum is 0x80000000 */
     428#endif
     429    LogFlowFunc(("%s: lVol=%RU32, rVol=%RU32 => lVol=%RU32, rVol=%RU32\n",
     430                  pVol->uLeft, pVol->uRight, pMixer->VolMaster.uLeft, pMixer->VolMaster.uRight));
     431
     432    return VINF_SUCCESS;
     433}
     434
     435int audioMixerSetSinkVolume(PAUDMIXSINK pSink, PPDMAUDIOVOLUME pVol)
     436{
     437    AssertPtrReturn(pSink, VERR_INVALID_POINTER);
     438    AssertPtrReturn(pVol, VERR_INVALID_POINTER);
     439
     440    LogFlowFunc(("%s: lVol=%RU32, rVol=%RU32\n", pSink->pszName, pVol->uLeft, pVol->uRight));
     441
     442    pSink->Volume.uLeft  = pVol->uLeft  * 0x808080; /* Maximum is INT_MAX = 0x7fffffff */
     443    pSink->Volume.uRight = pVol->uRight * 0x808080; /* Maximum is INT_MAX = 0x7fffffff */
     444
     445    /** @todo Apply the mixer's master volume to it. */
     446
     447    /** @todo Very crude implementation for now -- needs more work! */
     448
     449    bool fOut = pSink->enmDir == AUDMIXSINKDIR_OUTPUT;
     450
     451    /* Propagate new sink volume to all streams in the sink. */
     452    PAUDMIXSTREAM pStream;
     453    RTListForEach(&pSink->lstStreams, pStream, AUDMIXSTREAM, Node)
     454    {
     455        if (fOut)
     456            audioMixBufSetVolume(&pStream->pOut->MixBuf, &pSink->Volume);
     457        else
     458            audioMixBufSetVolume(&pStream->pIn->MixBuf,  &pSink->Volume);
     459    }
     460
     461    return VINF_SUCCESS;
     462}
     463
  • trunk/src/VBox/Devices/Audio/AudioMixer.h

    r54230 r55005  
    3232     *  can work with it. */
    3333    PDMAUDIOSTREAMCFG       devFmt;
     34    /** The master volume of this mixer. */
     35    PDMAUDIOVOLUME          VolMaster;
    3436    /* List of audio mixer sinks. */
    3537    RTLISTANCHOR            lstSinks;
     
    4244    RTLISTNODE              Node;
    4345    PPDMIAUDIOCONNECTOR     pConn;
    44     /** @todo Add support for output streams. */
    45     PPDMAUDIOGSTSTRMIN      pStrm;
     46    union
     47    {
     48        PPDMAUDIOGSTSTRMIN  pIn;
     49        PPDMAUDIOGSTSTRMOUT pOut;
     50    };
    4651} AUDMIXSTREAM, *PAUDMIXSTREAM;
    4752
     
    5055    AUDMIXSINKDIR_UNKNOWN = 0,
    5156    AUDMIXSINKDIR_INPUT,
    52     AUDMIXSINKDIR_OUTPUT
     57    AUDMIXSINKDIR_OUTPUT,
     58    /** The usual 32-bit hack. */
     59    AUDMIXSINKDIR_32BIT_HACK = 0x7fffffff
    5360} AUDMIXSINKDIR;
    5461
     
    7077    /** This sink's mixing buffer. */
    7178    PDMAUDIOMIXBUF          MixBuf;
     79    /** The volume of this sink. The volume always will
     80     *  be combined with the mixer's master volume. */
     81    PDMAUDIOVOLUME          Volume;
    7282} AUDMIXSINK, *PAUDMIXSINK;
    7383
     
    7686    AUDMIXOP_NONE = 0,
    7787    AUDMIXOP_COPY,
    78     AUDMIXOP_BLEND
     88    AUDMIXOP_BLEND,
     89    /** The usual 32-bit hack. */
     90    AUDMIXOP_32BIT_HACK = 0x7fffffff
    7991} AUDMIXOP;
    8092
    8193
    82 int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, PAUDMIXSINK *ppSink);
     94int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, AUDMIXSINKDIR enmDir, PAUDMIXSINK *ppSink);
    8395int audioMixerAddStreamIn(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMIN pStream, uint32_t uFlags, PAUDMIXSTREAM *ppStream);
    84 int audioMixerControlStream(AUDMIXSTREAM pHandle); /** @todo */
     96int audioMixerAddStreamOut(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMOUT pStream, uint32_t uFlags, PAUDMIXSTREAM *ppStream);
     97int audioMixerControlStream(AUDMIXSTREAM pHandle); /** @todo Implement me. */
    8598int audioMixerCreate(const char *pszName, uint32_t uFlags, PAUDIOMIXER *ppMixer);
    8699void audioMixerDestroy(PAUDIOMIXER pMixer);
    87 int audioMixerProcessSamples(AUDMIXOP enmOp, PPDMAUDIOSAMPLE pDst, uint32_t cToWrite, PPDMAUDIOSAMPLE pSrc, uint32_t cToRead, uint32_t *pcRead, uint32_t *pcWritten);
    88 int audioMixerProcessSamplesEx(AUDMIXOP enmOp, void *pvParms, size_t cbParms, PPDMAUDIOSAMPLE pDst, uint32_t cToWrite, PPDMAUDIOSAMPLE pSrc, uint32_t cToRead, uint32_t *pcRead, uint32_t *pcWritten);
    89100uint32_t audioMixerGetStreamCount(PAUDIOMIXER pMixer);
    90 int audioMixerProcessSinkIn(PAUDMIXSINK pSink, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed);
     101int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed);
     102int audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed);
    91103void audioMixerRemoveSink(PAUDIOMIXER pMixer, PAUDMIXSINK pSink);
    92104void audioMixerRemoveStream(PAUDMIXSINK pMixer, PAUDMIXSTREAM pStream);
    93105int audioMixerSetDeviceFormat(PAUDIOMIXER pMixer, PPDMAUDIOSTREAMCFG pCfg);
     106int audioMixerSetMasterVolume(PAUDIOMIXER pMixer, PPDMAUDIOVOLUME pVol);
     107int audioMixerSetSinkVolume(PAUDMIXSINK pSink, PPDMAUDIOVOLUME pVol);
    94108
    95109#endif /* AUDIO_MIXER_H */
     110
  • trunk/src/VBox/Devices/Audio/DevIchAc97.cpp

    r54988 r55005  
    6464#define AC97_SSM_VERSION 1
    6565
    66 #ifndef VBOX
    67 # define SOFT_VOLUME
     66#ifdef VBOX
     67# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     68#  define SOFT_VOLUME /** @todo Get rid of this crap. */
     69# else
     70#  undef  SOFT_VOLUME
     71# endif
    6872#else
    69 # undef  SOFT_VOLUME
     73# define  SOFT_VOLUME
    7074#endif
     75
    7176#define SR_FIFOE RT_BIT(4)          /* rwc, fifo error */
    7277#define SR_BCIS  RT_BIT(3)          /* rwc, buffer completion interrupt status */
     
    151156    AC97_Reset                     = 0x00,
    152157    AC97_Master_Volume_Mute        = 0x02,
    153     AC97_Headphone_Volume_Mute     = 0x04,
     158    AC97_Headphone_Volume_Mute     = 0x04, /** Also known as AUX, see table 16, section 5.7. */
    154159    AC97_Master_Volume_Mono_Mute   = 0x06,
    155160    AC97_Master_Tone_RL            = 0x08,
     
    224229    /** PCM output stream. */
    225230    R3PTRTYPE(PPDMAUDIOGSTSTRMOUT)     pStrmOut;
     231    /** Mixer handle for output stream. */
     232    R3PTRTYPE(PAUDMIXSTREAM)           phStrmOut;
    226233} AC97OUTPUTSTREAM, *PAC97OUTPUTSTREAM;
    227234
     
    293300    /** The device' software mixer. */
    294301    R3PTRTYPE(PAUDIOMIXER)  pMixer;
     302    /** Audio sink for PCM output. */
     303    R3PTRTYPE(PAUDMIXSINK)  pSinkOutput;
    295304    /** Audio sink for line input. */
    296305    R3PTRTYPE(PAUDMIXSINK)  pSinkLineIn;
     
    603612                    rc = pDrv->pConnector->pfnOpenOut(pDrv->pConnector, pszDesc, &streamCfg, &pDrv->Out.pStrmOut);
    604613                    LogFlowFunc(("LUN#%RU8: Opened output with rc=%Rrc\n", uLUN, rc));
     614                    if (rc == VINF_SUCCESS) /* Note: Could return VWRN_ALREADY_EXISTS. */
     615                    {
     616                        audioMixerRemoveStream(pThis->pSinkOutput, pDrv->Out.phStrmOut);
     617                        rc = audioMixerAddStreamOut(pThis->pSinkOutput,
     618                                                    pDrv->pConnector, pDrv->Out.pStrmOut,
     619                                                    0 /* uFlags */,
     620                                                    &pDrv->Out.phStrmOut);
     621                    }
    605622
    606623                    RTStrFree(pszDesc);
     
    653670                {
    654671                    pDrv->pConnector->pfnCloseIn(pDrv->pConnector, pDrv->LineIn.pStrmIn);
    655                     audioMixerRemoveStream(pThis->pSinkLineIn,pDrv->LineIn.phStrmIn);
    656 
    657                     pDrv->LineIn.pStrmIn = NULL;
     672                    audioMixerRemoveStream(pThis->pSinkLineIn, pDrv->LineIn.phStrmIn);
     673
     674                    pDrv->LineIn.pStrmIn  = NULL;
    658675                    pDrv->LineIn.phStrmIn = NULL;
    659676                }
     
    668685                {
    669686                    pDrv->pConnector->pfnCloseOut(pDrv->pConnector, pDrv->Out.pStrmOut);
    670                     pDrv->Out.pStrmOut = NULL;
     687                    audioMixerRemoveStream(pThis->pSinkOutput, pDrv->Out.phStrmOut);
     688
     689                    pDrv->Out.pStrmOut  = NULL;
     690                    pDrv->Out.phStrmOut = NULL;
    671691                }
    672692
     
    827847    lvol = 255 * lvol / VOL_MASK;
    828848
    829 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    830     PAC97DRIVER pDrv;
    831 #endif
     849    LogFunc(("mt=%ld, val=%RU32\n", mt, val));
    832850
    833851#ifdef SOFT_VOLUME
     852# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     853    if (pThis->pMixer) /* Device can be in reset state, so no mixer available. */
     854    {
     855        PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol };
     856        PAC97DRIVER pDrv;
     857        switch (mt)
     858        {
     859            case PDMAUDIOMIXERCTL_VOLUME:
     860                audioMixerSetMasterVolume(pThis->pMixer, &vol);
     861                break;
     862
     863            case PDMAUDIOMIXERCTL_PCM:
     864                audioMixerSetSinkVolume(pThis->pSinkOutput, &vol);
     865                break;
     866
     867            case PDMAUDIOMIXERCTL_MIC_IN:
     868                audioMixerSetSinkVolume(pThis->pSinkMicIn, &vol);
     869                break;
     870
     871            case PDMAUDIOMIXERCTL_LINE_IN:
     872                audioMixerSetSinkVolume(pThis->pSinkLineIn, &vol);
     873                break;
     874
     875            default:
     876                break;
     877        }
     878    }
     879# else /* !VBOX_WITH_PDM_AUDIO_DRIVER */
    834880    if (index == AC97_Master_Volume_Mute)
    835     {
    836 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    837         RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node)
    838             pDrv->pConnector->pfnSetVolumeOut(pDrv->pConnector, pDrv->Out.pStrmOut, RT_BOOL(mute), lvol, rvol);
    839 #else
    840881        AUD_set_volume_out(pThis->voice_po, mute, lvol, rvol);
    841 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    842     }
    843     /** @todo Handle AC97_Mic_Volume_Mute + AC97_Line_In_Volume_Mute. */
    844882    else
    845     {
    846 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    847         RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node)
    848             pDrv->pConnector->pfnSetVolume(pDrv->pConnector, RT_BOOL(mute), lvol, rvol);
    849 #else
    850883        AUD_set_volume(mt, &mute, &lvol, &rvol);
    851 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    852     }
     884# endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
     885
    853886#else /* !SOFT_VOLUME */
    854 #ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    855     RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node)
    856         pDrv->pConnector->pfnSetVolume(pDrv->pConnector, RT_BOOL(mute), lvol, rvol);
    857 #else
    858887    AUD_set_volume(mt, &mute, &lvol, &rvol);
    859 #endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    860888#endif /* SOFT_VOLUME */
    861889
     
    940968    RTListForEach(&pThis->lstDrv, pDrv, AC97DRIVER, Node)
    941969    {
     970        pDrv->Out.phStrmOut   = NULL;
    942971        pDrv->LineIn.phStrmIn = NULL;
    943972        pDrv->MicIn.phStrmIn  = NULL;
    944973    }
    945974
     975    pThis->pSinkOutput = NULL;
    946976    pThis->pSinkLineIn = NULL;
    947     pThis->pSinkMicIn = NULL;
     977    pThis->pSinkMicIn  = NULL;
    948978
    949979    if (pThis->pMixer)
     
    10001030
    10011031#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    1002     int rc2 = audioMixerCreate("AC'97 Mixer", 0 /* uFlags */,
    1003                                &pThis->pMixer);
     1032    int rc2 = audioMixerCreate("AC'97 Mixer", 0 /* uFlags */, &pThis->pMixer);
    10041033    if (RT_SUCCESS(rc2))
    10051034    {
     1035        /* Set a default audio format for our mixer. */
    10061036        PDMAUDIOSTREAMCFG streamCfg;
    1007         streamCfg.uHz           = 48000;
     1037        streamCfg.uHz           = 41000;
    10081038        streamCfg.cChannels     = 2;
    10091039        streamCfg.enmFormat     = AUD_FMT_S16;
     
    10141044
    10151045        /* Add all required audio sinks. */
     1046        rc2 = audioMixerAddSink(pThis->pMixer, "[Playback] PCM Output",
     1047                               AUDMIXSINKDIR_OUTPUT, &pThis->pSinkOutput);
     1048        AssertRC(rc2);
     1049
    10161050        rc2 = audioMixerAddSink(pThis->pMixer, "[Recording] Line In",
    1017                                 &pThis->pSinkLineIn);
     1051                                AUDMIXSINKDIR_INPUT, &pThis->pSinkLineIn);
    10181052        AssertRC(rc2);
    10191053
    10201054        rc2 = audioMixerAddSink(pThis->pMixer, "[Recording] Microphone In",
    1021                                 &pThis->pSinkMicIn);
     1055                                AUDMIXSINKDIR_INPUT, &pThis->pSinkMicIn);
    10221056        AssertRC(rc2);
    10231057    }
     
    12091243    if (pvMixBuf)
    12101244    {
    1211         rc = audioMixerProcessSinkIn(pSink, pvMixBuf, cbToRead, &cbRead);
     1245        rc = audioMixerProcessSinkIn(pSink, AUDMIXOP_BLEND, pvMixBuf, cbToRead, &cbRead);
    12121246        if (   RT_SUCCESS(rc)
    12131247            && cbRead)
  • trunk/src/VBox/Devices/Audio/DevIchHda.cpp

    r54428 r55005  
    678678    /** The device' software mixer. */
    679679    R3PTRTYPE(PAUDIOMIXER)             pMixer;
     680    /** Audio sink for PCM output. */
     681    R3PTRTYPE(PAUDMIXSINK)             pSinkOutput;
    680682    /** Audio mixer sink for line input. */
    681683    R3PTRTYPE(PAUDMIXSINK)             pSinkLineIn;
     
    22062208    {
    22072209        uint32_t cbRead = 0;
    2208         rc = audioMixerProcessSinkIn(pSink, pBdle->au8HdaBuffer, cb2Copy, &cbRead);
     2210        rc = audioMixerProcessSinkIn(pSink, AUDMIXOP_BLEND, pBdle->au8HdaBuffer, cb2Copy, &cbRead);
    22092211        if (RT_SUCCESS(rc))
    22102212        {
     
    25112513    int rc = VINF_SUCCESS;
    25122514
    2513     PHDADRIVER pDrv;
    2514     RTListForEach(&pThis->lstDrv, pDrv, HDADRIVER, Node)
    2515     {
    2516         int rc2 = pDrv->pConnector->pfnSetVolume(pDrv->pConnector,
    2517                                                  fMute, uVolLeft, uVolRight);
    2518         if (RT_FAILURE(rc2))
    2519         {
    2520             LogFunc(("Failed for LUN #%RU8, rc=%Rrc\n", pDrv->uLUN, rc2));
    2521             if (RT_SUCCESS(rc))
    2522                 rc = rc2;
    2523             /* Keep going. */
    2524         }
    2525     }
     2515    PDMAUDIOVOLUME vol = { fMute, uVolLeft, uVolRight };
     2516    audioMixerSetMasterVolume(pThis->pMixer, &vol);
    25262517
    25272518    LogFlowFuncLeaveRC(rc);
     
    38373828    if (RT_SUCCESS(rc))
    38383829    {
    3839         rc = audioMixerCreate("HDA Mixer", 0 /* uFlags */,
    3840                               &pThis->pMixer);
     3830        rc = audioMixerCreate("HDA Mixer", 0 /* uFlags */, &pThis->pMixer);
    38413831        if (RT_SUCCESS(rc))
    38423832        {
     3833            /* Set a default audio format for our mixer. */
    38433834            PDMAUDIOSTREAMCFG streamCfg;
    3844             streamCfg.uHz           = 48000;
     3835            streamCfg.uHz           = 41000;
    38453836            streamCfg.cChannels     = 2;
    38463837            streamCfg.enmFormat     = AUD_FMT_S16;
     
    38513842
    38523843            /* Add all required audio sinks. */
     3844            rc = audioMixerAddSink(pThis->pMixer, "[Playback] PCM Output",
     3845                                   AUDMIXSINKDIR_OUTPUT, &pThis->pSinkOutput);
     3846            AssertRC(rc);
     3847
    38533848            rc = audioMixerAddSink(pThis->pMixer, "[Recording] Line In",
    3854                                    &pThis->pSinkLineIn);
     3849                                   AUDMIXSINKDIR_INPUT, &pThis->pSinkLineIn);
    38553850            AssertRC(rc);
    38563851
    38573852            rc = audioMixerAddSink(pThis->pMixer, "[Recording] Microphone In",
    3858                                    &pThis->pSinkMicIn);
     3853                                   AUDMIXSINKDIR_INPUT, &pThis->pSinkMicIn);
    38593854            AssertRC(rc);
    38603855        }
  • trunk/src/VBox/Devices/Audio/DevSB16.cpp

    r54230 r55005  
    4040#include "vl_vbox.h"
    4141
    42 #ifndef VBOX_WITH_PDM_AUDIO_DRIVER
    43 extern "C" {
    44 #include "audio.h"
    45 }
     42#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     43# include "AudioMixer.h"
     44#else
     45 extern "C" {
     46  #include "audio.h"
     47 }
    4648#endif
    4749
     
    8486#endif /* !VBOX */
    8587
    86 typedef struct SB16State {
     88#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     89typedef struct SB16OUTPUTSTREAM
     90{
     91    /** PCM output stream. */
     92    R3PTRTYPE(PPDMAUDIOGSTSTRMOUT)     pStrmOut;
     93    /** Mixer handle for output stream. */
     94    R3PTRTYPE(PAUDMIXSTREAM)           phStrmOut;
     95} SB16OUTPUTSTREAM, *PSB16OUTPUTSTREAM;
     96
     97/**
     98 * Struct for maintaining a host backend driver.
     99 */
     100typedef struct SB16STATE *PSB16STATE;
     101typedef struct SB16DRIVER
     102{
     103    union
     104    {
     105        /** Node for storing this driver in our device driver
     106         *  list of AC97STATE. */
     107        RTLISTNODE                     Node;
     108        struct
     109        {
     110            R3PTRTYPE(void *)          dummy1;
     111            R3PTRTYPE(void *)          dummy2;
     112        } dummy;
     113    };
     114
     115    /** Pointer to SB16 controller (state). */
     116    R3PTRTYPE(PSB16STATE)              pSB16State;
     117    /** Driver flags. */
     118    PDMAUDIODRVFLAGS                   Flags;
     119    uint32_t                           PaddingFlags;
     120    /** LUN # to which this driver has been assigned. */
     121    uint8_t                            uLUN;
     122    uint8_t                            Padding[5];
     123    /** Audio connector interface to the underlying
     124     *  host backend. */
     125    R3PTRTYPE(PPDMIAUDIOCONNECTOR)     pConnector;
     126    /** Stream for output. */
     127    SB16OUTPUTSTREAM                   Out;
     128} SB16DRIVER, *PSB16DRIVER;
     129#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
     130
     131typedef struct SB16STATE
     132{
    87133#ifdef VBOX
    88134    /** Pointer to the device instance. */
    89     PPDMDEVINSR3 pDevIns;
     135    PPDMDEVINSR3        pDevIns;
    90136    /** Pointer to the connector of the attached audio driver. */
    91     PPDMIAUDIOCONNECTOR     pDrv;
    92 #endif
    93 #ifdef VBOX /* lazy bird */
     137    PPDMIAUDIOCONNECTOR pDrv;
    94138    int irqCfg;
    95139    int dmaCfg;
     
    152196
    153197#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    154     PPDMAUDIOGSTSTRMOUT pGstStrmOut;
     198    R3PTRTYPE(PPDMAUDIOGSTSTRMOUT) pGstStrmOut;
     199    /** List of associated LUN drivers. */
     200    RTLISTANCHOR                   lstDrv;
     201    /** The device' software mixer. */
     202    R3PTRTYPE(PAUDIOMIXER)         pMixer;
     203    /** Audio sink for PCM output. */
     204    R3PTRTYPE(PAUDMIXSINK)         pSinkOutput;
    155205#else
    156206    SWVoiceOut *voice;
     
    165215    int mixer_nreg;
    166216    uint8_t mixer_regs[256];
    167 } SB16State;
     217} SB16STATE, *PSB16STATE;
    168218
    169219#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     
    222272#endif
    223273
    224 static void speaker (SB16State *s, int on)
    225 {
    226     s->speaker = on;
    227     /* AUD_enable (s->voice, on); */
    228 }
    229 
    230 static void control (SB16State *s, int hold)
    231 {
    232     int dma = s->use_hdma ? s->hdma : s->dma;
    233     s->dma_running = hold;
    234 
    235     LogFlowFunc(("hold %d high %d dma %d\n", hold, s->use_hdma, dma));
     274static void speaker (PSB16STATE pThis, int on)
     275{
     276    pThis->speaker = on;
     277    /* AUD_enable (pThis->voice, on); */
     278}
     279
     280static void control (PSB16STATE pThis, int hold)
     281{
     282    int dma = pThis->use_hdma ? pThis->hdma : pThis->dma;
     283    pThis->dma_running = hold;
     284
     285    LogFlowFunc(("hold %d high %d dma %d\n", hold, pThis->use_hdma, dma));
    236286
    237287#ifndef VBOX
    238288    if (hold) {
    239289        DMA_hold_DREQ (dma);
    240         AUD_set_active_out (s->voice, 1);
     290        AUD_set_active_out (pThis->voice, 1);
    241291    }
    242292    else {
    243293        DMA_release_DREQ (dma);
    244         AUD_set_active_out (s->voice, 0);
     294        AUD_set_active_out (pThis->voice, 0);
    245295    }
    246296#else  /* VBOX */
    247297    if (hold)
    248298    {
    249         PDMDevHlpDMASetDREQ (s->pDevIns, dma, 1);
    250         PDMDevHlpDMASchedule (s->pDevIns);
     299        PDMDevHlpDMASetDREQ (pThis->pDevIns, dma, 1);
     300        PDMDevHlpDMASchedule (pThis->pDevIns);
    251301#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    252         s->pDrv->pfnEnableOut(s->pDrv, s->pGstStrmOut, true /* fEnable */);
    253 #else
    254         AUD_set_active_out (s->voice, 1);
     302        pThis->pDrv->pfnEnableOut(pThis->pDrv, pThis->pGstStrmOut, true /* fEnable */);
     303#else
     304        AUD_set_active_out (pThis->voice, 1);
    255305#endif
    256306    }
    257307    else
    258308    {
    259         PDMDevHlpDMASetDREQ (s->pDevIns, dma, 0);
     309        PDMDevHlpDMASetDREQ (pThis->pDevIns, dma, 0);
    260310#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    261         s->pDrv->pfnEnableOut(s->pDrv, s->pGstStrmOut, false /* fEnable */);
    262 #else
    263         AUD_set_active_out (s->voice, 0);
     311        pThis->pDrv->pfnEnableOut(pThis->pDrv, pThis->pGstStrmOut, false /* fEnable */);
     312#else
     313        AUD_set_active_out (pThis->voice, 0);
    264314#endif
    265315    }
     
    270320static void aux_timer (void *opaque)
    271321{
    272     SB16State *s = opaque;
    273     s->can_write = 1;
    274     qemu_irq_raise (s->pic[s->irq]);
     322    PSB16STATE pThis = opaque;
     323    pThis->can_write = 1;
     324    qemu_irq_raise (pThis->pic[pThis->irq]);
    275325}
    276326#else  /* VBOX */
    277327static DECLCALLBACK(void) sb16Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvThis)
    278328{
    279     SB16State *s = (SB16State *)pvThis;
    280     s->can_write = 1;
    281     PDMDevHlpISASetIrq(s->pDevIns, s->irq, 1);
     329    PSB16STATE pThis = (SB16STATE *)pvThis;
     330    pThis->can_write = 1;
     331    PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
    282332}
    283333#endif /* VBOX */
     
    286336#define DMA8_HIGH 2
    287337
    288 static void continue_dma8 (SB16State *s)
    289 {
    290     if (s->freq > 0)
     338static void continue_dma8 (PSB16STATE pThis)
     339{
     340    if (pThis->freq > 0)
    291341    {
    292         s->audio_free = 0;
     342        pThis->audio_free = 0;
    293343
    294344#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    295345        PDMAUDIOSTREAMCFG as;
    296         as.uHz           = s->freq;
    297         as.cChannels     = 1 << s->fmt_stereo;
    298         as.enmFormat     = s->fmt;
     346        as.uHz           = pThis->freq;
     347        as.cChannels     = 1 << pThis->fmt_stereo;
     348        as.enmFormat     = pThis->fmt;
    299349        as.enmEndianness = PDMAUDIOHOSTENDIANESS;
    300350
    301         int rc = s->pDrv->pfnOpenOut(s->pDrv, "sb16.out", &as, &s->pGstStrmOut);
     351        int rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, "sb16.out", &as, &pThis->pGstStrmOut);
    302352        AssertRC(rc);
    303353#else
    304354        audsettings_t as;
    305         as.freq = s->freq;
    306         as.nchannels = 1 << s->fmt_stereo;
    307         as.fmt = s->fmt;
     355        as.freq = pThis->freq;
     356        as.nchannels = 1 << pThis->fmt_stereo;
     357        as.fmt = pThis->fmt;
    308358        as.endianness = 0;
    309         s->voice = AUD_open_out (
    310             &s->card,
    311             s->voice,
     359        pThis->voice = AUD_open_out (
     360            &pThis->card,
     361            pThis->voice,
    312362            "sb16",
    313             s,
     363            pThis,
    314364            sb16AudioCallback,
    315365            &as
     
    318368    }
    319369
    320     control (s, 1);
    321 }
    322 
    323 static void dma_cmd8 (SB16State *s, int mask, int dma_len)
    324 {
    325     s->fmt = AUD_FMT_U8;
    326     s->use_hdma = 0;
    327     s->fmt_bits = 8;
    328     s->fmt_signed = 0;
    329     s->fmt_stereo = (s->mixer_regs[0x0e] & 2) != 0;
    330     if (-1 == s->time_const) {
    331         if (s->freq <= 0)
    332             s->freq = 11025;
     370    control(pThis, 1);
     371}
     372
     373static void dma_cmd8 (PSB16STATE pThis, int mask, int dma_len)
     374{
     375    pThis->fmt = AUD_FMT_U8;
     376    pThis->use_hdma = 0;
     377    pThis->fmt_bits = 8;
     378    pThis->fmt_signed = 0;
     379    pThis->fmt_stereo = (pThis->mixer_regs[0x0e] & 2) != 0;
     380    if (-1 == pThis->time_const) {
     381        if (pThis->freq <= 0)
     382            pThis->freq = 11025;
    333383    }
    334384    else {
    335         int tmp = (256 - s->time_const);
    336         s->freq = (1000000 + (tmp / 2)) / tmp;
     385        int tmp = (256 - pThis->time_const);
     386        pThis->freq = (1000000 + (tmp / 2)) / tmp;
    337387    }
    338388
    339389    if (dma_len != -1) {
    340         s->block_size = dma_len << s->fmt_stereo;
     390        pThis->block_size = dma_len << pThis->fmt_stereo;
    341391    }
    342392    else {
     
    350400           Both use stereo, and Creatives own documentation states that
    351401           0x48 sets block size in bytes less one.. go figure */
    352         s->block_size &= ~s->fmt_stereo;
    353     }
    354 
    355     s->freq >>= s->fmt_stereo;
    356     s->left_till_irq = s->block_size;
    357     s->bytes_per_second = (s->freq << s->fmt_stereo);
    358     /* s->highspeed = (mask & DMA8_HIGH) != 0; */
    359     s->dma_auto = (mask & DMA8_AUTO) != 0;
    360     s->align = (1 << s->fmt_stereo) - 1;
    361 
    362     if (s->block_size & s->align) {
     402        pThis->block_size &= ~pThis->fmt_stereo;
     403    }
     404
     405    pThis->freq >>= pThis->fmt_stereo;
     406    pThis->left_till_irq = pThis->block_size;
     407    pThis->bytes_per_second = (pThis->freq << pThis->fmt_stereo);
     408    /* pThis->highspeed = (mask & DMA8_HIGH) != 0; */
     409    pThis->dma_auto = (mask & DMA8_AUTO) != 0;
     410    pThis->align = (1 << pThis->fmt_stereo) - 1;
     411
     412    if (pThis->block_size & pThis->align) {
    363413        LogFlowFunc(("warning: misaligned block size %d, alignment %d\n",
    364                s->block_size, s->align + 1));
     414               pThis->block_size, pThis->align + 1));
    365415    }
    366416
    367417    LogFlowFunc(("freq %d, stereo %d, sign %d, bits %d, "
    368418            "dma %d, auto %d, fifo %d, high %d\n",
    369             s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,
    370             s->block_size, s->dma_auto, s->fifo, s->highspeed));
    371 
    372     continue_dma8 (s);
    373     speaker (s, 1);
    374 }
    375 
    376 static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len)
    377 {
    378     s->use_hdma = cmd < 0xc0;
    379     s->fifo = (cmd >> 1) & 1;
    380     s->dma_auto = (cmd >> 2) & 1;
    381     s->fmt_signed = (d0 >> 4) & 1;
    382     s->fmt_stereo = (d0 >> 5) & 1;
     419            pThis->freq, pThis->fmt_stereo, pThis->fmt_signed, pThis->fmt_bits,
     420            pThis->block_size, pThis->dma_auto, pThis->fifo, pThis->highspeed));
     421
     422    continue_dma8 (pThis);
     423    speaker (pThis, 1);
     424}
     425
     426static void dma_cmd (PSB16STATE pThis, uint8_t cmd, uint8_t d0, int dma_len)
     427{
     428    pThis->use_hdma = cmd < 0xc0;
     429    pThis->fifo = (cmd >> 1) & 1;
     430    pThis->dma_auto = (cmd >> 2) & 1;
     431    pThis->fmt_signed = (d0 >> 4) & 1;
     432    pThis->fmt_stereo = (d0 >> 5) & 1;
    383433
    384434    switch (cmd >> 4) {
    385435    case 11:
    386         s->fmt_bits = 16;
     436        pThis->fmt_bits = 16;
    387437        break;
    388438
    389439    case 12:
    390         s->fmt_bits = 8;
     440        pThis->fmt_bits = 8;
    391441        break;
    392442    }
    393443
    394     if (-1 != s->time_const) {
     444    if (-1 != pThis->time_const) {
    395445#if 1
    396         int tmp = 256 - s->time_const;
    397         s->freq = (1000000 + (tmp / 2)) / tmp;
    398 #else
    399         /* s->freq = 1000000 / ((255 - s->time_const) << s->fmt_stereo); */
    400         s->freq = 1000000 / ((255 - s->time_const));
    401 #endif
    402         s->time_const = -1;
    403     }
    404 
    405     s->block_size = dma_len + 1;
    406     s->block_size <<= ((s->fmt_bits == 16) ? 1 : 0);
    407     if (!s->dma_auto) {
     446        int tmp = 256 - pThis->time_const;
     447        pThis->freq = (1000000 + (tmp / 2)) / tmp;
     448#else
     449        /* pThis->freq = 1000000 / ((255 - pThis->time_const) << pThis->fmt_stereo); */
     450        pThis->freq = 1000000 / ((255 - pThis->time_const));
     451#endif
     452        pThis->time_const = -1;
     453    }
     454
     455    pThis->block_size = dma_len + 1;
     456    pThis->block_size <<= ((pThis->fmt_bits == 16) ? 1 : 0);
     457    if (!pThis->dma_auto) {
    408458        /* It is clear that for DOOM and auto-init this value
    409459           shouldn't take stereo into account, while Miles Sound Systems
    410460           setsound.exe with single transfer mode wouldn't work without it
    411461           wonders of SB16 yet again */
    412         s->block_size <<= s->fmt_stereo;
     462        pThis->block_size <<= pThis->fmt_stereo;
    413463    }
    414464
    415465    LogFlowFunc(("freq %d, stereo %d, sign %d, bits %d, "
    416466            "dma %d, auto %d, fifo %d, high %d\n",
    417             s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,
    418             s->block_size, s->dma_auto, s->fifo, s->highspeed));
    419 
    420     if (16 == s->fmt_bits) {
    421         if (s->fmt_signed) {
    422             s->fmt = AUD_FMT_S16;
     467            pThis->freq, pThis->fmt_stereo, pThis->fmt_signed, pThis->fmt_bits,
     468            pThis->block_size, pThis->dma_auto, pThis->fifo, pThis->highspeed));
     469
     470    if (16 == pThis->fmt_bits) {
     471        if (pThis->fmt_signed) {
     472            pThis->fmt = AUD_FMT_S16;
    423473        }
    424474        else {
    425             s->fmt = AUD_FMT_U16;
     475            pThis->fmt = AUD_FMT_U16;
    426476        }
    427477    }
    428478    else {
    429         if (s->fmt_signed) {
    430             s->fmt = AUD_FMT_S8;
     479        if (pThis->fmt_signed) {
     480            pThis->fmt = AUD_FMT_S8;
    431481        }
    432482        else {
    433             s->fmt = AUD_FMT_U8;
    434         }
    435     }
    436 
    437     s->left_till_irq = s->block_size;
    438 
    439     s->bytes_per_second = (s->freq << s->fmt_stereo) << ((s->fmt_bits == 16) ? 1 : 0);
    440     s->highspeed = 0;
    441     s->align = (1 << (s->fmt_stereo + (s->fmt_bits == 16))) - 1;
    442     if (s->block_size & s->align) {
     483            pThis->fmt = AUD_FMT_U8;
     484        }
     485    }
     486
     487    pThis->left_till_irq = pThis->block_size;
     488
     489    pThis->bytes_per_second = (pThis->freq << pThis->fmt_stereo) << ((pThis->fmt_bits == 16) ? 1 : 0);
     490    pThis->highspeed = 0;
     491    pThis->align = (1 << (pThis->fmt_stereo + (pThis->fmt_bits == 16))) - 1;
     492    if (pThis->block_size & pThis->align) {
    443493        LogFlowFunc(("warning: misaligned block size %d, alignment %d\n",
    444                s->block_size, s->align + 1));
    445     }
    446 
    447     if (s->freq)
     494               pThis->block_size, pThis->align + 1));
     495    }
     496
     497    if (pThis->freq)
    448498    {
    449         s->audio_free = 0;
     499        pThis->audio_free = 0;
    450500
    451501#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    452502        PDMAUDIOSTREAMCFG as;
    453         as.uHz           = s->freq;
    454         as.cChannels     = 1 << s->fmt_stereo;
    455         as.enmFormat     = s->fmt;
     503        as.uHz           = pThis->freq;
     504        as.cChannels     = 1 << pThis->fmt_stereo;
     505        as.enmFormat     = pThis->fmt;
    456506        as.enmEndianness = PDMAUDIOHOSTENDIANESS;
    457507
    458         int rc = s->pDrv->pfnOpenOut(s->pDrv, "sb16.out", &as, &s->pGstStrmOut);
     508        int rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, "sb16.out", &as, &pThis->pGstStrmOut);
    459509        AssertRC(rc);
    460510#else
    461511        audsettings_t as;
    462         as.freq = s->freq;
    463         as.nchannels = 1 << s->fmt_stereo;
    464         as.fmt = s->fmt;
     512        as.freq = pThis->freq;
     513        as.nchannels = 1 << pThis->fmt_stereo;
     514        as.fmt = pThis->fmt;
    465515        as.endianness = 0;
    466         s->voice = AUD_open_out (
    467             &s->card,
    468             s->voice,
     516        pThis->voice = AUD_open_out (
     517            &pThis->card,
     518            pThis->voice,
    469519            "sb16",
    470             s,
     520            pThis,
    471521            sb16AudioCallback,
    472522            &as
     
    475525    }
    476526
    477     control (s, 1);
    478     speaker (s, 1);
    479 }
    480 
    481 static inline void dsp_out_data (SB16State *s, uint8_t val)
     527    control (pThis, 1);
     528    speaker (pThis, 1);
     529}
     530
     531static inline void dsp_out_data (PSB16STATE pThis, uint8_t val)
    482532{
    483533    LogFlowFunc(("outdata %#x\n", val));
    484     if ((size_t) s->out_data_len < sizeof (s->out_data)) {
    485         s->out_data[s->out_data_len++] = val;
    486     }
    487 }
    488 
    489 static inline uint8_t dsp_get_data (SB16State *s)
    490 {
    491     if (s->in_index) {
    492         return s->in2_data[--s->in_index];
     534    if ((size_t) pThis->out_data_len < sizeof (pThis->out_data)) {
     535        pThis->out_data[pThis->out_data_len++] = val;
     536    }
     537}
     538
     539static inline uint8_t dsp_get_data (PSB16STATE pThis)
     540{
     541    if (pThis->in_index) {
     542        return pThis->in2_data[--pThis->in_index];
    493543    }
    494544    else {
     
    498548}
    499549
    500 static void command (SB16State *s, uint8_t cmd)
     550static void command (PSB16STATE pThis, uint8_t cmd)
    501551{
    502552    LogFlowFunc(("command %#x\n", cmd));
     
    514564            LogFlowFunc(("%#x wrong bits\n", cmd));
    515565        }
    516         s->needed_bytes = 3;
     566        pThis->needed_bytes = 3;
    517567    }
    518568    else {
    519         s->needed_bytes = 0;
     569        pThis->needed_bytes = 0;
    520570
    521571        switch (cmd) {
    522572        case 0x03:
    523             dsp_out_data (s, 0x10); /* s->csp_param); */
     573            dsp_out_data (pThis, 0x10); /* pThis->csp_param); */
    524574            goto warn;
    525575
    526576        case 0x04:
    527             s->needed_bytes = 1;
     577            pThis->needed_bytes = 1;
    528578            goto warn;
    529579
    530580        case 0x05:
    531             s->needed_bytes = 2;
     581            pThis->needed_bytes = 2;
    532582            goto warn;
    533583
     
    537587
    538588        case 0x0e:
    539             s->needed_bytes = 2;
     589            pThis->needed_bytes = 2;
    540590            goto warn;
    541591
    542592        case 0x09:
    543             dsp_out_data (s, 0xf8);
     593            dsp_out_data (pThis, 0xf8);
    544594            goto warn;
    545595
    546596        case 0x0f:
    547             s->needed_bytes = 1;
     597            pThis->needed_bytes = 1;
    548598            goto warn;
    549599
    550600        case 0x10:
    551             s->needed_bytes = 1;
     601            pThis->needed_bytes = 1;
    552602            goto warn;
    553603
    554604        case 0x14:
    555             s->needed_bytes = 2;
    556             s->block_size = 0;
     605            pThis->needed_bytes = 2;
     606            pThis->block_size = 0;
    557607            break;
    558608
    559609        case 0x1c:              /* Auto-Initialize DMA DAC, 8-bit */
    560             dma_cmd8 (s, DMA8_AUTO, -1);
     610            dma_cmd8 (pThis, DMA8_AUTO, -1);
    561611            break;
    562612
    563613        case 0x20:              /* Direct ADC, Juice/PL */
    564             dsp_out_data (s, 0xff);
     614            dsp_out_data (pThis, 0xff);
    565615            goto warn;
    566616
     
    570620
    571621        case 0x40:
    572             s->freq = -1;
    573             s->time_const = -1;
    574             s->needed_bytes = 1;
     622            pThis->freq = -1;
     623            pThis->time_const = -1;
     624            pThis->needed_bytes = 1;
    575625            break;
    576626
    577627        case 0x41:
    578             s->freq = -1;
    579             s->time_const = -1;
    580             s->needed_bytes = 2;
     628            pThis->freq = -1;
     629            pThis->time_const = -1;
     630            pThis->needed_bytes = 2;
    581631            break;
    582632
    583633        case 0x42:
    584             s->freq = -1;
    585             s->time_const = -1;
    586             s->needed_bytes = 2;
     634            pThis->freq = -1;
     635            pThis->time_const = -1;
     636            pThis->needed_bytes = 2;
    587637            goto warn;
    588638
    589639        case 0x45:
    590             dsp_out_data (s, 0xaa);
     640            dsp_out_data (pThis, 0xaa);
    591641            goto warn;
    592642
     
    595645
    596646        case 0x48:
    597             s->needed_bytes = 2;
     647            pThis->needed_bytes = 2;
    598648            break;
    599649
    600650        case 0x74:
    601             s->needed_bytes = 2; /* DMA DAC, 4-bit ADPCM */
     651            pThis->needed_bytes = 2; /* DMA DAC, 4-bit ADPCM */
    602652            LogFlowFunc(("0x75 - DMA DAC, 4-bit ADPCM not implemented\n"));
    603653            break;
    604654
    605655        case 0x75:              /* DMA DAC, 4-bit ADPCM Reference */
    606             s->needed_bytes = 2;
     656            pThis->needed_bytes = 2;
    607657            LogFlowFunc(("0x74 - DMA DAC, 4-bit ADPCM Reference not implemented\n"));
    608658            break;
    609659
    610660        case 0x76:              /* DMA DAC, 2.6-bit ADPCM */
    611             s->needed_bytes = 2;
     661            pThis->needed_bytes = 2;
    612662            LogFlowFunc(("0x74 - DMA DAC, 2.6-bit ADPCM not implemented\n"));
    613663            break;
    614664
    615665        case 0x77:              /* DMA DAC, 2.6-bit ADPCM Reference */
    616             s->needed_bytes = 2;
     666            pThis->needed_bytes = 2;
    617667            LogFlowFunc(("0x74 - DMA DAC, 2.6-bit ADPCM Reference not implemented\n"));
    618668            break;
     
    629679
    630680        case 0x80:
    631             s->needed_bytes = 2;
     681            pThis->needed_bytes = 2;
    632682            break;
    633683
    634684        case 0x90:
    635685        case 0x91:
    636             dma_cmd8 (s, (((cmd & 1) == 0) ? 1 : 0) | DMA8_HIGH, -1);
     686            dma_cmd8 (pThis, (((cmd & 1) == 0) ? 1 : 0) | DMA8_HIGH, -1);
    637687            break;
    638688
    639689        case 0xd0:              /* halt DMA operation. 8bit */
    640             control (s, 0);
     690            control (pThis, 0);
    641691            break;
    642692
    643693        case 0xd1:              /* speaker on */
    644             speaker (s, 1);
     694            speaker (pThis, 1);
    645695            break;
    646696
    647697        case 0xd3:              /* speaker off */
    648             speaker (s, 0);
     698            speaker (pThis, 0);
    649699            break;
    650700
     
    652702            /* KQ6 (or maybe Sierras audblst.drv in general) resets
    653703               the frequency between halt/continue */
    654             continue_dma8 (s);
     704            continue_dma8 (pThis);
    655705            break;
    656706
    657707        case 0xd5:              /* halt DMA operation. 16bit */
    658             control (s, 0);
     708            control (pThis, 0);
    659709            break;
    660710
    661711        case 0xd6:              /* continue DMA operation. 16bit */
    662             control (s, 1);
     712            control (pThis, 1);
    663713            break;
    664714
    665715        case 0xd9:              /* exit auto-init DMA after this block. 16bit */
    666             s->dma_auto = 0;
     716            pThis->dma_auto = 0;
    667717            break;
    668718
    669719        case 0xda:              /* exit auto-init DMA after this block. 8bit */
    670             s->dma_auto = 0;
     720            pThis->dma_auto = 0;
    671721            break;
    672722
    673723        case 0xe0:              /* DSP identification */
    674             s->needed_bytes = 1;
     724            pThis->needed_bytes = 1;
    675725            break;
    676726
    677727        case 0xe1:
    678             dsp_out_data (s, s->ver & 0xff);
    679             dsp_out_data (s, s->ver >> 8);
     728            dsp_out_data (pThis, pThis->ver & 0xff);
     729            dsp_out_data (pThis, pThis->ver >> 8);
    680730            break;
    681731
    682732        case 0xe2:
    683             s->needed_bytes = 1;
     733            pThis->needed_bytes = 1;
    684734            goto warn;
    685735
     
    688738                int i;
    689739                for (i = sizeof (e3) - 1; i >= 0; --i)
    690                     dsp_out_data (s, e3[i]);
     740                    dsp_out_data (pThis, e3[i]);
    691741            }
    692742            break;
    693743
    694744        case 0xe4:              /* write test reg */
    695             s->needed_bytes = 1;
     745            pThis->needed_bytes = 1;
    696746            break;
    697747
     
    701751
    702752        case 0xe8:              /* read test reg */
    703             dsp_out_data (s, s->test_reg);
     753            dsp_out_data (pThis, pThis->test_reg);
    704754            break;
    705755
    706756        case 0xf2:
    707757        case 0xf3:
    708             dsp_out_data (s, 0xaa);
    709             s->mixer_regs[0x82] |= (cmd == 0xf2) ? 1 : 2;
     758            dsp_out_data (pThis, 0xaa);
     759            pThis->mixer_regs[0x82] |= (cmd == 0xf2) ? 1 : 2;
    710760#ifndef VBOX
    711             qemu_irq_raise (s->pic[s->irq]);
    712 #else
    713             PDMDevHlpISASetIrq(s->pDevIns, s->irq, 1);
     761            qemu_irq_raise (pThis->pic[pThis->irq]);
     762#else
     763            PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
    714764#endif
    715765            break;
    716766
    717767        case 0xf9:
    718             s->needed_bytes = 1;
     768            pThis->needed_bytes = 1;
    719769            goto warn;
    720770
    721771        case 0xfa:
    722             dsp_out_data (s, 0);
     772            dsp_out_data (pThis, 0);
    723773            goto warn;
    724774
    725775        case 0xfc:              /* FIXME */
    726             dsp_out_data (s, 0);
     776            dsp_out_data (pThis, 0);
    727777            goto warn;
    728778
     
    733783    }
    734784
    735     if (!s->needed_bytes) {
     785    if (!pThis->needed_bytes) {
    736786        LogFlow(("\n"));
    737787    }
    738788
    739789 exit:
    740     if (!s->needed_bytes) {
    741         s->cmd = -1;
     790    if (!pThis->needed_bytes) {
     791        pThis->cmd = -1;
    742792    }
    743793    else {
    744         s->cmd = cmd;
     794        pThis->cmd = cmd;
    745795    }
    746796    return;
     
    748798 warn:
    749799    LogFlowFunc(("warning: command %#x,%d is not truly understood yet\n",
    750            cmd, s->needed_bytes));
     800           cmd, pThis->needed_bytes));
    751801    goto exit;
    752802
    753803}
    754804
    755 static uint16_t dsp_get_lohi (SB16State *s)
    756 {
    757     uint8_t hi = dsp_get_data (s);
    758     uint8_t lo = dsp_get_data (s);
     805static uint16_t dsp_get_lohi (PSB16STATE pThis)
     806{
     807    uint8_t hi = dsp_get_data (pThis);
     808    uint8_t lo = dsp_get_data (pThis);
    759809    return (hi << 8) | lo;
    760810}
    761811
    762 static uint16_t dsp_get_hilo (SB16State *s)
    763 {
    764     uint8_t lo = dsp_get_data (s);
    765     uint8_t hi = dsp_get_data (s);
     812static uint16_t dsp_get_hilo (PSB16STATE pThis)
     813{
     814    uint8_t lo = dsp_get_data (pThis);
     815    uint8_t hi = dsp_get_data (pThis);
    766816    return (hi << 8) | lo;
    767817}
    768818
    769 static void complete (SB16State *s)
     819static void complete (PSB16STATE pThis)
    770820{
    771821    int d0, d1, d2;
    772822    LogFlowFunc(("complete command %#x, in_index %d, needed_bytes %d\n",
    773             s->cmd, s->in_index, s->needed_bytes));
    774 
    775     if (s->cmd > 0xaf && s->cmd < 0xd0) {
    776         d2 = dsp_get_data (s);
    777         d1 = dsp_get_data (s);
    778         d0 = dsp_get_data (s);
    779 
    780         if (s->cmd & 8) {
     823            pThis->cmd, pThis->in_index, pThis->needed_bytes));
     824
     825    if (pThis->cmd > 0xaf && pThis->cmd < 0xd0) {
     826        d2 = dsp_get_data (pThis);
     827        d1 = dsp_get_data (pThis);
     828        d0 = dsp_get_data (pThis);
     829
     830        if (pThis->cmd & 8) {
    781831            LogFlowFunc(("ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
    782                    s->cmd, d0, d1, d2));
     832                   pThis->cmd, d0, d1, d2));
    783833        }
    784834        else {
    785835            LogFlowFunc(("cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
    786                     s->cmd, d0, d1, d2));
    787             dma_cmd (s, s->cmd, d0, d1 + (d2 << 8));
     836                    pThis->cmd, d0, d1, d2));
     837            dma_cmd (pThis, pThis->cmd, d0, d1 + (d2 << 8));
    788838        }
    789839    }
    790840    else {
    791         switch (s->cmd) {
     841        switch (pThis->cmd) {
    792842        case 0x04:
    793             s->csp_mode = dsp_get_data (s);
    794             s->csp_reg83r = 0;
    795             s->csp_reg83w = 0;
    796             LogFlowFunc(("CSP command 0x04: mode=%#x\n", s->csp_mode));
     843            pThis->csp_mode = dsp_get_data (pThis);
     844            pThis->csp_reg83r = 0;
     845            pThis->csp_reg83w = 0;
     846            LogFlowFunc(("CSP command 0x04: mode=%#x\n", pThis->csp_mode));
    797847            break;
    798848
    799849        case 0x05:
    800             s->csp_param = dsp_get_data (s);
    801             s->csp_value = dsp_get_data (s);
     850            pThis->csp_param = dsp_get_data (pThis);
     851            pThis->csp_value = dsp_get_data (pThis);
    802852            LogFlowFunc(("CSP command 0x05: param=%#x value=%#x\n",
    803                     s->csp_param,
    804                     s->csp_value));
     853                    pThis->csp_param,
     854                    pThis->csp_value));
    805855            break;
    806856
    807857        case 0x0e:
    808             d0 = dsp_get_data (s);
    809             d1 = dsp_get_data (s);
     858            d0 = dsp_get_data (pThis);
     859            d1 = dsp_get_data (pThis);
    810860            LogFlowFunc(("write CSP register %d <- %#x\n", d1, d0));
    811861            if (d1 == 0x83) {
    812                 LogFlowFunc(("0x83[%d] <- %#x\n", s->csp_reg83r, d0));
    813                 s->csp_reg83[s->csp_reg83r % 4] = d0;
    814                 s->csp_reg83r += 1;
     862                LogFlowFunc(("0x83[%d] <- %#x\n", pThis->csp_reg83r, d0));
     863                pThis->csp_reg83[pThis->csp_reg83r % 4] = d0;
     864                pThis->csp_reg83r += 1;
    815865            }
    816866            else {
    817                 s->csp_regs[d1] = d0;
     867                pThis->csp_regs[d1] = d0;
    818868            }
    819869            break;
    820870
    821871        case 0x0f:
    822             d0 = dsp_get_data (s);
     872            d0 = dsp_get_data (pThis);
    823873            LogFlowFunc(("read CSP register %#x -> %#x, mode=%#x\n",
    824                     d0, s->csp_regs[d0], s->csp_mode));
     874                    d0, pThis->csp_regs[d0], pThis->csp_mode));
    825875            if (d0 == 0x83) {
    826876                LogFlowFunc(("0x83[%d] -> %#x\n",
    827                         s->csp_reg83w,
    828                         s->csp_reg83[s->csp_reg83w % 4]));
    829                 dsp_out_data (s, s->csp_reg83[s->csp_reg83w % 4]);
    830                 s->csp_reg83w += 1;
     877                        pThis->csp_reg83w,
     878                        pThis->csp_reg83[pThis->csp_reg83w % 4]));
     879                dsp_out_data (pThis, pThis->csp_reg83[pThis->csp_reg83w % 4]);
     880                pThis->csp_reg83w += 1;
    831881            }
    832882            else {
    833                 dsp_out_data (s, s->csp_regs[d0]);
     883                dsp_out_data (pThis, pThis->csp_regs[d0]);
    834884            }
    835885            break;
    836886
    837887        case 0x10:
    838             d0 = dsp_get_data (s);
     888            d0 = dsp_get_data (pThis);
    839889            LogFlowFunc(("cmd 0x10 d0=%#x\n", d0));
    840890            break;
    841891
    842892        case 0x14:
    843             dma_cmd8 (s, 0, dsp_get_lohi (s) + 1);
     893            dma_cmd8 (pThis, 0, dsp_get_lohi (pThis) + 1);
    844894            break;
    845895
    846896        case 0x40:
    847             s->time_const = dsp_get_data (s);
    848             LogFlowFunc(("set time const %d\n", s->time_const));
     897            pThis->time_const = dsp_get_data (pThis);
     898            LogFlowFunc(("set time const %d\n", pThis->time_const));
    849899            break;
    850900
     
    854904#endif
    855905        case 0x41:
    856             s->freq = dsp_get_hilo (s);
    857             LogFlowFunc(("set freq %d\n", s->freq));
     906            pThis->freq = dsp_get_hilo (pThis);
     907            LogFlowFunc(("set freq %d\n", pThis->freq));
    858908            break;
    859909
    860910        case 0x48:
    861             s->block_size = dsp_get_lohi (s) + 1;
    862             LogFlowFunc(("set dma block len %d\n", s->block_size));
     911            pThis->block_size = dsp_get_lohi (pThis) + 1;
     912            LogFlowFunc(("set dma block len %d\n", pThis->block_size));
    863913            break;
    864914
     
    875925                uint64_t ticks;
    876926
    877                 freq = s->freq > 0 ? s->freq : 11025;
    878                 samples = dsp_get_lohi (s) + 1;
    879                 bytes = samples << s->fmt_stereo << ((s->fmt_bits == 16) ? 1 : 0);
     927                freq = pThis->freq > 0 ? pThis->freq : 11025;
     928                samples = dsp_get_lohi (pThis) + 1;
     929                bytes = samples << pThis->fmt_stereo << ((pThis->fmt_bits == 16) ? 1 : 0);
    880930#ifndef VBOX
    881931                ticks = (bytes * ticks_per_sec) / freq;
    882932                if (ticks < ticks_per_sec / 1024) {
    883                     qemu_irq_raise (s->pic[s->irq]);
     933                    qemu_irq_raise (pThis->pic[pThis->irq]);
    884934                }
    885935                else {
    886                     if (s->aux_ts) {
     936                    if (pThis->aux_ts) {
    887937                        qemu_mod_timer (
    888                             s->aux_ts,
     938                            pThis->aux_ts,
    889939                            qemu_get_clock (vm_clock) + ticks
    890940                            );
     
    893943                LogFlowFunc(("mix silence %d %d %" PRId64 "\n", samples, bytes, ticks));
    894944#else  /* VBOX */
    895                 ticks = (bytes * TMTimerGetFreq(s->pTimer)) / freq;
    896                 if (ticks < TMTimerGetFreq(s->pTimer) / 1024)
    897                     PDMDevHlpISASetIrq(s->pDevIns, s->irq, 1);
     945                ticks = (bytes * TMTimerGetFreq(pThis->pTimer)) / freq;
     946                if (ticks < TMTimerGetFreq(pThis->pTimer) / 1024)
     947                    PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
    898948                else
    899                     TMTimerSet(s->pTimer, TMTimerGet(s->pTimer) + ticks);
     949                    TMTimerSet(pThis->pTimer, TMTimerGet(pThis->pTimer) + ticks);
    900950                LogFlowFunc(("mix silence %d %d % %RU64\n", samples, bytes, ticks));
    901951#endif /* VBOX */
     
    904954
    905955        case 0xe0:
    906             d0 = dsp_get_data (s);
    907             s->out_data_len = 0;
     956            d0 = dsp_get_data (pThis);
     957            pThis->out_data_len = 0;
    908958            LogFlowFunc(("E0 data = %#x\n", d0));
    909             dsp_out_data (s, ~d0);
     959            dsp_out_data (pThis, ~d0);
    910960            break;
    911961
    912962        case 0xe2:
    913             d0 = dsp_get_data (s);
     963            d0 = dsp_get_data (pThis);
    914964            LogFlow(("SB16:E2 = %#x\n", d0));
    915965            break;
    916966
    917967        case 0xe4:
    918             s->test_reg = dsp_get_data (s);
     968            pThis->test_reg = dsp_get_data (pThis);
    919969            break;
    920970
    921971        case 0xf9:
    922             d0 = dsp_get_data (s);
     972            d0 = dsp_get_data (pThis);
    923973            LogFlowFunc(("command 0xf9 with %#x\n", d0));
    924974            switch (d0) {
    925975            case 0x0e:
    926                 dsp_out_data (s, 0xff);
     976                dsp_out_data (pThis, 0xff);
    927977                break;
    928978
    929979            case 0x0f:
    930                 dsp_out_data (s, 0x07);
     980                dsp_out_data (pThis, 0x07);
    931981                break;
    932982
    933983            case 0x37:
    934                 dsp_out_data (s, 0x38);
     984                dsp_out_data (pThis, 0x38);
    935985                break;
    936986
    937987            default:
    938                 dsp_out_data (s, 0x00);
     988                dsp_out_data (pThis, 0x00);
    939989                break;
    940990            }
     
    942992
    943993        default:
    944             LogFlowFunc(("complete: unrecognized command %#x\n", s->cmd));
     994            LogFlowFunc(("complete: unrecognized command %#x\n", pThis->cmd));
    945995            return;
    946996        }
     
    948998
    949999    LogFlow(("\n"));
    950     s->cmd = -1;
     1000    pThis->cmd = -1;
    9511001    return;
    9521002}
    9531003
    954 static void legacy_reset (SB16State *s)
    955 {
    956     s->freq = 11025;
    957     s->fmt_signed = 0;
    958     s->fmt_bits = 8;
    959     s->fmt_stereo = 0;
     1004static void legacy_reset (PSB16STATE pThis)
     1005{
     1006    pThis->freq = 11025;
     1007    pThis->fmt_signed = 0;
     1008    pThis->fmt_bits = 8;
     1009    pThis->fmt_stereo = 0;
    9601010
    9611011#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    9621012    PDMAUDIOSTREAMCFG as;
    963     as.uHz           = s->freq;
     1013    as.uHz           = pThis->freq;
    9641014    as.cChannels     = 1;
    9651015    as.enmFormat     = AUD_FMT_U8;
    9661016    as.enmEndianness = PDMAUDIOHOSTENDIANESS;
    9671017
    968     int rc = s->pDrv->pfnOpenOut(s->pDrv, "sb16.out", &as, &s->pGstStrmOut);
     1018    int rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, "sb16.out", &as, &pThis->pGstStrmOut);
    9691019    AssertRC(rc);
    9701020#else
    9711021    audsettings_t as;
    972     as.freq = s->freq;
     1022    as.freq = pThis->freq;
    9731023    as.nchannels = 1;
    9741024    as.fmt = AUD_FMT_U8;
    9751025    as.endianness = 0;
    976     s->voice = AUD_open_out (
    977         &s->card,
    978         s->voice,
     1026    pThis->voice = AUD_open_out (
     1027        &pThis->card,
     1028        pThis->voice,
    9791029        "sb16",
    980         s,
     1030        pThis,
    9811031        sb16AudioCallback,
    9821032        &as
     
    9851035
    9861036    /* Not sure about that... */
    987     /* AUD_set_active_out (s->voice, 1); */
    988 }
    989 
    990 static void reset (SB16State *s)
     1037    /* AUD_set_active_out (pThis->voice, 1); */
     1038}
     1039
     1040static void reset (PSB16STATE pThis)
    9911041{
    9921042#ifndef VBOX
    993     qemu_irq_lower (s->pic[s->irq]);
    994     if (s->dma_auto) {
    995         qemu_irq_raise (s->pic[s->irq]);
    996         qemu_irq_lower (s->pic[s->irq]);
     1043    qemu_irq_lower (pThis->pic[pThis->irq]);
     1044    if (pThis->dma_auto) {
     1045        qemu_irq_raise (pThis->pic[pThis->irq]);
     1046        qemu_irq_lower (pThis->pic[pThis->irq]);
    9971047    }
    9981048#else  /* VBOX */
    999     PDMDevHlpISASetIrq(s->pDevIns, s->irq, 0);
    1000     if (s->dma_auto) {
    1001         PDMDevHlpISASetIrq(s->pDevIns, s->irq, 1);
    1002         PDMDevHlpISASetIrq(s->pDevIns, s->irq, 0);
     1049    PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
     1050    if (pThis->dma_auto) {
     1051        PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
     1052        PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
    10031053    }
    10041054#endif /* VBOX */
    10051055
    1006     s->mixer_regs[0x82] = 0;
    1007     s->dma_auto = 0;
    1008     s->in_index = 0;
    1009     s->out_data_len = 0;
    1010     s->left_till_irq = 0;
    1011     s->needed_bytes = 0;
    1012     s->block_size = -1;
    1013     s->nzero = 0;
    1014     s->highspeed = 0;
    1015     s->v2x6 = 0;
    1016     s->cmd = -1;
    1017 
    1018     dsp_out_data(s, 0xaa);
    1019     speaker (s, 0);
    1020     control (s, 0);
    1021     legacy_reset (s);
     1056    pThis->mixer_regs[0x82] = 0;
     1057    pThis->dma_auto = 0;
     1058    pThis->in_index = 0;
     1059    pThis->out_data_len = 0;
     1060    pThis->left_till_irq = 0;
     1061    pThis->needed_bytes = 0;
     1062    pThis->block_size = -1;
     1063    pThis->nzero = 0;
     1064    pThis->highspeed = 0;
     1065    pThis->v2x6 = 0;
     1066    pThis->cmd = -1;
     1067
     1068    dsp_out_data(pThis, 0xaa);
     1069    speaker (pThis, 0);
     1070    control (pThis, 0);
     1071    legacy_reset (pThis);
    10221072}
    10231073
    10241074static IO_WRITE_PROTO (dsp_write)
    10251075{
    1026     SB16State *s = (SB16State*)opaque;
    1027     int iport = nport - s->port;
     1076    PSB16STATE pThis = (SB16STATE*)opaque;
     1077    int iport = nport - pThis->port;
    10281078
    10291079    LogFlowFunc(("write %#x <- %#x\n", nport, val));
     
    10321082        switch (val) {
    10331083        case 0x00:
    1034             if (s->v2x6 == 1) {
    1035                 if (0 && s->highspeed) {
    1036                     s->highspeed = 0;
     1084            if (pThis->v2x6 == 1) {
     1085                if (0 && pThis->highspeed) {
     1086                    pThis->highspeed = 0;
    10371087#ifndef VBOX
    1038                     qemu_irq_lower (s->pic[s->irq]);
    1039 #else
    1040                     PDMDevHlpISASetIrq(s->pDevIns, s->irq, 0);
    1041 #endif
    1042                     control (s, 0);
     1088                    qemu_irq_lower (pThis->pic[pThis->irq]);
     1089#else
     1090                    PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
     1091#endif
     1092                    control (pThis, 0);
    10431093                }
    10441094                else {
    1045                     reset (s);
     1095                    reset (pThis);
    10461096                }
    10471097            }
    1048             s->v2x6 = 0;
     1098            pThis->v2x6 = 0;
    10491099            break;
    10501100
    10511101        case 0x01:
    10521102        case 0x03:              /* FreeBSD kludge */
    1053             s->v2x6 = 1;
     1103            pThis->v2x6 = 1;
    10541104            break;
    10551105
    10561106        case 0xc6:
    1057             s->v2x6 = 0;        /* Prince of Persia, csp.sys, diagnose.exe */
     1107            pThis->v2x6 = 0;        /* Prince of Persia, csp.sys, diagnose.exe */
    10581108            break;
    10591109
    10601110        case 0xb8:              /* Panic */
    1061             reset (s);
     1111            reset (pThis);
    10621112            break;
    10631113
    10641114        case 0x39:
    1065             dsp_out_data (s, 0x38);
    1066             reset (s);
    1067             s->v2x6 = 0x39;
     1115            dsp_out_data (pThis, 0x38);
     1116            reset (pThis);
     1117            pThis->v2x6 = 0x39;
    10681118            break;
    10691119
    10701120        default:
    1071             s->v2x6 = val;
     1121            pThis->v2x6 = val;
    10721122            break;
    10731123        }
     
    10751125
    10761126    case 0x0c:                  /* write data or command | write status */
    1077 /*         if (s->highspeed) */
     1127/*         if (pThis->highspeed) */
    10781128/*             break; */
    10791129
    1080         if (0 == s->needed_bytes) {
    1081             command (s, val);
     1130        if (0 == pThis->needed_bytes) {
     1131            command (pThis, val);
    10821132#if 0
    1083             if (0 == s->needed_bytes) {
    1084                 log_dsp (s);
     1133            if (0 == pThis->needed_bytes) {
     1134                log_dsp (pThis);
    10851135            }
    10861136#endif
    10871137        }
    10881138        else {
    1089             if (s->in_index == sizeof (s->in2_data)) {
     1139            if (pThis->in_index == sizeof (pThis->in2_data)) {
    10901140                LogFlowFunc(("in data overrun\n"));
    10911141            }
    10921142            else {
    1093                 s->in2_data[s->in_index++] = val;
    1094                 if (s->in_index == s->needed_bytes) {
    1095                     s->needed_bytes = 0;
    1096                     complete (s);
     1143                pThis->in2_data[pThis->in_index++] = val;
     1144                if (pThis->in_index == pThis->needed_bytes) {
     1145                    pThis->needed_bytes = 0;
     1146                    complete (pThis);
    10971147#if 0
    1098                     log_dsp (s);
     1148                    log_dsp (pThis);
    10991149#endif
    11001150                }
     
    11151165static IO_READ_PROTO (dsp_read)
    11161166{
    1117     SB16State *s = (SB16State*)opaque;
     1167    PSB16STATE pThis = (SB16STATE*)opaque;
    11181168    int iport, retval, ack = 0;
    11191169
    1120     iport = nport - s->port;
     1170    iport = nport - pThis->port;
    11211171#ifdef VBOX
    11221172    /** @todo reject non-byte access?
     
    11301180
    11311181    case 0x0a:                  /* read data */
    1132         if (s->out_data_len) {
    1133             retval = s->out_data[--s->out_data_len];
    1134             s->last_read_byte = retval;
     1182        if (pThis->out_data_len) {
     1183            retval = pThis->out_data[--pThis->out_data_len];
     1184            pThis->last_read_byte = retval;
    11351185        }
    11361186        else {
    1137             if (s->cmd != -1) {
     1187            if (pThis->cmd != -1) {
    11381188                LogFlowFunc(("empty output buffer for command %#x\n",
    1139                        s->cmd));
     1189                       pThis->cmd));
    11401190            }
    1141             retval = s->last_read_byte;
     1191            retval = pThis->last_read_byte;
    11421192            /* goto error; */
    11431193        }
     
    11451195
    11461196    case 0x0c:                  /* 0 can write */
    1147         retval = s->can_write ? 0 : 0x80;
     1197        retval = pThis->can_write ? 0 : 0x80;
    11481198        break;
    11491199
     
    11541204
    11551205    case 0x0e:                  /* data available status | irq 8 ack */
    1156         retval = (!s->out_data_len || s->highspeed) ? 0 : 0x80;
    1157         if (s->mixer_regs[0x82] & 1) {
     1206        retval = (!pThis->out_data_len || pThis->highspeed) ? 0 : 0x80;
     1207        if (pThis->mixer_regs[0x82] & 1) {
    11581208            ack = 1;
    1159             s->mixer_regs[0x82] &= ~1;
     1209            pThis->mixer_regs[0x82] &= ~1;
    11601210#ifndef VBOX
    1161             qemu_irq_lower (s->pic[s->irq]);
    1162 #else
    1163             PDMDevHlpISASetIrq(s->pDevIns, s->irq, 0);
     1211            qemu_irq_lower (pThis->pic[pThis->irq]);
     1212#else
     1213            PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
    11641214#endif
    11651215        }
     
    11681218    case 0x0f:                  /* irq 16 ack */
    11691219        retval = 0xff;
    1170         if (s->mixer_regs[0x82] & 2) {
     1220        if (pThis->mixer_regs[0x82] & 2) {
    11711221            ack = 1;
    1172             s->mixer_regs[0x82] &= ~2;
     1222            pThis->mixer_regs[0x82] &= ~2;
    11731223#ifndef VBOX
    1174             qemu_irq_lower (s->pic[s->irq]);
    1175 #else
    1176             PDMDevHlpISASetIrq(s->pDevIns, s->irq, 0);
     1224            qemu_irq_lower (pThis->pic[pThis->irq]);
     1225#else
     1226            PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
    11771227#endif
    11781228        }
     
    12031253}
    12041254
    1205 static void reset_mixer (SB16State *s)
     1255static void reset_mixer (PSB16STATE pThis)
    12061256{
    12071257    int i;
    12081258
    1209     memset (s->mixer_regs, 0xff, 0x7f);
    1210     memset (s->mixer_regs + 0x83, 0xff, sizeof (s->mixer_regs) - 0x83);
    1211 
    1212     s->mixer_regs[0x02] = 4;    /* master volume 3bits */
    1213     s->mixer_regs[0x06] = 4;    /* MIDI volume 3bits */
    1214     s->mixer_regs[0x08] = 0;    /* CD volume 3bits */
    1215     s->mixer_regs[0x0a] = 0;    /* voice volume 2bits */
     1259    memset (pThis->mixer_regs, 0xff, 0x7f);
     1260    memset (pThis->mixer_regs + 0x83, 0xff, sizeof (pThis->mixer_regs) - 0x83);
     1261
     1262    pThis->mixer_regs[0x02] = 4;    /* master volume 3bits */
     1263    pThis->mixer_regs[0x06] = 4;    /* MIDI volume 3bits */
     1264    pThis->mixer_regs[0x08] = 0;    /* CD volume 3bits */
     1265    pThis->mixer_regs[0x0a] = 0;    /* voice volume 2bits */
    12161266
    12171267    /* d5=input filt, d3=lowpass filt, d1,d2=input source */
    1218     s->mixer_regs[0x0c] = 0;
     1268    pThis->mixer_regs[0x0c] = 0;
    12191269
    12201270    /* d5=output filt, d1=stereo switch */
    1221     s->mixer_regs[0x0e] = 0;
     1271    pThis->mixer_regs[0x0e] = 0;
    12221272
    12231273    /* voice volume L d5,d7, R d1,d3 */
    1224     s->mixer_regs[0x04] = (4 << 5) | (4 << 1);
     1274    pThis->mixer_regs[0x04] = (4 << 5) | (4 << 1);
    12251275    /* master ... */
    1226     s->mixer_regs[0x22] = (4 << 5) | (4 << 1);
     1276    pThis->mixer_regs[0x22] = (4 << 5) | (4 << 1);
    12271277    /* MIDI ... */
    1228     s->mixer_regs[0x26] = (4 << 5) | (4 << 1);
     1278    pThis->mixer_regs[0x26] = (4 << 5) | (4 << 1);
    12291279
    12301280    for (i = 0x30; i < 0x48; i++) {
    1231         s->mixer_regs[i] = 0x20;
     1281        pThis->mixer_regs[i] = 0x20;
    12321282    }
    12331283}
     
    12351285static IO_WRITE_PROTO(mixer_write_indexb)
    12361286{
    1237     SB16State *s = (SB16State*)opaque;
     1287    PSB16STATE pThis = (SB16STATE*)opaque;
    12381288    (void) nport;
    1239     s->mixer_nreg = val;
     1289    pThis->mixer_nreg = val;
    12401290
    12411291#ifdef VBOX
     
    12631313static IO_WRITE_PROTO(mixer_write_datab)
    12641314{
    1265     SB16State   *s = (SB16State*)opaque;
    1266     bool        update_master = false;
    1267     bool        update_voice = false;
     1315    PSB16STATE  pThis = (PSB16STATE)opaque;
     1316    bool        fUpdateMaster = false;
     1317    bool        fUpdateStream = false;
    12681318
    12691319    (void) nport;
    1270     LogFlowFunc(("mixer_write [%#x] <- %#x\n", s->mixer_nreg, val));
    1271 
    1272     switch (s->mixer_nreg) {
    1273     case 0x00:
    1274         reset_mixer(s);
    1275         /* And update the actual volume, too. */
    1276         update_master = true;
    1277         update_voice  = true;
    1278         break;
    1279 
    1280     case 0x04:
    1281         /* Translate from old style voice volume (L/R). */
    1282         s->mixer_regs[0x32] = val & 0xff;
    1283         s->mixer_regs[0x33] = val << 4;
    1284         update_voice = true;
    1285         break;
    1286 
    1287     case 0x22:
    1288         /* Translate from old style master volume (L/R). */
    1289         s->mixer_regs[0x30] = val & 0xff;
    1290         s->mixer_regs[0x31] = val << 4;
    1291         update_master = true;
    1292         break;
    1293 
    1294     case 0x30:
    1295         /* Translate to old style master volume (L). */
    1296         s->mixer_regs[0x22] = (s->mixer_regs[0x22] & 0x0f) | val;
    1297         update_master = true;
    1298         break;
    1299 
    1300     case 0x31:
    1301         /* Translate to old style master volume (R). */
    1302         s->mixer_regs[0x22] = (s->mixer_regs[0x22] & 0xf0) | (val >> 4);
    1303         update_master = true;
    1304         break;
    1305 
    1306     case 0x32:
    1307         /* Translate to old style voice volume (L). */
    1308         s->mixer_regs[0x04] = (s->mixer_regs[0x04] & 0x0f) | val;
    1309         update_voice = true;
    1310         break;
    1311 
    1312     case 0x33:
    1313         /* Translate to old style voice volume (R). */
    1314         s->mixer_regs[0x04] = (s->mixer_regs[0x04] & 0xf0) | (val >> 4);
    1315         update_voice = true;
    1316         break;
    1317 
    1318     case 0x80:
     1320    LogFlowFunc(("mixer_write [%#x] <- %#x\n", pThis->mixer_nreg, val));
     1321
     1322    switch (pThis->mixer_nreg)
     1323    {
     1324        case 0x00:
     1325            reset_mixer(pThis);
     1326            /* And update the actual volume, too. */
     1327            fUpdateMaster = true;
     1328            fUpdateStream  = true;
     1329            break;
     1330
     1331        case 0x04:
     1332            /* Translate from old style stream volume (L/R). */
     1333            pThis->mixer_regs[0x32] = val & 0xff;
     1334            pThis->mixer_regs[0x33] = val << 4;
     1335            fUpdateStream = true;
     1336            break;
     1337
     1338        case 0x22:
     1339            /* Translate from old style master volume (L/R). */
     1340            pThis->mixer_regs[0x30] = val & 0xff;
     1341            pThis->mixer_regs[0x31] = val << 4;
     1342            fUpdateMaster = true;
     1343            break;
     1344
     1345        case 0x30:
     1346            /* Translate to old style master volume (L). */
     1347            pThis->mixer_regs[0x22] = (pThis->mixer_regs[0x22] & 0x0f) | val;
     1348            fUpdateMaster = true;
     1349            break;
     1350
     1351        case 0x31:
     1352            /* Translate to old style master volume (R). */
     1353            pThis->mixer_regs[0x22] = (pThis->mixer_regs[0x22] & 0xf0) | (val >> 4);
     1354            fUpdateMaster = true;
     1355            break;
     1356
     1357        case 0x32:
     1358            /* Translate to old style stream volume (L). */
     1359            pThis->mixer_regs[0x04] = (pThis->mixer_regs[0x04] & 0x0f) | val;
     1360            fUpdateStream = true;
     1361            break;
     1362
     1363        case 0x33:
     1364            /* Translate to old style stream volume (R). */
     1365            pThis->mixer_regs[0x04] = (pThis->mixer_regs[0x04] & 0xf0) | (val >> 4);
     1366            fUpdateStream = true;
     1367            break;
     1368
     1369        case 0x80:
    13191370        {
    1320             int irq = irq_of_magic (val);
     1371            int irq = irq_of_magic(val);
    13211372            LogFlowFunc(("setting irq to %d (val=%#x)\n", irq, val));
    1322             if (irq > 0) {
    1323                 s->irq = irq;
    1324             }
    1325         }
    1326         break;
    1327 
    1328     case 0x81:
     1373            if (irq > 0)
     1374                pThis->irq = irq;
     1375            break;
     1376        }
     1377
     1378        case 0x81:
    13291379        {
    13301380            int dma, hdma;
     
    13321382            dma = lsbindex (val & 0xf);
    13331383            hdma = lsbindex (val & 0xf0);
    1334             if (dma != s->dma || hdma != s->hdma) {
    1335                 LogFlow((
    1336                     "SB16: attempt to change DMA "
    1337                     "8bit %d(%d), 16bit %d(%d) (val=%#x)\n",
    1338                     dma, s->dma, hdma, s->hdma, val));
    1339             }
     1384            if (dma != pThis->dma || hdma != pThis->hdma)
     1385                LogFlow(("SB16: attempt to change DMA 8bit %d(%d), 16bit %d(%d) (val=%#x)\n",
     1386                         dma, pThis->dma, hdma, pThis->hdma, val));
    13401387#if 0
    1341             s->dma = dma;
    1342             s->hdma = hdma;
    1343 #endif
    1344         }
    1345         break;
    1346 
    1347     case 0x82:
    1348         LogFlowFunc(("attempt to write into IRQ status register (val=%#x)\n",
    1349                val));
     1388            pThis->dma = dma;
     1389            pThis->hdma = hdma;
     1390#endif
     1391            break;
     1392        }
     1393
     1394        case 0x82:
     1395            LogFlowFunc(("attempt to write into IRQ status register (val=%#x)\n", val));
    13501396#ifdef VBOX
    1351         return VINF_SUCCESS;
    1352 #endif
    1353 
    1354     default:
    1355         if (s->mixer_nreg >= 0x80) {
    1356             LogFlowFunc(("attempt to write mixer[%#x] <- %#x\n", s->mixer_nreg, val));
    1357         }
    1358         break;
    1359     }
    1360 
    1361     s->mixer_regs[s->mixer_nreg] = val;
     1397            return VINF_SUCCESS;
     1398#endif
     1399
     1400        default:
     1401            if (pThis->mixer_nreg >= 0x80)
     1402                LogFlowFunc(("attempt to write mixer[%#x] <- %#x\n", pThis->mixer_nreg, val));
     1403            break;
     1404    }
     1405
     1406    pThis->mixer_regs[pThis->mixer_nreg] = val;
    13621407
    13631408#ifdef VBOX
    13641409    /* Update the master (mixer) volume. */
    1365     if (update_master)
     1410    if (fUpdateMaster)
    13661411    {
    1367         int     mute = 0;
    1368         uint8_t lvol = s->mixer_regs[0x30];
    1369         uint8_t rvol = s->mixer_regs[0x31];
     1412        int     mute = 0; /** @todo Handle (un)muting. */
     1413        uint8_t lvol = pThis->mixer_regs[0x30];
     1414        uint8_t rvol = pThis->mixer_regs[0x31];
    13701415
    13711416#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    1372         s->pDrv->pfnSetVolume(s->pDrv, RT_BOOL(mute), lvol, rvol);
     1417        PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol };
     1418        audioMixerSetMasterVolume(pThis->pMixer, &vol);
    13731419#else
    13741420        AUD_set_volume(AUD_MIXER_VOLUME, &mute, &lvol, &rvol);
    13751421#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    13761422    }
    1377     /* Update the voice (PCM) volume. */
    1378     if (update_voice)
     1423
     1424    /* Update the stream (PCM) volume. */
     1425    if (fUpdateStream)
    13791426    {
    1380         int     mute = 0;
    1381         uint8_t lvol = s->mixer_regs[0x32];
    1382         uint8_t rvol = s->mixer_regs[0x33];
     1427        int     mute = 0; /** @todo Handle (un)muting. */
     1428        uint8_t lvol = pThis->mixer_regs[0x32];
     1429        uint8_t rvol = pThis->mixer_regs[0x33];
    13831430
    13841431#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    1385         s->pDrv->pfnSetVolume(s->pDrv, RT_BOOL(mute), lvol, rvol);
     1432        PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol };
     1433        audioMixerSetSinkVolume(pThis->pSinkOutput, &vol);
    13861434#else
    13871435        AUD_set_volume(AUD_MIXER_PCM, &mute, &lvol, &rvol);
     
    14011449    mixer_write_datab (opaque, nport, (val >> 8) & 0xff);
    14021450#else  /* VBOX */
    1403     SB16State *s = (SB16State*)opaque;
    1404     int iport = nport - s->port;
     1451    PSB16STATE pThis = (SB16STATE*)opaque;
     1452    int iport = nport - pThis->port;
    14051453    switch (cb)
    14061454    {
     
    14301478static IO_READ_PROTO(mixer_read)
    14311479{
    1432     SB16State *s = (SB16State*)opaque;
     1480    PSB16STATE pThis = (SB16STATE*)opaque;
    14331481
    14341482    (void) nport;
    14351483#ifndef DEBUG_SB16_MOST
    1436     if (s->mixer_nreg != 0x82) {
     1484    if (pThis->mixer_nreg != 0x82) {
    14371485        LogFlowFunc(("mixer_read[%#x] -> %#x\n",
    1438                 s->mixer_nreg, s->mixer_regs[s->mixer_nreg]));
     1486                pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg]));
    14391487    }
    14401488#else
    14411489    LogFlowFunc(("mixer_read[%#x] -> %#x\n",
    1442             s->mixer_nreg, s->mixer_regs[s->mixer_nreg]));
     1490            pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg]));
    14431491#endif
    14441492#ifndef VBOX
    1445     return s->mixer_regs[s->mixer_nreg];
    1446 #else
    1447     *pu32 = s->mixer_regs[s->mixer_nreg];
     1493    return pThis->mixer_regs[pThis->mixer_nreg];
     1494#else
     1495    *pu32 = pThis->mixer_regs[pThis->mixer_nreg];
    14481496    return VINF_SUCCESS;
    14491497#endif
    14501498}
    14511499
    1452 static int write_audio (SB16State *s, int nchan, int dma_pos,
     1500static int write_audio (PSB16STATE pThis, int nchan, int dma_pos,
    14531501                        int dma_len, int len)
    14541502{
     
    14771525        copied = DMA_read_memory (nchan, tmpbuf, dma_pos, to_copy);
    14781526#else
    1479         int rc = PDMDevHlpDMAReadMemory(s->pDevIns, nchan, tmpbuf, dma_pos,
     1527        int rc = PDMDevHlpDMAReadMemory(pThis->pDevIns, nchan, tmpbuf, dma_pos,
    14801528                                        to_copy, &copied);
    14811529        AssertMsgRC (rc, ("DMAReadMemory -> %Rrc\n", rc));
     
    14831531
    14841532#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    1485         rc = s->pDrv->pfnWrite(s->pDrv, s->pGstStrmOut, tmpbuf, to_copy, &copied);
     1533        rc = pThis->pDrv->pfnWrite(pThis->pDrv, pThis->pGstStrmOut, tmpbuf, to_copy, &copied);
    14861534        if (RT_FAILURE(rc))
    14871535            break;
    14881536#else
    1489         copied = AUD_write (s->voice, tmpbuf, copied);
     1537        copied = AUD_write (pThis->voice, tmpbuf, copied);
    14901538#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    14911539
     
    15071555#endif
    15081556{
    1509     SB16State *s = (SB16State*)opaque;
     1557    PSB16STATE pThis = (SB16STATE*)opaque;
    15101558    int till, copy, written, free;
    15111559
    1512     if (s->block_size <= 0) {
     1560    if (pThis->block_size <= 0) {
    15131561        LogFlowFunc(("invalid block size=%d nchan=%d dma_pos=%d dma_len=%d\n",
    1514                s->block_size, nchan, dma_pos, dma_len));
     1562               pThis->block_size, nchan, dma_pos, dma_len));
    15151563        return dma_pos;
    15161564    }
    15171565
    1518     if (s->left_till_irq < 0) {
    1519         s->left_till_irq = s->block_size;
     1566    if (pThis->left_till_irq < 0) {
     1567        pThis->left_till_irq = pThis->block_size;
    15201568    }
    15211569
    15221570#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    1523     if (s->pGstStrmOut) {
    1524 #else
    1525     if (s->voice) {
     1571    if (pThis->pGstStrmOut) {
     1572#else
     1573    if (pThis->voice) {
    15261574#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    1527         free = s->audio_free & ~s->align;
     1575        free = pThis->audio_free & ~pThis->align;
    15281576        if ((free <= 0) || !dma_len) {
    15291577            return dma_pos;
     
    15351583
    15361584    copy = free;
    1537     till = s->left_till_irq;
     1585    till = pThis->left_till_irq;
    15381586
    15391587#ifdef DEBUG_SB16_MOST
     
    15431591
    15441592    if (copy >= till) {
    1545         if (0 == s->dma_auto) {
     1593        if (0 == pThis->dma_auto) {
    15461594            copy = till;
    15471595        } else {
    1548             if( copy >= till + s->block_size ) {
     1596            if( copy >= till + pThis->block_size ) {
    15491597                copy = till;    /* Make sure we won't skip IRQs. */
    15501598            }
     
    15521600    }
    15531601
    1554     written = write_audio (s, nchan, dma_pos, dma_len, copy);
     1602    written = write_audio (pThis, nchan, dma_pos, dma_len, copy);
    15551603    dma_pos = (dma_pos + written) % dma_len;
    1556     s->left_till_irq -= written;
    1557 
    1558     if (s->left_till_irq <= 0) {
    1559         s->mixer_regs[0x82] |= (nchan & 4) ? 2 : 1;
     1604    pThis->left_till_irq -= written;
     1605
     1606    if (pThis->left_till_irq <= 0) {
     1607        pThis->mixer_regs[0x82] |= (nchan & 4) ? 2 : 1;
    15601608#ifndef VBOX
    1561         qemu_irq_raise (s->pic[s->irq]);
    1562 #else
    1563         PDMDevHlpISASetIrq(s->pDevIns, s->irq, 1);
    1564 #endif
    1565         if (0 == s->dma_auto) {
    1566             control (s, 0);
    1567             speaker (s, 0);
     1609        qemu_irq_raise (pThis->pic[pThis->irq]);
     1610#else
     1611        PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
     1612#endif
     1613        if (0 == pThis->dma_auto) {
     1614            control (pThis, 0);
     1615            speaker (pThis, 0);
    15681616        }
    15691617    }
     
    15711619#ifdef DEBUG_SB16_MOST
    15721620    LogFlowFunc(("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n",
    1573             dma_pos, free, dma_len, s->left_till_irq, copy, written,
    1574             s->block_size));
    1575 #endif
    1576 
    1577     while (s->left_till_irq <= 0) {
    1578         s->left_till_irq = s->block_size + s->left_till_irq;
     1621            dma_pos, free, dma_len, pThis->left_till_irq, copy, written,
     1622            pThis->block_size));
     1623#endif
     1624
     1625    while (pThis->left_till_irq <= 0) {
     1626        pThis->left_till_irq = pThis->block_size + pThis->left_till_irq;
    15791627    }
    15801628
     
    15881636#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    15891637{
    1590     SB16State *pState = (SB16State*)pvContext;
     1638    SB16STATE *pState = (SB16STATE*)pvContext;
    15911639    AssertPtrReturnVoid(pState);
    15921640    pState->audio_free = cbFree;
     
    16001648{
    16011649#ifndef VBOX
    1602     SB16State *s = opaque;
    1603 #else
    1604     SB16State *s = (SB16State *)opaque;
    1605 #endif
    1606 
    1607     qemu_put_be32 (f, s->irq);
    1608     qemu_put_be32 (f, s->dma);
    1609     qemu_put_be32 (f, s->hdma);
    1610     qemu_put_be32 (f, s->port);
    1611     qemu_put_be32 (f, s->ver);
    1612     qemu_put_be32 (f, s->in_index);
    1613     qemu_put_be32 (f, s->out_data_len);
    1614     qemu_put_be32 (f, s->fmt_stereo);
    1615     qemu_put_be32 (f, s->fmt_signed);
    1616     qemu_put_be32 (f, s->fmt_bits);
    1617     qemu_put_be32s (f, &s->fmt);
    1618     qemu_put_be32 (f, s->dma_auto);
    1619     qemu_put_be32 (f, s->block_size);
    1620     qemu_put_be32 (f, s->fifo);
    1621     qemu_put_be32 (f, s->freq);
    1622     qemu_put_be32 (f, s->time_const);
    1623     qemu_put_be32 (f, s->speaker);
    1624     qemu_put_be32 (f, s->needed_bytes);
    1625     qemu_put_be32 (f, s->cmd);
    1626     qemu_put_be32 (f, s->use_hdma);
    1627     qemu_put_be32 (f, s->highspeed);
    1628     qemu_put_be32 (f, s->can_write);
    1629     qemu_put_be32 (f, s->v2x6);
    1630 
    1631     qemu_put_8s (f, &s->csp_param);
    1632     qemu_put_8s (f, &s->csp_value);
    1633     qemu_put_8s (f, &s->csp_mode);
    1634     qemu_put_8s (f, &s->csp_param);
    1635     qemu_put_buffer (f, s->csp_regs, 256);
    1636     qemu_put_8s (f, &s->csp_index);
    1637     qemu_put_buffer (f, s->csp_reg83, 4);
    1638     qemu_put_be32 (f, s->csp_reg83r);
    1639     qemu_put_be32 (f, s->csp_reg83w);
    1640 
    1641     qemu_put_buffer (f, s->in2_data, sizeof (s->in2_data));
    1642     qemu_put_buffer (f, s->out_data, sizeof (s->out_data));
    1643     qemu_put_8s (f, &s->test_reg);
    1644     qemu_put_8s (f, &s->last_read_byte);
    1645 
    1646     qemu_put_be32 (f, s->nzero);
    1647     qemu_put_be32 (f, s->left_till_irq);
    1648     qemu_put_be32 (f, s->dma_running);
    1649     qemu_put_be32 (f, s->bytes_per_second);
    1650     qemu_put_be32 (f, s->align);
    1651 
    1652     qemu_put_be32 (f, s->mixer_nreg);
    1653     qemu_put_buffer (f, s->mixer_regs, 256);
     1650    PSB16STATE pThis = opaque;
     1651#else
     1652    PSB16STATE pThis = (SB16STATE *)opaque;
     1653#endif
     1654
     1655    qemu_put_be32 (f, pThis->irq);
     1656    qemu_put_be32 (f, pThis->dma);
     1657    qemu_put_be32 (f, pThis->hdma);
     1658    qemu_put_be32 (f, pThis->port);
     1659    qemu_put_be32 (f, pThis->ver);
     1660    qemu_put_be32 (f, pThis->in_index);
     1661    qemu_put_be32 (f, pThis->out_data_len);
     1662    qemu_put_be32 (f, pThis->fmt_stereo);
     1663    qemu_put_be32 (f, pThis->fmt_signed);
     1664    qemu_put_be32 (f, pThis->fmt_bits);
     1665    qemu_put_be32s (f, &pThis->fmt);
     1666    qemu_put_be32 (f, pThis->dma_auto);
     1667    qemu_put_be32 (f, pThis->block_size);
     1668    qemu_put_be32 (f, pThis->fifo);
     1669    qemu_put_be32 (f, pThis->freq);
     1670    qemu_put_be32 (f, pThis->time_const);
     1671    qemu_put_be32 (f, pThis->speaker);
     1672    qemu_put_be32 (f, pThis->needed_bytes);
     1673    qemu_put_be32 (f, pThis->cmd);
     1674    qemu_put_be32 (f, pThis->use_hdma);
     1675    qemu_put_be32 (f, pThis->highspeed);
     1676    qemu_put_be32 (f, pThis->can_write);
     1677    qemu_put_be32 (f, pThis->v2x6);
     1678
     1679    qemu_put_8s (f, &pThis->csp_param);
     1680    qemu_put_8s (f, &pThis->csp_value);
     1681    qemu_put_8s (f, &pThis->csp_mode);
     1682    qemu_put_8s (f, &pThis->csp_param);
     1683    qemu_put_buffer (f, pThis->csp_regs, 256);
     1684    qemu_put_8s (f, &pThis->csp_index);
     1685    qemu_put_buffer (f, pThis->csp_reg83, 4);
     1686    qemu_put_be32 (f, pThis->csp_reg83r);
     1687    qemu_put_be32 (f, pThis->csp_reg83w);
     1688
     1689    qemu_put_buffer (f, pThis->in2_data, sizeof (pThis->in2_data));
     1690    qemu_put_buffer (f, pThis->out_data, sizeof (pThis->out_data));
     1691    qemu_put_8s (f, &pThis->test_reg);
     1692    qemu_put_8s (f, &pThis->last_read_byte);
     1693
     1694    qemu_put_be32 (f, pThis->nzero);
     1695    qemu_put_be32 (f, pThis->left_till_irq);
     1696    qemu_put_be32 (f, pThis->dma_running);
     1697    qemu_put_be32 (f, pThis->bytes_per_second);
     1698    qemu_put_be32 (f, pThis->align);
     1699
     1700    qemu_put_be32 (f, pThis->mixer_nreg);
     1701    qemu_put_buffer (f, pThis->mixer_regs, 256);
    16541702}
    16551703
     
    16571705{
    16581706#ifndef VBOX
    1659     SB16State *s = opaque;
     1707    PSB16STATE pThis = opaque;
    16601708
    16611709    if (version_id != 1) {
     
    16631711    }
    16641712#else
    1665     SB16State *s = (SB16State *)opaque;
    1666 #endif
    1667 
    1668     s->irq=qemu_get_be32 (f);
    1669     s->dma=qemu_get_be32 (f);
    1670     s->hdma=qemu_get_be32 (f);
    1671     s->port=qemu_get_be32 (f);
    1672     s->ver=qemu_get_be32 (f);
    1673     s->in_index=qemu_get_be32 (f);
    1674     s->out_data_len=qemu_get_be32 (f);
    1675     s->fmt_stereo=qemu_get_be32 (f);
    1676     s->fmt_signed=qemu_get_be32 (f);
    1677     s->fmt_bits=qemu_get_be32 (f);
    1678     qemu_get_be32s (f, (uint32_t*)&s->fmt);
    1679     s->dma_auto=qemu_get_be32 (f);
    1680     s->block_size=qemu_get_be32 (f);
    1681     s->fifo=qemu_get_be32 (f);
    1682     s->freq=qemu_get_be32 (f);
    1683     s->time_const=qemu_get_be32 (f);
    1684     s->speaker=qemu_get_be32 (f);
    1685     s->needed_bytes=qemu_get_be32 (f);
    1686     s->cmd=qemu_get_be32 (f);
    1687     s->use_hdma=qemu_get_be32 (f);
    1688     s->highspeed=qemu_get_be32 (f);
    1689     s->can_write=qemu_get_be32 (f);
    1690     s->v2x6=qemu_get_be32 (f);
    1691 
    1692     qemu_get_8s (f, &s->csp_param);
    1693     qemu_get_8s (f, &s->csp_value);
    1694     qemu_get_8s (f, &s->csp_mode);
    1695     qemu_get_8s (f, &s->csp_param);
    1696     qemu_get_buffer (f, s->csp_regs, 256);
    1697     qemu_get_8s (f, &s->csp_index);
    1698     qemu_get_buffer (f, s->csp_reg83, 4);
    1699     s->csp_reg83r=qemu_get_be32 (f);
    1700     s->csp_reg83w=qemu_get_be32 (f);
    1701 
    1702     qemu_get_buffer (f, s->in2_data, sizeof (s->in2_data));
    1703     qemu_get_buffer (f, s->out_data, sizeof (s->out_data));
    1704     qemu_get_8s (f, &s->test_reg);
    1705     qemu_get_8s (f, &s->last_read_byte);
    1706 
    1707     s->nzero=qemu_get_be32 (f);
    1708     s->left_till_irq=qemu_get_be32 (f);
    1709     s->dma_running=qemu_get_be32 (f);
    1710     s->bytes_per_second=qemu_get_be32 (f);
    1711     s->align=qemu_get_be32 (f);
    1712 
    1713     s->mixer_nreg=qemu_get_be32 (f);
    1714     qemu_get_buffer (f, s->mixer_regs, 256);
     1713    PSB16STATE pThis = (SB16STATE *)opaque;
     1714#endif
     1715
     1716    pThis->irq=qemu_get_be32 (f);
     1717    pThis->dma=qemu_get_be32 (f);
     1718    pThis->hdma=qemu_get_be32 (f);
     1719    pThis->port=qemu_get_be32 (f);
     1720    pThis->ver=qemu_get_be32 (f);
     1721    pThis->in_index=qemu_get_be32 (f);
     1722    pThis->out_data_len=qemu_get_be32 (f);
     1723    pThis->fmt_stereo=qemu_get_be32 (f);
     1724    pThis->fmt_signed=qemu_get_be32 (f);
     1725    pThis->fmt_bits=qemu_get_be32 (f);
     1726    qemu_get_be32s (f, (uint32_t*)&pThis->fmt);
     1727    pThis->dma_auto=qemu_get_be32 (f);
     1728    pThis->block_size=qemu_get_be32 (f);
     1729    pThis->fifo=qemu_get_be32 (f);
     1730    pThis->freq=qemu_get_be32 (f);
     1731    pThis->time_const=qemu_get_be32 (f);
     1732    pThis->speaker=qemu_get_be32 (f);
     1733    pThis->needed_bytes=qemu_get_be32 (f);
     1734    pThis->cmd=qemu_get_be32 (f);
     1735    pThis->use_hdma=qemu_get_be32 (f);
     1736    pThis->highspeed=qemu_get_be32 (f);
     1737    pThis->can_write=qemu_get_be32 (f);
     1738    pThis->v2x6=qemu_get_be32 (f);
     1739
     1740    qemu_get_8s (f, &pThis->csp_param);
     1741    qemu_get_8s (f, &pThis->csp_value);
     1742    qemu_get_8s (f, &pThis->csp_mode);
     1743    qemu_get_8s (f, &pThis->csp_param);
     1744    qemu_get_buffer (f, pThis->csp_regs, 256);
     1745    qemu_get_8s (f, &pThis->csp_index);
     1746    qemu_get_buffer (f, pThis->csp_reg83, 4);
     1747    pThis->csp_reg83r=qemu_get_be32 (f);
     1748    pThis->csp_reg83w=qemu_get_be32 (f);
     1749
     1750    qemu_get_buffer (f, pThis->in2_data, sizeof (pThis->in2_data));
     1751    qemu_get_buffer (f, pThis->out_data, sizeof (pThis->out_data));
     1752    qemu_get_8s (f, &pThis->test_reg);
     1753    qemu_get_8s (f, &pThis->last_read_byte);
     1754
     1755    pThis->nzero=qemu_get_be32 (f);
     1756    pThis->left_till_irq=qemu_get_be32 (f);
     1757    pThis->dma_running=qemu_get_be32 (f);
     1758    pThis->bytes_per_second=qemu_get_be32 (f);
     1759    pThis->align=qemu_get_be32 (f);
     1760
     1761    pThis->mixer_nreg=qemu_get_be32 (f);
     1762    qemu_get_buffer (f, pThis->mixer_regs, 256);
    17151763
    17161764#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    1717     if (s->pGstStrmOut)
     1765    if (pThis->pGstStrmOut)
    17181766    {
    1719         s->pDrv->pfnCloseOut(s->pDrv, s->pGstStrmOut);
    1720         s->pGstStrmOut = NULL;
    1721     }
    1722 #else
    1723     AUD_close_out (&s->card, s->voice);
    1724     s->voice = NULL;
     1767        pThis->pDrv->pfnCloseOut(pThis->pDrv, pThis->pGstStrmOut);
     1768        pThis->pGstStrmOut = NULL;
     1769    }
     1770#else
     1771    AUD_close_out (&pThis->card, pThis->voice);
     1772    pThis->voice = NULL;
    17251773#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    17261774
    1727     if (s->dma_running)
     1775    if (pThis->dma_running)
    17281776    {
    1729         if (s->freq)
     1777        if (pThis->freq)
    17301778        {
    1731             s->audio_free = 0;
     1779            pThis->audio_free = 0;
    17321780
    17331781#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    17341782            PDMAUDIOSTREAMCFG streamCfg;
    1735             streamCfg.uHz           = s->freq;
    1736             streamCfg.cChannels     = 1 << s->fmt_stereo;
    1737             streamCfg.enmFormat     = s->fmt;
     1783            streamCfg.uHz           = pThis->freq;
     1784            streamCfg.cChannels     = 1 << pThis->fmt_stereo;
     1785            streamCfg.enmFormat     = pThis->fmt;
    17381786            streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
    17391787
    1740             int rc = s->pDrv->pfnOpenOut(s->pDrv, "sb16.out", &streamCfg, &s->pGstStrmOut);
     1788            int rc = pThis->pDrv->pfnOpenOut(pThis->pDrv, "sb16.out", &streamCfg, &pThis->pGstStrmOut);
    17411789            AssertRC(rc);
    17421790#else
    17431791            audsettings_t as;
    1744             as.freq = s->freq;
    1745             as.nchannels = 1 << s->fmt_stereo;
    1746             as.fmt = s->fmt;
     1792            as.freq = pThis->freq;
     1793            as.nchannels = 1 << pThis->fmt_stereo;
     1794            as.fmt = pThis->fmt;
    17471795            as.endianness = 0;
    1748             s->voice = AUD_open_out (
    1749                 &s->card,
    1750                 s->voice,
     1796            pThis->voice = AUD_open_out (
     1797                &pThis->card,
     1798                pThis->voice,
    17511799                "sb16",
    1752                 s,
     1800                pThis,
    17531801                sb16AudioCallback,
    17541802                &as
     
    17571805        }
    17581806
    1759         control(s, 1);
    1760         speaker(s, s->speaker);
     1807        control(pThis, 1);
     1808        speaker(pThis, pThis->speaker);
    17611809    }
    17621810
     
    17691817int SB16_init (AudioState *audio, qemu_irq *pic)
    17701818{
    1771     SB16State *s;
     1819    PSB16STATE pThis;
    17721820    int i;
    17731821    static const uint8_t dsp_write_ports[] = {0x6, 0xc};
     
    17861834    }
    17871835
    1788     s->cmd = -1;
    1789     s->pic = pic;
    1790     s->irq = conf.irq;
    1791     s->dma = conf.dma;
    1792     s->hdma = conf.hdma;
    1793     s->port = conf.port;
    1794     s->ver = conf.ver_lo | (conf.ver_hi << 8);
    1795 
    1796     s->mixer_regs[0x80] = magic_of_irq (s->irq);
    1797     s->mixer_regs[0x81] = (1 << s->dma) | (1 << s->hdma);
    1798     s->mixer_regs[0x82] = 2 << 5;
    1799 
    1800     s->csp_regs[5] = 1;
    1801     s->csp_regs[9] = 0xf8;
    1802 
    1803     reset_mixer (s);
    1804     s->aux_ts = qemu_new_timer (vm_clock, aux_timer, s);
    1805     if (!s->aux_ts) {
     1836    pThis->cmd = -1;
     1837    pThis->pic = pic;
     1838    pThis->irq = conf.irq;
     1839    pThis->dma = conf.dma;
     1840    pThis->hdma = conf.hdma;
     1841    pThis->port = conf.port;
     1842    pThis->ver = conf.ver_lo | (conf.ver_hi << 8);
     1843
     1844    pThis->mixer_regs[0x80] = magic_of_irq (pThis->irq);
     1845    pThis->mixer_regs[0x81] = (1 << pThis->dma) | (1 << pThis->hdma);
     1846    pThis->mixer_regs[0x82] = 2 << 5;
     1847
     1848    pThis->csp_regs[5] = 1;
     1849    pThis->csp_regs[9] = 0xf8;
     1850
     1851    reset_mixer (pThis);
     1852    pThis->aux_ts = qemu_new_timer (vm_clock, aux_timer, s);
     1853    if (!pThis->aux_ts) {
    18061854        LogFlowFunc(("warning: Could not create auxiliary timer\n"));
    18071855    }
    18081856
    18091857    for (i = 0; i < LENOFA (dsp_write_ports); i++) {
    1810         register_ioport_write (s->port + dsp_write_ports[i], 1, 1, dsp_write, s);
     1858        register_ioport_write (pThis->port + dsp_write_ports[i], 1, 1, dsp_write, s);
    18111859    }
    18121860
    18131861    for (i = 0; i < LENOFA (dsp_read_ports); i++) {
    1814         register_ioport_read (s->port + dsp_read_ports[i], 1, 1, dsp_read, s);
    1815     }
    1816 
    1817     register_ioport_write (s->port + 0x4, 1, 1, mixer_write_indexb, s);
    1818     register_ioport_write (s->port + 0x4, 1, 2, mixer_write_indexw, s);
    1819     register_ioport_read (s->port + 0x5, 1, 1, mixer_read, s);
    1820     register_ioport_write (s->port + 0x5, 1, 1, mixer_write_datab, s);
    1821 
    1822     DMA_register_channel (s->hdma, SB_read_DMA, s);
    1823     DMA_register_channel (s->dma, SB_read_DMA, s);
    1824     s->can_write = 1;
     1862        register_ioport_read (pThis->port + dsp_read_ports[i], 1, 1, dsp_read, s);
     1863    }
     1864
     1865    register_ioport_write (pThis->port + 0x4, 1, 1, mixer_write_indexb, s);
     1866    register_ioport_write (pThis->port + 0x4, 1, 2, mixer_write_indexw, s);
     1867    register_ioport_read (pThis->port + 0x5, 1, 1, mixer_read, s);
     1868    register_ioport_write (pThis->port + 0x5, 1, 1, mixer_write_datab, s);
     1869
     1870    DMA_register_channel (pThis->hdma, SB_read_DMA, s);
     1871    DMA_register_channel (pThis->dma, SB_read_DMA, s);
     1872    pThis->can_write = 1;
    18251873
    18261874    register_savevm ("sb16", 0, 1, SB_save, SB_load, s);
    1827     AUD_register_card (audio, "sb16", &s->card);
     1875    AUD_register_card (audio, "sb16", &pThis->card);
    18281876    return 0;
    18291877}
     
    18341882static DECLCALLBACK(int) sb16LiveExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
    18351883{
    1836     SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);
     1884    PSB16STATE pThis = PDMINS_2_DATA (pDevIns, PSB16STATE);
    18371885
    18381886    SSMR3PutS32(pSSM, pThis->irqCfg);
     
    18461894static DECLCALLBACK(int) sb16SaveExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    18471895{
    1848     SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);
     1896    PSB16STATE pThis = PDMINS_2_DATA (pDevIns, PSB16STATE);
    18491897
    18501898    sb16LiveExec (pDevIns, pSSM, 0);
     
    18561904                                       uint32_t uVersion, uint32_t uPass)
    18571905{
    1858     SB16State *pThis = PDMINS_2_DATA (pDevIns, SB16State *);
     1906    PSB16STATE pThis = PDMINS_2_DATA (pDevIns, PSB16STATE);
    18591907
    18601908    AssertMsgReturn(    uVersion == SB16_SAVE_STATE_VERSION
     
    19021950                                                const char *pszIID)
    19031951{
    1904     SB16State *pThis = RT_FROM_MEMBER(pInterface, SB16State, IBase);
     1952    PSB16STATE pThis = RT_FROM_MEMBER(pInterface, SB16STATE, IBase);
    19051953    Assert(&pThis->IBase == pInterface);
    19061954
     
    19141962static DECLCALLBACK(int) sb16Destruct(PPDMDEVINS pDevIns)
    19151963{
    1916     SB16State *pThis = PDMINS_2_DATA(pDevIns, SB16State *);
     1964    PSB16STATE pThis = PDMINS_2_DATA(pDevIns, PSB16STATE);
     1965
     1966#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
     1967    PSB16DRIVER pDrv;
     1968
     1969    RTListForEach(&pThis->lstDrv, pDrv, SB16DRIVER, Node)
     1970        pDrv->Out.phStrmOut = NULL;
     1971
     1972    pThis->pSinkOutput = NULL;
     1973
     1974    if (pThis->pMixer)
     1975    {
     1976        audioMixerDestroy(pThis->pMixer);
     1977        pThis->pMixer = NULL;
     1978    }
     1979#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
    19171980
    19181981    return VINF_SUCCESS;
     
    19211984static DECLCALLBACK(int) sb16Construct (PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfgHandle)
    19221985{
    1923     SB16State *s = PDMINS_2_DATA(pDevIns, SB16State *);
     1986    PSB16STATE pThis = PDMINS_2_DATA(pDevIns, PSB16STATE);
    19241987    int rc;
    19251988
     
    19412004     * Read config data.
    19422005     */
    1943     rc = CFGMR3QuerySIntDef(pCfgHandle, "IRQ", &s->irq, 5);
     2006    rc = CFGMR3QuerySIntDef(pCfgHandle, "IRQ", &pThis->irq, 5);
    19442007    if (RT_FAILURE(rc))
    19452008        return PDMDEV_SET_ERROR(pDevIns, rc,
    19462009                                N_("Configuration error: Failed to get the \"IRQ\" value"));
    1947     s->irqCfg  = s->irq;
    1948 
    1949     rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA", &s->dma, 1);
     2010    pThis->irqCfg  = pThis->irq;
     2011
     2012    rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA", &pThis->dma, 1);
    19502013    if (RT_FAILURE(rc))
    19512014        return PDMDEV_SET_ERROR(pDevIns, rc,
    19522015                                N_("Configuration error: Failed to get the \"DMA\" value"));
    1953     s->dmaCfg  = s->dma;
    1954 
    1955     rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA16", &s->hdma, 5);
     2016    pThis->dmaCfg  = pThis->dma;
     2017
     2018    rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA16", &pThis->hdma, 5);
    19562019    if (RT_FAILURE(rc))
    19572020        return PDMDEV_SET_ERROR(pDevIns, rc,
    19582021                                N_("Configuration error: Failed to get the \"DMA16\" value"));
    1959     s->hdmaCfg = s->hdma;
     2022    pThis->hdmaCfg = pThis->hdma;
    19602023
    19612024    RTIOPORT Port;
     
    19642027        return PDMDEV_SET_ERROR(pDevIns, rc,
    19652028                                N_("Configuration error: Failed to get the \"Port\" value"));
    1966     s->port    = Port;
    1967     s->portCfg = Port;
     2029    pThis->port    = Port;
     2030    pThis->portCfg = Port;
    19682031
    19692032    uint16_t u16Version;
     
    19722035        return PDMDEV_SET_ERROR(pDevIns, rc,
    19732036                                N_("Configuration error: Failed to get the \"Version\" value"));
    1974     s->ver     = u16Version;
    1975     s->verCfg  = u16Version;
     2037    pThis->ver     = u16Version;
     2038    pThis->verCfg  = u16Version;
    19762039
    19772040    /*
    19782041     * Init instance data.
    19792042     */
    1980     s->pDevIns                 = pDevIns;
    1981     s->IBase.pfnQueryInterface = sb16QueryInterface;
    1982     s->cmd                     = -1;
    1983 
    1984     s->mixer_regs[0x80]        = magic_of_irq (s->irq);
    1985     s->mixer_regs[0x81]        = (1 << s->dma) | (1 << s->hdma);
    1986     s->mixer_regs[0x82]        = 2 << 5;
    1987 
    1988     s->csp_regs[5]             = 1;
    1989     s->csp_regs[9]             = 0xf8;
    1990 
    1991     reset_mixer(s);
     2043    pThis->pDevIns                 = pDevIns;
     2044    pThis->IBase.pfnQueryInterface = sb16QueryInterface;
     2045    pThis->cmd                     = -1;
     2046
     2047    pThis->mixer_regs[0x80]        = magic_of_irq (pThis->irq);
     2048    pThis->mixer_regs[0x81]        = (1 << pThis->dma) | (1 << pThis->hdma);
     2049    pThis->mixer_regs[0x82]        = 2 << 5;
     2050
     2051    pThis->csp_regs[5]             = 1;
     2052    pThis->csp_regs[9]             = 0xf8;
     2053
     2054    reset_mixer(pThis);
    19922055
    19932056    /*
    19942057     * Create timer, register & attach stuff.
    19952058     */
    1996     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, sb16Timer, s,
    1997                                 TMTIMER_FLAGS_DEFAULT_CRIT_SECT, "SB16 timer", &s->pTimer);
     2059    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, sb16Timer, pThis,
     2060                                TMTIMER_FLAGS_DEFAULT_CRIT_SECT, "SB16 timer", &pThis->pTimer);
    19982061    if (RT_FAILURE(rc))
    19992062        AssertMsgFailedReturn(("pfnTMTimerCreate -> %Rrc\n", rc), rc);
    20002063
    2001     rc = PDMDevHlpIOPortRegister(pDevIns, s->port + 0x04,  2, s,
     2064    rc = PDMDevHlpIOPortRegister(pDevIns, pThis->port + 0x04,  2, pThis,
    20022065                                 mixer_write, mixer_read, NULL, NULL, "SB16");
    20032066    if (RT_FAILURE(rc))
    20042067        return rc;
    2005     rc = PDMDevHlpIOPortRegister(pDevIns, s->port + 0x06, 10, s,
     2068    rc = PDMDevHlpIOPortRegister(pDevIns, pThis->port + 0x06, 10, pThis,
    20062069                                 dsp_write, dsp_read, NULL, NULL, "SB16");
    20072070    if (RT_FAILURE(rc))
    20082071        return rc;
    20092072
    2010     rc = PDMDevHlpDMARegister(pDevIns, s->hdma, SB_read_DMA, s);
     2073    rc = PDMDevHlpDMARegister(pDevIns, pThis->hdma, SB_read_DMA, pThis);
    20112074    if (RT_FAILURE(rc))
    20122075        return rc;
    2013     rc = PDMDevHlpDMARegister(pDevIns, s->dma, SB_read_DMA, s);
     2076    rc = PDMDevHlpDMARegister(pDevIns, pThis->dma, SB_read_DMA, pThis);
    20142077    if (RT_FAILURE(rc))
    20152078        return rc;
    20162079
    2017     s->can_write = 1;
    2018 
    2019     rc = PDMDevHlpSSMRegister3(pDevIns, SB16_SAVE_STATE_VERSION, sizeof(*s), sb16LiveExec, sb16SaveExec, sb16LoadExec);
     2080    pThis->can_write = 1;
     2081
     2082    rc = PDMDevHlpSSMRegister3(pDevIns, SB16_SAVE_STATE_VERSION, sizeof(SB16STATE), sb16LiveExec, sb16SaveExec, sb16LoadExec);
    20202083    if (RT_FAILURE(rc))
    20212084        return rc;
    20222085
    2023     rc = PDMDevHlpDriverAttach(pDevIns, 0, &s->IBase, &s->pDrvBase, "Audio Driver Port");
     2086    rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThis->IBase, &pThis->pDrvBase, "Audio Driver Port");
    20242087#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    20252088    if(RT_SUCCESS(rc))
    20262089    {
    2027         s->pDrv = PDMIBASE_QUERY_INTERFACE(s->pDrvBase, PDMIAUDIOCONNECTOR);
    2028         AssertMsgReturn(s->pDrv,
     2090        pThis->pDrv = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIAUDIOCONNECTOR);
     2091        AssertMsgReturn(pThis->pDrv,
    20292092                        ("Configuration error: instance %d has no host audio interface!\n", iInstance),
    20302093                        VERR_PDM_MISSING_INTERFACE);
     
    20422105
    20432106#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
    2044     legacy_reset(s);
    2045 
    2046     if (!s->pDrv->pfnIsOutputOK(s->pDrv,s->pGstStrmOut))
     2107    legacy_reset(pThis);
     2108
     2109    if (!pThis->pDrv->pfnIsOutputOK(pThis->pDrv,pThis->pGstStrmOut))
    20472110    {
    20482111        LogRel(("SB16: WARNING: Unable to open PCM OUT!\n"));
    2049         s->pDrv->pfnCloseOut(s->pDrv, s->pGstStrmOut );
    2050         s->pGstStrmOut = NULL;
    2051 
    2052         s->pDrv->pfnInitNull(s->pDrv);
     2112        pThis->pDrv->pfnCloseOut(pThis->pDrv, pThis->pGstStrmOut );
     2113        pThis->pGstStrmOut = NULL;
     2114
     2115        pThis->pDrv->pfnInitNull(pThis->pDrv);
    20532116
    20542117        PDMDevHlpVMSetRuntimeError(pDevIns, 0 /*fFlags*/, "HostAudioNotResponding",
     
    20572120    }
    20582121#else
    2059     AUD_register_card("sb16", &s->card);
    2060     legacy_reset(s);
    2061 
    2062     if (!AUD_is_host_voice_out_ok(s->voice))
     2122    AUD_register_card("sb16", &pThis->card);
     2123    legacy_reset(pThis);
     2124
     2125    if (!AUD_is_host_voice_out_ok(pThis->voice))
    20632126    {
    20642127        LogRel (("SB16: WARNING: Unable to open PCM OUT!\n"));
    2065         AUD_close_out (&s->card, s->voice);
    2066         s->voice = NULL;
     2128        AUD_close_out (&pThis->card, pThis->voice);
     2129        pThis->voice = NULL;
    20672130
    20682131        AUD_init_null();
     
    20962159    1,
    20972160    /* cbInstance */
    2098     sizeof(SB16State),
     2161    sizeof(SB16STATE),
    20992162    /* pfnConstruct */
    21002163    sb16Construct,
  • trunk/src/VBox/Devices/Audio/DrvAudio.cpp

    r54975 r55005  
    7676static int drvAudioDestroyHstIn(PDRVAUDIO pThis, PPDMAUDIOHSTSTRMIN pHstStrmIn);
    7777
    78 volume_t nominal_volume =
    79 {
    80     0,
    81     INT_MAX,
    82     INT_MAX
    83 };
    84 
    85 volume_t sum_out_volume =
    86 {
    87     0,
    88     INT_MAX,
    89     INT_MAX
    90 };
    91 
    92 volume_t pcm_in_volume =
    93 {
    94     0,
    95     INT_MAX,
    96     INT_MAX
    97 };
    98 
    9978int drvAudioAddHstOut(PDRVAUDIO pThis, const char *pszName, PPDMAUDIOSTREAMCFG pCfg, PPDMAUDIOHSTSTRMOUT *ppHstStrmOut)
    10079{
     
    498477                       const char *pszName, PPDMAUDIOSTREAMCFG pCfg)
    499478{
     479    AssertPtrReturn(pGstStrmOut,  VERR_INVALID_POINTER);
     480    AssertPtrReturn(pHostStrmOut, VERR_INVALID_POINTER);
     481    AssertPtrReturn(pszName,      VERR_INVALID_POINTER);
     482    AssertPtrReturn(pCfg,         VERR_INVALID_POINTER);
     483
    500484    int rc = drvAudioStreamCfgToProps(pCfg, &pGstStrmOut->Props);
    501485    if (RT_SUCCESS(rc))
     
    505489            return VERR_NO_MEMORY;
    506490
    507         rc = audioMixBufInit(&pGstStrmOut->MixBuf, pszTemp, &pGstStrmOut->Props,
    508                              audioMixBufSize(&pHostStrmOut->MixBuf));
     491        rc = audioMixBufInit(&pGstStrmOut->MixBuf, pszTemp, &pGstStrmOut->Props, audioMixBufSize(&pHostStrmOut->MixBuf));
    509492        if (RT_SUCCESS(rc))
    510493            rc = audioMixBufLinkTo(&pGstStrmOut->MixBuf, &pHostStrmOut->MixBuf);
     
    758741            return VERR_NO_MEMORY;
    759742
    760         rc = audioMixBufInit(&pGstStrmIn->MixBuf, pszTemp, &pGstStrmIn->Props,
    761                              audioMixBufSize(&pHstStrmIn->MixBuf));
     743        rc = audioMixBufInit(&pGstStrmIn->MixBuf, pszTemp, &pGstStrmIn->Props, audioMixBufSize(&pHstStrmIn->MixBuf));
    762744        if (RT_SUCCESS(rc))
    763745            rc = audioMixBufLinkTo(&pHstStrmIn->MixBuf, &pGstStrmIn->MixBuf);
     
    14561438                 cRead, AUDIOMIXBUF_S2B(&pGstStrmIn->MixBuf, cRead), rc));
    14571439    return rc;
    1458 }
    1459 
    1460 static DECLCALLBACK(int) drvAudioIsSetOutVolume(PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut,
    1461                                                 bool fMute, uint8_t uVolLeft, uint8_t uVolRight)
    1462 {
    1463     LogFlowFunc(("[%s] fMute=%RTbool, uVolLeft=%RU8, uVolRight=%RU8\n",
    1464                  pGstStrmOut->MixBuf.pszName, fMute, uVolLeft, uVolRight));
    1465 
    1466     if (pGstStrmOut)
    1467     {
    1468         pGstStrmOut->State.fMuted       = fMute;
    1469         pGstStrmOut->State.uVolumeLeft  = (uint32_t)uVolLeft * 0x808080; /* maximum is INT_MAX = 0x7fffffff */
    1470         pGstStrmOut->State.uVolumeRight = (uint32_t)uVolRight * 0x808080; /* maximum is INT_MAX = 0x7fffffff */
    1471     }
    1472 
    1473     return VINF_SUCCESS;
    1474 }
    1475 
    1476 /** @todo Handle more channels than stereo ... */
    1477 static DECLCALLBACK(int) drvAudioSetVolume(PPDMIAUDIOCONNECTOR pInterface,
    1478                                            bool fMute, uint8_t uVolLeft, uint8_t uVolRight)
    1479 {
    1480     LogFlowFunc(("fMute=%RTbool, uVolLeft=%RU8, uVolRight=%RU8\n",
    1481                  fMute, uVolLeft, uVolRight));
    1482 
    1483     volume_t vol;
    1484 
    1485     uint32_t u32VolumeLeft  = uVolLeft;
    1486     uint32_t u32VolumeRight = uVolRight;
    1487 
    1488     /* 0x00..0xff => 0x01..0x100 */
    1489     if (u32VolumeLeft)
    1490         u32VolumeLeft++;
    1491     if (u32VolumeRight)
    1492         u32VolumeRight++;
    1493     vol.mute  = fMute ? 1 : 0;
    1494     vol.l     = u32VolumeLeft  * 0x800000; /* maximum is 0x80000000 */
    1495     vol.r     = u32VolumeRight * 0x800000; /* maximum is 0x80000000 */
    1496 
    1497     sum_out_volume.mute = 0;
    1498     sum_out_volume.l    = ASMMultU64ByU32DivByU32(INT_MAX, INT_MAX, 0x80000000U);
    1499     sum_out_volume.r    = ASMMultU64ByU32DivByU32(INT_MAX, INT_MAX, 0x80000000U);
    1500 
    1501     LogFlowFunc(("sum_out l=%RU32, r=%RU32\n", sum_out_volume.l, sum_out_volume.r));
    1502 
    1503     return VINF_SUCCESS;
    15041440}
    15051441
     
    16771613
    16781614    if (pGstStrmIn)
    1679     {
    1680         pGstStrmIn->State.uVolumeLeft = nominal_volume.l;
    1681         pGstStrmIn->State.uVolumeRight = nominal_volume.r;
    1682         pGstStrmIn->State.fMuted = RT_BOOL(nominal_volume.mute);
    1683 
    16841615        *ppGstStrmIn = pGstStrmIn;
    1685     }
    16861616
    16871617    LogFlowFuncLeaveRC(rc);
     
    17631693    {
    17641694        AssertPtr(pGstStrmOut);
    1765         pGstStrmOut->State.uVolumeLeft  = nominal_volume.l;
    1766         pGstStrmOut->State.uVolumeRight = nominal_volume.r;
    1767         pGstStrmOut->State.fMuted       = RT_BOOL(nominal_volume.mute);
    1768 
    17691695        *ppGstStrmOut = pGstStrmOut;
    17701696#if 0
     
    19021828    pThis->IAudioConnector.pfnIsOutputOK             = drvAudioIsOutputOK;
    19031829    pThis->IAudioConnector.pfnInitNull               = drvAudioInitNull;
    1904     pThis->IAudioConnector.pfnSetVolumeOut           = drvAudioIsSetOutVolume;
    1905     pThis->IAudioConnector.pfnSetVolume              = drvAudioSetVolume;
    19061830    pThis->IAudioConnector.pfnEnableOut              = drvAudioEnableOut;
    19071831    pThis->IAudioConnector.pfnEnableIn               = drvAudioEnableIn;
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