- Timestamp:
- Feb 9, 2011, 5:02:00 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/winmm/mixer.cpp
r8855 r21570 5 5 * 6 6 * Copyright 2002 Sander van Leeuwen (sandervl@xs4all.nl) 7 * 7 * 8 8 * TODO: Mixer notification 9 * 9 * 10 10 * NOTE: Not really flexible (capabilities, > 1 audio card) 11 11 * … … 13 13 * (mixerGetLineControlsW/mixerGetControlDetailsW) 14 14 * Copyright 1993 Martin Ayotte 15 * Eric POUECH 15 * Eric POUECH 16 16 * 17 17 * Project Odin Software License can be found in LICENSE.TXT … … 51 51 //array of all mixer lines 52 52 static MIXLINE *pmixerLines[MAX_MIXER_LINES] = {NULL}; 53 //array of all mixer controls 53 //array of all mixer controls 54 54 static MIXCONTROL mixerControls[MAX_MIXER_CONTROLS] = {0}; 55 55 … … 65 65 DWORD lineID, controlType; 66 66 DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj; 67 67 68 68 if((fdwDetails & 0xF0000000)== MIXER_OBJECTF_HMIXER) { 69 69 if(!pMixInfo) { … … 235 235 return MMSYSERR_NOERROR; 236 236 } 237 237 238 238 #ifdef DEBUG 239 239 case MIXERCONTROL_CONTROLTYPE_MIXER: … … 369 369 dprintf(("Only implemented for mux controls")); 370 370 return MIXERR_INVALCONTROL; 371 371 372 372 default: 373 373 dprintf(("Only implemented for multiple item controls")); … … 445 445 int val; 446 446 DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj; 447 447 448 448 if((fdwDetails & 0xF0000000) == MIXER_OBJECTF_HMIXER) { 449 449 if(!pMixInfo) { … … 461 461 return MMSYSERR_INVALPARAM; 462 462 } 463 463 464 464 switch (fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK) { 465 465 case MIXER_GETCONTROLDETAILSF_VALUE: … … 497 497 //select recording source 498 498 for(int i=0;i<nrDestinations;i++) { 499 if(mixerDest[i].id == MIXER_DEST_WAVEIN) 499 if(mixerDest[i].id == MIXER_DEST_WAVEIN) 500 500 { 501 501 for(int j=0;j<mixerDest[i].cConnections;j++) { 502 502 dprintf(("wavein source %s %d (id %d)", pmixerLines[mixerDest[i].Connections[j]]->line.szName, pmixerLines[mixerDest[i].Connections[j]]->id, mixerDest[i].Connections[j])); 503 if(pDetails[j].fValue) 503 if(pDetails[j].fValue) 504 504 { 505 505 if(OSLibMixSetRecSource(pmixerLines[mixerDest[i].Connections[j]]->id) == FALSE) { … … 590 590 goto success; 591 591 } 592 592 593 593 #ifdef DEBUG 594 594 case MIXERCONTROL_CONTROLTYPE_MIXER: … … 711 711 return MMSYSERR_INVALPARAM; 712 712 713 switch(fdwControls & MIXER_GETLINECONTROLSF_QUERYMASK) 713 switch(fdwControls & MIXER_GETLINECONTROLSF_QUERYMASK) 714 714 { 715 715 case MIXER_GETLINECONTROLSF_ALL: … … 755 755 break; 756 756 } 757 else 757 else 758 758 if(pmixerLines[i]->Controls[j] == -1) { 759 759 break; … … 924 924 lpmlcW->u.dwControlType = mlcA.u.dwControlType; 925 925 lpmlcW->cControls = mlcA.cControls; 926 926 927 927 for (i = 0; i < mlcA.cControls; i++) { 928 928 lpmlcW->pamxctrl[i].cbStruct = sizeof(MIXERCONTROLW); … … 937 937 lpmlcW->pamxctrl[i].szName, 938 938 sizeof(lpmlcW->pamxctrl[i].szName)/sizeof(WCHAR) ); 939 /* sizeof(lpmlcW->pamxctrl[i].Bounds) == 939 /* sizeof(lpmlcW->pamxctrl[i].Bounds) == 940 940 * sizeof(mlcA.pamxctrl[i].Bounds) */ 941 memcpy(&lpmlcW->pamxctrl[i].Bounds, &mlcA.pamxctrl[i].Bounds, 941 memcpy(&lpmlcW->pamxctrl[i].Bounds, &mlcA.pamxctrl[i].Bounds, 942 942 sizeof(mlcA.pamxctrl[i].Bounds)); 943 /* sizeof(lpmlcW->pamxctrl[i].Metrics) == 943 /* sizeof(lpmlcW->pamxctrl[i].Metrics) == 944 944 * sizeof(mlcA.pamxctrl[i].Metrics) */ 945 memcpy(&lpmlcW->pamxctrl[i].Metrics, &mlcA.pamxctrl[i].Metrics, 945 memcpy(&lpmlcW->pamxctrl[i].Metrics, &mlcA.pamxctrl[i].Metrics, 946 946 sizeof(mlcA.pamxctrl[i].Metrics)); 947 947 } … … 973 973 return MMSYSERR_INVALPARAM; 974 974 } 975 976 switch (fdwInfo & MIXER_GETLINEINFOF_QUERYMASK) 975 976 switch (fdwInfo & MIXER_GETLINEINFOF_QUERYMASK) 977 977 { 978 978 case MIXER_GETLINEINFOF_DESTINATION: … … 1018 1018 dprintf(("MIXER_GETLINEINFOF_COMPONENTTYPE")); 1019 1019 #ifdef DEBUG 1020 switch (lpMl->dwComponentType) 1020 switch (lpMl->dwComponentType) 1021 1021 { 1022 1022 case MIXERLINE_COMPONENTTYPE_DST_UNDEFINED: … … 1122 1122 dprintf(("MIXERLINE_TARGETTYPE_AUX")); 1123 1123 break; 1124 default: 1124 default: 1125 1125 dprintf(("Unhandled target type (%08lx)\n", lpMl->Target.dwType)); 1126 1126 return MMSYSERR_INVALPARAM; … … 1147 1147 return MMSYSERR_INVALPARAM; 1148 1148 break; 1149 } 1149 } 1150 1150 return MMSYSERR_NOERROR; 1151 1151 } … … 1227 1227 } 1228 1228 1229 // According to MSDN, uMxId may be a handle returned by mixerOpen() so we 1230 // must accept this situation. Note that since we don't actually track 1231 // the created handles and that we provide only one mixer anyway 1232 // (see mixerGetNumDevs()), we have to accept any uMxId value here... 1233 #if 0 1229 1234 if(uMxId > 0) { 1230 1235 return MMSYSERR_BADDEVICEID; 1231 1236 } 1237 #endif 1232 1238 1233 1239 //According to MSDN, nothing is copied when cbmxcaps is zero … … 1253 1259 } 1254 1260 1261 // According to MSDN, uMxId may be a handle returned by mixerOpen() so we 1262 // must accept this situation. Note that since we don't actually track 1263 // the created handles and that we provide only one mixer anyway 1264 // (see mixerGetNumDevs()), we have to accept any uMxId value here... 1265 #if 0 1255 1266 if(uMxId > 0) { 1256 1267 return MMSYSERR_BADDEVICEID; 1257 1268 } 1269 #endif 1258 1270 1259 1271 //According to MSDN, nothing is copied when cbmxcaps is zero … … 1321 1333 DEVICE_STRUCT *pMixInfo; 1322 1334 1323 if (DartWaveOut::getNumDevices() == 0) {1335 if (mixerGetNumDevs() <= uMxId) { 1324 1336 if(phmx) *phmx = 0; 1325 1337 return MMSYSERR_NODRIVER; 1326 1338 } 1339 1327 1340 pMixInfo = (DEVICE_STRUCT *)malloc(sizeof(DEVICE_STRUCT)); 1328 1341 if(pMixInfo == NULL) { … … 1350 1363 /******************************************************************************/ 1351 1364 /******************************************************************************/ 1352 BOOL mixerInit() 1365 BOOL mixerInit() 1353 1366 { 1354 1367 MIXLINE *pDestLine; … … 1388 1401 mixerAddControl(MIX_CTRL_VOL_OUT_LINE, pDestLine); 1389 1402 mixerAddControl(MIX_CTRL_MUTE_OUT_LINE, pDestLine); 1403 1390 1404 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_3DCENTER)) { 1391 1405 mixerAddControl(MIX_CTRL_OUT_L_3DCENTER, pDestLine); … … 1535 1549 /******************************************************************************/ 1536 1550 void mixerExit() 1537 { 1551 { 1538 1552 if(fMMPMAvailable == FALSE) return; 1539 1553 … … 1544 1558 static MIXLINE *mixerAddSource(MIXLINE *pDestLine, DWORD dwSource) 1545 1559 { 1546 MIXLINE *pSource = &mixerSource[nrSources]; 1560 MIXLINE *pSource = &mixerSource[nrSources]; 1547 1561 MIXERLINEA *pline = &pSource->line; 1548 1562 … … 1691 1705 pline->Target.dwType = MIXERLINE_TARGETTYPE_WAVEIN; 1692 1706 break; 1693 1707 1694 1708 default: 1695 1709 DebugInt3(); … … 1703 1717 pline->Target.wPid = WINMM_MIXER_CAPS_WPID; 1704 1718 pline->Target.vDriverVersion = WINMM_MIXER_CAPS_VERSION; 1705 1719 1706 1720 dprintf(("Adding destination %s (%s) connections %d controls %d", pline->szName, pline->szShortName, pline->cConnections, pline->cControls)); 1707 1721 nrDestinations++; … … 1840 1854 return FALSE; 1841 1855 } 1842 1856 1843 1857 //add control to list of controls associated with source line 1844 1858 pSrcLine->Controls[pSrcLine->cControls] = pctrl->dwControlID;
Note:
See TracChangeset
for help on using the changeset viewer.