Ignore:
Timestamp:
May 25, 2002, 7:19:41 PM (23 years ago)
Author:
sandervl
Message:

more mixer changes/fixes

File:
1 edited

Legend:

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

    r8488 r8492  
    1 /* $Id: mixer.cpp,v 1.16 2002-05-25 08:07:59 sandervl Exp $ */
     1/* $Id: mixer.cpp,v 1.17 2002-05-25 17:19:40 sandervl Exp $ */
    22
    33/*
     
    358358        pLine = pmixerLines[lpMlc->dwLineID];
    359359        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));
     360            dprintf(("ERROR: invalid nr of controls %d or structure size %d (%d) (ptr %x)", lpMlc->cControls, lpMlc->cbmxctrl, pLine->cControls*sizeof(MIXERCONTROLA), lpMlc->pamxctrl));
    361361            return MMSYSERR_INVALPARAM;
    362362        }
     
    522522
    523523        }
    524         return MIXERR_INVALVALUE;
     524        return MIXERR_INVALLINE;    //returned by win2k when type not found
    525525    }
    526526    default:
     
    649649
    650650    case MIXER_GETLINEINFOF_COMPONENTTYPE:
     651    {
    651652        dprintf(("MIXER_GETLINEINFOF_COMPONENTTYPE"));
     653#ifdef DEBUG
    652654            switch (lpMl->dwComponentType)
    653655            {
     
    679681            dprintf(("MIXERLINE_COMPONENTTYPE_DST_VOICEIN"));
    680682            break;
     683        case MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED:
     684            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED"));
     685            break;
     686        case MIXERLINE_COMPONENTTYPE_SRC_DIGITAL:
     687            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_DIGITAL"));
     688            break;
     689        case MIXERLINE_COMPONENTTYPE_SRC_LINE:
     690            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_LINE"));
     691            break;
     692        case MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE:
     693            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE"));
     694            break;
     695        case MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER:
     696            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER"));
     697            break;
     698        case MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC:
     699            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC"));
     700            break;
     701        case MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE:
     702            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE"));
     703            break;
     704        case MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER:
     705            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER"));
     706            break;
     707        case MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT:
     708            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT"));
     709            break;
     710        case MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY:
     711            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY"));
     712            break;
     713        case MIXERLINE_COMPONENTTYPE_SRC_ANALOG:
     714            dprintf(("MIXERLINE_COMPONENTTYPE_SRC_ANALOG"));
     715            break;
    681716        default:
    682717                dprintf(("Unhandled component type (%08lx)\n", lpMl->dwComponentType));
    683718                return MMSYSERR_INVALPARAM;
    684719            }
    685         return MIXERR_INVALLINE;
     720#endif
     721        //search all lines (src & dest) for one with specified type
     722        for(int i=0;i<nrLines;i++) {
     723            if(pmixerLines[i]->dwComponentType == lpMl->dwComponentType) {
     724                break;
     725            }
     726        }
     727        if(i == nrLines) {
     728            dprintf(("Component type %d not found!!", lpMl->dwComponentType));
     729            return MIXERR_INVALLINE;
     730        }
     731        memcpy(lpMl, pmixerLines[i], sizeof(MIXERLINEA));
     732        dprintf(("found line %s (%s) id %d connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->dwLineID, lpMl->cConnections, lpMl->cControls));
    686733            break;
    687 
     734    }
    688735    case MIXER_GETLINEINFOF_TARGETTYPE:
    689             dprintf(("_TARGETTYPE not implemented yet.\n"));
    690         return MIXERR_INVALLINE;
    691             break;
     736    {
     737            dprintf(("MIXER_GETLINEINFOF_TARGETTYPE %x", lpMl->Target.dwType));
     738#ifdef DEBUG
     739        switch(lpMl->Target.dwType) {
     740        case MIXERLINE_TARGETTYPE_UNDEFINED:
     741            dprintf(("MIXERLINE_TARGETTYPE_UNDEFINED"));
     742            break;
     743        case MIXERLINE_TARGETTYPE_WAVEOUT:
     744            dprintf(("MIXERLINE_TARGETTYPE_WAVEOUT"));
     745            break;
     746        case MIXERLINE_TARGETTYPE_WAVEIN:
     747            dprintf(("MIXERLINE_TARGETTYPE_WAVEIN"));
     748            break;
     749        case MIXERLINE_TARGETTYPE_MIDIOUT:
     750            dprintf(("MIXERLINE_TARGETTYPE_MIDIOUT"));
     751            break;
     752        case MIXERLINE_TARGETTYPE_MIDIIN:
     753            dprintf(("MIXERLINE_TARGETTYPE_MIDIIN"));
     754            break;
     755        case MIXERLINE_TARGETTYPE_AUX:
     756            dprintf(("MIXERLINE_TARGETTYPE_AUX"));
     757            break;
     758        default:       
     759                dprintf(("Unhandled target type (%08lx)\n", lpMl->Target.dwType));
     760                return MMSYSERR_INVALPARAM;
     761        }
     762#endif
     763        //search all lines (src & dest) for one with specified type
     764        //TODO: Should we compare mid, pid & pddname too? (must be initialized according to MSDN)
     765        //      (see below; unicode version doesn't copy pddname; change if these checks are required)
     766        for(int i=0;i<nrLines;i++) {
     767            if(pmixerLines[i]->Target.dwType == lpMl->Target.dwType) {
     768                break;
     769            }
     770        }
     771        if(i == nrLines) {
     772            dprintf(("Component type %d not found!!", lpMl->Target.dwType));
     773            return MIXERR_INVALLINE;
     774        }
     775        memcpy(lpMl, pmixerLines[i], sizeof(MIXERLINEA));
     776        dprintf(("found line %s (%s) id %d connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->dwLineID, lpMl->cConnections, lpMl->cControls));
     777        break;
     778    }
    692779    default:
    693780            dprintf(("Unknown flag (%08lx)\n", fdwInfo & MIXER_GETLINEINFOF_QUERYMASK));
     
    721808    line.Target.wMid           = pmxl->Target.wMid;
    722809    line.Target.wPid           = pmxl->Target.wPid;
     810    //TODO: need to copy this?? (MIXER_GETLINEINFOF_TARGETTYPE)
    723811    line.Target.szPname[0]     = 0;
    724812
     
    751839MMRESULT WINAPI mixerMessage(HMIXER hmx, UINT uMsg, DWORD dwParam1, DWORD dwParam2)
    752840{
    753     dprintf(("WINMM:mixerMessage - stub\n" ));
    754     return MMSYSERR_INVALPARAM;
     841    dprintf(("WINMM:mixerMessage - NOT IMPLEMENTED" ));
     842    return MMSYSERR_NOTSUPPORTED;
    755843}
    756844/******************************************************************************/
     
    778866    if(cbmxcaps >= sizeof(MIXERCAPSA)) {
    779867        // we have to fill in this thing
    780         pmxcaps->wMid = 0;                  /* manufacturer ID */
    781         pmxcaps->wPid = 0;                  /* product ID */
    782         pmxcaps->vDriverVersion = 0x0001;        /* version of the driver */
    783         strcpy( pmxcaps->szPname, WINMM_MIXERSTRING_A); /* product name */
     868        pmxcaps->wMid = WINMM_MIXER_CAPS_WMID;                  /* manufacturer ID */
     869        pmxcaps->wPid = WINMM_MIXER_CAPS_WPID;                  /* product ID */
     870        pmxcaps->vDriverVersion = WINMM_MIXER_CAPS_VERSION;     /* version of the driver */
     871        strncpy( pmxcaps->szPname, WINMM_MIXERSTRING_A, sizeof(pmxcaps->szPname)); /* product name */
    784872
    785873        pmxcaps->fdwSupport    = 0;    //no mixer flags exist
     
    805893    if(cbmxcaps >= sizeof(MIXERCAPSW)) {
    806894        // we have to fill in this thing
    807         pmxcaps->wMid = 0;                  /* manufacturer ID */
    808         pmxcaps->wPid = 0;                  /* product ID */
    809         pmxcaps->vDriverVersion = 0x0001;        /* version of the driver */
    810         lstrcpyW( pmxcaps->szPname, WINMM_MIXERSTRING_W ); /* product name */
     895        pmxcaps->wMid = WINMM_MIXER_CAPS_WMID;                  /* manufacturer ID */
     896        pmxcaps->wPid = WINMM_MIXER_CAPS_WPID;                  /* product ID */
     897        pmxcaps->vDriverVersion = WINMM_MIXER_CAPS_VERSION;     /* version of the driver */
     898        lstrcpyW( pmxcaps->szPname, WINMM_MIXERSTRING_W );      /* product name */
    811899
    812900        pmxcaps->fdwSupport    = 0;    //no mixer flags exist
     
    899987{
    900988    MIXERLINEA *pDestLine;
    901     MIXERCONTROLA *pLineOutMix;
    902989    MIXERCONTROLA *pWaveInMux;
    903990
     
    908995    memset(mixerDestInputs, -1, sizeof(mixerDestInputs));
    909996
    910     if(OSLibMixerOpen() == TRUE) {
     997    if(OSLibMixerOpen() == FALSE) {
    911998        //Line out destination
    912999        pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT);
    913 
    914         pLineOutMix = mixerAddControl(pDestLine, MIX_CTRL_MIX_OUT_LINE, pDestLine);
    9151000        mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_LINE, pDestLine);
    9161001        mixerAddControl(pDestLine, MIX_CTRL_MUTE_OUT_LINE, pDestLine);
    917         pLineOutMix->cMultipleItems = pDestLine->cConnections;
    9181002
    9191003        //WaveIn destination
     
    9251009        return TRUE;
    9261010    }
     1011
    9271012    //Line out destination
    9281013    pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT);
    929 
    930     pLineOutMix = mixerAddControl(pDestLine, MIX_CTRL_MIX_OUT_LINE, pDestLine);
    9311014
    9321015    mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_LINE, pDestLine);
     
    10031086        mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_VIDEO, pLine);
    10041087    }
    1005     pLineOutMix->cMultipleItems = pDestLine->cConnections;
    10061088
    10071089    //Wave In Destination
     
    10651147static MIXERLINEA *mixerAddSource(MIXERLINEA *pDestLine, DWORD dwSource)
    10661148{
    1067     MIXERLINEA *pline  = &mixerSource[nrSources];
     1149    MIXERLINEA *pline = &mixerSource[nrSources];
    10681150
    10691151    if(nrSources >= MAX_MIXER_SOURCES) {
     
    10731155    }
    10741156
    1075     pline->cbStruct = sizeof(MIXERLINEA);
    10761157    memset(pline, 0, sizeof(MIXERLINEA));
    10771158
    1078     pline->cConnections    = 0;
    1079     pline->cControls       = 0;
    1080     pline->dwDestination   = 0;
    1081     pline->fdwLine         = MIXERLINE_LINEF_SOURCE;
    1082     pline->dwSource        = nrSources;
     1159    pline->cbStruct              = sizeof(MIXERLINEA);
     1160    pline->cConnections          = 0;
     1161    pline->cControls             = 0;
     1162    pline->dwDestination         = 0;
     1163    pline->fdwLine               = MIXERLINE_LINEF_SOURCE;
     1164    pline->dwSource              = nrSources;
     1165    pline->Target.dwDeviceID     = 0;
     1166    pline->Target.wMid           = WINMM_MIXER_CAPS_WMID;
     1167    pline->Target.vDriverVersion = WINMM_MIXER_CAPS_VERSION;
    10831168
    10841169    switch(dwSource) {
     
    11451230    strncpy(pline->szShortName, szSourceName[dwSource][0], sizeof(pline->szShortName));
    11461231    strncpy(pline->szName,      szSourceName[dwSource][1], sizeof(pline->szName));
     1232    strncpy(pline->Target.szPname, WINMM_MIXERSTRING_A, sizeof(pline->Target.szPname));
    11471233
    11481234    dprintf(("Adding Source %s (%s)", pline->szName, pline->szShortName));
     
    11561242    nrLines++;
    11571243
    1158     //increase nr of inputs at destinateion line
     1244    //increase nr of inputs at destination line
    11591245    pDestLine->cConnections++;
    11601246
     
    11751261        return NULL;
    11761262    }
    1177     pline->cbStruct = sizeof(MIXERLINEA);
    11781263    memset(pline, 0, sizeof(MIXERLINEA));
     1264    pline->cbStruct        = sizeof(MIXERLINEA);
     1265    pline->cConnections    = 0;
     1266    pline->cControls       = 0;
     1267    pline->dwSource        = (DWORD)-1;
     1268    pline->dwDestination   = nrDestinations;
    11791269
    11801270    switch(dwDest) {
    11811271    case MIXER_DEST_LINEOUT:
    1182         pline->dwDestination   = nrDestinations;
    11831272        pline->cChannels       = 2;
    1184         pline->cConnections    = 0;
    1185         pline->cControls       = 0;
    11861273        pline->dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    1187         pline->dwSource        = 0;
    11881274        pline->fdwLine         = MIXERLINE_LINEF_ACTIVE;
    11891275        pline->Target.dwType   = MIXERLINE_TARGETTYPE_UNDEFINED;
     
    11911277
    11921278    case MIXER_DEST_SPDIFOUT:
    1193         pline->dwDestination   = nrDestinations;
    11941279        pline->cChannels       = 2;
    1195         pline->cConnections    = 0;
    1196         pline->cControls       = 0;
    11971280        pline->dwComponentType = MIXERLINE_COMPONENTTYPE_DST_DIGITAL;
    1198         pline->dwSource        = 0;
    11991281        pline->fdwLine         = MIXERLINE_LINEF_ACTIVE;
    12001282        pline->Target.dwType   = MIXERLINE_TARGETTYPE_UNDEFINED;
     
    12021284
    12031285    case MIXER_DEST_WAVEIN:
    1204         pline->dwSource        = nrDestinations;
    12051286        pline->cChannels       = 2;
    1206         pline->cConnections    = 0;
    1207         pline->cControls       = 0;
    12081287        pline->dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
    1209         pline->dwDestination   = 0;
    1210         pline->fdwLine         = MIXERLINE_LINEF_SOURCE;
    1211         pline->Target.dwType   = MIXERLINE_TARGETTYPE_UNDEFINED;
     1288        pline->fdwLine         = MIXERLINE_LINEF_ACTIVE;
     1289        pline->Target.dwType   = MIXERLINE_TARGETTYPE_WAVEIN;
    12121290        break;
    12131291       
     
    12181296    strncpy(pline->szShortName, szDestName[dwDest][0], sizeof(pline->szShortName));
    12191297    strncpy(pline->szName,      szDestName[dwDest][1], sizeof(pline->szName));
     1298    strncpy(pline->Target.szPname, WINMM_MIXERSTRING_A, sizeof(pline->Target.szPname));
     1299    pline->Target.dwDeviceID     = 0;
     1300    pline->Target.wMid           = WINMM_MIXER_CAPS_WMID;
     1301    pline->Target.wPid           = WINMM_MIXER_CAPS_WPID;
     1302    pline->Target.vDriverVersion = WINMM_MIXER_CAPS_VERSION;
     1303   
    12201304    dprintf(("Adding destination %s (%s) connections %d controls %d", pline->szName, pline->szShortName, pline->cConnections, pline->cControls));
    12211305    nrDestinations++;
     
    12701354    }
    12711355
     1356    memset(pctrl, 0, sizeof(MIXERCONTROLA));
    12721357    pctrl->cbStruct = sizeof(MIXERCONTROLA);
    1273     memset(pctrl, 0, sizeof(MIXERCONTROLA));
    1274 
    12751358    pctrl->cMultipleItems   = 0;
    12761359    pctrl->dwControlID      = nrControls;
    12771360    pctrl->fdwControl       = 0;
    12781361    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 
    12881362    case MIX_CTRL_MUX_IN_W_SRC:
    12891363        pctrl->fdwControl       = MIXERCONTROL_CONTROLF_MULTIPLE | MIXERCONTROL_CONTROLF_UNIFORM;
     
    13081382    case MIX_CTRL_VOL_IN_L_MIDI:
    13091383        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_VOLUME;
    1310         pctrl->Bounds.s.lMinimum = 0;
    1311         pctrl->Bounds.s.lMaximum = 100;
    1312         pctrl->Metrics.cSteps    = 1;
     1384        OSLibMixGetCtrlCaps(dwControl, &pctrl->Bounds.s.lMinimum, &pctrl->Bounds.s.lMaximum, &pctrl->Metrics.cSteps);
    13131385        break;
    13141386
     
    13251397    case MIX_CTRL_VOL_IN_W_MIDI:
    13261398        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_VOLUME;
    1327         pctrl->Bounds.s.lMinimum = 0;
    1328         pctrl->Bounds.s.lMaximum = 100;
    1329         pctrl->Metrics.cSteps    = 1;
     1399        OSLibMixGetCtrlCaps(dwControl, &pctrl->Bounds.s.lMinimum, &pctrl->Bounds.s.lMaximum, &pctrl->Metrics.cSteps);
    13301400        mixerDestInputs[MIXER_DEST_WAVEIN][nrWaveInInputs] = mixerSourceLineId[mixerWaveInVolToSource(dwControl)];
    13311401        nrWaveInInputs++;
     
    13511421    case MIX_CTRL_VOL_OUT_SPDIF:
    13521422        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_VOLUME;
    1353         pctrl->Bounds.s.lMinimum = 0;
    1354         pctrl->Bounds.s.lMaximum = 100;
    1355         pctrl->Metrics.cSteps    = 1;
     1423        OSLibMixGetCtrlCaps(dwControl, &pctrl->Bounds.s.lMinimum, &pctrl->Bounds.s.lMaximum, &pctrl->Metrics.cSteps);
    13561424        break;
    13571425
     
    13751443        pctrl->fdwControl       = MIXERCONTROL_CONTROLF_UNIFORM;
    13761444        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_FADER;
    1377         pctrl->Bounds.s.lMinimum = 0;
    1378         pctrl->Bounds.s.lMaximum = 100;
    1379         pctrl->Metrics.cSteps    = 1;
     1445        OSLibMixGetCtrlCaps(dwControl, &pctrl->Bounds.s.lMinimum, &pctrl->Bounds.s.lMaximum, &pctrl->Metrics.cSteps);
    13801446        break;
    13811447
     
    13831449        pctrl->fdwControl       = MIXERCONTROL_CONTROLF_UNIFORM;
    13841450        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_FADER;
    1385         pctrl->Bounds.s.lMinimum = 0;
    1386         pctrl->Bounds.s.lMaximum = 100;
    1387         pctrl->Metrics.cSteps    = 1;
     1451        OSLibMixGetCtrlCaps(dwControl, &pctrl->Bounds.s.lMinimum, &pctrl->Bounds.s.lMaximum, &pctrl->Metrics.cSteps);
    13881452        break;
    13891453
    13901454    case MIX_CTRL_OUT_L_TREBLE:
    13911455        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_TREBLE;
    1392         pctrl->Bounds.s.lMinimum = 0;
    1393         pctrl->Bounds.s.lMaximum = 100;
    1394         pctrl->Metrics.cSteps    = 1;
     1456        OSLibMixGetCtrlCaps(dwControl, &pctrl->Bounds.s.lMinimum, &pctrl->Bounds.s.lMaximum, &pctrl->Metrics.cSteps);
    13951457        break;
    13961458
    13971459    case MIX_CTRL_OUT_L_BASS:
    13981460        pctrl->dwControlType    = MIXERCONTROL_CONTROLTYPE_BASS;
    1399         pctrl->Bounds.s.lMinimum = 0;
    1400         pctrl->Bounds.s.lMaximum = 100;
    1401         pctrl->Metrics.cSteps    = 1;
     1461        OSLibMixGetCtrlCaps(dwControl, &pctrl->Bounds.s.lMinimum, &pctrl->Bounds.s.lMaximum, &pctrl->Metrics.cSteps);
    14021462        break;
    14031463
     
    14061466        return FALSE;
    14071467    }
    1408     //increase nr of controls of corresponding destinateion line
    1409     pDestLine->cControls++;
    14101468 
    14111469    //add control to list of controls associated with source line
     
    14191477        DebugInt3();
    14201478    }
     1479    //increase nr of controls of corresponding source line
     1480    pSrcLine->cControls++;
    14211481
    14221482    strncpy(pctrl->szShortName, szCtrlName[dwControl][0], sizeof(pctrl->szShortName));
Note: See TracChangeset for help on using the changeset viewer.