VirtualBox

Changeset 31076 in vbox


Ignore:
Timestamp:
Jul 24, 2010 5:34:36 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
64022
Message:

Audio/HDA: some todo and more verbs(SetAmplifier(B--), ProcessingState(f03/703), DigitalConverter(F0D/70D/70E)).

File:
1 edited

Legend:

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

    r31075 r31076  
    113113    Log(("codecUnimplemented: cmd(raw:%x: cad:%x, d:%c, nid:%x, verb:%x)\n", cmd,
    114114        CODEC_CAD(cmd), CODEC_DIRECT(cmd) ? 'N' : 'Y', CODEC_NID(cmd), CODEC_VERBDATA(cmd)));
    115     if (CODEC_CAD(cmd) != pState->id)
    116         //** @todo r=michaln: Are we really supposed to respond to commands sent to nonexistent codecs??
    117         //** @todo r=michaln: Where in the specs is this response format defined?
    118         *pResp = ((uint64_t)CODEC_CAD(cmd) << 4)| 0xFF;
    119     else
    120         *pResp = 0;
     115    *pResp = 0;
    121116    return VINF_SUCCESS;
    122117}
     
    129124    return rc;
    130125}
    131 
     126/* B-- */
    132127static int codecGetAmplifier(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
    133128{
     
    155150    return VINF_SUCCESS;
    156151}
     152/* 3-- */
     153static int codecSetAmplifier(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
     154{
     155    uint32_t *pu32Bparam = NULL;
     156    PCODECNODE pNode = &pState->pNodes[CODEC_NID(cmd)];
     157    *pResp = 0;
     158    if (STAC9220_IS_DAC_CMD(cmd))
     159        pu32Bparam = &AMPLIFIER_REGISTER(pNode->dac.B_params,
     160            CODEC_B_DIRECTION(cmd),
     161            CODEC_B_SIDE(cmd),
     162            CODEC_B_INDEX(cmd));
     163    else if (STAC9220_IS_ADCVOL_CMD(cmd))
     164        pu32Bparam = &AMPLIFIER_REGISTER(pNode->adcvol.B_params,
     165            CODEC_B_DIRECTION(cmd),
     166            CODEC_B_SIDE(cmd),
     167            CODEC_B_INDEX(cmd));
     168    else if (STAC9220_IS_ADCMUX_CMD(cmd))
     169        pu32Bparam = &AMPLIFIER_REGISTER(pNode->adcmux.B_params,
     170            CODEC_B_DIRECTION(cmd),
     171            CODEC_B_SIDE(cmd),
     172            CODEC_B_INDEX(cmd));
     173    Assert(pu32Bparam);
     174    if (pu32Bparam)
     175    {
     176        *pu32Bparam = (*pu32Bparam) & ~CODEC_VERB_8BIT_DATA;
     177        *pu32Bparam = (*pu32Bparam) | (cmd & CODEC_VERB_8BIT_DATA);
     178    }
     179    return VINF_SUCCESS;
     180}
    157181
    158182static int codecGetF00(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
     
    189213    Assert((CODEC_CAD(cmd) == pState->id));
    190214    *pResp = *(uint32_t *)&pState->pNodes[CODEC_NID(cmd)].node.au8F02_param[cmd & CODEC_VERB_8BIT_DATA];
     215    return VINF_SUCCESS;
     216}
     217/* F03 */
     218static int codecGetProcessingState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
     219{
     220    Assert((CODEC_CAD(cmd) == pState->id));
     221    *pResp = 0;
     222    if (STAC9220_IS_ADC_CMD(cmd))
     223        *pResp = pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param;
     224    return VINF_SUCCESS;
     225}
     226/* 703 */
     227static int codecSetProcessingState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
     228{
     229    Assert((CODEC_CAD(cmd) == pState->id));
     230    if (STAC9220_IS_ADC_CMD(cmd))
     231    {
     232        pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param &= ~CODEC_VERB_8BIT_DATA;
     233        pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param |= cmd & CODEC_VERB_8BIT_DATA;
     234    }
     235    *pResp = 0;
     236    return VINF_SUCCESS;
     237}
     238/* F0D */
     239static int codecGetDigitalConverter(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
     240{
     241    Assert((CODEC_CAD(cmd) == pState->id));
     242    *pResp = 0;
     243    if (STAC9220_IS_SPDIFOUT_CMD(cmd))
     244        *pResp = pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param;
     245    return VINF_SUCCESS;
     246}
     247/* 70D */
     248static int codecSetDigitalConverter1(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
     249{
     250    Assert((CODEC_CAD(cmd) == pState->id));
     251    if (STAC9220_IS_SPDIFOUT_CMD(cmd))
     252    {
     253        pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param &= ~CODEC_VERB_8BIT_DATA;
     254        pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param |= cmd & CODEC_VERB_8BIT_DATA;
     255    }
     256    *pResp = 0;
     257    return VINF_SUCCESS;
     258}
     259/* 70E */
     260static int codecSetDigitalConverter2(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
     261{
     262    Assert((CODEC_CAD(cmd) == pState->id));
     263    if (STAC9220_IS_SPDIFOUT_CMD(cmd))
     264    {
     265        pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param &= ~(CODEC_VERB_8BIT_DATA << 8);
     266        pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param |= cmd & (CODEC_VERB_8BIT_DATA << 8);
     267    }
     268    *pResp = 0;
    191269    return VINF_SUCCESS;
    192270}
     
    275353    return VINF_SUCCESS;
    276354}
     355
    277356static int codecSetConverterFormat(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)
    278357{
     
    513592    {0x00020000, CODEC_VERB_16BIT_CMD, codecSetConverterFormat},
    514593    {0x000B0000, CODEC_VERB_16BIT_CMD, codecGetAmplifier },
     594    {0x00030000, CODEC_VERB_16BIT_CMD, codecSetAmplifier },
    515595    {0x00070600, CODEC_VERB_8BIT_CMD , codecSetStreamId    },
    516596    {0x000F0600, CODEC_VERB_8BIT_CMD , codecGetStreamId    },
     
    518598    {0x00070700, CODEC_VERB_8BIT_CMD , stac9220SetPinCtrl},
    519599    {0x000F0200, CODEC_VERB_8BIT_CMD , codecGetF02       },
     600    {0x000F0300, CODEC_VERB_8BIT_CMD , codecGetProcessingState },
     601    {0x00070300, CODEC_VERB_8BIT_CMD , codecSetProcessingState },
     602    {0x000F0D00, CODEC_VERB_8BIT_CMD , codecGetDigitalConverter },
     603    {0x00070D00, CODEC_VERB_8BIT_CMD , codecSetDigitalConverter1 },
     604    {0x00070E00, CODEC_VERB_8BIT_CMD , codecSetDigitalConverter2 },
    520605    {0x000F2000, CODEC_VERB_8BIT_CMD , codecGetSubId     },
    521606    {0x0007FF00, CODEC_VERB_8BIT_CMD , codecReset        },
     
    528613{
    529614    int rc = VINF_SUCCESS;
    530     if (   CODEC_CAD(cmd) != pState->id
    531         || CODEC_VERBDATA(cmd) == 0
     615    Assert(CODEC_CAD(cmd) == pState->id)
     616    if (  CODEC_VERBDATA(cmd) == 0
    532617        || CODEC_NID(cmd) >= STAC9220_NODE_COUNT
    533618        || STAC9220_IS_RESERVED_CMD(cmd))
    534619    {
    535         *pfn = CODEC_CAD(cmd) != pState->id ? codecUnimplemented : codecBreak;
     620        *pfn = CODEC_VERBDATA(cmd) != 0 ? codecUnimplemented : codecBreak;
    536621        //** @todo r=michaln: There needs to be a counter to avoid log flooding (see e.g. DevRTC.cpp)
    537622        LogRel(("HDAcodec: cmd %x was ignored\n", cmd));
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