Changeset 8495 for trunk/src/winmm/mixer.cpp
- Timestamp:
- May 27, 2002, 5:49:55 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/winmm/mixer.cpp
r8493 r8495 1 /* $Id: mixer.cpp,v 1.1 8 2002-05-26 10:52:30sandervl Exp $ */1 /* $Id: mixer.cpp,v 1.19 2002-05-27 15:49:54 sandervl Exp $ */ 2 2 3 3 /* … … 41 41 #include "dbglocal.h" 42 42 43 static MIXERCONTROLA *mixerAddControl(DWORD dwControl, MIX ERLINEA*pSrcLine);44 static MIX ERLINEA *mixerAddSource(MIXERDEST*pDestLine, DWORD dwSource);45 static MIX ERDEST*mixerAddDestination(DWORD dwDest);43 static MIXERCONTROLA *mixerAddControl(DWORD dwControl, MIXLINE *pSrcLine); 44 static MIXLINE *mixerAddSource(MIXLINE *pDestLine, DWORD dwSource); 45 static MIXLINE *mixerAddDestination(DWORD dwDest); 46 46 47 47 //array of destination mixer lines 48 static MIX ERDEST mixerDest[MAX_MIXER_DESTINATIONS];48 static MIXLINE mixerDest[MAX_MIXER_DESTINATIONS] = {0}; 49 49 //array of source mixer lines 50 static MIXERLINEA mixerSource[MAX_MIXER_SOURCES] = {0}; 51 //array of controls connected to mixer lines 52 static int mixerLineControls[MAX_MIXER_LINES][MAX_SOURCE_CONTROLS] = {-1}; 50 static MIXLINE mixerSource[MAX_MIXER_SOURCES] = {0}; 53 51 //array of all mixer lines 54 static MIXERLINEA *pmixerLines[MAX_MIXER_LINES] = {NULL}; 55 //mapping from src to line id 56 static int mixerSourceLineId[MAX_MIXER_SOURCES] = {-1}; 57 //array of all mixer controls 58 static MIXERCONTROLA mixerControls[MAX_MIXER_CONTROLS] = {0}; 59 //mapping of mixer id to internal id 60 static int mixerControlId[MAX_MIXER_CONTROLS] = {0}; 52 static MIXLINE *pmixerLines[MAX_MIXER_LINES] = {NULL}; 53 //array of all mixer controls 54 static MIXCONTROL mixerControls[MAX_MIXER_CONTROLS] = {0}; 61 55 62 56 static int nrDestinations = 0; … … 88 82 return MMSYSERR_INVALPARAM; 89 83 } 90 91 84 switch (fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK) { 92 85 case MIXER_GETCONTROLDETAILSF_VALUE: 93 dprintf(("MIXER_GETCONTROLDETAILSF_VALUE %d (internal id %d)", lpmcd->dwControlID, mixerControl Id[lpmcd->dwControlID]));86 dprintf(("MIXER_GETCONTROLDETAILSF_VALUE %d (internal id %d)", lpmcd->dwControlID, mixerControls[lpmcd->dwControlID].id)); 94 87 if(lpmcd->dwControlID >= nrControls) { 95 88 dprintf(("invalid control %d", lpmcd->dwControlID)); 96 89 return MIXERR_INVALCONTROL; 97 90 } 98 switch(mixerControls[lpmcd->dwControlID].dwControlType) { 91 if(lpmcd->cbDetails < sizeof(MIXERCONTROLDETAILS_UNSIGNED)) { 92 dprintf(("not enough room in buffer (%d)", lpmcd->cbDetails)); 93 return MMSYSERR_INVALPARAM; 94 } 95 switch(mixerControls[lpmcd->dwControlID].ctrl.dwControlType) { 99 96 case MIXERCONTROL_CONTROLTYPE_MUX: 97 { 98 MIXERCONTROLDETAILS_BOOLEAN *pDetails = (MIXERCONTROLDETAILS_BOOLEAN *)lpmcd->paDetails; 99 DWORD dwRecSrc; 100 100 101 dprintf(("MIXERCONTROL_CONTROLTYPE_MUX")); 101 break; 102 case MIXERCONTROL_CONTROLTYPE_MIXER: 103 dprintf(("MIXERCONTROL_CONTROLTYPE_MIXER")); 104 break; 105 case MIXERCONTROL_CONTROLTYPE_FADER: 106 dprintf(("MIXERCONTROL_CONTROLTYPE_FADER")); 107 break; 102 if(lpmcd->cChannels != 1) {//only accepts 1 in win2k 103 dprintf(("invalid number of channels %d", lpmcd->cChannels)); 104 return MMSYSERR_INVALPARAM; 105 } 106 //this is also checked in win2k 107 if(lpmcd->u.cMultipleItems != mixerControls[lpmcd->dwControlID].ctrl.cMultipleItems) { 108 dprintf(("invalid cMultipleItems %d", lpmcd->u.cMultipleItems)); 109 return MMSYSERR_INVALPARAM; 110 } 111 112 if(mixerControls[lpmcd->dwControlID].id != MIX_CTRL_MUX_IN_W_SRC) { 113 dprintf(("oh, oh. not wavein mux")); 114 DebugInt3(); 115 return MMSYSERR_INVALPARAM; 116 } 117 118 if(OSLibMixGetRecSource(&dwRecSrc, NULL, NULL) == FALSE) { 119 dprintf(("OSLibMixGetRecSource failed!!")); 120 return MIXERR_INVALCONTROL; 121 } 122 //clear the array 123 memset(pDetails, 0, sizeof(MIXERCONTROLDETAILS_BOOLEAN)*lpmcd->u.cMultipleItems); 124 //mark recording source 125 for(int i=0;i<nrDestinations;i++) { 126 if(mixerDest[i].id == MIXER_DEST_WAVEIN) { 127 for(int j=0;j<mixerDest[i].cConnections;j++) { 128 dprintf(("wavein source %d (id %d)", pmixerLines[mixerDest[i].Connections[j]]->id, mixerDest[i].Connections[j])); 129 if(pmixerLines[mixerDest[i].Connections[j]]->id == dwRecSrc) { 130 pDetails[j].fValue = 1; 131 return MMSYSERR_NOERROR; 132 } 133 } 134 } 135 } 136 dprintf(("recording source %d not found!!", dwRecSrc)); 137 break; 138 } 139 108 140 case MIXERCONTROL_CONTROLTYPE_VOLUME: //unsigned 109 141 { … … 112 144 113 145 dprintf(("MIXERCONTROL_CONTROLTYPE_VOLUME")); 114 if(OSLibMixGetVolume(mixerControl Id[lpmcd->dwControlID], NULL, &dwVolLeft, &dwVolRight) == FALSE) {146 if(OSLibMixGetVolume(mixerControls[lpmcd->dwControlID].id, NULL, &dwVolLeft, &dwVolRight) == FALSE) { 115 147 dprintf(("OSLibMixGetVolume failed!!")); 116 148 return MIXERR_INVALCONTROL; … … 126 158 return MMSYSERR_NOERROR; 127 159 } 128 case MIXERCONTROL_CONTROLTYPE_BASS: 129 dprintf(("MIXERCONTROL_CONTROLTYPE_BASS")); 130 break; 131 case MIXERCONTROL_CONTROLTYPE_TREBLE: 132 dprintf(("MIXERCONTROL_CONTROLTYPE_TREBLE")); 133 break; 134 case MIXERCONTROL_CONTROLTYPE_MUTE: 160 161 case MIXERCONTROL_CONTROLTYPE_MUTE: //assuming boolean 135 162 { 136 MIXERCONTROLDETAILS_ UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED*)lpmcd->paDetails;163 MIXERCONTROLDETAILS_BOOLEAN *pDetails = (MIXERCONTROLDETAILS_BOOLEAN *)lpmcd->paDetails; 137 164 BOOL fMute; 138 165 139 166 dprintf(("MIXERCONTROL_CONTROLTYPE_MUTE")); 140 if(OSLibMixGetVolume(mixerControl Id[lpmcd->dwControlID], &fMute, NULL, NULL) == FALSE) {167 if(OSLibMixGetVolume(mixerControls[lpmcd->dwControlID].id, &fMute, NULL, NULL) == FALSE) { 141 168 dprintf(("OSLibMixGetVolume failed!!")); 142 169 return MIXERR_INVALCONTROL; 143 170 } 144 pDetails-> dwValue = fMute;171 pDetails->fValue = fMute; 145 172 dprintf(("Left mute %d", fMute)); 146 173 if(lpmcd->cChannels == 2) { 147 174 dprintf(("Right mute %d", fMute)); 148 175 pDetails += 1; 149 pDetails-> dwValue = fMute;150 } 151 //todo > 2 channels 176 pDetails->fValue = fMute; 177 } 178 //todo > 2 channels (usually only 1 channel is requested though) 152 179 return MMSYSERR_NOERROR; 153 180 } 181 182 case MIXERCONTROL_CONTROLTYPE_FADER: 183 { 184 MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails; 185 DWORD dwLevelL; 186 187 dprintf(("MIXERCONTROL_CONTROLTYPE_FADER")); 188 189 if(lpmcd->cChannels != 1) { 190 dprintf(("Invalid nr of channels %d!!", lpmcd->cChannels)); 191 return MMSYSERR_INVALPARAM; 192 } 193 if(OSLibMixGetVolume(mixerControls[lpmcd->dwControlID].id, NULL, &dwLevelL, NULL) == FALSE) { 194 dprintf(("OSLibMixGetVolume failed!!")); 195 return MIXERR_INVALCONTROL; 196 } 197 pDetails->dwValue = dwLevelL; 198 #ifdef DEBUG 199 if(mixerControls[lpmcd->dwControlID].id == MIX_CTRL_OUT_L_3DCENTER) { 200 dprintf(("3D center %d", dwLevelL)); 201 } 202 else dprintf(("3D depth %d", dwLevelL)); 203 #endif 204 return MMSYSERR_NOERROR; 205 } 206 207 case MIXERCONTROL_CONTROLTYPE_BASS: 208 { 209 MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails; 210 DWORD dwLevelL; 211 212 dprintf(("MIXERCONTROL_CONTROLTYPE_BASS")); 213 214 if(lpmcd->cChannels != 1) { 215 dprintf(("Invalid nr of channels %d!!", lpmcd->cChannels)); 216 return MMSYSERR_INVALPARAM; 217 } 218 if(OSLibMixGetVolume(mixerControls[lpmcd->dwControlID].id, NULL, &dwLevelL, NULL) == FALSE) { 219 dprintf(("OSLibMixGetVolume failed!!")); 220 return MIXERR_INVALCONTROL; 221 } 222 pDetails->dwValue = dwLevelL; 223 dprintf(("Bass %d", dwLevelL)); 224 return MMSYSERR_NOERROR; 225 } 226 227 case MIXERCONTROL_CONTROLTYPE_TREBLE: 228 { 229 MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails; 230 DWORD dwLevelL; 231 232 dprintf(("MIXERCONTROL_CONTROLTYPE_TREBLE")); 233 234 if(lpmcd->cChannels != 1) { 235 dprintf(("Invalid nr of channels %d!!", lpmcd->cChannels)); 236 return MMSYSERR_INVALPARAM; 237 } 238 if(OSLibMixGetVolume(mixerControls[lpmcd->dwControlID].id, NULL, &dwLevelL, NULL) == FALSE) { 239 dprintf(("OSLibMixGetVolume failed!!")); 240 return MIXERR_INVALCONTROL; 241 } 242 pDetails->dwValue = dwLevelL; 243 dprintf(("Treble %d", dwLevelL)); 244 return MMSYSERR_NOERROR; 245 } 246 247 #ifdef DEBUG 248 case MIXERCONTROL_CONTROLTYPE_MIXER: 249 dprintf(("MIXERCONTROL_CONTROLTYPE_MIXER")); 250 break; 154 251 case MIXERCONTROL_CONTROLTYPE_CUSTOM: 155 252 dprintf(("MIXERCONTROL_CONTROLTYPE_CUSTOM")); … … 221 318 dprintf(("MIXERCONTROL_CONTROLTYPE_MILLITIME")); 222 319 break; 320 #endif 223 321 default: 224 322 DebugInt3(); … … 233 331 return MIXERR_INVALCONTROL; 234 332 } 235 break; 333 switch(mixerControls[lpmcd->dwControlID].ctrl.dwControlType) { 334 case MIXERCONTROL_CONTROLTYPE_MUX: 335 { 336 MIXERCONTROLDETAILS_LISTTEXTA *pDetails = (MIXERCONTROLDETAILS_LISTTEXTA *)lpmcd->paDetails; 337 if(lpmcd->cChannels != 1) {//only accepts 1 in win2k 338 dprintf(("invalid number of channels %d", lpmcd->cChannels)); 339 return MMSYSERR_INVALPARAM; 340 } 341 //this is also checked in win2k 342 if(lpmcd->u.cMultipleItems != mixerControls[lpmcd->dwControlID].ctrl.cMultipleItems) { 343 dprintf(("invalid cMultipleItems %d", lpmcd->u.cMultipleItems)); 344 return MMSYSERR_INVALPARAM; 345 } 346 //fails otherwise in win2k 347 if(lpmcd->cbDetails != sizeof(MIXERCONTROLDETAILS_LISTTEXTA)) { 348 dprintf(("invalid buffer size %d; should be %d", lpmcd->cbDetails, sizeof(MIXERCONTROLDETAILS_LISTTEXTA))); 349 return MMSYSERR_INVALPARAM; 350 } 351 if(mixerControls[lpmcd->dwControlID].id != MIX_CTRL_MUX_IN_W_SRC) { 352 dprintf(("oh, oh. not wavein mux")); 353 DebugInt3(); 354 return MMSYSERR_INVALPARAM; 355 } 356 //clear the array 357 memset(pDetails, 0, sizeof(MIXERCONTROLDETAILS_LISTTEXTA)*lpmcd->u.cMultipleItems); 358 //set mux source details 359 for(int i=0;i<nrDestinations;i++) { 360 if(mixerDest[i].id == MIXER_DEST_WAVEIN) { 361 for(int j=0;j<mixerDest[i].cConnections;j++) { 362 dprintf(("wavein source %d (%s)", pmixerLines[mixerDest[i].Connections[j]]->id, pmixerLines[mixerDest[i].Connections[j]]->line.szName)); 363 pDetails->dwParam1 = pmixerLines[mixerDest[i].Connections[j]]->line.dwLineID; 364 pDetails->dwParam2 = 0; 365 strncpy(pDetails->szName, pmixerLines[mixerDest[i].Connections[j]]->line.szName, sizeof(pDetails->szName)); 366 pDetails++; 367 } 368 return MMSYSERR_NOERROR; 369 } 370 } 371 DebugInt3(); 372 return MMSYSERR_INVALPARAM; 373 } 374 case MIXERCONTROL_CONTROLTYPE_EQUALIZER: 375 case MIXERCONTROL_CONTROLTYPE_MIXER: 376 case MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT: 377 case MIXERCONTROL_CONTROLTYPE_SINGLESELECT: 378 dprintf(("Only implemented for mux controls")); 379 return MIXERR_INVALCONTROL; 380 381 default: 382 dprintf(("Only implemented for multiple item controls")); 383 return MIXERR_INVALCONTROL; 384 } 385 236 386 default: 237 387 dprintf(("Unknown flag (%08lx)\n", fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK)); … … 257 407 case MIXER_GETCONTROLDETAILSF_LISTTEXT: 258 408 { 259 LPVOID paDetailsW = lpmcd->paDetails; 260 int size = max(1, lpmcd->cChannels) * sizeof(MIXERCONTROLDETAILS_LISTTEXTA); 261 262 if (lpmcd->u.cMultipleItems != 0 && lpmcd->u.cMultipleItems != lpmcd->u.hwndOwner) { 409 MIXERCONTROLDETAILS_LISTTEXTW *pDetailsW = (MIXERCONTROLDETAILS_LISTTEXTW *)lpmcd->paDetails; 410 MIXERCONTROLDETAILS_LISTTEXTA *pDetailsA; 411 int size = max(1, lpmcd->cChannels) * sizeof(MIXERCONTROLDETAILS_LISTTEXTA); 412 int i; 413 414 if (lpmcd->u.cMultipleItems != 0) { 263 415 size *= lpmcd->u.cMultipleItems; 264 416 } 265 lpmcd->paDetails = HeapAlloc(GetProcessHeap(), 0, size); 417 pDetailsA = (MIXERCONTROLDETAILS_LISTTEXTA *)HeapAlloc(GetProcessHeap(), 0, size); 418 lpmcd->paDetails = pDetailsA; 419 lpmcd->cbDetails = sizeof(MIXERCONTROLDETAILS_LISTTEXTA); 266 420 /* set up lpmcd->paDetails */ 267 421 ret = mixerGetControlDetailsA(hmxobj, lpmcd, fdwDetails); 268 422 /* copy from lpmcd->paDetails back to paDetailsW; */ 269 HeapFree(GetProcessHeap(), 0, lpmcd->paDetails); 270 lpmcd->paDetails = paDetailsW; 423 if(ret == MMSYSERR_NOERROR) { 424 for(i=0;i<lpmcd->u.cMultipleItems*lpmcd->cChannels;i++) { 425 pDetailsW->dwParam1 = pDetailsA->dwParam1; 426 pDetailsW->dwParam2 = pDetailsA->dwParam2; 427 MultiByteToWideChar( CP_ACP, 0, pDetailsA->szName, -1, 428 pDetailsW->szName, 429 sizeof(pDetailsW->szName)/sizeof(WCHAR) ); 430 pDetailsA++; 431 pDetailsW++; 432 } 433 pDetailsA -= lpmcd->u.cMultipleItems*lpmcd->cChannels; 434 pDetailsW -= lpmcd->u.cMultipleItems*lpmcd->cChannels; 435 } 436 HeapFree(GetProcessHeap(), 0, pDetailsA); 437 lpmcd->paDetails = pDetailsW; 438 lpmcd->cbDetails = sizeof(MIXERCONTROLDETAILS_LISTTEXTW); 271 439 break; 272 440 } … … 305 473 switch (fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK) { 306 474 case MIXER_GETCONTROLDETAILSF_VALUE: 307 dprintf(("MIXER_GETCONTROLDETAILSF_VALUE")); 308 break; 475 dprintf(("MIXER_GETCONTROLDETAILSF_VALUE %d (internal id %d)", lpmcd->dwControlID, mixerControls[lpmcd->dwControlID].id)); 476 if(lpmcd->dwControlID >= nrControls) { 477 dprintf(("invalid control %d", lpmcd->dwControlID)); 478 return MIXERR_INVALCONTROL; 479 } 480 if(lpmcd->cbDetails < sizeof(MIXERCONTROLDETAILS_UNSIGNED)) { 481 dprintf(("not enough room in buffer (%d)", lpmcd->cbDetails)); 482 return MMSYSERR_INVALPARAM; 483 } 484 switch(mixerControls[lpmcd->dwControlID].ctrl.dwControlType) { 485 case MIXERCONTROL_CONTROLTYPE_MUX: 486 { 487 MIXERCONTROLDETAILS_BOOLEAN *pDetails = (MIXERCONTROLDETAILS_BOOLEAN *)lpmcd->paDetails; 488 DWORD dwRecSrc; 489 490 dprintf(("MIXERCONTROL_CONTROLTYPE_MUX")); 491 if(lpmcd->cChannels != 1) {//only accepts 1 in win2k 492 dprintf(("invalid number of channels %d", lpmcd->cChannels)); 493 return MMSYSERR_INVALPARAM; 494 } 495 //this is also checked in win2k 496 if(lpmcd->u.cMultipleItems != mixerControls[lpmcd->dwControlID].ctrl.cMultipleItems) { 497 dprintf(("invalid cMultipleItems %d", lpmcd->u.cMultipleItems)); 498 return MMSYSERR_INVALPARAM; 499 } 500 501 if(mixerControls[lpmcd->dwControlID].id != MIX_CTRL_MUX_IN_W_SRC) { 502 dprintf(("oh, oh. not wavein mux")); 503 DebugInt3(); 504 return MMSYSERR_INVALPARAM; 505 } 506 #if 0 507 if(OSLibMixGetRecSource(&dwRecSrc, NULL, NULL) == FALSE) { 508 dprintf(("OSLibMixGetRecSource failed!!")); 509 return MIXERR_INVALCONTROL; 510 } 511 //clear the array 512 memset(pDetails, 0, sizeof(MIXERCONTROLDETAILS_BOOLEAN)*lpmcd->u.cMultipleItems); 513 //mark recording source 514 for(int i=0;i<nrDestinations;i++) { 515 if(mixerDest[i].id == MIXER_DEST_WAVEIN) { 516 for(int j=0;j<mixerDest[i].cConnections;j++) { 517 dprintf(("wavein source %d (id %d)", pmixerLines[mixerDest[i].Connections[j]]->id, mixerDest[i].Connections[j])); 518 if(pmixerLines[mixerDest[i].Connections[j]]->id == dwRecSrc) { 519 pDetails[j].fValue = 1; 520 return MMSYSERR_NOERROR; 521 } 522 } 523 } 524 } 525 dprintf(("recording source %d not found!!", dwRecSrc)); 526 #endif 527 break; 528 } 529 530 case MIXERCONTROL_CONTROLTYPE_VOLUME: //unsigned 531 { 532 MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails; 533 534 dprintf(("MIXERCONTROL_CONTROLTYPE_VOLUME")); 535 dprintf(("Left volume %d", pDetails->dwValue)); 536 if(lpmcd->cChannels == 2) { 537 pDetails += 1; 538 dprintf(("Right volume %d", pDetails->dwValue)); 539 } 540 //todo > 2 channels 541 return MMSYSERR_NOERROR; 542 } 543 544 case MIXERCONTROL_CONTROLTYPE_MUTE: //assuming boolean 545 { 546 MIXERCONTROLDETAILS_BOOLEAN *pDetails = (MIXERCONTROLDETAILS_BOOLEAN *)lpmcd->paDetails; 547 548 dprintf(("MIXERCONTROL_CONTROLTYPE_MUTE")); 549 dprintf(("Left mute %d", pDetails->fValue)); 550 if(lpmcd->cChannels == 2) { 551 pDetails += 1; 552 dprintf(("Right mute %d", pDetails->fValue)); 553 } 554 //todo > 2 channels (usually only 1 channel is requested though) 555 return MMSYSERR_NOERROR; 556 } 557 558 case MIXERCONTROL_CONTROLTYPE_FADER: 559 { 560 MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails; 561 562 dprintf(("MIXERCONTROL_CONTROLTYPE_FADER")); 563 564 if(lpmcd->cChannels != 1) { 565 dprintf(("Invalid nr of channels %d!!", lpmcd->cChannels)); 566 return MMSYSERR_INVALPARAM; 567 } 568 #ifdef DEBUG 569 if(mixerControls[lpmcd->dwControlID].id == MIX_CTRL_OUT_L_3DCENTER) { 570 dprintf(("3D center %d", pDetails->dwValue)); 571 } 572 else dprintf(("3D depth %d", pDetails->dwValue)); 573 #endif 574 return MMSYSERR_NOERROR; 575 } 576 577 case MIXERCONTROL_CONTROLTYPE_BASS: 578 { 579 MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails; 580 581 dprintf(("MIXERCONTROL_CONTROLTYPE_BASS")); 582 583 if(lpmcd->cChannels != 1) { 584 dprintf(("Invalid nr of channels %d!!", lpmcd->cChannels)); 585 return MMSYSERR_INVALPARAM; 586 } 587 dprintf(("Bass %d", pDetails->dwValue)); 588 return MMSYSERR_NOERROR; 589 } 590 591 case MIXERCONTROL_CONTROLTYPE_TREBLE: 592 { 593 MIXERCONTROLDETAILS_UNSIGNED *pDetails = (MIXERCONTROLDETAILS_UNSIGNED *)lpmcd->paDetails; 594 595 dprintf(("MIXERCONTROL_CONTROLTYPE_TREBLE")); 596 597 if(lpmcd->cChannels != 1) { 598 dprintf(("Invalid nr of channels %d!!", lpmcd->cChannels)); 599 return MMSYSERR_INVALPARAM; 600 } 601 dprintf(("Treble %d", pDetails->dwValue)); 602 return MMSYSERR_NOERROR; 603 } 604 605 #ifdef DEBUG 606 case MIXERCONTROL_CONTROLTYPE_MIXER: 607 dprintf(("MIXERCONTROL_CONTROLTYPE_MIXER")); 608 break; 609 case MIXERCONTROL_CONTROLTYPE_CUSTOM: 610 dprintf(("MIXERCONTROL_CONTROLTYPE_CUSTOM")); 611 break; 612 case MIXERCONTROL_CONTROLTYPE_BOOLEANMETER: 613 dprintf(("MIXERCONTROL_CONTROLTYPE_BOOLEANMETER")); 614 break; 615 case MIXERCONTROL_CONTROLTYPE_SIGNEDMETER: 616 dprintf(("MIXERCONTROL_CONTROLTYPE_SIGNEDMETER")); 617 break; 618 case MIXERCONTROL_CONTROLTYPE_PEAKMETER: 619 dprintf(("MIXERCONTROL_CONTROLTYPE_PEAKMETER")); 620 break; 621 case MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER: 622 dprintf(("MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER")); 623 break; 624 case MIXERCONTROL_CONTROLTYPE_BOOLEAN: 625 dprintf(("MIXERCONTROL_CONTROLTYPE_BOOLEAN")); 626 break; 627 case MIXERCONTROL_CONTROLTYPE_ONOFF: 628 dprintf(("MIXERCONTROL_CONTROLTYPE_ONOFF")); 629 break; 630 case MIXERCONTROL_CONTROLTYPE_MONO: 631 dprintf(("MIXERCONTROL_CONTROLTYPE_MONO")); 632 break; 633 case MIXERCONTROL_CONTROLTYPE_LOUDNESS: 634 dprintf(("MIXERCONTROL_CONTROLTYPE_LOUDNESS")); 635 break; 636 case MIXERCONTROL_CONTROLTYPE_STEREOENH: 637 dprintf(("MIXERCONTROL_CONTROLTYPE_STEREOENH")); 638 break; 639 case MIXERCONTROL_CONTROLTYPE_BUTTON: 640 dprintf(("MIXERCONTROL_CONTROLTYPE_BUTTON")); 641 break; 642 case MIXERCONTROL_CONTROLTYPE_DECIBELS: 643 dprintf(("MIXERCONTROL_CONTROLTYPE_DECIBELS")); 644 break; 645 case MIXERCONTROL_CONTROLTYPE_SIGNED: 646 dprintf(("MIXERCONTROL_CONTROLTYPE_SIGNED")); 647 break; 648 case MIXERCONTROL_CONTROLTYPE_UNSIGNED: 649 dprintf(("MIXERCONTROL_CONTROLTYPE_UNSIGNED")); 650 break; 651 case MIXERCONTROL_CONTROLTYPE_PERCENT: 652 dprintf(("MIXERCONTROL_CONTROLTYPE_PERCENT")); 653 break; 654 case MIXERCONTROL_CONTROLTYPE_SLIDER: 655 dprintf(("MIXERCONTROL_CONTROLTYPE_SLIDER")); 656 break; 657 case MIXERCONTROL_CONTROLTYPE_PAN: 658 dprintf(("MIXERCONTROL_CONTROLTYPE_PAN")); 659 break; 660 case MIXERCONTROL_CONTROLTYPE_QSOUNDPAN: 661 dprintf(("MIXERCONTROL_CONTROLTYPE_QSOUNDPAN")); 662 break; 663 case MIXERCONTROL_CONTROLTYPE_EQUALIZER: 664 dprintf(("MIXERCONTROL_CONTROLTYPE_EQUALIZER")); 665 break; 666 case MIXERCONTROL_CONTROLTYPE_SINGLESELECT: 667 dprintf(("MIXERCONTROL_CONTROLTYPE_SINGLESELECT")); 668 break; 669 case MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT: 670 dprintf(("MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT")); 671 break; 672 case MIXERCONTROL_CONTROLTYPE_MICROTIME: 673 dprintf(("MIXERCONTROL_CONTROLTYPE_MICROTIME")); 674 break; 675 case MIXERCONTROL_CONTROLTYPE_MILLITIME: 676 dprintf(("MIXERCONTROL_CONTROLTYPE_MILLITIME")); 677 break; 678 #endif 679 default: 680 DebugInt3(); 681 return MIXERR_INVALCONTROL; 682 } 683 return MIXERR_INVALCONTROL; 309 684 case MIXER_GETCONTROLDETAILSF_LISTTEXT: 310 685 dprintf(("MIXER_GETCONTROLDETAILSF_LISTTEXT")); … … 353 728 return MIXERR_INVALLINE; 354 729 } 355 pLine = pmixerLines[lpMlc->dwLineID];730 pLine = &pmixerLines[lpMlc->dwLineID]->line; 356 731 if(lpMlc->cControls != pLine->cControls || lpMlc->cbmxctrl < pLine->cControls*sizeof(MIXERCONTROLA)) { 357 732 dprintf(("ERROR: invalid nr of controls %d or structure size %d (%d) (ptr %x)", lpMlc->cControls, lpMlc->cbmxctrl, pLine->cControls*sizeof(MIXERCONTROLA), lpMlc->pamxctrl)); … … 360 735 for(int i=0;i<lpMlc->cControls;i++) { 361 736 pCtrl = lpMlc->pamxctrl+i; 362 memcpy(pCtrl, & mixerControls[mixerLineControls[lpMlc->dwLineID][i]], sizeof(MIXERCONTROLA));737 memcpy(pCtrl, &pmixerLines[lpMlc->dwLineID]->Controls[i], sizeof(MIXERCONTROLA)); 363 738 dprintf(("found control %s (%s) control id %d", pCtrl->szName, pCtrl->szShortName, pCtrl->dwControlID)); 364 739 } … … 379 754 //find line associated with this control 380 755 lpMlc->dwLineID = -1; 381 for(int i=0;i< MAX_MIXER_LINES;i++) {382 for(int j=0;j< MAX_SOURCE_CONTROLS;j++) {383 if( mixerLineControls[i][j] == lpMlc->u.dwControlID) {756 for(int i=0;i<nrLines;i++) { 757 for(int j=0;j<pmixerLines[i]->cControls;j++) { 758 if(pmixerLines[i]->Controls[j] == lpMlc->u.dwControlID) { 384 759 lpMlc->dwLineID = i; 385 760 break; 386 761 } 387 762 else 388 if( mixerLineControls[i][j] == -1) {763 if(pmixerLines[i]->Controls[j] == -1) { 389 764 break; 390 765 } … … 398 773 return MIXERR_INVALCONTROL; 399 774 } 400 memcpy(lpMlc->pamxctrl, &mixerControls[lpMlc->u.dwControlID] , sizeof(MIXERCONTROLA));775 memcpy(lpMlc->pamxctrl, &mixerControls[lpMlc->u.dwControlID].ctrl, sizeof(MIXERCONTROLA)); 401 776 402 777 dprintf(("found control %s (%s) associated line %d", lpMlc->pamxctrl->szName, lpMlc->pamxctrl->szShortName, lpMlc->dwLineID)); … … 509 884 int idx; 510 885 511 for(int i=0;i<MAX_SOURCE_CONTROLS;i++) { 512 idx = mixerLineControls[lpMlc->dwLineID][i]; 513 if(idx == -1) break; 514 if(mixerControls[idx].dwControlType == lpMlc->u.dwControlType) { 515 memcpy(lpMlc->pamxctrl, &mixerControls[idx], sizeof(MIXERCONTROLA)); 886 for(int i=0;i<pmixerLines[lpMlc->dwLineID]->cControls;i++) { 887 idx = pmixerLines[lpMlc->dwLineID]->Controls[i]; 888 if(mixerControls[idx].ctrl.dwControlType == lpMlc->u.dwControlType) { 889 memcpy(lpMlc->pamxctrl, &mixerControls[idx].ctrl, sizeof(MIXERCONTROLA)); 516 890 dprintf(("found control %s (%s) control id %d", lpMlc->pamxctrl->szName, lpMlc->pamxctrl->szShortName, lpMlc->pamxctrl->dwControlID)); 517 891 return MMSYSERR_NOERROR; … … 623 997 return MIXERR_INVALLINE; 624 998 } 625 memcpy(lpMl, pmixerLines[lpMl->dwLineID], sizeof(MIXERLINEA));999 memcpy(lpMl, &pmixerLines[lpMl->dwLineID]->line, sizeof(MIXERLINEA)); 626 1000 dprintf(("found line %s (%s) connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->cConnections, lpMl->cControls)); 627 1001 break; … … 637 1011 return MIXERR_INVALLINE; 638 1012 } 639 if(mixerDest[lpMl->dwDestination]. Sources[lpMl->dwSource] == -1) {1013 if(mixerDest[lpMl->dwDestination].Connections[lpMl->dwSource] == -1) { 640 1014 dprintf(("ERROR: Invalid destination/source combo (%d,%d)", lpMl->dwDestination, lpMl->dwSource)); 641 1015 return MIXERR_INVALLINE; 642 1016 } 643 memcpy(lpMl, &mixerSource[mixerDest[lpMl->dwDestination]. Sources[lpMl->dwSource]], sizeof(MIXERLINEA));1017 memcpy(lpMl, &mixerSource[mixerDest[lpMl->dwDestination].Connections[lpMl->dwSource]], sizeof(MIXERLINEA)); 644 1018 dprintf(("found line %s (%s) id %d connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->dwLineID, lpMl->cConnections, lpMl->cControls)); 645 1019 break; … … 718 1092 //search all lines (src & dest) for one with specified type 719 1093 for(int i=0;i<nrLines;i++) { 720 if(pmixerLines[i]-> dwComponentType == lpMl->dwComponentType) {1094 if(pmixerLines[i]->line.dwComponentType == lpMl->dwComponentType) { 721 1095 break; 722 1096 } … … 726 1100 return MIXERR_INVALLINE; 727 1101 } 728 memcpy(lpMl, pmixerLines[i], sizeof(MIXERLINEA));1102 memcpy(lpMl, &pmixerLines[i]->line, sizeof(MIXERLINEA)); 729 1103 dprintf(("found line %s (%s) id %d connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->dwLineID, lpMl->cConnections, lpMl->cControls)); 730 1104 break; … … 762 1136 // (see below; unicode version doesn't copy pddname; change if these checks are required) 763 1137 for(int i=0;i<nrLines;i++) { 764 if(pmixerLines[i]-> Target.dwType == lpMl->Target.dwType) {1138 if(pmixerLines[i]->line.Target.dwType == lpMl->Target.dwType) { 765 1139 break; 766 1140 } … … 770 1144 return MIXERR_INVALLINE; 771 1145 } 772 memcpy(lpMl, pmixerLines[i], sizeof(MIXERLINEA));1146 memcpy(lpMl, &pmixerLines[i]->line, sizeof(MIXERLINEA)); 773 1147 dprintf(("found line %s (%s) id %d connections %d controls %d", lpMl->szName, lpMl->szShortName, lpMl->dwLineID, lpMl->cConnections, lpMl->cControls)); 774 1148 break; … … 981 1355 BOOL mixerInit() 982 1356 { 983 MIX ERDEST*pDestLine;1357 MIXLINE *pDestLine; 984 1358 MIXERCONTROLA *pWaveInMux; 985 1359 986 1360 if(!fMMPMAvailable) return TRUE; 987 1361 988 memset(mixerSourceLineId, -1, sizeof(mixerSourceLineId));989 memset(mixerLineControls, -1, sizeof(mixerLineControls));990 1362 memset(mixerDest, 0, sizeof(mixerDest)); 991 1363 for(int i=0;i<MIXER_DEST_MAX;i++) { 992 memset(mixerDest[i].Sources, -1, sizeof(mixerDest[i].Sources)); 993 } 994 1364 memset(mixerDest[i].Connections, -1, sizeof(mixerDest[i].Connections)); 1365 memset(mixerDest[i].Controls, -1, sizeof(mixerDest[i].Controls)); 1366 } 1367 memset(mixerSource, 0, sizeof(mixerSource)); 1368 for(i=0;i<MIXER_SRC_MAX;i++) { 1369 memset(mixerSource[i].Connections, -1, sizeof(mixerSource[i].Connections)); 1370 memset(mixerSource[i].Controls, -1, sizeof(mixerSource[i].Controls)); 1371 mixerSource[i].id = -1; 1372 } 995 1373 if(OSLibMixerOpen() == FALSE) { 996 1374 //Line out destination 997 1375 pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT); 998 mixerAddControl(MIX_CTRL_VOL_OUT_LINE, &pDestLine->line);999 mixerAddControl(MIX_CTRL_MUTE_OUT_LINE, &pDestLine->line);1376 mixerAddControl(MIX_CTRL_VOL_OUT_LINE, pDestLine); 1377 mixerAddControl(MIX_CTRL_MUTE_OUT_LINE, pDestLine); 1000 1378 1001 1379 //WaveIn destination 1002 1380 pDestLine = mixerAddDestination(MIXER_DEST_WAVEIN); 1003 pWaveInMux = mixerAddControl(MIX_CTRL_MUX_IN_W_SRC, &pDestLine->line);1004 mixerAddControl(MIX_CTRL_VOL_IN_W_MIC, &pDestLine->line);1005 mixerAddControl(MIX_CTRL_VOL_IN_W_LINE, &pDestLine->line);1381 pWaveInMux = mixerAddControl(MIX_CTRL_MUX_IN_W_SRC, pDestLine); 1382 mixerAddControl(MIX_CTRL_VOL_IN_W_MIC, pDestLine); 1383 mixerAddControl(MIX_CTRL_VOL_IN_W_LINE, pDestLine); 1006 1384 pWaveInMux->cMultipleItems = pDestLine->line.cConnections; 1007 1385 return TRUE; … … 1011 1389 pDestLine = mixerAddDestination(MIXER_DEST_LINEOUT); 1012 1390 1013 mixerAddControl(MIX_CTRL_VOL_OUT_LINE, &pDestLine->line);1014 mixerAddControl(MIX_CTRL_MUTE_OUT_LINE, &pDestLine->line);1391 mixerAddControl(MIX_CTRL_VOL_OUT_LINE, pDestLine); 1392 mixerAddControl(MIX_CTRL_MUTE_OUT_LINE, pDestLine); 1015 1393 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_3DCENTER)) { 1016 mixerAddControl(MIX_CTRL_OUT_L_3DCENTER, &pDestLine->line);1394 mixerAddControl(MIX_CTRL_OUT_L_3DCENTER, pDestLine); 1017 1395 } 1018 1396 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_3DDEPTH)) { 1019 mixerAddControl(MIX_CTRL_OUT_L_3DDEPTH, &pDestLine->line);1397 mixerAddControl(MIX_CTRL_OUT_L_3DDEPTH, pDestLine); 1020 1398 } 1021 1399 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_TREBLE)) { 1022 mixerAddControl(MIX_CTRL_OUT_L_TREBLE, &pDestLine->line);1400 mixerAddControl(MIX_CTRL_OUT_L_TREBLE, pDestLine); 1023 1401 } 1024 1402 if(OSLibMixIsControlPresent(MIX_CTRL_OUT_L_BASS)) { 1025 mixerAddControl(MIX_CTRL_OUT_L_BASS, &pDestLine->line);1403 mixerAddControl(MIX_CTRL_OUT_L_BASS, pDestLine); 1026 1404 } 1027 1405 1028 1406 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_PCM)) { 1029 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_PCM);1407 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_PCM); 1030 1408 mixerAddControl(MIX_CTRL_VOL_IN_L_PCM, pLine); 1031 1409 mixerAddControl(MIX_CTRL_MUTE_IN_L_PCM, pLine); 1032 1410 } 1033 1411 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_WAVETABLE)) { 1034 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_WAVETABLE);1412 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_WAVETABLE); 1035 1413 mixerAddControl(MIX_CTRL_VOL_IN_L_WAVETABLE, pLine); 1036 1414 mixerAddControl(MIX_CTRL_MUTE_IN_L_WAVETABLE, pLine); 1037 1415 } 1038 1416 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MIDI)) { 1039 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_MIDI);1417 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_MIDI); 1040 1418 mixerAddControl(MIX_CTRL_VOL_IN_L_MIDI, pLine); 1041 1419 mixerAddControl(MIX_CTRL_MUTE_IN_L_MIDI, pLine); 1042 1420 } 1043 1421 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MIC)) { 1044 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_MIC);1422 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_MIC); 1045 1423 mixerAddControl(MIX_CTRL_VOL_IN_L_MIC, pLine); 1046 1424 mixerAddControl(MIX_CTRL_MUTE_IN_L_MIC, pLine); … … 1050 1428 } 1051 1429 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_LINE)) { 1052 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_LINE);1430 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_LINE); 1053 1431 mixerAddControl(MIX_CTRL_VOL_IN_L_LINE, pLine); 1054 1432 mixerAddControl(MIX_CTRL_MUTE_IN_L_LINE, pLine); 1055 1433 } 1056 1434 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_CD)) { 1057 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_CD);1435 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_CD); 1058 1436 mixerAddControl(MIX_CTRL_VOL_IN_L_CD, pLine); 1059 1437 mixerAddControl(MIX_CTRL_MUTE_IN_L_CD, pLine); 1060 1438 } 1061 1439 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_AUX)) { 1062 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_AUX);1440 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_AUX); 1063 1441 mixerAddControl(MIX_CTRL_VOL_IN_L_AUX, pLine); 1064 1442 mixerAddControl(MIX_CTRL_MUTE_IN_L_AUX, pLine); 1065 1443 } 1066 1444 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_SPDIF)) { 1067 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_SPDIF);1445 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_SPDIF); 1068 1446 mixerAddControl(MIX_CTRL_VOL_IN_L_SPDIF, pLine); 1069 1447 mixerAddControl(MIX_CTRL_MUTE_IN_L_SPDIF, pLine); 1070 1448 } 1071 1449 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_MONO)) { 1072 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_MONOIN);1450 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_MONOIN); 1073 1451 mixerAddControl(MIX_CTRL_VOL_IN_L_MONO, pLine); 1074 1452 mixerAddControl(MIX_CTRL_MUTE_IN_L_MONO, pLine); 1075 1453 } 1076 1454 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_PHONE)) { 1077 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_PHONE);1455 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_PHONE); 1078 1456 mixerAddControl(MIX_CTRL_VOL_IN_L_PHONE, pLine); 1079 1457 mixerAddControl(MIX_CTRL_MUTE_IN_L_PHONE, pLine); 1080 1458 } 1081 1459 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_IN_L_VIDEO)) { 1082 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_VIDEO);1460 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_L_VIDEO); 1083 1461 mixerAddControl(MIX_CTRL_VOL_IN_L_VIDEO, pLine); 1084 1462 mixerAddControl(MIX_CTRL_MUTE_IN_L_VIDEO, pLine); … … 1088 1466 if(OSLibMixIsControlPresent(MIX_CTRL_MUX_IN_W_SRC)) { 1089 1467 pDestLine = mixerAddDestination(MIXER_DEST_WAVEIN); 1090 pWaveInMux = mixerAddControl(MIX_CTRL_MUX_IN_W_SRC, &pDestLine->line);1468 pWaveInMux = mixerAddControl(MIX_CTRL_MUX_IN_W_SRC, pDestLine); 1091 1469 1092 1470 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_MIC)) { 1093 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_MIC);1471 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_MIC); 1094 1472 mixerAddControl(MIX_CTRL_VOL_IN_W_MIC, pLine); 1095 1473 } 1096 1474 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_LINE)) { 1097 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_LINE);1475 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_LINE); 1098 1476 mixerAddControl(MIX_CTRL_VOL_IN_W_LINE, pLine); 1099 1477 } 1100 1478 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_CD)) { 1101 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_CD);1479 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_CD); 1102 1480 mixerAddControl(MIX_CTRL_VOL_IN_W_CD, pLine); 1103 1481 } 1104 1482 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_AUX)) { 1105 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_AUX);1483 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_AUX); 1106 1484 mixerAddControl(MIX_CTRL_VOL_IN_W_AUX, pLine); 1107 1485 } 1108 1486 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_PCM)) { 1109 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_PCM);1487 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_PCM); 1110 1488 mixerAddControl(MIX_CTRL_VOL_IN_W_PCM, pLine); 1111 1489 } 1112 1490 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_WAVETABLE)) { 1113 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_WAVETABLE);1491 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_WAVETABLE); 1114 1492 mixerAddControl(MIX_CTRL_VOL_IN_W_WAVETABLE, pLine); 1115 1493 } 1116 1494 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_MIDI)) { 1117 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_MIDI);1495 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_MIDI); 1118 1496 mixerAddControl(MIX_CTRL_VOL_IN_W_MIDI, pLine); 1119 1497 } 1120 1498 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_MONOIN)) { 1121 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_MONOIN);1499 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_MONOIN); 1122 1500 mixerAddControl(MIX_CTRL_VOL_IN_W_MONO, pLine); 1123 1501 } 1124 1502 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_PHONE)) { 1125 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_PHONE);1503 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_PHONE); 1126 1504 mixerAddControl(MIX_CTRL_VOL_IN_W_PHONE, pLine); 1127 1505 } 1128 1506 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_SPDIF)) { 1129 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_SPDIF);1507 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_SPDIF); 1130 1508 mixerAddControl(MIX_CTRL_VOL_IN_W_SPDIF, pLine); 1131 1509 } 1132 1510 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_VIDEO)) { 1133 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_VIDEO);1511 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_VIDEO); 1134 1512 mixerAddControl(MIX_CTRL_VOL_IN_W_VIDEO, pLine); 1135 1513 } 1136 1514 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_STEREOMIX)) { 1137 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_STEREOMIX);1515 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_STEREOMIX); 1138 1516 mixerAddControl(MIX_CTRL_VOL_IN_W_STEREOMIX, pLine); 1139 1517 } 1140 1518 if(OSLibMixIsRecSourcePresent(MIXER_SRC_IN_W_MONOMIX)) { 1141 MIX ERLINEA*pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_MONOMIX);1519 MIXLINE *pLine = mixerAddSource(pDestLine, MIXER_SRC_IN_W_MONOMIX); 1142 1520 mixerAddControl(MIX_CTRL_VOL_IN_W_MONOMIX, pLine); 1143 1521 } … … 1151 1529 if(OSLibMixIsControlPresent(MIX_CTRL_VOL_OUT_SPDIF)) { 1152 1530 pDestLine = mixerAddDestination(MIXER_DEST_SPDIFOUT); 1153 mixerAddControl(MIX_CTRL_VOL_OUT_SPDIF, &pDestLine->line);1154 mixerAddControl(MIX_CTRL_MUTE_OUT_SPDIF, &pDestLine->line);1531 mixerAddControl(MIX_CTRL_VOL_OUT_SPDIF, pDestLine); 1532 mixerAddControl(MIX_CTRL_MUTE_OUT_SPDIF, pDestLine); 1155 1533 } 1156 1534 … … 1165 1543 /******************************************************************************/ 1166 1544 /******************************************************************************/ 1167 static MIX ERLINEA *mixerAddSource(MIXERDEST*pDestLine, DWORD dwSource)1545 static MIXLINE *mixerAddSource(MIXLINE *pDestLine, DWORD dwSource) 1168 1546 { 1169 MIXERLINEA *pline = &mixerSource[nrSources]; 1547 MIXLINE *pSource = &mixerSource[nrSources]; 1548 MIXERLINEA *pline = &pSource->line; 1170 1549 1171 1550 if(nrSources >= MAX_MIXER_SOURCES) { … … 1182 1561 pline->dwDestination = 0; 1183 1562 pline->fdwLine = MIXERLINE_LINEF_SOURCE; 1184 pline->dwSource = nrSources;1185 1563 pline->Target.dwDeviceID = 0; 1186 1564 pline->Target.wMid = WINMM_MIXER_CAPS_WMID; 1187 1565 pline->Target.vDriverVersion = WINMM_MIXER_CAPS_VERSION; 1566 pline->dwSource = nrSources; 1567 nrSources++; 1188 1568 1189 1569 switch(dwSource) { … … 1263 1643 strncpy(pline->Target.szPname, WINMM_MIXERSTRING_A, sizeof(pline->Target.szPname)); 1264 1644 1265 dprintf(("Adding Source %s (%s)", pline->szName, pline->szShortName)); 1266 nrSources++; 1267 1645 //add to array of mixer line pointers 1268 1646 pline->dwLineID = nrLines; 1269 pmixerLines[nrLines] = p line;1647 pmixerLines[nrLines] = pSource; 1270 1648 nrLines++; 1649 1650 //store line id in source to line mapping array 1651 pSource->id = dwSource; 1271 1652 1272 1653 //increase nr of inputs at destination line 1273 1654 pDestLine->line.cConnections++; 1274 pDestLine->Sources[pDestLine->cSources] = pline->dwSource; 1275 pDestLine->cSources++; 1276 1277 //store line id in source to line mapping array 1278 mixerSourceLineId[dwSource] = pline->dwLineID; 1279 1280 return pline; 1655 pDestLine->Connections[pDestLine->cConnections] = pline->dwLineID; 1656 pDestLine->cConnections++; 1657 1658 dprintf(("Adding Source %s (%s) with destination %s (%d -> %d)", pline->szName, pline->szShortName, pDestLine->line.szName, dwSource, pline->dwLineID)); 1659 1660 return pSource; 1281 1661 } 1282 1662 /******************************************************************************/ 1283 1663 /******************************************************************************/ 1284 static MIX ERDEST*mixerAddDestination(DWORD dwDest)1664 static MIXLINE *mixerAddDestination(DWORD dwDest) 1285 1665 { 1286 MIX ERDEST*pDest = &mixerDest[nrDestinations];1666 MIXLINE *pDest = &mixerDest[nrDestinations]; 1287 1667 MIXERLINEA *pline = &pDest->line; 1288 1668 … … 1337 1717 1338 1718 pline->dwLineID = nrLines; 1339 pmixerLines[nrLines] = p line;1719 pmixerLines[nrLines] = pDest; 1340 1720 nrLines++; 1721 1722 //save internal id 1723 pDest->id = dwDest; 1341 1724 return pDest; 1342 1725 } 1343 1726 /******************************************************************************/ 1344 1727 /******************************************************************************/ 1345 static MIXERCONTROLA * mixerAddControl(DWORD dwControl, MIX ERLINEA*pSrcLine)1728 static MIXERCONTROLA * mixerAddControl(DWORD dwControl, MIXLINE *pSrcLine) 1346 1729 { 1347 MIXERCONTROLA *pctrl = &mixerControls[nrControls]; 1730 MIXCONTROL *pmixctrl = &mixerControls[nrControls]; 1731 MIXERCONTROLA *pctrl = &pmixctrl->ctrl; 1348 1732 1349 1733 if(nrControls >= MAX_MIXER_CONTROLS) { … … 1467 1851 1468 1852 //add control to list of controls associated with source line 1469 for(int i=0;i<MAX_SOURCE_CONTROLS;i++) { 1470 if(mixerLineControls[pSrcLine->dwLineID][i] == -1) { 1471 mixerLineControls[pSrcLine->dwLineID][i] = pctrl->dwControlID; 1472 break; 1473 } 1474 } 1475 if(i == MAX_SOURCE_CONTROLS) { 1476 DebugInt3(); 1477 } 1478 //increase nr of controls of corresponding source line 1853 pSrcLine->Controls[pSrcLine->cControls] = pctrl->dwControlID; 1479 1854 pSrcLine->cControls++; 1480 1855 … … 1483 1858 1484 1859 //save internal id 1485 mixerControlId[nrControls]= dwControl;1860 pmixctrl->id = dwControl; 1486 1861 nrControls++; 1487 1862 dprintf(("Adding control %s (%s)", pctrl->szName, pctrl->szShortName));
Note:
See TracChangeset
for help on using the changeset viewer.