VirtualBox

Changeset 9326 in vbox for trunk/src/VBox/Devices/Audio


Ignore:
Timestamp:
Jun 2, 2008 9:20:46 PM (17 years ago)
Author:
vboxsync
Message:

Some cleanup. Added a todo in dsp_read about non-byte reads.

File:
1 edited

Legend:

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

    r7882 r9326  
     1/* $Id$ */
    12/** @file
     3 * VBox SB16 Audio Controller.
     4 * (r3917 sb16.c)
    25 *
    3  * VBox SB16 Audio Controller
    4  *
    5  * TODO: hiccups on NT4 and Win98.
     6 * @todo hiccups on NT4 and Win98.
    67 */
    78
     
    4546
    4647#define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))
     48
    4749#define dolog(...) AUD_log ("sb16", __VA_ARGS__)
    4850
     
    5658#endif
    5759
    58 #else
     60#else /* VBOX */
    5961
    6062DECLINLINE(void) dolog (const char *fmt, ...)
     
    6668}
    6769
    68 #ifdef DEBUG
     70# ifdef DEBUG
    6971static void ldebug (const char *fmt, ...)
    7072{
     
    7577    va_end (ap);
    7678}
    77 #else
     79# else
    7880DECLINLINE(void) ldebug (const char *fmt, ...)
    7981{
    8082    (void)fmt;
    8183}
    82 #endif
     84# endif
    8385
    8486#endif /* VBOX */
    8587
     88#ifndef VBOX
     89#define IO_READ_PROTO(name)                             \
     90    uint32_t name (void *opaque, uint32_t nport)
     91#define IO_WRITE_PROTO(name)                                    \
     92    void name (void *opaque, uint32_t nport, uint32_t val)
     93#else  /* VBOX */
    8694#define IO_READ_PROTO(name)                                             \
    87         DECLCALLBACK(int) name (PPDMDEVINS pDevIns, void *opaque,       \
    88                                            RTIOPORT nport, uint32_t *pu32, unsigned cb)
     95    DECLCALLBACK(int) name (PPDMDEVINS pDevIns, void *opaque,       \
     96                            RTIOPORT nport, uint32_t *pu32, unsigned cb)
    8997
    9098#define IO_WRITE_PROTO(name)                                            \
    91         DECLCALLBACK(int) name (PPDMDEVINS pDevIns, void *opaque,       \
    92                                            RTIOPORT nport, uint32_t val, unsigned cb)
     99    DECLCALLBACK(int) name (PPDMDEVINS pDevIns, void *opaque,       \
     100                            RTIOPORT nport, uint32_t val, unsigned cb)
     101#endif /* VBOX */
    93102
    94103static const char e3[] = "COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.";
     
    103112    int port;
    104113} conf = {5, 4, 5, 1, 5, 0x220};
    105 #endif
     114#endif /* !VBOX */
    106115
    107116typedef struct SB16State {
     
    247256        AUD_set_active_out (s->voice, 0);
    248257    }
    249 #else
     258#else  /* VBOX */
    250259    if (hold)
    251260    {
     
    259268        AUD_set_active_out (s->voice, 0);
    260269    }
    261 #endif
     270#endif /* VBOX */
    262271}
    263272
     
    265274static void aux_timer (void *opaque)
    266275{
    267     SB16State *s = (SB16State*)opaque;
     276    SB16State *s = opaque;
    268277    s->can_write = 1;
    269278    qemu_irq_raise (s->pic[s->irq]);
    270279}
    271 #else
     280#else  /* VBOX */
    272281static DECLCALLBACK(void) sb16Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer)
    273282{
     
    276285    PDMDevHlpISASetIrq(s->pDevIns, s->irq, 1);
    277286}
    278 #endif
     287#endif /* VBOX */
    279288
    280289#define DMA8_AUTO 1
     
    374383        break;
    375384    }
    376 
    377385
    378386    if (-1 != s->time_const) {
     
    867875                    }
    868876                }
    869 #else
     877                ldebug ("mix silence %d %d %" PRId64 "\n", samples, bytes, ticks);
     878#else  /* VBOX */
    870879                ticks = (bytes * TMTimerGetFreq(s->pTimer)) / freq;
    871880                if (ticks < TMTimerGetFreq(s->pTimer) / 1024)
    872                 {
    873881                    PDMDevHlpISASetIrq(s->pDevIns, s->irq, 1);
    874                 }
    875882                else
    876883                    TMTimerSet(s->pTimer, TMTimerGet(s->pTimer) + ticks);
    877 #endif
    878884                ldebug ("mix silence %d %d % %RU64\n", samples, bytes, ticks);
     885#endif /* VBOX */
    879886            }
    880887            break;
     
    964971        qemu_irq_lower (s->pic[s->irq]);
    965972    }
    966 #else
     973#else  /* VBOX */
    967974    PDMDevHlpISASetIrq(s->pDevIns, s->irq, 0);
    968975    if (s->dma_auto) {
     
    970977        PDMDevHlpISASetIrq(s->pDevIns, s->irq, 0);
    971978    }
    972 #endif
     979#endif /* VBOX */
    973980
    974981    s->mixer_regs[0x82] = 0;
     
    9961003
    9971004    ldebug ("write %#x <- %#x\n", nport, val);
    998 
    9991005    switch (iport) {
    10001006    case 0x06:
     
    10771083    }
    10781084
     1085#ifdef VBOX
    10791086    return VINF_SUCCESS;
     1087#endif
    10801088}
    10811089
     
    10861094
    10871095    iport = nport - s->port;
     1096#ifdef VBOX
     1097    /** @todo reject non-byte access? */
     1098#endif
    10881099
    10891100    switch (iport) {
     
    12021213    s->mixer_nreg = val;
    12031214
     1215#ifdef VBOX
    12041216    return VINF_SUCCESS;
     1217#endif
    12051218}
    12061219
     
    12491262        dolog ("attempt to write into IRQ status register (val=%#x)\n",
    12501263               val);
     1264#ifdef VBOX
    12511265        return VINF_SUCCESS;
     1266#endif
    12521267
    12531268    default:
     
    12601275    s->mixer_regs[s->mixer_nreg] = val;
    12611276
     1277#ifdef VBOX /*???*/
    12621278    if (s->mixer_nreg == 0x30 || s->mixer_nreg == 0x31)
    12631279    {
     
    12671283        AUD_set_volume (AUD_MIXER_VOLUME, &mute, &lvol, &rvol);
    12681284    }
    1269 
     1285#endif /* VBOX ??? */
     1286
     1287#ifdef VBOX
    12701288    return VINF_SUCCESS;
     1289#endif
    12711290}
    12721291
    12731292static IO_WRITE_PROTO(mixer_write)
    12741293{
     1294#ifndef VBOX
     1295    mixer_write_indexb (opaque, nport, val & 0xff);
     1296    mixer_write_datab (opaque, nport, (val >> 8) & 0xff);
     1297#else  /* VBOX */
    12751298    SB16State *s = (SB16State*)opaque;
    12761299    int iport = nport - s->port;
     
    12971320    }
    12981321    return VINF_SUCCESS;
     1322#endif /* VBOX */
    12991323}
    13001324
     
    14491473}
    14501474
     1475#ifndef VBOX
     1476static void SB_save (QEMUFile *f, void *opaque)
     1477{
     1478    SB16State *s = opaque;
     1479#else
    14511480static DECLCALLBACK(int) SaveExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
    14521481{
    14531482    SB16State *s = PDMINS2DATA (pDevIns, SB16State *);
    14541483    QEMUFile *f = pSSMHandle;
     1484#endif
    14551485
    14561486    qemu_put_be32 (f, s->irq);
     
    15021532    qemu_put_buffer (f, s->mixer_regs, 256);
    15031533
     1534#ifdef VBOX
    15041535    return VINF_SUCCESS;
    1505 }
    1506 
     1536#endif
     1537}
     1538
     1539#ifndef VBOX
     1540static int SB_load (QEMUFile *f, void *opaque, int version_id)
     1541{
     1542    SB16State *s = opaque;
     1543
     1544    if (version_id != 1) {
     1545        return -EINVAL;
     1546    }
     1547#else  /* VBOX */
    15071548static DECLCALLBACK(int) LoadExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle,
    15081549                                   uint32_t u32Version)
     
    15161557        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
    15171558    }
     1559#endif /* VBOX */
    15181560
    15191561    s->irq=qemu_get_be32 (f);
     
    15951637    }
    15961638
     1639#ifdef VBOX
    15971640    return VINF_SUCCESS;
     1641#endif
    15981642}
    15991643
     
    16601704    return 0;
    16611705}
    1662 #endif
     1706
     1707#else /* VBOX */
    16631708
    16641709static DECLCALLBACK(void *) sb16QueryInterface (struct PDMIBASE *pInterface,
     
    16821727    int rc;
    16831728
     1729    /*
     1730     * Validations.
     1731     */
    16841732    Assert(iInstance == 0);
    1685 
    1686     uint32_t value;
    1687     if (!CFGMR3AreValuesValid(pCfgHandle, "IRQ\0DMA\0DMA16\0Port\0Version\0"))
     1733    if (!CFGMR3AreValuesValid(pCfgHandle,
     1734                              "IRQ\0"
     1735                              "DMA\0"
     1736                              "DMA16\0"
     1737                              "Port\0"
     1738                              "Version\0"))
    16881739        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
    16891740                                N_("Invalid configuraton for sb16 device"));
    1690     rc = CFGMR3QueryU32(pCfgHandle, "IRQ", &value);
    1691     if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    1692         s->irq = 5;
    1693     else if (VBOX_FAILURE(rc))
     1741
     1742    /*
     1743     * Read config data.
     1744     */
     1745    rc = CFGMR3QuerySIntDef(pCfgHandle, "IRQ", &s->irq, 5);
     1746    if (VBOX_FAILURE(rc))
    16941747        return PDMDEV_SET_ERROR(pDevIns, rc,
    16951748                                N_("Configuration error: Failed to get the \"IRQ\" value"));
    1696     else s->irq = value;
    1697     rc = CFGMR3QueryU32(pCfgHandle, "DMA", &value);
    1698     if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    1699         s->dma = 1;
    1700     else if (VBOX_FAILURE(rc))
     1749
     1750    rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA", &s->dma, 1);
     1751    if (VBOX_FAILURE(rc))
    17011752        return PDMDEV_SET_ERROR(pDevIns, rc,
    17021753                                N_("Configuration error: Failed to get the \"DMA\" value"));
    1703     else
    1704         s->dma = value;
    1705     rc = CFGMR3QueryU32(pCfgHandle, "DMA16", &value);
    1706     if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    1707         s->hdma = 5;
    1708     else if (VBOX_FAILURE(rc))
     1754
     1755    rc = CFGMR3QuerySIntDef(pCfgHandle, "DMA16", &s->hdma, 5);
     1756    if (VBOX_FAILURE(rc))
    17091757        return PDMDEV_SET_ERROR(pDevIns, rc,
    17101758                                N_("Configuration error: Failed to get the \"DMA16\" value"));
    1711     else
    1712         s->hdma = value;
    1713     rc = CFGMR3QueryU32(pCfgHandle, "Port", &value);
    1714     if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    1715         s->port = 0x220;
    1716     else if (VBOX_FAILURE(rc))
     1759
     1760    RTIOPORT Port;
     1761    rc = CFGMR3QueryPortDef(pCfgHandle, "Port", &Port, 0x220);
     1762    if (VBOX_FAILURE(rc))
    17171763        return PDMDEV_SET_ERROR(pDevIns, rc,
    17181764                                N_("Configuration error: Failed to get the \"Port\" value"));
    1719     else
    1720         s->port = value;
    1721     uint16_t version;
    1722     rc = CFGMR3QueryU16(pCfgHandle, "Version", &version);
    1723     if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    1724         s->ver = 0x0405;
    1725     else if (VBOX_FAILURE(rc))
     1765    s->port = Port;
     1766
     1767    uint16_t u16Version;
     1768    rc = CFGMR3QueryU16Def(pCfgHandle, "Version", &u16Version, 0x0405);
     1769    if (VBOX_FAILURE(rc))
    17261770        return PDMDEV_SET_ERROR(pDevIns, rc,
    17271771                                N_("Configuration error: Failed to get the \"Version\" value"));
    1728     else
    1729         s->ver = version;
    1730 
     1772    s->ver = u16Version;
     1773
     1774    /*
     1775     * Init instance data.
     1776     */
    17311777    s->pDevIns                 = pDevIns;
    17321778    s->IBase.pfnQueryInterface = sb16QueryInterface;
     
    17401786    s->csp_regs[9]             = 0xf8;
    17411787
    1742     reset_mixer (s);
    1743 
     1788    reset_mixer(s);
     1789
     1790    /*
     1791     * Create timer, register & attach stuff.
     1792     */
    17441793    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, sb16Timer, "SB16 timer", &s->pTimer);
    17451794    if (VBOX_FAILURE(rc))
    17461795        AssertMsgFailedReturn(("pfnTMTimerCreate -> %Vrc\n", rc), rc);
    17471796
    1748     rc = PDMDevHlpIOPortRegister (pDevIns, s->port + 0x04,  2, s,
    1749                                   mixer_write, mixer_read, NULL, NULL, "SB16");
    1750     if (VBOX_FAILURE (rc))
    1751         return rc;
    1752     rc = PDMDevHlpIOPortRegister (pDevIns, s->port + 0x06, 10, s,
    1753                                   dsp_write, dsp_read, NULL, NULL, "SB16");
    1754     if (VBOX_FAILURE (rc))
    1755         return rc;
    1756 
    1757     rc = PDMDevHlpDMARegister (pDevIns, s->hdma, SB_read_DMA, s);
    1758     if (VBOX_FAILURE (rc))
    1759         return rc;
    1760     rc = PDMDevHlpDMARegister (pDevIns, s->dma, SB_read_DMA, s);
    1761     if (VBOX_FAILURE (rc))
    1762         return rc;
    1763 
    1764     s->can_write = 1;
    1765 
    1766     rc = PDMDevHlpSSMRegister (pDevIns, pDevIns->pDevReg->szDeviceName, iInstance, SB16_SSM_VERSION,
    1767                                sizeof (*s), NULL, SaveExec, NULL, NULL, LoadExec, NULL);
     1797    rc = PDMDevHlpIOPortRegister(pDevIns, s->port + 0x04,  2, s,
     1798                                 mixer_write, mixer_read, NULL, NULL, "SB16");
    17681799    if (VBOX_FAILURE(rc))
    17691800        return rc;
    1770 
    1771     rc = PDMDevHlpDriverAttach (pDevIns, 0, &s->IBase, &s->pDrvBase, "Audio Driver Port");
     1801    rc = PDMDevHlpIOPortRegister(pDevIns, s->port + 0x06, 10, s,
     1802                                 dsp_write, dsp_read, NULL, NULL, "SB16");
     1803    if (VBOX_FAILURE(rc))
     1804        return rc;
     1805
     1806    rc = PDMDevHlpDMARegister(pDevIns, s->hdma, SB_read_DMA, s);
     1807    if (VBOX_FAILURE(rc))
     1808        return rc;
     1809    rc = PDMDevHlpDMARegister(pDevIns, s->dma, SB_read_DMA, s);
     1810    if (VBOX_FAILURE(rc))
     1811        return rc;
     1812
     1813    s->can_write = 1;
     1814
     1815    rc = PDMDevHlpSSMRegister(pDevIns, pDevIns->pDevReg->szDeviceName, iInstance, SB16_SSM_VERSION,
     1816                              sizeof(*s), NULL, SaveExec, NULL, NULL, LoadExec, NULL);
     1817    if (VBOX_FAILURE(rc))
     1818        return rc;
     1819
     1820    rc = PDMDevHlpDriverAttach(pDevIns, 0, &s->IBase, &s->pDrvBase, "Audio Driver Port");
    17721821    if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
    1773         Log (("sb16: No attached driver!\n"));
     1822        Log(("sb16: No attached driver!\n"));
    17741823    else if (VBOX_FAILURE(rc))
    17751824        AssertMsgFailedReturn(("Failed to attach SB16 LUN #0! rc=%Vrc\n", rc), rc);
    17761825
    1777     AUD_register_card ("sb16", &s->card);
    1778     legacy_reset (s);
     1826    AUD_register_card("sb16", &s->card);
     1827    legacy_reset(s);
    17791828
    17801829    if (!s->voice)
     
    17841833        AUD_init_null();
    17851834        PDMDevHlpVMSetRuntimeError(pDevIns, false, "HostAudioNotResponding",
    1786                 N_("No audio devices could be opened. Selecting the NULL audio backend "
    1787                    "with the consequence that no sound is audible."));
     1835            N_("No audio devices could be opened. Selecting the NULL audio backend "
     1836               "with the consequence that no sound is audible."));
    17881837    }
    17891838    return VINF_SUCCESS;
     
    18311880    NULL
    18321881};
     1882
     1883#endif /* VBOX */
     1884
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette