Ignore:
Timestamp:
May 24, 2002, 8:02:48 PM (23 years ago)
Author:
sandervl
Message:

more mixer updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/winmm/mixer.cpp

    r8479 r8485  
    1 /* $Id: mixer.cpp,v 1.14 2002-05-23 20:42:06 sandervl Exp $ */
     1/* $Id: mixer.cpp,v 1.15 2002-05-24 18:02:47 sandervl Exp $ */
    22
    33/*
     
    4141#include "dbglocal.h"
    4242
    43 static BOOL        mixerAddControl(MIXERLINEA *pDestLine, DWORD dwControl, MIXERLINEA *pSrcLine);
    44 static MIXERLINEA *mixerAddSource(MIXERLINEA *pDestLine, DWORD dwSource);
    45 static MIXERLINEA *mixerAddDestination(DWORD dwDest);
     43static MIXERCONTROLA *mixerAddControl(MIXERLINEA *pDestLine, DWORD dwControl, MIXERLINEA *pSrcLine);
     44static MIXERLINEA    *mixerAddSource(MIXERLINEA *pDestLine, DWORD dwSource);
     45static MIXERLINEA    *mixerAddDestination(DWORD dwDest);
    4646
    4747//array of destination mixer lines
     
    5959//array of all mixer controls
    6060static MIXERCONTROLA mixerControls[MAX_MIXER_CONTROLS]                          = {0};
     61//mapping of mixer id to internal id
     62static int           mixerControlId[MAX_MIXER_CONTROLS]                         = {0};
    6163
    6264static int           nrDestinations    = 0;
     
    7476    DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj;
    7577   
    76     if(fdwDetails == MIXER_OBJECTF_HMIXER) {
     78    if((fdwDetails & 0xF0000000)== MIXER_OBJECTF_HMIXER) {
    7779        if(!pMixInfo) {
    7880            return MMSYSERR_INVALHANDLE;
     
    8082    }
    8183    else
    82     if(fdwDetails == MIXER_OBJECTF_MIXER) {
    83         if(hmxobj > 0) {
     84    if((fdwDetails & 0xF0000000) == MIXER_OBJECTF_MIXER) {
     85        if(!HIWORD(hmxobj) && hmxobj > 0) {
    8486            return MMSYSERR_NODRIVER;
    8587        }
    8688    }
    8789
    88     if (lpmcd == NULL) return MMSYSERR_INVALPARAM;
     90    if(lpmcd == NULL || lpmcd->cbStruct != sizeof(MIXERCONTROLDETAILS)) {
     91        dprintf(("ERROR: invalid pointer or structure size %d (%d)", (lpmcd) ? lpmcd->cbStruct : 0, sizeof(MIXERCONTROLDETAILS)));
     92        return MMSYSERR_INVALPARAM;
     93    }
    8994
    9095    switch (fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK) {
    9196    case MIXER_GETCONTROLDETAILSF_VALUE:
     97        dprintf(("MIXER_GETCONTROLDETAILSF_VALUE %d (internal id %d)", lpmcd->dwControlID, mixerControlId[lpmcd->dwControlID]));
     98        if(lpmcd->dwControlID >= nrControls) {
     99            dprintf(("invalid control %d", lpmcd->dwControlID));
     100            return MIXERR_INVALCONTROL;
     101        }
     102        switch(mixerControls[lpmcd->dwControlID].dwControlType) {
     103        case MIXERCONTROL_CONTROLTYPE_MUX:
     104            dprintf(("MIXERCONTROL_CONTROLTYPE_MUX"));
     105            break;
     106        case MIXERCONTROL_CONTROLTYPE_MIXER:
     107            dprintf(("MIXERCONTROL_CONTROLTYPE_MIXER"));
     108            break;
     109        case MIXERCONTROL_CONTROLTYPE_FADER:
     110            dprintf(("MIXERCONTROL_CONTROLTYPE_FADER"));
     111            break;
     112        case MIXERCONTROL_CONTROLTYPE_VOLUME: //unsigned
     113        {
     114            MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails;
     115            DWORD dwVolLeft, dwVolRight;
     116
     117            dprintf(("MIXERCONTROL_CONTROLTYPE_VOLUME"));
     118            if(OSLibMixGetVolume(mixerControlId[lpmcd->dwControlID], NULL, &dwVolLeft, &dwVolRight) == FALSE) {
     119                dprintf(("OSLibMixGetVolume failed!!"));
     120                return MIXERR_INVALCONTROL;
     121            }
     122            pDetails->dwValue = dwVolLeft;
     123            dprintf(("Left volume %d", dwVolLeft));
     124            if(lpmcd->cChannels == 2) {
     125                dprintf(("Right volume %d", dwVolRight));
     126                pDetails += 1;
     127                pDetails->dwValue = dwVolRight;
     128            }
     129            //todo > 2 channels
     130            break;
     131        }
     132        case MIXERCONTROL_CONTROLTYPE_BASS:
     133            dprintf(("MIXERCONTROL_CONTROLTYPE_BASS"));
     134            break;
     135        case MIXERCONTROL_CONTROLTYPE_TREBLE:
     136            dprintf(("MIXERCONTROL_CONTROLTYPE_TREBLE"));
     137            break;
     138        case MIXERCONTROL_CONTROLTYPE_MUTE:
     139        {
     140            MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails;
     141            BOOL  fMute;
     142
     143            dprintf(("MIXERCONTROL_CONTROLTYPE_MUTE"));
     144            if(OSLibMixGetVolume(mixerControlId[lpmcd->dwControlID], &fMute, NULL, NULL) == FALSE) {
     145                dprintf(("OSLibMixGetVolume failed!!"));
     146                return MIXERR_INVALCONTROL;
     147            }
     148            pDetails->dwValue = fMute;
     149            dprintf(("Left mute %d", fMute));
     150            if(lpmcd->cChannels == 2) {
     151                dprintf(("Right mute %d", fMute));
     152                pDetails += 1;
     153                pDetails->dwValue = fMute;
     154            }
     155            //todo > 2 channels
     156            break;
     157        }
     158        case MIXERCONTROL_CONTROLTYPE_CUSTOM:
     159            dprintf(("MIXERCONTROL_CONTROLTYPE_CUSTOM"));
     160            break;
     161        case MIXERCONTROL_CONTROLTYPE_BOOLEANMETER:
     162            dprintf(("MIXERCONTROL_CONTROLTYPE_BOOLEANMETER"));
     163            break;
     164        case MIXERCONTROL_CONTROLTYPE_SIGNEDMETER:
     165            dprintf(("MIXERCONTROL_CONTROLTYPE_SIGNEDMETER"));
     166            break;
     167        case MIXERCONTROL_CONTROLTYPE_PEAKMETER:
     168            dprintf(("MIXERCONTROL_CONTROLTYPE_PEAKMETER"));
     169            break;
     170        case MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER:
     171            dprintf(("MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER"));
     172            break;
     173        case MIXERCONTROL_CONTROLTYPE_BOOLEAN:
     174            dprintf(("MIXERCONTROL_CONTROLTYPE_BOOLEAN"));
     175            break;
     176        case MIXERCONTROL_CONTROLTYPE_ONOFF:
     177            dprintf(("MIXERCONTROL_CONTROLTYPE_ONOFF"));
     178            break;
     179        case MIXERCONTROL_CONTROLTYPE_MONO:
     180            dprintf(("MIXERCONTROL_CONTROLTYPE_MONO"));
     181            break;
     182        case MIXERCONTROL_CONTROLTYPE_LOUDNESS:
     183            dprintf(("MIXERCONTROL_CONTROLTYPE_LOUDNESS"));
     184            break;
     185        case MIXERCONTROL_CONTROLTYPE_STEREOENH:
     186            dprintf(("MIXERCONTROL_CONTROLTYPE_STEREOENH"));
     187            break;
     188        case MIXERCONTROL_CONTROLTYPE_BUTTON:
     189            dprintf(("MIXERCONTROL_CONTROLTYPE_BUTTON"));
     190            break;
     191        case MIXERCONTROL_CONTROLTYPE_DECIBELS:
     192            dprintf(("MIXERCONTROL_CONTROLTYPE_DECIBELS"));
     193            break;
     194        case MIXERCONTROL_CONTROLTYPE_SIGNED:
     195            dprintf(("MIXERCONTROL_CONTROLTYPE_SIGNED"));
     196            break;
     197        case MIXERCONTROL_CONTROLTYPE_UNSIGNED:
     198            dprintf(("MIXERCONTROL_CONTROLTYPE_UNSIGNED"));
     199            break;
     200        case MIXERCONTROL_CONTROLTYPE_PERCENT:
     201            dprintf(("MIXERCONTROL_CONTROLTYPE_PERCENT"));
     202            break;
     203        case MIXERCONTROL_CONTROLTYPE_SLIDER:
     204            dprintf(("MIXERCONTROL_CONTROLTYPE_SLIDER"));
     205            break;
     206        case MIXERCONTROL_CONTROLTYPE_PAN:
     207            dprintf(("MIXERCONTROL_CONTROLTYPE_PAN"));
     208            break;
     209        case MIXERCONTROL_CONTROLTYPE_QSOUNDPAN:
     210            dprintf(("MIXERCONTROL_CONTROLTYPE_QSOUNDPAN"));
     211            break;
     212        case MIXERCONTROL_CONTROLTYPE_EQUALIZER:
     213            dprintf(("MIXERCONTROL_CONTROLTYPE_EQUALIZER"));
     214            break;
     215        case MIXERCONTROL_CONTROLTYPE_SINGLESELECT:
     216            dprintf(("MIXERCONTROL_CONTROLTYPE_SINGLESELECT"));
     217            break;
     218        case MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT:
     219            dprintf(("MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT"));
     220            break;
     221        case MIXERCONTROL_CONTROLTYPE_MICROTIME:
     222            dprintf(("MIXERCONTROL_CONTROLTYPE_MICROTIME"));
     223            break;
     224        case MIXERCONTROL_CONTROLTYPE_MILLITIME:
     225            dprintf(("MIXERCONTROL_CONTROLTYPE_MILLITIME"));
     226            break;
     227        default:
     228            DebugInt3();
     229            return MIXERR_INVALCONTROL;
     230        }
    92231        break;
    93232    case MIXER_GETCONTROLDETAILSF_LISTTEXT:
    94         dprintf(("mixerGetControlDetailsA: NIY\n"));
     233        dprintf(("MIXER_GETCONTROLDETAILSF_LISTTEXT %d", lpmcd->dwControlID));
     234        if(lpmcd->dwControlID >= nrControls) {
     235            dprintf(("invalid control %d", lpmcd->dwControlID));
     236            return MIXERR_INVALCONTROL;
     237        }
    95238            break;
    96239    default:
     
    147290    DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj;
    148291     
    149     if(fdwDetails == MIXER_OBJECTF_HMIXER) {
     292    if((fdwDetails & 0xF0000000) == MIXER_OBJECTF_HMIXER) {
    150293        if(!pMixInfo) {
    151294            return MMSYSERR_INVALHANDLE;
     
    153296    }
    154297    else
    155     if(fdwDetails == MIXER_OBJECTF_MIXER) {
    156         if(hmxobj > 0) {
     298    if((fdwDetails & 0xF0000000) == MIXER_OBJECTF_MIXER) {
     299        if(!HIWORD(hmxobj) && hmxobj > 0) {
    157300            return MMSYSERR_NODRIVER;
    158301        }
    159302    }
    160     if (lpmcd == NULL) return MMSYSERR_INVALPARAM;
     303    if(lpmcd == NULL || lpmcd->cbDetails != sizeof(MIXERCONTROLDETAILS)) {
     304        dprintf(("ERROR: invalid pointer or structure size"));
     305        return MMSYSERR_INVALPARAM;
     306    }
    161307   
    162308    switch (fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK) {
    163309    case MIXER_GETCONTROLDETAILSF_VALUE:
     310        dprintf(("MIXER_GETCONTROLDETAILSF_VALUE"));
    164311        break;
    165312    case MIXER_GETCONTROLDETAILSF_LISTTEXT:
    166         dprintf(("mixerSetControlDetails: NIY\n"));
     313        dprintf(("MIXER_GETCONTROLDETAILSF_LISTTEXT"));
    167314        break;
    168315    default:
     
    180327    DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj;
    181328
    182     if(fdwControls == MIXER_OBJECTF_HMIXER) {
     329    if((fdwControls & 0xF0000000) == MIXER_OBJECTF_HMIXER) {
    183330        if(!pMixInfo) {
    184331            return MMSYSERR_INVALHANDLE;
     
    186333    }
    187334    else
    188     if(fdwControls == MIXER_OBJECTF_MIXER) {
    189         if(hmxobj > 0) {
     335    if((fdwControls & 0xF0000000) == MIXER_OBJECTF_MIXER) {
     336        if(!HIWORD(hmxobj) && hmxobj > 0) {
    190337            return MMSYSERR_NODRIVER;
    191338        }
     
    200347    {
    201348    case MIXER_GETLINECONTROLSF_ALL:
    202         dprintf(("MIXER_GETLINECONTROLSF_ALL"));
    203         return MIXERR_INVALLINE;
     349    {
     350        MIXERLINEA    *pLine;
     351        MIXERCONTROLA *pCtrl;
     352
     353        dprintf(("MIXER_GETLINECONTROLSF_ALL for line %d", lpMlc->dwLineID));
     354        if(lpMlc->dwLineID >= nrLines) {
     355            dprintf(("ERROR: Invalid line %d", lpMlc->dwLineID));
     356            return MIXERR_INVALLINE;
     357        }
     358        pLine = pmixerLines[lpMlc->dwLineID];
     359        if(lpMlc->cControls != pLine->cControls || lpMlc->cbmxctrl < pLine->cControls*sizeof(MIXERCONTROLA)) {
     360            dprintf(("ERROR: invalid nr of controls %d or structure size %d", lpMlc->cControls, lpMlc->cbmxctrl));
     361            return MMSYSERR_INVALPARAM;
     362        }
     363        for(int i=0;i<lpMlc->cControls;i++) {
     364            pCtrl = lpMlc->pamxctrl+i;
     365            memcpy(pCtrl, &mixerControls[mixerLineControls[lpMlc->dwLineID][i]], sizeof(MIXERCONTROLA));
     366            dprintf(("found control %s (%s) control id %d", pCtrl->szName, pCtrl->szShortName, pCtrl->dwControlID));
     367        }
    204368            break;
     369    }
    205370
    206371    case MIXER_GETLINECONTROLSF_ONEBYID:
     372    {
    207373        dprintf(("MIXER_GETLINECONTROLSF_ONEBYID %x", lpMlc->u.dwControlID));
    208374        if(lpMlc->cControls != 1 || lpMlc->cbmxctrl != sizeof(MIXERCONTROLA)) {
     
    214380            return MIXERR_INVALCONTROL;
    215381        }
     382        //find line associated with this control
     383        lpMlc->dwLineID = -1;
     384        for(int i=0;i<MAX_MIXER_LINES;i++) {
     385            for(int j=0;j<MAX_SOURCE_CONTROLS;j++) {
     386                if(mixerLineControls[i][j] == lpMlc->u.dwControlID) {
     387                    lpMlc->dwLineID = i;
     388                    break;
     389                }
     390                else
     391                if(mixerLineControls[i][j] == -1) {
     392                    break;
     393                }
     394            }
     395            if(lpMlc->dwLineID != -1) {
     396                break;
     397            }
     398        }
     399        if(i == MAX_MIXER_LINES) {
     400            dprintf(("Associated line for control %d NOT FOUND", lpMlc->u.dwControlID));
     401            return MIXERR_INVALCONTROL;
     402        }
    216403        memcpy(lpMlc->pamxctrl, &mixerControls[lpMlc->u.dwControlID], sizeof(MIXERCONTROLA));
    217         dprintf(("found control %s (%s)", lpMlc->pamxctrl->szName, lpMlc->pamxctrl->szShortName));
     404
     405        dprintf(("found control %s (%s) associated line %d", lpMlc->pamxctrl->szName, lpMlc->pamxctrl->szShortName, lpMlc->dwLineID));
    218406            break;
     407    }
    219408
    220409    case MIXER_GETLINECONTROLSF_ONEBYTYPE:
     
    328517            if(mixerControls[idx].dwControlType == lpMlc->u.dwControlType) {
    329518                memcpy(lpMlc->pamxctrl, &mixerControls[idx], sizeof(MIXERCONTROLA));
    330                 dprintf(("found control %s (%s)", lpMlc->pamxctrl->szName, lpMlc->pamxctrl->szShortName));
     519                dprintf(("found control %s (%s) control id %d", lpMlc->pamxctrl->szName, lpMlc->pamxctrl->szShortName, lpMlc->pamxctrl->dwControlID));
    331520                return MMSYSERR_NOERROR;
    332521            }
    333522
    334523        }
    335         return MIXERR_INVALLINE;
     524        return MIXERR_INVALVALUE;
    336525    }
    337526    default:
     
    402591    DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj;
    403592
    404     if(fdwInfo & MIXER_OBJECTF_HMIXER) {
     593    if((fdwInfo & 0xF0000000) == MIXER_OBJECTF_HMIXER) {
    405594        if(!pMixInfo) {
    406595            return MMSYSERR_INVALHANDLE;
     
    408597    }
    409598    else
    410     if((fdwInfo & MIXER_OBJECTF_MIXER) == MIXER_OBJECTF_MIXER) {
    411         if(hmxobj > 0) {
     599    if((fdwInfo & 0xF0000000) == MIXER_OBJECTF_MIXER) {
     600        if(!HIWORD(hmxobj) && hmxobj > 0) {
    412601            return MMSYSERR_NODRIVER;
    413602        }
     
    428617        }
    429618        memcpy(lpMl, &mixerDest[lpMl->dwDestination], sizeof(MIXERLINEA));
    430         dprintf(("found line %s (%s) connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->cConnections, lpMl->cControls));
     619        dprintf(("found line %s (%s) id %d connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->dwLineID, lpMl->cConnections, lpMl->cControls));
    431620        break;
    432621
     
    434623        dprintf(("MIXER_GETLINEINFOF_LINEID %d", lpMl->dwLineID));
    435624        if(lpMl->dwLineID >= nrLines) {
    436             dprintf(("ERROR: Invalid destination %d", lpMl->dwLineID));
     625            dprintf(("ERROR: Invalid line %d", lpMl->dwLineID));
    437626            return MIXERR_INVALLINE;
    438627        }
     
    456645        }
    457646        memcpy(lpMl, &mixerSource[mixerDestInputs[lpMl->dwDestination][lpMl->dwSource]], sizeof(MIXERLINEA));
    458         dprintf(("found line %s (%s) connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->cConnections, lpMl->cControls));
     647        dprintf(("found line %s (%s) id %d connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->dwLineID, lpMl->cConnections, lpMl->cControls));
    459648        break;
    460649
     
    596785        pmxcaps->fdwSupport    = 0;    //no mixer flags exist
    597786        pmxcaps->cDestinations = nrDestinations;
     787        dprintf(("mixerGetDevCapsA: cDestinations %d", pmxcaps->cDestinations));
    598788    }
    599789
     
    622812        pmxcaps->fdwSupport    = 0;    //no mixer flags exist
    623813        pmxcaps->cDestinations = nrDestinations;
     814        dprintf(("mixerGetDevCapsW: cDestinations %d", pmxcaps->cDestinations));
    624815    }
    625816
     
    708899{
    709900    MIXERLINEA *pDestLine;
     901    MIXERCONTROLA *pLineOutMix;
     902    MIXERCONTROLA *pWaveInMux;
    710903
    711904    if(!fMMPMAvailable) return TRUE;
     
    719912        pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT);
    720913
     914        pLineOutMix = mixerAddControl(pDestLine, MIX_CTRL_MIX_OUT_LINE, pDestLine);
    721915        mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_LINE, pDestLine);
    722916        mixerAddControl(pDestLine, MIX_CTRL_MUTE_OUT_LINE, pDestLine);
     917        pLineOutMix->cMultipleItems = pDestLine->cConnections;
    723918
    724919        //WaveIn destination
    725920        pDestLine = mixerAddDestination(MIXER_DEST_WAVEIN);
     921        mixerAddControl(pDestLine, MIX_CTRL_MUX_IN_W_SRC, pDestLine);
    726922        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MIC, pDestLine);
    727923        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_LINE, pDestLine);
    728         //must add after all recording inputs (to count them)
    729         mixerAddControl(pDestLine, MIX_CTRL_MUX_IN_W_SRC, pDestLine);
     924        pWaveInMux->cMultipleItems = pDestLine->cConnections;
    730925        return TRUE;
    731926    }
    732927    //Line out destination
    733928    pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT);
     929
     930    pLineOutMix = mixerAddControl(pDestLine, MIX_CTRL_MIX_OUT_LINE, pDestLine);
    734931
    735932    mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_LINE, pDestLine);
     
    748945    }
    749946
    750     if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_SPDIF)) {
    751         MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_SPDIF);
    752         mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_SPDIF, pLine);
    753         mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_SPDIF, pLine);
    754     }
    755 
    756     if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MONO)) {
    757         MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_MONOIN);
    758         mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_MONO, pLine);
    759         mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_MONO, pLine);
    760     }
    761     if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_PHONE)) {
    762         MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_PHONE);
    763         mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_PHONE, pLine);
    764         mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_PHONE, pLine);
     947    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_PCM)) {
     948        MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_PCM);
     949        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_PCM, pLine);
     950        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_PCM, pLine);
     951    }
     952    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_WAVETABLE)) {
     953        MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_WAVETABLE);
     954        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_WAVETABLE, pLine);
     955        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_WAVETABLE, pLine);
     956    }
     957    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MIDI)) {
     958        MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_MIDI);
     959        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_MIDI, pLine);
     960        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_MIDI, pLine);
    765961    }
    766962    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MIC)) {
     
    782978        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_CD, pLine);
    783979    }
     980    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_AUX)) {
     981        MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_AUX);
     982        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_AUX, pLine);
     983        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_AUX, pLine);
     984    }
     985    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_SPDIF)) {
     986        MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_SPDIF);
     987        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_SPDIF, pLine);
     988        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_SPDIF, pLine);
     989    }
     990    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MONO)) {
     991        MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_MONOIN);
     992        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_MONO, pLine);
     993        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_MONO, pLine);
     994    }
     995    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_PHONE)) {
     996        MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_PHONE);
     997        mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_PHONE, pLine);
     998        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_PHONE, pLine);
     999    }
    7841000    if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_VIDEO)) {
    7851001        MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_VIDEO);
     
    7871003        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_VIDEO, pLine);
    7881004    }
    789     if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_AUX)) {
    790         MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_AUX);
    791         mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_AUX, pLine);
    792         mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_AUX, pLine);
    793     }
    794     if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_PCM)) {
    795         MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_PCM);
    796         mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_PCM, pLine);
    797         mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_PCM, pLine);
    798     }
    799     if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_WAVETABLE)) {
    800         MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_WAVETABLE);
    801         mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_WAVETABLE, pLine);
    802         mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_WAVETABLE, pLine);
    803     }
    804     if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MIDI)) {
    805         MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_MIDI);
    806         mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_MIDI, pLine);
    807         mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_MIDI, pLine);
    808     }
     1005    pLineOutMix->cMultipleItems = pDestLine->cConnections;
    8091006
    8101007    //Wave In Destination
    8111008    if(OSLibMixIsControlPresent(MIX_CTRL_MUX_IN_W_SRC)) {
    8121009        pDestLine = mixerAddDestination(MIXER_DEST_WAVEIN);
     1010        pWaveInMux = mixerAddControl(pDestLine, MIX_CTRL_MUX_IN_W_SRC, pDestLine);
     1011
     1012        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_MIC)) {
     1013            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MIC, pDestLine);
     1014        }
     1015        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_LINE)) {
     1016            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_LINE, pDestLine);
     1017        }
     1018        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_CD)) {
     1019            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_CD, pDestLine);
     1020        }
     1021        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_AUX)) {
     1022            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_AUX, pDestLine);
     1023        }
     1024        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_PCM)) {
     1025            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_PCM, pDestLine);
     1026        }
     1027        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_WAVETABLE)) {
     1028            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_WAVETABLE, pDestLine);
     1029        }
     1030        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_MIDI)) {
     1031            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MIDI, pDestLine);
     1032        }
    8131033        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_MONO)) {
    8141034            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MONO, pDestLine);
     
    8171037            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_PHONE, pDestLine);
    8181038        }
    819         if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_MIC)) {
    820             mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MIC, pDestLine);
    821         }
    822         if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_LINE)) {
    823             mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_LINE, pDestLine);
    824         }
    825         if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_CD)) {
    826             mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_CD, pDestLine);
    827         }
    8281039        if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_SPDIF)) {
    8291040            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_SPDIF, pDestLine);
     
    8321043            mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_VIDEO, pDestLine);
    8331044        }
    834         if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_AUX)) {
    835             mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_AUX, pDestLine);
    836         }
    837         if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_PCM)) {
    838             mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_PCM, pDestLine);
    839         }
    840         if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_WAVETABLE)) {
    841             mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_WAVETABLE, pDestLine);
    842         }
    843         if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_MIDI)) {
    844             mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MIDI, pDestLine);
    845         }
    846         //must add after all recording inputs (to count them)
    847         mixerAddControl(pDestLine, MIX_CTRL_MUX_IN_W_SRC, pDestLine);
     1045        pWaveInMux->cMultipleItems = pDestLine->cConnections;
    8481046    }
    8491047
     
    10621260/******************************************************************************/
    10631261/******************************************************************************/
    1064 static BOOL mixerAddControl(MIXERLINEA *pDestLine, DWORD dwControl, MIXERLINEA *pSrcLine)
     1262static MIXERCONTROLA * mixerAddControl(MIXERLINEA *pDestLine, DWORD dwControl, MIXERLINEA *pSrcLine)
    10651263{
    10661264    MIXERCONTROLA *pctrl  = &mixerControls[nrControls];
     
    10691267        dprintf(("ERROR: mixerAddControl: out of room!!!"));
    10701268        DebugInt3();
    1071         return FALSE;
     1269        return NULL;
    10721270    }
    10731271
     
    10791277    pctrl->fdwControl       = 0;
    10801278    switch(dwControl) {
     1279    case MIX_CTRL_MIX_OUT_LINE:
     1280        pctrl->fdwControl        = MIXERCONTROL_CONTROLF_MULTIPLE | MIXERCONTROL_CONTROLF_UNIFORM;
     1281        pctrl->dwControlType     = MIXERCONTROL_CONTROLTYPE_MIXER;
     1282        pctrl->Bounds.s.lMinimum = 0;
     1283        pctrl->Bounds.s.lMaximum = 1;
     1284        pctrl->Metrics.cSteps    = 1;
     1285        pctrl->cMultipleItems    = 0;   //to be filled in later (see caller)
     1286        break;
     1287
     1288    case MIX_CTRL_MUX_IN_W_SRC:
     1289        pctrl->fdwControl       = MIXERCONTROL_CONTROLF_MULTIPLE | MIXERCONTROL_CONTROLF_UNIFORM;
     1290        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_MUX;
     1291        pctrl->Bounds.s.lMinimum = 0;
     1292        pctrl->Bounds.s.lMaximum = 1;
     1293        pctrl->Metrics.cSteps    = 1;
     1294        pctrl->cMultipleItems    = 0;   //to be filled in later (see caller)
     1295        break;
     1296
    10811297    case MIX_CTRL_VOL_OUT_LINE:
    10821298    case MIX_CTRL_VOL_IN_L_MONO:
     
    11721388        break;
    11731389
    1174     case MIX_CTRL_MUX_IN_W_SRC:
    1175         pctrl->fdwControl       = MIXERCONTROL_CONTROLF_MULTIPLE | MIXERCONTROL_CONTROLF_UNIFORM;
    1176         pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_MUX;
    1177         pctrl->Bounds.s.lMinimum = 0;
    1178         pctrl->Bounds.s.lMaximum = 1;
    1179         pctrl->Metrics.cSteps    = 1;
    1180         break;
    1181 
    11821390    case MIX_CTRL_OUT_L_TREBLE:
    11831391        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_TREBLE;
     
    12001408    //increase nr of controls of corresponding destinateion line
    12011409    pDestLine->cControls++;
    1202 
     1410 
    12031411    //add control to list of controls associated with source line
    12041412    for(int i=0;i<MAX_SOURCE_CONTROLS;i++) {
     
    12141422    strncpy(pctrl->szShortName, szCtrlName[dwControl][0], sizeof(pctrl->szShortName));
    12151423    strncpy(pctrl->szName,      szCtrlName[dwControl][1], sizeof(pctrl->szName));
     1424
     1425    //save internal id
     1426    mixerControlId[nrControls] = dwControl;
    12161427    nrControls++;
    12171428    dprintf(("Adding control %s (%s)", pctrl->szName, pctrl->szShortName));
    1218     return TRUE;
    1219 }
    1220 /******************************************************************************/
    1221 /******************************************************************************/
    1222 
     1429    return pctrl;
     1430}
     1431/******************************************************************************/
     1432/******************************************************************************/
     1433
Note: See TracChangeset for help on using the changeset viewer.