- Timestamp:
- May 23, 2002, 10:42:06 PM (23 years ago)
- Location:
- trunk/src/winmm
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/winmm/mixer.cpp
r8477 r8479 1 /* $Id: mixer.cpp,v 1.1 3 2002-05-23 13:50:15sandervl Exp $ */1 /* $Id: mixer.cpp,v 1.14 2002-05-23 20:42:06 sandervl Exp $ */ 2 2 3 3 /* … … 10 10 * NOTE: Not really flexible (capabilities, > 1 audio card) 11 11 * 12 * Some portions borrowed from Wine (X11): (dll\winmm\mmsystem.c) 13 * (mixerGetLineControlsW/mixerGetControlDetailsW) 14 * Copyright 1993 Martin Ayotte 15 * Eric POUECH 16 * 12 17 * Project Odin Software License can be found in LICENSE.TXT 13 18 * … … 36 41 #include "dbglocal.h" 37 42 38 static BOOL mixerAddControl(DWORD dwControl); 39 static BOOL mixerAddSource(DWORD dwDest); 40 static BOOL mixerAddDestination(DWORD dwSource); 41 42 static MIXERLINEA mixerDest[MAX_MIXER_DESTINATIONS] = {0}; 43 static MIXERLINEA mixerSource[MAX_MIXER_SOURCES] = {0}; 44 static MIXERCONTROLA mixerControls[MAX_MIXER_CONTROLS] = {0}; 45 static int nrDestinations = 0; 46 static int nrSources = 0; 47 static int nrControls = 0; 48 static int nrLineOutInputs = 0; 49 static int nrLineOutControls = 0; 50 static int nrWaveInInputs = 0; 51 static int nrWaveInControls = 0; 52 static int nrSPDIFInputs = 0; 53 static int nrSPDIFControls = 0; 43 static BOOL mixerAddControl(MIXERLINEA *pDestLine, DWORD dwControl, MIXERLINEA *pSrcLine); 44 static MIXERLINEA *mixerAddSource(MIXERLINEA *pDestLine, DWORD dwSource); 45 static MIXERLINEA *mixerAddDestination(DWORD dwDest); 46 47 //array of destination mixer lines 48 static MIXERLINEA mixerDest[MAX_MIXER_DESTINATIONS] = {0}; 49 //array of connected sources to destinations 50 static int mixerDestInputs[MAX_MIXER_DESTINATIONS][MAX_MIXER_SOURCES] = {-1}; 51 //array of source mixer lines 52 static MIXERLINEA mixerSource[MAX_MIXER_SOURCES] = {0}; 53 //array of controls connected to mixer lines 54 static int mixerLineControls[MAX_MIXER_LINES][MAX_SOURCE_CONTROLS] = {-1}; 55 //array of all mixer lines 56 static MIXERLINEA *pmixerLines[MAX_MIXER_LINES] = {NULL}; 57 //mapping from src to line id 58 static int mixerSourceLineId[MAX_MIXER_SOURCES] = {-1}; 59 //array of all mixer controls 60 static MIXERCONTROLA mixerControls[MAX_MIXER_CONTROLS] = {0}; 61 62 static int nrDestinations = 0; 63 static int nrSources = 0; 64 static int nrControls = 0; 65 static int nrLines = 0; 66 static int nrLineOutInputs = 0; 67 static int nrWaveInInputs = 0; 54 68 55 69 /******************************************************************************/ … … 58 72 { 59 73 DWORD lineID, controlType; 74 DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj; 60 75 76 if(fdwDetails == MIXER_OBJECTF_HMIXER) { 77 if(!pMixInfo) { 78 return MMSYSERR_INVALHANDLE; 79 } 80 } 81 else 82 if(fdwDetails == MIXER_OBJECTF_MIXER) { 83 if(hmxobj > 0) { 84 return MMSYSERR_NODRIVER; 85 } 86 } 87 61 88 if (lpmcd == NULL) return MMSYSERR_INVALPARAM; 62 89 … … 75 102 /******************************************************************************/ 76 103 /******************************************************************************/ 77 MMRESULT WINAPI mixerGetControlDetailsW(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) 78 { 79 dprintf(("WINMM:mixerGetControlDetailsW - stub\n" )); 80 return MIXERR_INVALCONTROL; 104 MMRESULT WINAPI mixerGetControlDetailsW(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS lpmcd, DWORD fdwDetails) 105 { 106 DWORD ret = MMSYSERR_NOTENABLED; 107 108 if (lpmcd == NULL || lpmcd->cbStruct != sizeof(*lpmcd)) 109 return MMSYSERR_INVALPARAM; 110 111 switch (fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK) { 112 case MIXER_GETCONTROLDETAILSF_VALUE: 113 /* can safely use W structure as it is, no string inside */ 114 ret = mixerGetControlDetailsA(hmxobj, lpmcd, fdwDetails); 115 break; 116 117 case MIXER_GETCONTROLDETAILSF_LISTTEXT: 118 { 119 LPVOID paDetailsW = lpmcd->paDetails; 120 int size = max(1, lpmcd->cChannels) * sizeof(MIXERCONTROLDETAILS_LISTTEXTA); 121 122 if (lpmcd->u.cMultipleItems != 0 && lpmcd->u.cMultipleItems != lpmcd->u.hwndOwner) { 123 size *= lpmcd->u.cMultipleItems; 124 } 125 lpmcd->paDetails = HeapAlloc(GetProcessHeap(), 0, size); 126 /* set up lpmcd->paDetails */ 127 ret = mixerGetControlDetailsA(hmxobj, lpmcd, fdwDetails); 128 /* copy from lpmcd->paDetails back to paDetailsW; */ 129 HeapFree(GetProcessHeap(), 0, lpmcd->paDetails); 130 lpmcd->paDetails = paDetailsW; 131 break; 132 } 133 default: 134 dprintf(("Unsupported fdwDetails=0x%08lx\n", fdwDetails)); 135 break; 136 } 137 138 return ret; 81 139 } 82 140 /******************************************************************************/ … … 87 145 DWORD lineID, controlType; 88 146 int val; 147 DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj; 89 148 149 if(fdwDetails == MIXER_OBJECTF_HMIXER) { 150 if(!pMixInfo) { 151 return MMSYSERR_INVALHANDLE; 152 } 153 } 154 else 155 if(fdwDetails == MIXER_OBJECTF_MIXER) { 156 if(hmxobj > 0) { 157 return MMSYSERR_NODRIVER; 158 } 159 } 90 160 if (lpmcd == NULL) return MMSYSERR_INVALPARAM; 91 161 … … 110 180 DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj; 111 181 112 if(!pMixInfo) { 113 return MMSYSERR_INVALHANDLE; 182 if(fdwControls == MIXER_OBJECTF_HMIXER) { 183 if(!pMixInfo) { 184 return MMSYSERR_INVALHANDLE; 185 } 186 } 187 else 188 if(fdwControls == MIXER_OBJECTF_MIXER) { 189 if(hmxobj > 0) { 190 return MMSYSERR_NODRIVER; 191 } 114 192 } 115 193 … … 122 200 { 123 201 case MIXER_GETLINECONTROLSF_ALL: 124 if (lpMlc->cControls != 2) { 125 dwRet = MMSYSERR_INVALPARAM; 126 } 127 else { 128 } 202 dprintf(("MIXER_GETLINECONTROLSF_ALL")); 203 return MIXERR_INVALLINE; 129 204 break; 205 130 206 case MIXER_GETLINECONTROLSF_ONEBYID: 207 dprintf(("MIXER_GETLINECONTROLSF_ONEBYID %x", lpMlc->u.dwControlID)); 208 if(lpMlc->cControls != 1 || lpMlc->cbmxctrl != sizeof(MIXERCONTROLA)) { 209 dprintf(("invalid parameters")); 210 return MMSYSERR_INVALPARAM; 211 } 212 if(lpMlc->u.dwControlID >= nrControls) { 213 dprintf(("invalid control")); 214 return MIXERR_INVALCONTROL; 215 } 216 memcpy(lpMlc->pamxctrl, &mixerControls[lpMlc->u.dwControlID], sizeof(MIXERCONTROLA)); 217 dprintf(("found control %s (%s)", lpMlc->pamxctrl->szName, lpMlc->pamxctrl->szShortName)); 131 218 break; 132 219 133 220 case MIXER_GETLINECONTROLSF_ONEBYTYPE: 134 switch (lpMlc->u.dwControlType & MIXERCONTROL_CT_CLASS_MASK) { 135 case MIXERCONTROL_CT_CLASS_FADER: 136 break; 137 case MIXERCONTROL_CT_CLASS_SWITCH: 138 break; 221 { 222 dprintf(("MIXER_GETLINECONTROLSF_ONEBYTYPE %x %d", lpMlc->u.dwControlType, lpMlc->dwLineID)); 223 if(lpMlc->dwLineID >= nrLines) { 224 dprintf(("ERROR: Invalid line %d", lpMlc->dwLineID)); 225 return MIXERR_INVALLINE; 226 } 227 #ifdef DEBUG 228 switch (lpMlc->u.dwControlType) { 229 case MIXERCONTROL_CONTROLTYPE_CUSTOM: 230 dprintf(("MIXERCONTROL_CONTROLTYPE_CUSTOM")); 231 break; 232 case MIXERCONTROL_CONTROLTYPE_BOOLEANMETER: 233 dprintf(("MIXERCONTROL_CONTROLTYPE_BOOLEANMETER")); 234 break; 235 case MIXERCONTROL_CONTROLTYPE_SIGNEDMETER: 236 dprintf(("MIXERCONTROL_CONTROLTYPE_SIGNEDMETER")); 237 break; 238 case MIXERCONTROL_CONTROLTYPE_PEAKMETER: 239 dprintf(("MIXERCONTROL_CONTROLTYPE_PEAKMETER")); 240 break; 241 case MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER: 242 dprintf(("MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER")); 243 break; 244 case MIXERCONTROL_CONTROLTYPE_BOOLEAN: 245 dprintf(("MIXERCONTROL_CONTROLTYPE_BOOLEAN")); 246 break; 247 case MIXERCONTROL_CONTROLTYPE_ONOFF: 248 dprintf(("MIXERCONTROL_CONTROLTYPE_ONOFF")); 249 break; 250 case MIXERCONTROL_CONTROLTYPE_MUTE: 251 dprintf(("MIXERCONTROL_CONTROLTYPE_MUTE")); 252 break; 253 case MIXERCONTROL_CONTROLTYPE_MONO: 254 dprintf(("MIXERCONTROL_CONTROLTYPE_MONO")); 255 break; 256 case MIXERCONTROL_CONTROLTYPE_LOUDNESS: 257 dprintf(("MIXERCONTROL_CONTROLTYPE_LOUDNESS")); 258 break; 259 case MIXERCONTROL_CONTROLTYPE_STEREOENH: 260 dprintf(("MIXERCONTROL_CONTROLTYPE_STEREOENH")); 261 break; 262 case MIXERCONTROL_CONTROLTYPE_BUTTON: 263 dprintf(("MIXERCONTROL_CONTROLTYPE_BUTTON")); 264 break; 265 case MIXERCONTROL_CONTROLTYPE_DECIBELS: 266 dprintf(("MIXERCONTROL_CONTROLTYPE_DECIBELS")); 267 break; 268 case MIXERCONTROL_CONTROLTYPE_SIGNED: 269 dprintf(("MIXERCONTROL_CONTROLTYPE_SIGNED")); 270 break; 271 case MIXERCONTROL_CONTROLTYPE_UNSIGNED: 272 dprintf(("MIXERCONTROL_CONTROLTYPE_UNSIGNED")); 273 break; 274 case MIXERCONTROL_CONTROLTYPE_PERCENT: 275 dprintf(("MIXERCONTROL_CONTROLTYPE_PERCENT")); 276 break; 277 case MIXERCONTROL_CONTROLTYPE_SLIDER: 278 dprintf(("MIXERCONTROL_CONTROLTYPE_SLIDER")); 279 break; 280 case MIXERCONTROL_CONTROLTYPE_PAN: 281 dprintf(("MIXERCONTROL_CONTROLTYPE_PAN")); 282 break; 283 case MIXERCONTROL_CONTROLTYPE_QSOUNDPAN: 284 dprintf(("MIXERCONTROL_CONTROLTYPE_QSOUNDPAN")); 285 break; 286 case MIXERCONTROL_CONTROLTYPE_FADER: 287 dprintf(("MIXERCONTROL_CONTROLTYPE_FADER")); 288 break; 289 case MIXERCONTROL_CONTROLTYPE_VOLUME: 290 dprintf(("MIXERCONTROL_CONTROLTYPE_VOLUME")); 291 break; 292 case MIXERCONTROL_CONTROLTYPE_BASS: 293 dprintf(("MIXERCONTROL_CONTROLTYPE_BASS")); 294 break; 295 case MIXERCONTROL_CONTROLTYPE_TREBLE: 296 dprintf(("MIXERCONTROL_CONTROLTYPE_TREBLE")); 297 break; 298 case MIXERCONTROL_CONTROLTYPE_EQUALIZER: 299 dprintf(("MIXERCONTROL_CONTROLTYPE_EQUALIZER")); 300 break; 301 case MIXERCONTROL_CONTROLTYPE_SINGLESELECT: 302 dprintf(("MIXERCONTROL_CONTROLTYPE_SINGLESELECT")); 303 break; 304 case MIXERCONTROL_CONTROLTYPE_MUX: 305 dprintf(("MIXERCONTROL_CONTROLTYPE_MUX")); 306 break; 307 case MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT: 308 dprintf(("MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT")); 309 break; 310 case MIXERCONTROL_CONTROLTYPE_MIXER: 311 dprintf(("MIXERCONTROL_CONTROLTYPE_MIXER")); 312 break; 313 case MIXERCONTROL_CONTROLTYPE_MICROTIME: 314 dprintf(("MIXERCONTROL_CONTROLTYPE_MICROTIME")); 315 break; 316 case MIXERCONTROL_CONTROLTYPE_MILLITIME: 317 dprintf(("MIXERCONTROL_CONTROLTYPE_MILLITIME")); 318 break; 139 319 default: 140 dwRet =MMSYSERR_INVALPARAM;320 return MMSYSERR_INVALPARAM; 141 321 } 142 break; 143 322 #endif 323 int idx; 324 325 for(int i=0;i<MAX_SOURCE_CONTROLS;i++) { 326 idx = mixerLineControls[lpMlc->dwLineID][i]; 327 if(idx == -1) break; 328 if(mixerControls[idx].dwControlType == lpMlc->u.dwControlType) { 329 memcpy(lpMlc->pamxctrl, &mixerControls[idx], sizeof(MIXERCONTROLA)); 330 dprintf(("found control %s (%s)", lpMlc->pamxctrl->szName, lpMlc->pamxctrl->szShortName)); 331 return MMSYSERR_NOERROR; 332 } 333 334 } 335 return MIXERR_INVALLINE; 336 } 144 337 default: 145 338 dprintf(("Unknown flag %08lx\n", fdwControls & MIXER_GETLINECONTROLSF_QUERYMASK)); 146 339 dwRet = MMSYSERR_INVALPARAM; 340 break; 147 341 } 148 342 … … 151 345 /******************************************************************************/ 152 346 /******************************************************************************/ 153 MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls) 347 MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW lpmlcW, DWORD fdwControls) 348 { 349 MIXERLINECONTROLSA mlcA; 350 DWORD ret; 351 int i; 352 353 if (lpmlcW == NULL || lpmlcW->cbStruct != sizeof(*lpmlcW) || lpmlcW->cbmxctrl != sizeof(MIXERCONTROLW)) 354 return MMSYSERR_INVALPARAM; 355 356 mlcA.cbStruct = sizeof(mlcA); 357 mlcA.dwLineID = lpmlcW->dwLineID; 358 mlcA.u.dwControlID = lpmlcW->u.dwControlID; 359 mlcA.u.dwControlType = lpmlcW->u.dwControlType; 360 mlcA.cControls = lpmlcW->cControls; 361 mlcA.cbmxctrl = sizeof(MIXERCONTROLA); 362 mlcA.pamxctrl = (MIXERCONTROLA *)HeapAlloc(GetProcessHeap(), 0, mlcA.cControls * mlcA.cbmxctrl); 363 364 ret = mixerGetLineControlsA(hmxobj, &mlcA, fdwControls); 365 366 if (ret == MMSYSERR_NOERROR) { 367 lpmlcW->dwLineID = mlcA.dwLineID; 368 lpmlcW->u.dwControlID = mlcA.u.dwControlID; 369 lpmlcW->u.dwControlType = mlcA.u.dwControlType; 370 lpmlcW->cControls = mlcA.cControls; 371 372 for (i = 0; i < mlcA.cControls; i++) { 373 lpmlcW->pamxctrl[i].cbStruct = sizeof(MIXERCONTROLW); 374 lpmlcW->pamxctrl[i].dwControlID = mlcA.pamxctrl[i].dwControlID; 375 lpmlcW->pamxctrl[i].dwControlType = mlcA.pamxctrl[i].dwControlType; 376 lpmlcW->pamxctrl[i].fdwControl = mlcA.pamxctrl[i].fdwControl; 377 lpmlcW->pamxctrl[i].cMultipleItems = mlcA.pamxctrl[i].cMultipleItems; 378 MultiByteToWideChar( CP_ACP, 0, mlcA.pamxctrl[i].szShortName, -1, 379 lpmlcW->pamxctrl[i].szShortName, 380 sizeof(lpmlcW->pamxctrl[i].szShortName)/sizeof(WCHAR) ); 381 MultiByteToWideChar( CP_ACP, 0, mlcA.pamxctrl[i].szName, -1, 382 lpmlcW->pamxctrl[i].szName, 383 sizeof(lpmlcW->pamxctrl[i].szName)/sizeof(WCHAR) ); 384 /* sizeof(lpmlcW->pamxctrl[i].Bounds) == 385 * sizeof(mlcA.pamxctrl[i].Bounds) */ 386 memcpy(&lpmlcW->pamxctrl[i].Bounds, &mlcA.pamxctrl[i].Bounds, 387 sizeof(mlcA.pamxctrl[i].Bounds)); 388 /* sizeof(lpmlcW->pamxctrl[i].Metrics) == 389 * sizeof(mlcA.pamxctrl[i].Metrics) */ 390 memcpy(&lpmlcW->pamxctrl[i].Metrics, &mlcA.pamxctrl[i].Metrics, 391 sizeof(mlcA.pamxctrl[i].Metrics)); 392 } 393 } 394 395 HeapFree(GetProcessHeap(), 0, mlcA.pamxctrl); 396 return ret; 397 } 398 /******************************************************************************/ 399 /******************************************************************************/ 400 MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ hmxobj, LPMIXERLINEA lpMl, DWORD fdwInfo) 154 401 { 155 402 DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj; 156 403 157 if(!pMixInfo) { 158 return MMSYSERR_INVALHANDLE; 159 } 160 161 dprintf(("WINMM:mixerGetGetLineControlsW - stub\n" )); 162 return MIXERR_INVALLINE; 163 } 164 /******************************************************************************/ 165 /******************************************************************************/ 166 MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ hmxobj, LPMIXERLINEA lpMl, DWORD fdwInfo) 167 { 168 DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj; 169 170 if(!pMixInfo) { 171 return MMSYSERR_INVALHANDLE; 404 if(fdwInfo & MIXER_OBJECTF_HMIXER) { 405 if(!pMixInfo) { 406 return MMSYSERR_INVALHANDLE; 407 } 408 } 409 else 410 if((fdwInfo & MIXER_OBJECTF_MIXER) == MIXER_OBJECTF_MIXER) { 411 if(hmxobj > 0) { 412 return MMSYSERR_NODRIVER; 413 } 172 414 } 173 415 … … 180 422 { 181 423 case MIXER_GETLINEINFOF_DESTINATION: 182 dprintf(("MIXER_GETLINEINFOF_DESTINATION "));424 dprintf(("MIXER_GETLINEINFOF_DESTINATION %d", lpMl->dwDestination)); 183 425 if(lpMl->dwDestination >= nrDestinations) { 184 dprintf(("ERROR: Invalid des itnation %d", lpMl->dwDestination));426 dprintf(("ERROR: Invalid destination %d", lpMl->dwDestination)); 185 427 return MMSYSERR_INVALPARAM; 186 428 } 187 429 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)); 188 431 break; 189 432 190 433 case MIXER_GETLINEINFOF_LINEID: 191 dprintf(("MIXER_GETLINEINFOF_LINEID")); 434 dprintf(("MIXER_GETLINEINFOF_LINEID %d", lpMl->dwLineID)); 435 if(lpMl->dwLineID >= nrLines) { 436 dprintf(("ERROR: Invalid destination %d", lpMl->dwLineID)); 437 return MIXERR_INVALLINE; 438 } 439 memcpy(lpMl, pmixerLines[lpMl->dwLineID], sizeof(MIXERLINEA)); 440 dprintf(("found line %s (%s) connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->cConnections, lpMl->cControls)); 192 441 break; 193 442 194 443 case MIXER_GETLINEINFOF_SOURCE: 195 dprintf(("MIXER_GETLINEINFOF_SOURCE "));444 dprintf(("MIXER_GETLINEINFOF_SOURCE %d %d", lpMl->dwDestination, lpMl->dwSource)); 196 445 if(lpMl->dwDestination >= nrDestinations) { 197 dprintf(("ERROR: Invalid desitnation %d", lpMl->dwDestination)); 198 return MMSYSERR_INVALPARAM; 199 } 446 dprintf(("ERROR: Invalid destination %d", lpMl->dwDestination)); 447 return MIXERR_INVALLINE; 448 } 449 if(lpMl->dwSource >= MIXER_SRC_MAX) { 450 dprintf(("ERROR: Invalid destination %d", lpMl->dwDestination)); 451 return MIXERR_INVALLINE; 452 } 453 if(mixerDestInputs[lpMl->dwDestination][lpMl->dwSource] == -1) { 454 dprintf(("ERROR: Invalid destination %d", lpMl->dwDestination)); 455 return MIXERR_INVALLINE; 456 } 457 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)); 200 459 break; 201 460 … … 204 463 switch (lpMl->dwComponentType) 205 464 { 206 case MIXERLINE_COMPONENTTYPE_DST_SPEAKERS: 207 break; 208 case MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT: 209 break; 465 case MIXERLINE_COMPONENTTYPE_DST_UNDEFINED: 466 dprintf(("MIXERLINE_COMPONENTTYPE_DST_UNDEFINED")); 467 break; 468 case MIXERLINE_COMPONENTTYPE_DST_DIGITAL: 469 dprintf(("MIXERLINE_COMPONENTTYPE_DST_DIGITAL")); 470 break; 471 case MIXERLINE_COMPONENTTYPE_DST_LINE: 472 dprintf(("MIXERLINE_COMPONENTTYPE_DST_LINE")); 473 break; 474 case MIXERLINE_COMPONENTTYPE_DST_MONITOR: 475 dprintf(("MIXERLINE_COMPONENTTYPE_DST_MONITOR")); 476 break; 477 case MIXERLINE_COMPONENTTYPE_DST_SPEAKERS: 478 dprintf(("MIXERLINE_COMPONENTTYPE_DST_SPEAKERS")); 479 break; 480 case MIXERLINE_COMPONENTTYPE_DST_HEADPHONES: 481 dprintf(("MIXERLINE_COMPONENTTYPE_DST_HEADPHONES")); 482 break; 483 case MIXERLINE_COMPONENTTYPE_DST_TELEPHONE: 484 dprintf(("MIXERLINE_COMPONENTTYPE_DST_TELEPHONE")); 485 break; 486 case MIXERLINE_COMPONENTTYPE_DST_WAVEIN: 487 dprintf(("MIXERLINE_COMPONENTTYPE_DST_WAVEIN")); 488 break; 489 case MIXERLINE_COMPONENTTYPE_DST_VOICEIN: 490 dprintf(("MIXERLINE_COMPONENTTYPE_DST_VOICEIN")); 491 break; 210 492 default: 211 493 dprintf(("Unhandled component type (%08lx)\n", lpMl->dwComponentType)); 212 494 return MMSYSERR_INVALPARAM; 213 495 } 496 return MIXERR_INVALLINE; 214 497 break; 215 498 216 499 case MIXER_GETLINEINFOF_TARGETTYPE: 217 500 dprintf(("_TARGETTYPE not implemented yet.\n")); 501 return MIXERR_INVALLINE; 218 502 break; 219 503 default: 220 504 dprintf(("Unknown flag (%08lx)\n", fdwInfo & MIXER_GETLINEINFOF_QUERYMASK)); 505 return MMSYSERR_INVALPARAM; 221 506 break; 222 507 } … … 231 516 MMRESULT result; 232 517 233 if(!pMixInfo) {234 return MMSYSERR_INVALHANDLE;235 }236 518 line.cbStruct = sizeof(MIXERLINEA); 237 519 line.cChannels = pmxl->cChannels; … … 281 563 { 282 564 dprintf(("WINMM:mixerMessage - stub\n" )); 283 return 0;565 return MMSYSERR_INVALPARAM; 284 566 } 285 567 /******************************************************************************/ … … 425 707 BOOL mixerInit() 426 708 { 709 MIXERLINEA *pDestLine; 710 427 711 if(!fMMPMAvailable) return TRUE; 712 713 memset(mixerSourceLineId, -1, sizeof(mixerSourceLineId)); 714 memset(mixerLineControls, -1, sizeof(mixerLineControls)); 715 memset(mixerDestInputs, -1, sizeof(mixerDestInputs)); 428 716 429 717 if(OSLibMixerOpen() == FALSE) { 430 718 //Line out destination 431 mixerAddControl(MIX_CTRL_VOL_OUT_LINE);432 mixerAddControl(MIX_CTRL_MUTE_OUT_LINE); 433 //muast add after all controls (for counting controls & inputs)434 mixerAdd Destination(MIXER_DEST_LINEOUT);719 pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT); 720 721 mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_LINE, pDestLine); 722 mixerAddControl(pDestLine, MIX_CTRL_MUTE_OUT_LINE, pDestLine); 435 723 436 724 //WaveIn destination 437 mixerAddControl(MIX_CTRL_VOL_IN_W_MIC); 438 mixerAddControl(MIX_CTRL_VOL_IN_W_LINE); 725 pDestLine = mixerAddDestination(MIXER_DEST_WAVEIN); 726 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MIC, pDestLine); 727 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_LINE, pDestLine); 439 728 //must add after all recording inputs (to count them) 440 mixerAddControl(MIX_CTRL_MUX_IN_W_SRC); 441 //muast add after all wave in controls (for counting controls & inputs) 442 mixerAddDestination(MIXER_DEST_WAVEIN); 729 mixerAddControl(pDestLine, MIX_CTRL_MUX_IN_W_SRC, pDestLine); 443 730 return TRUE; 444 731 } 445 732 //Line out destination 446 mixerAddControl(MIX_CTRL_VOL_OUT_LINE); 447 mixerAddControl(MIX_CTRL_MUTE_OUT_LINE); 733 pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT); 734 735 mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_LINE, pDestLine); 736 mixerAddControl(pDestLine, MIX_CTRL_MUTE_OUT_LINE, pDestLine); 737 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_3DCENTER)) { 738 mixerAddControl(pDestLine, MIX_CTRL_OUT_L_3DCENTER, pDestLine); 739 } 740 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_3DDEPTH)) { 741 mixerAddControl(pDestLine, MIX_CTRL_OUT_L_3DDEPTH, pDestLine); 742 } 743 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_TREBLE)) { 744 mixerAddControl(pDestLine, MIX_CTRL_OUT_L_TREBLE, pDestLine); 745 } 746 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_BASS)) { 747 mixerAddControl(pDestLine, MIX_CTRL_OUT_L_BASS, pDestLine); 748 } 448 749 449 750 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_SPDIF)) { 450 mixerAddSource(MIXER_SRC_SPDIF);451 mixerAddControl( MIX_CTRL_VOL_IN_L_SPDIF);452 mixerAddControl( MIX_CTRL_MUTE_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); 453 754 } 454 755 455 756 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MONO)) { 456 mixerAddSource(MIXER_SRC_MONOIN);457 mixerAddControl( MIX_CTRL_VOL_IN_L_MONO);458 mixerAddControl( MIX_CTRL_MUTE_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); 459 760 } 460 761 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_PHONE)) { 461 mixerAddSource(MIXER_SRC_PHONE);462 mixerAddControl( MIX_CTRL_VOL_IN_L_PHONE);463 mixerAddControl( MIX_CTRL_MUTE_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); 464 765 } 465 766 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MIC)) { 466 mixerAddSource(MIXER_SRC_MIC);467 mixerAddControl( MIX_CTRL_VOL_IN_L_MIC);468 mixerAddControl( MIX_CTRL_MUTE_IN_L_MIC);767 MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_MIC); 768 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_MIC, pLine); 769 mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_MIC, pLine); 469 770 if(OSLibMixIsControlPresent(MIX_CTRL_BOOST_IN_L_MIC)) { 470 mixerAddControl( MIX_CTRL_BOOST_IN_L_MIC);771 mixerAddControl(pDestLine, MIX_CTRL_BOOST_IN_L_MIC, pLine); 471 772 } 472 773 } 473 774 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_LINE)) { 474 mixerAddSource(MIXER_SRC_LINE);475 mixerAddControl( MIX_CTRL_VOL_IN_L_LINE);476 mixerAddControl( MIX_CTRL_MUTE_IN_L_LINE);775 MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_LINE); 776 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_LINE, pLine); 777 mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_LINE, pLine); 477 778 } 478 779 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_CD)) { 479 mixerAddSource(MIXER_SRC_CD);480 mixerAddControl( MIX_CTRL_VOL_IN_L_CD);481 mixerAddControl( MIX_CTRL_MUTE_IN_L_CD);780 MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_CD); 781 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_CD, pLine); 782 mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_CD, pLine); 482 783 } 483 784 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_VIDEO)) { 484 mixerAddSource(MIXER_SRC_VIDEO);485 mixerAddControl( MIX_CTRL_VOL_IN_L_VIDEO);486 mixerAddControl( MIX_CTRL_MUTE_IN_L_VIDEO);785 MIXERLINEA *pLine = mixerAddSource(pDestLine, MIXER_SRC_VIDEO); 786 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_L_VIDEO, pLine); 787 mixerAddControl(pDestLine, MIX_CTRL_MUTE_IN_L_VIDEO, pLine); 487 788 } 488 789 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_AUX)) { 489 mixerAddSource(MIXER_SRC_AUX);490 mixerAddControl( MIX_CTRL_VOL_IN_L_AUX);491 mixerAddControl( MIX_CTRL_MUTE_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); 492 793 } 493 794 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_PCM)) { 494 mixerAddSource(MIXER_SRC_PCM);495 mixerAddControl( MIX_CTRL_VOL_IN_L_PCM);496 mixerAddControl( MIX_CTRL_MUTE_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); 497 798 } 498 799 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_WAVETABLE)) { 499 mixerAddSource(MIXER_SRC_WAVETABLE);500 mixerAddControl( MIX_CTRL_VOL_IN_L_WAVETABLE);501 mixerAddControl( MIX_CTRL_MUTE_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); 502 803 } 503 804 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MIDI)) { 504 mixerAddSource(MIXER_SRC_MIDI); 505 mixerAddControl(MIX_CTRL_VOL_IN_L_MIDI); 506 mixerAddControl(MIX_CTRL_MUTE_IN_L_MIDI); 507 } 508 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_3DCENTER)) { 509 mixerAddControl(MIX_CTRL_OUT_L_3DCENTER); 510 } 511 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_3DDEPTH)) { 512 mixerAddControl(MIX_CTRL_OUT_L_3DDEPTH); 513 } 514 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_TREBLE)) { 515 mixerAddControl(MIX_CTRL_OUT_L_TREBLE); 516 } 517 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_BASS)) { 518 mixerAddControl(MIX_CTRL_OUT_L_BASS); 519 } 520 //muast add after all controls (for counting controls & inputs) 521 mixerAddDestination(MIXER_DEST_LINEOUT); 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 } 522 809 523 810 //Wave In Destination 524 811 if(OSLibMixIsControlPresent(MIX_CTRL_MUX_IN_W_SRC)) { 812 pDestLine = mixerAddDestination(MIXER_DEST_WAVEIN); 525 813 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_MONO)) { 526 mixerAddControl( MIX_CTRL_VOL_IN_W_MONO);814 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MONO, pDestLine); 527 815 } 528 816 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_PHONE)) { 529 mixerAddControl( MIX_CTRL_VOL_IN_W_PHONE);817 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_PHONE, pDestLine); 530 818 } 531 819 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_MIC)) { 532 mixerAddControl( MIX_CTRL_VOL_IN_W_MIC);820 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MIC, pDestLine); 533 821 } 534 822 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_LINE)) { 535 mixerAddControl( MIX_CTRL_VOL_IN_W_LINE);823 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_LINE, pDestLine); 536 824 } 537 825 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_CD)) { 538 mixerAddControl( MIX_CTRL_VOL_IN_W_CD);826 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_CD, pDestLine); 539 827 } 540 828 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_SPDIF)) { 541 mixerAddControl( MIX_CTRL_VOL_IN_W_SPDIF);829 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_SPDIF, pDestLine); 542 830 } 543 831 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_VIDEO)) { 544 mixerAddControl( MIX_CTRL_VOL_IN_W_VIDEO);832 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_VIDEO, pDestLine); 545 833 } 546 834 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_AUX)) { 547 mixerAddControl( MIX_CTRL_VOL_IN_W_AUX);835 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_AUX, pDestLine); 548 836 } 549 837 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_PCM)) { 550 mixerAddControl( MIX_CTRL_VOL_IN_W_PCM);838 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_PCM, pDestLine); 551 839 } 552 840 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_WAVETABLE)) { 553 mixerAddControl( MIX_CTRL_VOL_IN_W_WAVETABLE);841 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_WAVETABLE, pDestLine); 554 842 } 555 843 if(OSLibMixIsRecSourcePresent(MIX_CTRL_VOL_IN_W_MIDI)) { 556 mixerAddControl( MIX_CTRL_VOL_IN_W_MIDI);844 mixerAddControl(pDestLine, MIX_CTRL_VOL_IN_W_MIDI, pDestLine); 557 845 } 558 846 //must add after all recording inputs (to count them) 559 mixerAddControl(MIX_CTRL_MUX_IN_W_SRC); 560 //muast add after all wave in controls (for counting controls & inputs) 561 mixerAddDestination(MIXER_DEST_WAVEIN); 847 mixerAddControl(pDestLine, MIX_CTRL_MUX_IN_W_SRC, pDestLine); 562 848 } 563 849 564 850 //SPDIF destination 565 851 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_OUT_SPDIF)) { 566 mixerAddControl(MIX_CTRL_VOL_OUT_SPDIF);567 mixerAddControl( MIX_CTRL_MUTE_OUT_SPDIF);568 mixerAdd Destination(MIXER_DEST_SPDIFOUT);852 pDestLine = mixerAddDestination(MIXER_DEST_SPDIFOUT); 853 mixerAddControl(pDestLine, MIX_CTRL_VOL_OUT_SPDIF, pDestLine); 854 mixerAddControl(pDestLine, MIX_CTRL_MUTE_OUT_SPDIF, pDestLine); 569 855 } 570 856 … … 579 865 /******************************************************************************/ 580 866 /******************************************************************************/ 581 static BOOL mixerAddSource(DWORD dwSource)867 static MIXERLINEA *mixerAddSource(MIXERLINEA *pDestLine, DWORD dwSource) 582 868 { 583 869 MIXERLINEA *pline = &mixerSource[nrSources]; … … 586 872 dprintf(("ERROR: mixerAddSource: out of room!!!")); 587 873 DebugInt3(); 588 return FALSE;874 return NULL; 589 875 } 590 876 591 877 pline->cbStruct = sizeof(MIXERLINEA); 592 878 memset(pline, 0, sizeof(MIXERLINEA)); 879 880 pline->cConnections = 0; 881 pline->cControls = 0; 882 pline->dwDestination = 0; 883 pline->fdwLine = MIXERLINE_LINEF_SOURCE; 884 pline->dwSource = nrSources; 593 885 594 886 switch(dwSource) { 595 887 case MIXER_SRC_MONOIN: 596 888 case MIXER_SRC_PHONE: 597 pline->dwSource = nrSources;598 889 pline->cChannels = 1; 599 pline->cConnections = 0;600 pline->cControls = 0;601 890 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE; 602 pline->dwDestination = 0;603 pline->dwLineID = (DWORD)-1;604 pline->fdwLine = MIXERLINE_LINEF_SOURCE;605 891 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; 606 nrLineOutInputs++;607 892 break; 608 893 609 894 case MIXER_SRC_MIC: 610 pline->dwSource = nrSources;611 895 pline->cChannels = 1; 612 pline->cConnections = 0;613 pline->cControls = 0;614 896 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE; 615 pline->dwDestination = 0;616 pline->dwLineID = (DWORD)-1;617 pline->fdwLine = MIXERLINE_LINEF_SOURCE;618 897 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; 619 nrLineOutInputs++;620 898 break; 621 899 622 900 case MIXER_SRC_LINE: 623 pline->dwSource = nrSources;624 901 pline->cChannels = 2; 625 pline->cConnections = 0;626 pline->cControls = 0;627 902 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_LINE; 628 pline->dwDestination = 0;629 pline->dwLineID = (DWORD)-1;630 pline->fdwLine = MIXERLINE_LINEF_SOURCE;631 903 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; 632 nrLineOutInputs++;633 904 break; 634 905 635 906 case MIXER_SRC_CD: 636 pline->dwSource = nrSources;637 907 pline->cChannels = 2; 638 pline->cConnections = 0;639 pline->cControls = 0;640 908 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; 641 pline->dwDestination = 0;642 pline->dwLineID = (DWORD)-1;643 pline->fdwLine = MIXERLINE_LINEF_SOURCE;644 909 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; 645 nrLineOutInputs++;646 910 break; 647 911 648 912 case MIXER_SRC_SPDIF: 649 pline->dwSource = nrSources;650 913 pline->cChannels = 2; 651 pline->cConnections = 0;652 pline->cControls = 0;653 914 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_DIGITAL; 654 pline->dwDestination = 0;655 pline->dwLineID = (DWORD)-1;656 pline->fdwLine = MIXERLINE_LINEF_SOURCE;657 915 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; 658 nrLineOutInputs++;659 916 break; 660 917 661 918 case MIXER_SRC_VIDEO: 662 pline->dwSource = nrSources;663 919 pline->cChannels = 2; 664 pline->cConnections = 0;665 pline->cControls = 0;666 920 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED; 667 pline->dwDestination = 0;668 pline->dwLineID = (DWORD)-1;669 pline->fdwLine = MIXERLINE_LINEF_SOURCE;670 921 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; 671 nrLineOutInputs++;672 922 break; 673 923 674 924 case MIXER_SRC_AUX: 675 pline->dwSource = nrSources;676 925 pline->cChannels = 2; 677 pline->cConnections = 0;678 pline->cControls = 0;679 926 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY; 680 pline->dwDestination = 0;681 pline->dwLineID = (DWORD)-1;682 pline->fdwLine = MIXERLINE_LINEF_SOURCE;683 927 pline->Target.dwType = MIXERLINE_TARGETTYPE_AUX; 684 nrLineOutInputs++;685 928 break; 686 929 687 930 case MIXER_SRC_PCM: 688 pline->dwSource = nrSources;689 931 pline->cChannels = 2; 690 pline->cConnections = 0;691 pline->cControls = 0;692 932 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; 693 pline->dwDestination = 0;694 pline->dwLineID = (DWORD)-1;695 pline->fdwLine = MIXERLINE_LINEF_SOURCE;696 933 pline->Target.dwType = MIXERLINE_TARGETTYPE_WAVEOUT; 697 nrLineOutInputs++;698 934 break; 699 935 700 936 case MIXER_SRC_WAVETABLE: 701 937 case MIXER_SRC_MIDI: 702 pline->dwSource = nrSources;703 938 pline->cChannels = 2; 704 pline->cConnections = 0;705 pline->cControls = 0;706 939 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; 707 pline->dwDestination = 0;708 pline->dwLineID = (DWORD)-1;709 pline->fdwLine = MIXERLINE_LINEF_SOURCE;710 940 pline->Target.dwType = MIXERLINE_TARGETTYPE_MIDIOUT; 711 nrLineOutInputs++;712 941 break; 713 942 714 943 default: 715 944 DebugInt3(); 716 return FALSE;945 return NULL; 717 946 } 718 947 strncpy(pline->szShortName, szSourceName[dwSource][0], sizeof(pline->szShortName)); … … 720 949 721 950 dprintf(("Adding Source %s (%s)", pline->szName, pline->szShortName)); 722 723 951 nrSources++; 724 return TRUE; 725 } 726 /******************************************************************************/ 727 /******************************************************************************/ 728 static BOOL mixerAddDestination(DWORD dwDest) 952 953 mixerDestInputs[MIXER_DEST_LINEOUT][nrLineOutInputs] = pline->dwSource; 954 nrLineOutInputs++; 955 956 pline->dwLineID = nrLines; 957 pmixerLines[nrLines] = pline; 958 nrLines++; 959 960 //increase nr of inputs at destinateion line 961 pDestLine->cConnections++; 962 963 //store line id in source to line mapping array 964 mixerSourceLineId[dwSource] = pline->dwLineID; 965 966 return pline; 967 } 968 /******************************************************************************/ 969 /******************************************************************************/ 970 static MIXERLINEA *mixerAddDestination(DWORD dwDest) 729 971 { 730 972 MIXERLINEA *pline = &mixerDest[nrDestinations]; … … 733 975 dprintf(("ERROR: mixerAddDestination: out of room!!!")); 734 976 DebugInt3(); 735 return FALSE;977 return NULL; 736 978 } 737 979 pline->cbStruct = sizeof(MIXERLINEA); … … 742 984 pline->dwDestination = nrDestinations; 743 985 pline->cChannels = 2; 744 pline->cConnections = nrLineOutInputs;745 pline->cControls = nrLineOutControls;986 pline->cConnections = 0; 987 pline->cControls = 0; 746 988 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; 747 989 pline->dwSource = 0; 748 pline->dwLineID = (DWORD)-1;749 990 pline->fdwLine = MIXERLINE_LINEF_ACTIVE; 750 991 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; … … 754 995 pline->dwDestination = nrDestinations; 755 996 pline->cChannels = 2; 756 pline->cConnections = nrSPDIFInputs;757 pline->cControls = nrSPDIFControls;997 pline->cConnections = 0; 998 pline->cControls = 0; 758 999 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_DST_DIGITAL; 759 1000 pline->dwSource = 0; 760 pline->dwLineID = (DWORD)-1; 761 pline->fdwLine = 0; 1001 pline->fdwLine = MIXERLINE_LINEF_ACTIVE; 762 1002 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; 763 1003 break; 764 1004 765 1005 case MIXER_DEST_WAVEIN: 766 pline->dwSource = nr Sources;1006 pline->dwSource = nrDestinations; 767 1007 pline->cChannels = 2; 768 pline->cConnections = nrWaveInInputs;769 pline->cControls = nrWaveInControls;1008 pline->cConnections = 0; 1009 pline->cControls = 0; 770 1010 pline->dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN; 771 1011 pline->dwDestination = 0; 772 pline->dwLineID = (DWORD)-1;773 1012 pline->fdwLine = MIXERLINE_LINEF_SOURCE; 774 1013 pline->Target.dwType = MIXERLINE_TARGETTYPE_UNDEFINED; … … 777 1016 default: 778 1017 DebugInt3(); 779 return FALSE;1018 return NULL; 780 1019 } 781 1020 strncpy(pline->szShortName, szDestName[dwDest][0], sizeof(pline->szShortName)); 782 1021 strncpy(pline->szName, szDestName[dwDest][1], sizeof(pline->szName)); 783 dprintf(("Adding destination %s (%s) ", pline->szName, pline->szShortName));1022 dprintf(("Adding destination %s (%s) connections %d controls %d", pline->szName, pline->szShortName, pline->cConnections, pline->cControls)); 784 1023 nrDestinations++; 785 return TRUE; 786 } 787 /******************************************************************************/ 788 /******************************************************************************/ 789 static BOOL mixerAddControl(DWORD dwControl) 1024 1025 pline->dwLineID = nrLines; 1026 pmixerLines[nrLines] = pline; 1027 nrLines++; 1028 return pline; 1029 } 1030 /******************************************************************************/ 1031 /******************************************************************************/ 1032 static int mixerWaveInVolToSource(DWORD dwControl) 1033 { 1034 switch(dwControl) { 1035 case MIX_CTRL_VOL_IN_W_MONO: 1036 return MIXER_SRC_MONOIN; 1037 case MIX_CTRL_VOL_IN_W_PHONE: 1038 return MIXER_SRC_PHONE; 1039 case MIX_CTRL_VOL_IN_W_MIC: 1040 return MIXER_SRC_MIC; 1041 case MIX_CTRL_VOL_IN_W_LINE: 1042 return MIXER_SRC_LINE; 1043 case MIX_CTRL_VOL_IN_W_CD: 1044 return MIXER_SRC_CD; 1045 case MIX_CTRL_VOL_IN_W_SPDIF: 1046 return MIXER_SRC_SPDIF; 1047 case MIX_CTRL_VOL_IN_W_VIDEO: 1048 return MIXER_SRC_VIDEO; 1049 case MIX_CTRL_VOL_IN_W_AUX: 1050 return MIXER_SRC_AUX; 1051 case MIX_CTRL_VOL_IN_W_PCM: 1052 return MIXER_SRC_PCM; 1053 case MIX_CTRL_VOL_IN_W_WAVETABLE: 1054 return MIXER_SRC_WAVETABLE; 1055 case MIX_CTRL_VOL_IN_W_MIDI: 1056 return MIXER_SRC_MIDI; 1057 default: 1058 DebugInt3(); 1059 return 0; 1060 } 1061 } 1062 /******************************************************************************/ 1063 /******************************************************************************/ 1064 static BOOL mixerAddControl(MIXERLINEA *pDestLine, DWORD dwControl, MIXERLINEA *pSrcLine) 790 1065 { 791 1066 MIXERCONTROLA *pctrl = &mixerControls[nrControls]; … … 800 1075 memset(pctrl, 0, sizeof(MIXERCONTROLA)); 801 1076 1077 pctrl->cMultipleItems = 0; 1078 pctrl->dwControlID = nrControls; 1079 pctrl->fdwControl = 0; 802 1080 switch(dwControl) { 803 1081 case MIX_CTRL_VOL_OUT_LINE: … … 813 1091 case MIX_CTRL_VOL_IN_L_WAVETABLE: 814 1092 case MIX_CTRL_VOL_IN_L_MIDI: 815 pctrl->cMultipleItems = 0;816 pctrl->fdwControl = 0;817 pctrl->dwControlID = nrControls;818 1093 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; 819 strncpy(pctrl->szShortName, szCtrlName[dwControl][0], sizeof(pctrl->szShortName));820 strncpy(pctrl->szName, szCtrlName[dwControl][1], sizeof(pctrl->szName));821 1094 pctrl->Bounds.s.lMinimum = 0; 822 1095 pctrl->Bounds.s.lMaximum = 100; 823 1096 pctrl->Metrics.cSteps = 1; 824 nrControls++;825 nrLineOutControls++;826 1097 break; 827 1098 … … 837 1108 case MIX_CTRL_VOL_IN_W_WAVETABLE: 838 1109 case MIX_CTRL_VOL_IN_W_MIDI: 839 pctrl->cMultipleItems = 0;840 pctrl->fdwControl = 0;841 pctrl->dwControlID = nrControls;842 1110 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; 843 strncpy(pctrl->szShortName, szCtrlName[dwControl][0], sizeof(pctrl->szShortName));844 strncpy(pctrl->szName, szCtrlName[dwControl][1], sizeof(pctrl->szName));845 1111 pctrl->Bounds.s.lMinimum = 0; 846 1112 pctrl->Bounds.s.lMaximum = 100; 847 1113 pctrl->Metrics.cSteps = 1; 848 nrControls++; 849 nrWaveInControls++; 1114 mixerDestInputs[MIXER_DEST_WAVEIN][nrWaveInInputs] = mixerSourceLineId[mixerWaveInVolToSource(dwControl)]; 850 1115 nrWaveInInputs++; 851 1116 break; … … 861 1126 case MIX_CTRL_MUTE_IN_L_AUX: 862 1127 case MIX_CTRL_MUTE_IN_L_PCM: 863 pctrl->cMultipleItems = 0;864 1128 pctrl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; 865 pctrl->dwControlID = nrControls;866 1129 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE; 867 strncpy(pctrl->szShortName, szCtrlName[dwControl][0], sizeof(pctrl->szShortName));868 strncpy(pctrl->szName, szCtrlName[dwControl][1], sizeof(pctrl->szName));869 1130 pctrl->Bounds.s.lMinimum = 0; 870 1131 pctrl->Bounds.s.lMaximum = 1; 871 1132 pctrl->Metrics.cSteps = 0; 872 nrControls++;873 nrLineOutControls++;874 1133 break; 875 1134 876 1135 case MIX_CTRL_VOL_OUT_SPDIF: 877 pctrl->cMultipleItems = 0;878 pctrl->fdwControl = 0;879 pctrl->dwControlID = nrControls;880 1136 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; 881 strncpy(pctrl->szShortName, szCtrlName[MIX_CTRL_VOL_OUT_SPDIF][0], sizeof(pctrl->szShortName));882 strncpy(pctrl->szName, szCtrlName[MIX_CTRL_VOL_OUT_SPDIF][1], sizeof(pctrl->szName));883 1137 pctrl->Bounds.s.lMinimum = 0; 884 1138 pctrl->Bounds.s.lMaximum = 100; 885 1139 pctrl->Metrics.cSteps = 1; 886 nrControls++;887 nrSPDIFControls++;888 1140 break; 889 1141 890 1142 case MIX_CTRL_MUTE_OUT_SPDIF: 891 pctrl->cMultipleItems = 0;892 1143 pctrl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; 893 pctrl->dwControlID = nrControls;894 1144 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE; 895 strncpy(pctrl->szShortName, szCtrlName[MIX_CTRL_MUTE_OUT_SPDIF][0], sizeof(pctrl->szShortName));896 strncpy(pctrl->szName, szCtrlName[MIX_CTRL_MUTE_OUT_SPDIF][1], sizeof(pctrl->szName));897 1145 pctrl->Bounds.s.lMinimum = 0; 898 1146 pctrl->Bounds.s.lMaximum = 1; 899 1147 pctrl->Metrics.cSteps = 0; 900 nrControls++;901 nrSPDIFControls++;902 1148 break; 903 1149 904 1150 case MIX_CTRL_BOOST_IN_L_MIC: 905 pctrl->cMultipleItems = 0;906 1151 pctrl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; 907 pctrl->dwControlID = nrControls;908 1152 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_ONOFF; 909 strncpy(pctrl->szShortName, szCtrlName[MIX_CTRL_BOOST_IN_L_MIC][0], sizeof(pctrl->szShortName));910 strncpy(pctrl->szName, szCtrlName[MIX_CTRL_BOOST_IN_L_MIC][1], sizeof(pctrl->szName));911 1153 pctrl->Bounds.s.lMinimum = 0; 912 1154 pctrl->Bounds.s.lMaximum = 1; 913 1155 pctrl->Metrics.cSteps = 0; 914 nrControls++;915 nrLineOutControls++;916 1156 break; 917 1157 918 1158 case MIX_CTRL_OUT_L_3DDEPTH: 919 pctrl->cMultipleItems = 0;920 1159 pctrl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; 921 pctrl->dwControlID = nrControls;922 1160 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_FADER; 923 strncpy(pctrl->szShortName, szCtrlName[MIX_CTRL_OUT_L_3DDEPTH][0], sizeof(pctrl->szShortName));924 strncpy(pctrl->szName, szCtrlName[MIX_CTRL_OUT_L_3DDEPTH][1], sizeof(pctrl->szName));925 1161 pctrl->Bounds.s.lMinimum = 0; 926 1162 pctrl->Bounds.s.lMaximum = 100; 927 1163 pctrl->Metrics.cSteps = 1; 928 nrControls++;929 nrLineOutControls++;930 1164 break; 931 1165 932 1166 case MIX_CTRL_OUT_L_3DCENTER: 933 pctrl->cMultipleItems = 0;934 1167 pctrl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; 935 pctrl->dwControlID = nrControls;936 1168 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_FADER; 937 strncpy(pctrl->szShortName, szCtrlName[MIX_CTRL_OUT_L_3DCENTER][0], sizeof(pctrl->szShortName));938 strncpy(pctrl->szName, szCtrlName[MIX_CTRL_OUT_L_3DCENTER][1], sizeof(pctrl->szName));939 1169 pctrl->Bounds.s.lMinimum = 0; 940 1170 pctrl->Bounds.s.lMaximum = 100; 941 1171 pctrl->Metrics.cSteps = 1; 942 nrControls++;943 nrLineOutControls++;944 1172 break; 945 1173 946 1174 case MIX_CTRL_MUX_IN_W_SRC: 947 pctrl->cMultipleItems = nrWaveInControls;948 1175 pctrl->fdwControl = MIXERCONTROL_CONTROLF_MULTIPLE | MIXERCONTROL_CONTROLF_UNIFORM; 949 pctrl->dwControlID = nrControls;950 1176 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_MUX; 951 strncpy(pctrl->szShortName, szCtrlName[MIX_CTRL_MUX_IN_W_SRC][0], sizeof(pctrl->szShortName));952 strncpy(pctrl->szName, szCtrlName[MIX_CTRL_MUX_IN_W_SRC][1], sizeof(pctrl->szName));953 1177 pctrl->Bounds.s.lMinimum = 0; 954 1178 pctrl->Bounds.s.lMaximum = 1; 955 1179 pctrl->Metrics.cSteps = 1; 956 nrControls++;957 nrWaveInControls++;958 1180 break; 959 1181 960 1182 case MIX_CTRL_OUT_L_TREBLE: 961 pctrl->cMultipleItems = 0;962 pctrl->fdwControl = 0;963 pctrl->dwControlID = nrControls;964 1183 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_TREBLE; 965 strncpy(pctrl->szShortName, szCtrlName[MIX_CTRL_OUT_L_TREBLE][0], sizeof(pctrl->szShortName));966 strncpy(pctrl->szName, szCtrlName[MIX_CTRL_OUT_L_TREBLE][1], sizeof(pctrl->szName));967 1184 pctrl->Bounds.s.lMinimum = 0; 968 1185 pctrl->Bounds.s.lMaximum = 100; 969 1186 pctrl->Metrics.cSteps = 1; 970 nrControls++;971 nrLineOutControls++;972 1187 break; 973 1188 974 1189 case MIX_CTRL_OUT_L_BASS: 975 pctrl->cMultipleItems = 0;976 pctrl->fdwControl = 0;977 pctrl->dwControlID = nrControls;978 1190 pctrl->dwControlType = MIXERCONTROL_CONTROLTYPE_BASS; 979 strncpy(pctrl->szShortName, szCtrlName[MIX_CTRL_OUT_L_BASS][0], sizeof(pctrl->szShortName));980 strncpy(pctrl->szName, szCtrlName[MIX_CTRL_OUT_L_BASS][1], sizeof(pctrl->szName));981 1191 pctrl->Bounds.s.lMinimum = 0; 982 1192 pctrl->Bounds.s.lMaximum = 100; 983 1193 pctrl->Metrics.cSteps = 1; 984 nrControls++;985 nrLineOutControls++;986 1194 break; 987 1195 … … 990 1198 return FALSE; 991 1199 } 1200 //increase nr of controls of corresponding destinateion line 1201 pDestLine->cControls++; 1202 1203 //add control to list of controls associated with source line 1204 for(int i=0;i<MAX_SOURCE_CONTROLS;i++) { 1205 if(mixerLineControls[pSrcLine->dwLineID][i] == -1) { 1206 mixerLineControls[pSrcLine->dwLineID][i] = pctrl->dwControlID; 1207 break; 1208 } 1209 } 1210 if(i == MAX_SOURCE_CONTROLS) { 1211 DebugInt3(); 1212 } 1213 1214 strncpy(pctrl->szShortName, szCtrlName[dwControl][0], sizeof(pctrl->szShortName)); 1215 strncpy(pctrl->szName, szCtrlName[dwControl][1], sizeof(pctrl->szName)); 1216 nrControls++; 992 1217 dprintf(("Adding control %s (%s)", pctrl->szName, pctrl->szShortName)); 993 1218 return TRUE; -
trunk/src/winmm/mixeros2.h
r8477 r8479 1 /* $Id: mixeros2.h,v 1. 2 2002-05-23 13:50:16 sandervl Exp $ */1 /* $Id: mixeros2.h,v 1.3 2002-05-23 20:42:06 sandervl Exp $ */ 2 2 3 3 /* … … 74 74 #define MIXER_SRC_MAX 11 75 75 76 //max controls connected to a source line 77 #define MAX_SOURCE_CONTROLS 8 78 76 79 #define MIXER_DEST_LINEOUT 0 77 80 #define MIXER_DEST_WAVEIN 1 78 81 #define MIXER_DEST_SPDIFOUT 2 79 82 #define MIXER_DEST_MAX 3 83 84 #define MAX_MIXER_LINES (MIXER_SRC_MAX+MIXER_DEST_MAX) 80 85 81 86 #ifdef __cplusplus
Note:
See TracChangeset
for help on using the changeset viewer.