VirtualBox

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


Ignore:
Timestamp:
Nov 18, 2010 7:28:16 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67873
Message:

Audio/HDA: drop counters on stream reset. postpons stopping back-end voices to let complete the tasks.

File:
1 edited

Legend:

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

    r34152 r34153  
    10341034    else if (HDA_IS_STREAM_IN_RESET(pState, offset))
    10351035    {
     1036        PHDABDLEDESC pBdle = NULL;
     1037        uint32_t *pu32Lpib = NULL;
    10361038        Log(("hda: guest has initiated exit of stream reset\n"));
    10371039        pState->u8StreamsInReset &= ~HDA_STREAM_BITMASK(offset);
    10381040        HDA_REG_IND(pState, index) &= ~HDA_REG_FIELD_FLAG_MASK(SDCTL, SRST);
    1039     }
     1041        switch (index)
     1042        {
     1043            case ICH6_HDA_REG_SD0CTL:
     1044                pBdle = &pState->stInBdle;
     1045                pu32Lpib = &SDLPIB(pState, 0);
     1046                AUD_set_active_in(ISD0FMT_TO_AUDIO_SELECTOR(pState), 0);
     1047                break;
     1048            case ICH6_HDA_REG_SD4CTL:
     1049                u64BaseDMA = RT_MAKE_U64(SDBDPL(pState, 4), SDBDPU(pState, 4));
     1050                fOn = fOn && u64BaseDMA;
     1051                AUD_set_active_out(OSD0FMT_TO_AUDIO_SELECTOR(pState), 0);
     1052                pBdle = &pState->stOutBdle;
     1053                pu32Lpib = &SDLPIB(pState, 4);
     1054                break;
     1055            default:
     1056                Log(("Attempt to reset DMA state on unattached SDI(%s), ignored\n", s_ichIntelHDRegMap[index].abbrev));
     1057        }
     1058        if (   pBdle
     1059            && pu32Lpib)
     1060        {
     1061            memset(pBdle, 0, sizeof(HDABDLEDESC));
     1062            *pu32Lpib = 0;
     1063        }
     1064    }
     1065    /*
     1066     * Stopping streams we postpone up to reset exit to let HDA complete the tasks
     1067     */
    10401068    switch (index)
    10411069    {
    10421070        case ICH6_HDA_REG_SD0CTL:
    1043             AUD_set_active_in(ISD0FMT_TO_AUDIO_SELECTOR(pState), fOn);
     1071            if (fOn)
     1072                AUD_set_active_in(ISD0FMT_TO_AUDIO_SELECTOR(pState), 1);
    10441073            Log(("hda: DMA SD0CTL switched %s\n", fOn ? "on" : " off"));
    10451074            break;
    10461075        case ICH6_HDA_REG_SD4CTL:
     1076            if (fOn)
     1077                SDSTS(pState, 4) &= ~(1<<5);
    10471078            u64BaseDMA = RT_MAKE_U64(SDBDPL(pState, 4), SDBDPU(pState, 4));
    10481079            fOn = fOn && u64BaseDMA;
    1049             SDSTS(pState, 4) &= ~(1<<5);
    1050             AUD_set_active_out(OSD0FMT_TO_AUDIO_SELECTOR(pState), fOn);
     1080            if (fOn)
     1081                AUD_set_active_out(OSD0FMT_TO_AUDIO_SELECTOR(pState), 1);
    10511082            Log(("hda: DMA SD4CTL switched %s\n", fOn ? "on" : " off"));
    10521083            break;
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