Changeset 8492 for trunk/src/winmm/mixer.cpp
- Timestamp:
- May 25, 2002, 7:19:41 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/winmm/mixer.cpp
r8488 r8492 1 /* $Id: mixer.cpp,v 1.1 6 2002-05-25 08:07:59sandervl Exp $ */1 /* $Id: mixer.cpp,v 1.17 2002-05-25 17:19:40 sandervl Exp $ */ 2 2 3 3 /* … … 358 358 pLine = pmixerLines[lpMlc->dwLineID]; 359 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));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)); 361 361 return MMSYSERR_INVALPARAM; 362 362 } … … 522 522 523 523 } 524 return MIXERR_INVAL VALUE;524 return MIXERR_INVALLINE; //returned by win2k when type not found 525 525 } 526 526 default: … … 649 649 650 650 case MIXER_GETLINEINFOF_COMPONENTTYPE: 651 { 651 652 dprintf(("MIXER_GETLINEINFOF_COMPONENTTYPE")); 653 #ifdef DEBUG 652 654 switch (lpMl->dwComponentType) 653 655 { … … 679 681 dprintf(("MIXERLINE_COMPONENTTYPE_DST_VOICEIN")); 680 682 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; 681 716 default: 682 717 dprintf(("Unhandled component type (%08lx)\n", lpMl->dwComponentType)); 683 718 return MMSYSERR_INVALPARAM; 684 719 } 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)); 686 733 break; 687 734 } 688 735 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 } 692 779 default: 693 780 dprintf(("Unknown flag (%08lx)\n", fdwInfo & MIXER_GETLINEINFOF_QUERYMASK)); … … 721 808 line.Target.wMid = pmxl->Target.wMid; 722 809 line.Target.wPid = pmxl->Target.wPid; 810 //TODO: need to copy this?? (MIXER_GETLINEINFOF_TARGETTYPE) 723 811 line.Target.szPname[0] = 0; 724 812 … … 751 839 MMRESULT WINAPI mixerMessage(HMIXER hmx, UINT uMsg, DWORD dwParam1, DWORD dwParam2) 752 840 { 753 dprintf(("WINMM:mixerMessage - stub\n" ));754 return MMSYSERR_ INVALPARAM;841 dprintf(("WINMM:mixerMessage - NOT IMPLEMENTED" )); 842 return MMSYSERR_NOTSUPPORTED; 755 843 } 756 844 /******************************************************************************/ … … 778 866 if(cbmxcaps >= sizeof(MIXERCAPSA)) { 779 867 // 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 str cpy( 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 */ 784 872 785 873 pmxcaps->fdwSupport = 0; //no mixer flags exist … … 805 893 if(cbmxcaps >= sizeof(MIXERCAPSW)) { 806 894 // 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 */ 811 899 812 900 pmxcaps->fdwSupport = 0; //no mixer flags exist … … 899 987 { 900 988 MIXERLINEA *pDestLine; 901 MIXERCONTROLA *pLineOutMix;902 989 MIXERCONTROLA *pWaveInMux; 903 990 … … 908 995 memset(mixerDestInputs, -1, sizeof(mixerDestInputs)); 909 996 910 if(OSLibMixerOpen() == TRUE) {997 if(OSLibMixerOpen() == FALSE) { 911 998 //Line out destination 912 999 pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT); 913 914 pLineOutMix = mixerAddControl(pDestLine, MIX_CTRL_MIX_OUT_LINE, pDestLine);915 1000 mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_LINE, pDestLine); 916 1001 mixerAddControl(pDestLine, MIX_CTRL_MUTE_OUT_LINE, pDestLine); 917 pLineOutMix->cMultipleItems = pDestLine->cConnections;918 1002 919 1003 //WaveIn destination … … 925 1009 return TRUE; 926 1010 } 1011 927 1012 //Line out destination 928 1013 pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT); 929 930 pLineOutMix = mixerAddControl(pDestLine, MIX_CTRL_MIX_OUT_LINE, pDestLine);931 1014 932 1015 mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_LINE, pDestLine); … … 1003 1086 mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_VIDEO, pLine); 1004 1087 } 1005 pLineOutMix->cMultipleItems = pDestLine->cConnections;1006 1088 1007 1089 //Wave In Destination … … 1065 1147 static MIXERLINEA *mixerAddSource(MIXERLINEA *pDestLine, DWORD dwSource) 1066 1148 { 1067 MIXERLINEA *pline 1149 MIXERLINEA *pline = &mixerSource[nrSources]; 1068 1150 1069 1151 if(nrSources >= MAX_MIXER_SOURCES) { … … 1073 1155 } 1074 1156 1075 pline->cbStruct = sizeof(MIXERLINEA);1076 1157 memset(pline, 0, sizeof(MIXERLINEA)); 1077 1158 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; 1083 1168 1084 1169 switch(dwSource) { … … 1145 1230 strncpy(pline->szShortName, szSourceName[dwSource][0], sizeof(pline->szShortName)); 1146 1231 strncpy(pline->szName, szSourceName[dwSource][1], sizeof(pline->szName)); 1232 strncpy(pline->Target.szPname, WINMM_MIXERSTRING_A, sizeof(pline->Target.szPname)); 1147 1233 1148 1234 dprintf(("Adding Source %s (%s)", pline->szName, pline->szShortName)); … … 1156 1242 nrLines++; 1157 1243 1158 //increase nr of inputs at destinat eion line1244 //increase nr of inputs at destination line 1159 1245 pDestLine->cConnections++; 1160 1246 … … 1175 1261 return NULL; 1176 1262 } 1177 pline->cbStruct = sizeof(MIXERLINEA);1178 1263 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; 1179 1269 1180 1270 switch(dwDest) { 1181 1271 case MIXER_DEST_LINEOUT: 1182 pline->dwDestination = nrDestinations;1183 1272 pline->cChannels = 2; 1184 pline->cConnections = 0;1185 pline->cControls = 0;1186 1273 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; 1187 pline->dwSource = 0;1188 1274 pline->fdwLine = MIXERLINE_LINEF_ACTIVE; 1189 1275 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; … … 1191 1277 1192 1278 case MIXER_DEST_SPDIFOUT: 1193 pline->dwDestination = nrDestinations;1194 1279 pline->cChannels = 2; 1195 pline->cConnections = 0;1196 pline->cControls = 0;1197 1280 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_DST_DIGITAL; 1198 pline->dwSource = 0;1199 1281 pline->fdwLine = MIXERLINE_LINEF_ACTIVE; 1200 1282 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; … … 1202 1284 1203 1285 case MIXER_DEST_WAVEIN: 1204 pline->dwSource = nrDestinations;1205 1286 pline->cChannels = 2; 1206 pline->cConnections = 0;1207 pline->cControls = 0;1208 1287 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; 1212 1290 break; 1213 1291 … … 1218 1296 strncpy(pline->szShortName, szDestName[dwDest][0], sizeof(pline->szShortName)); 1219 1297 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 1220 1304 dprintf(("Adding destination %s (%s) connections %d controls %d", pline->szName, pline->szShortName, pline->cConnections, pline->cControls)); 1221 1305 nrDestinations++; … … 1270 1354 } 1271 1355 1356 memset(pctrl, 0, sizeof(MIXERCONTROLA)); 1272 1357 pctrl->cbStruct = sizeof(MIXERCONTROLA); 1273 memset(pctrl, 0, sizeof(MIXERCONTROLA));1274 1275 1358 pctrl->cMultipleItems = 0; 1276 1359 pctrl->dwControlID = nrControls; 1277 1360 pctrl->fdwControl = 0; 1278 1361 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 1362 case MIX_CTRL_MUX_IN_W_SRC: 1289 1363 pctrl->fdwControl = MIXERCONTROL_CONTROLF_MULTIPLE | MIXERCONTROL_CONTROLF_UNIFORM; … … 1308 1382 case MIX_CTRL_VOL_IN_L_MIDI: 1309 1383 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); 1313 1385 break; 1314 1386 … … 1325 1397 case MIX_CTRL_VOL_IN_W_MIDI: 1326 1398 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); 1330 1400 mixerDestInputs[MIXER_DEST_WAVEIN][nrWaveInInputs] = mixerSourceLineId[mixerWaveInVolToSource(dwControl)]; 1331 1401 nrWaveInInputs++; … … 1351 1421 case MIX_CTRL_VOL_OUT_SPDIF: 1352 1422 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); 1356 1424 break; 1357 1425 … … 1375 1443 pctrl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; 1376 1444 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); 1380 1446 break; 1381 1447 … … 1383 1449 pctrl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; 1384 1450 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); 1388 1452 break; 1389 1453 1390 1454 case MIX_CTRL_OUT_L_TREBLE: 1391 1455 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); 1395 1457 break; 1396 1458 1397 1459 case MIX_CTRL_OUT_L_BASS: 1398 1460 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); 1402 1462 break; 1403 1463 … … 1406 1466 return FALSE; 1407 1467 } 1408 //increase nr of controls of corresponding destinateion line1409 pDestLine->cControls++;1410 1468 1411 1469 //add control to list of controls associated with source line … … 1419 1477 DebugInt3(); 1420 1478 } 1479 //increase nr of controls of corresponding source line 1480 pSrcLine->cControls++; 1421 1481 1422 1482 strncpy(pctrl->szShortName, szCtrlName[dwControl][0], sizeof(pctrl->szShortName));
Note:
See TracChangeset
for help on using the changeset viewer.