Changeset 166
- Timestamp:
- Mar 22, 2001, 7:13:01 PM (24 years ago)
- Location:
- sbliveos2/trunk/drv16
- Files:
-
- 2 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
sbliveos2/trunk/drv16/ioctl.cpp
r148 r166 24 24 #define INCL_NOPMAPI 25 25 #include <os2.h> 26 #include <os2me.h> 26 27 #include <audio.h> 27 28 … … 30 31 #include "mpu401.hpp" 31 32 #include "wavehw.hpp" 32 #include " wavestrm.hpp"33 #include "dwavestrm.hpp" 33 34 #include "midistrm.hpp" 34 35 … … 41 42 #include <parse.h> 42 43 #include "ioctl.h" 44 45 #include <daudio.h> 43 46 44 47 //Map of possible 256 supported ioctls (IOCTl 90 mixer api) … … 205 208 206 209 if (p->usIOCtlRequest != AUDIO_CHANGE) { 207 208 209 210 p->sReturnCode = INVALID_REQUEST; 211 prp->usStatus |= RPERR | RPBADCMD; 212 return; 210 213 } 211 214 p->sReturnCode=0; … … 217 220 addr += sizeof(MCI_AUDIO_CHANGE); 218 221 if(addr >= 0x10000UL) { 219 220 221 222 222 dprintf(("Invalid MCI_AUDIO_CHANGE pointer %lx!!", (ULONG)pAudChange)); 223 p->sReturnCode = INVALID_REQUEST; 224 prp->usStatus |= RPERR | RPBADCMD; 225 return; 223 226 } 224 227 pMasterVol = (LPMCI_TRACK_INFO)pAudChange->pvDevInfo; … … 228 231 addr += sizeof(MCI_TRACK_INFO); 229 232 if(addr >= 0x10000UL) { 230 231 232 233 233 dprintf(("Invalid MCI_TRACK_INFO pointer %lx!!", (ULONG)pMasterVol)); 234 p->sReturnCode = INVALID_REQUEST; 235 prp->usStatus |= RPERR | RPBADCMD; 236 return; 234 237 } 235 238 236 239 pStream = FindStream_fromFile((ULONG) prp->s.ioctl.usSysFileNum); 237 240 if(pStream == NULL) { 238 239 240 241 dprintf(("IoctlAudioControl stream %lx not found!", (ULONG) prp->s.ioctl.usSysFileNum)); 242 DebugInt3(); 243 return; 241 244 } 242 245 if(pAudChange->lBalance != AUDIO_IGNORE) 243 246 pStream->SetBalance(pAudChange->lBalance); 244 247 245 248 if(pAudChange->lVolume != AUDIO_IGNORE) { 246 247 248 249 250 251 } 252 249 // stream volume ranges from 0 to 0x7FFFFFFF (linear) 250 volume = pAudChange->lVolume >> 16UL; 251 volume = (volume*100UL)/0x7FFFUL; 252 dprintf(("Set stream volume of %x to %d", prp->s.ioctl.usSysFileNum, volume)); 253 pStream->SetVolume(MAKE_VOLUME_LR(volume, volume)); 254 } 255 253 256 if(pMasterVol && pMasterVol->usMasterVolume != AUDIO_IGNORE) { 254 255 256 volume = (volume*100UL)/0x7FFFUL; 257 258 259 260 261 257 // master volume ranges from 0 to 0x7FFF (linear) 258 volume = pMasterVol->usMasterVolume; 259 volume = (volume*100UL)/0x7FFFUL; 260 if(volume > 100) { 261 volume = 100; 262 } 263 dprintf(("Set mastervolume to %d", volume)); 264 pStream->SetMasterVol(MAKE_VOLUME_LR(volume, volume)); 262 265 } 263 266 if(!fRecSrcIOCTL90) { 264 for(int i=0;i<8;i++)265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 // 287 288 289 290 267 for(int i=0;i<8;i++) 268 { 269 switch(pAudChange->rInputList[0].ulDevType) { 270 case NULL_INPUT: 271 break; //continue; 272 case STEREO_LINE_INPUT: 273 case LEFT_LINE_INPUT: 274 case RIGHT_LINE_INPUT: 275 pStream->SetInputSrc(MIX_RECSRC_LINE); 276 break; 277 278 case MIC_INPUT: 279 case BOOSTED_MIC_INPUT: 280 pStream->SetInputSrc(MIX_RECSRC_MIC); 281 break; 282 283 case PHONE_LINE_INPUT: 284 case HANDSET_INPUT: 285 case SYNTH_INPUT: 286 case DIGITAL_PHONE_LINE_INPUT: 287 case DIGITAL_HANDSET_INPUT: 288 case MIDI_IN_PORT: 289 // case LOOPBACK: 290 pStream->SetInputSrc(MIX_RECSRC_MIXER); 291 break; 292 } 293 } 291 294 } 292 295 if(!fRecGainIOCTL90 && pAudChange->lGain != AUDIO_IGNORE) { 293 // input ranges from 0 to 0x7FFFFFFF (linear) 294 volume = pAudChange->lGain >> 16UL; 295 volume = (volume*100UL)/0x7FFFUL; 296 if(volume > 100) { 297 volume = 100; 298 } 299 dprintf(("Set input gain of %x to %d", prp->s.ioctl.usSysFileNum, volume)); 300 pStream->SetInputGain(MAKE_VOLUME_LR(volume, volume)); 301 } 296 // input ranges from 0 to 0x7FFFFFFF (linear) 297 volume = pAudChange->lGain >> 16UL; 298 volume = (volume*100UL)/0x7FFFUL; 299 if(volume > 100) { 300 volume = 100; 301 } 302 dprintf(("Set input gain of %x to %d", prp->s.ioctl.usSysFileNum, volume)); 303 pStream->SetInputGain(MAKE_VOLUME_LR(volume, volume)); 304 } 305 } 306 //****************************************************************************** 307 //****************************************************************************** 308 void IoctlDirectAudio(PREQPACKET prp) 309 { 310 PSTREAM pStream; 311 312 if(prp->s.ioctl.bCode == DAUDIO_OPEN) 313 { 314 LPMCI_AUDIO_INIT pInit = (LPMCI_AUDIO_INIT) prp->s.ioctl.pvData; 315 PAUDIOHW pHWobj; 316 MCI_AUDIO_CAPS audioCaps; 317 318 if(DevHelp_VerifyAccess(SELECTOROF(pInit), sizeof(MCI_AUDIO_INIT), OFFSETOF(pInit), VERIFY_READWRITE)) 319 { 320 dprintf(("Invalid MCI_AUDIO_INIT pointer %lx!!", (ULONG)pInit)); 321 prp->usStatus |= RPERR | RPBADCMD; 322 return; 323 } 324 325 audioCaps.ulLength = sizeof(MCI_AUDIO_CAPS); 326 audioCaps.ulSamplingRate = pInit->lSRate; 327 audioCaps.ulChannels = pInit->sChannels; 328 audioCaps.ulBitsPerSample = pInit->lBitsPerSRate; 329 audioCaps.ulDataType = pInit->sMode; 330 audioCaps.ulOperation = OPERATION_PLAY; 331 332 // get the pointer to the hardware object 333 // call DevCaps 334 // bailout if no hardware object is returned.. 335 pHWobj = GetHardwareDevice(AUDIOHW_WAVE_PLAY); 336 if (pHWobj) 337 { 338 pHWobj->DevCaps(&audioCaps); 339 if (audioCaps.ulSupport != SUPPORT_SUCCESS) { 340 dprintf(("IoctlDirectAudio: DevCaps failed")); 341 pInit->sReturnCode = INVALID_REQUEST; 342 prp->usStatus |= RPERR; 343 return; 344 } 345 } 346 else { 347 pInit->sReturnCode = INVALID_REQUEST; 348 prp->usStatus |= RPERR; 349 return; 350 } 351 352 pStream = new DWAVESTREAM(AUDIOHW_WAVE_PLAY, pInit, prp->s.ioctl.usSysFileNum); 353 if(pStream == NULL) { 354 DebugInt3(); 355 pInit->sReturnCode = INVALID_REQUEST; 356 prp->usStatus |= RPERR; 357 return; 358 } 359 360 pInit->ulFlags |= VOLUME; /* volume control is supported */ 361 pInit->ulFlags |= INPUT; /* Input select is supported */ 362 pInit->ulFlags |= OUTPUT; /* Output select is supported */ 363 pInit->ulFlags |= MONITOR; /* Record Monitor is supported */ 364 pInit->sDeviceID = SB_LIVE; /* Reported in VSD dll */ 365 pStream->ulSysFileNum = prp->s.ioctl.usSysFileNum; 366 pInit->pvReserved = (VOID FAR *) (ULONG) prp->s.ioctl.usSysFileNum; 367 pInit->sReturnCode = 0; 368 369 return; 370 } 371 else 372 if(prp->s.ioctl.bCode == DAUDIO_QUERYFORMAT) 373 { 374 LPMCI_AUDIO_INIT pInit = (LPMCI_AUDIO_INIT) prp->s.ioctl.pvData; 375 PAUDIOHW pHWobj; 376 MCI_AUDIO_CAPS audioCaps; 377 378 if(DevHelp_VerifyAccess(SELECTOROF(pInit), sizeof(MCI_AUDIO_INIT), OFFSETOF(pInit), VERIFY_READWRITE)) 379 { 380 dprintf(("Invalid MCI_AUDIO_INIT pointer %lx!!", (ULONG)pInit)); 381 prp->usStatus |= RPERR | RPBADCMD; 382 return; 383 } 384 385 audioCaps.ulLength = sizeof(MCI_AUDIO_CAPS); 386 audioCaps.ulSamplingRate = pInit->lSRate; 387 audioCaps.ulChannels = pInit->sChannels; 388 audioCaps.ulBitsPerSample = pInit->lBitsPerSRate; 389 audioCaps.ulDataType = pInit->sMode; 390 audioCaps.ulOperation = OPERATION_PLAY; 391 392 // get the pointer to the hardware object 393 // call DevCaps 394 // bailout if no hardware object is returned.. 395 pHWobj = GetHardwareDevice(AUDIOHW_WAVE_PLAY); 396 if (pHWobj) 397 { 398 pHWobj->DevCaps(&audioCaps); 399 if (audioCaps.ulSupport != SUPPORT_SUCCESS) { 400 dprintf(("IoctlDirectAudio: DevCaps failed")); 401 prp->usStatus |= RPERR; 402 pInit->sReturnCode = INVALID_REQUEST; 403 return; 404 } 405 pInit->sReturnCode = 0; 406 return; 407 } 408 else { 409 pInit->sReturnCode = INVALID_REQUEST; 410 prp->usStatus |= RPERR; 411 return; 412 } 413 } 414 415 pStream = FindStream_fromFile((ULONG) prp->s.ioctl.usSysFileNum); 416 if(pStream == NULL) { 417 dprintf(("IoctlDirectAudio stream %lx not found!", (ULONG) prp->s.ioctl.usSysFileNum)); 418 DebugInt3(); 419 prp->usStatus |= RPERR | RPBADCMD; 420 return; 421 } 422 423 LPDAUDIO_CMD pDAudioCmd = (LPDAUDIO_CMD) prp->s.ioctl.pvData; 424 ULONG rc = 0; 425 426 if(DevHelp_VerifyAccess(SELECTOROF(pDAudioCmd), sizeof(DAUDIO_CMD), OFFSETOF(pDAudioCmd), VERIFY_READWRITE)) 427 { 428 dprintf(("Invalid DAUDIO_CMD pointer %lx!!", (ULONG)pDAudioCmd)); 429 prp->usStatus |= RPERR | RPBADCMD; 430 return; 431 } 432 433 switch(prp->s.ioctl.bCode) 434 { 435 case DAUDIO_CLOSE: 436 delete pStream; 437 break; 438 439 case DAUDIO_SETVOLUME: 440 pStream->SetVolume(pDAudioCmd->Vol.Volume); 441 break; 442 443 case DAUDIO_GETVOLUME: 444 pDAudioCmd->Vol.Volume = pStream->GetVolume(); 445 break; 446 447 case DAUDIO_START: 448 rc = pStream->StartStream(); 449 break; 450 451 case DAUDIO_STOP: 452 { 453 CONTROL_PARM cParm; 454 rc = pStream->StopStream(&cParm); 455 break; 456 } 457 458 case DAUDIO_PAUSE: 459 { 460 CONTROL_PARM cParm; 461 rc = pStream->PauseStream(&cParm); 462 break; 463 } 464 465 case DAUDIO_RESUME: 466 rc = pStream->ResumeStream(); 467 break; 468 469 case DAUDIO_GETPOS: 470 pDAudioCmd->Pos.ulCurrentPos = pStream->GetCurrentPos(); 471 break; 472 473 case DAUDIO_ADDBUFFER: 474 { 475 rc = pStream->Write((PSTREAMBUF)pDAudioCmd->Buffer.lpBuffer, pDAudioCmd->Buffer.ulBufferLength); 476 break; 477 } 478 479 case DAUDIO_REGISTER_THREAD: 480 { 481 DDCMDREGISTER reg; 482 483 if(DevHelp_OpenEventSem(pDAudioCmd->Thread.hSemaphore) != 0) { 484 dprintf(("DevHlp_OpenEventSem %lx failed!", pDAudioCmd->Thread.hSemaphore)); 485 prp->usStatus |= RPERR | RPBADCMD; 486 return; 487 } 488 489 reg.ulFunction = DDCMD_REG_STREAM; 490 reg.hStream = pDAudioCmd->Thread.hSemaphore; 491 reg.ulSysFileNum = prp->s.ioctl.usSysFileNum; 492 reg.pSHDEntryPoint = NULL; 493 rc = pStream->Register(®); 494 break; 495 } 496 497 case DAUDIO_DEREGISTER_THREAD: 498 { 499 pStream->DeRegister(); 500 501 if(DevHelp_CloseEventSem(pDAudioCmd->Thread.hSemaphore) != 0) { 502 dprintf(("DevHlp_CloseEventSemaphore %lx failed!", pDAudioCmd->Thread.hSemaphore)); 503 prp->usStatus |= RPERR | RPBADCMD; 504 return; 505 } 506 break; 507 } 508 509 } 510 511 if(rc) { 512 prp->usStatus |= RPERR | RPBADCMD; 513 return; 514 } 515 return; 302 516 } 303 517 //****************************************************************************** … … 310 524 USHORT VolumeL, VolumeR; 311 525 312 if((prp->s.ioctl.bCode & 0xF0) == 0x40) 526 if((prp->s.ioctl.bCode & 0xF0) == 0x40) 313 527 { 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 528 if(DevHelp_VerifyAccess(SELECTOROF(pMixStruct), sizeof(MIXSTRUCT), OFFSETOF(pMixStruct), VERIFY_READWRITE)) 529 { 530 dprintf(("Invalid IOCTL90 pointer %lx!!", (ULONG)pMixStruct)); 531 prp->usStatus |= RPERR | RPBADCMD; 532 return; 533 } 534 MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeL = pMixStruct->VolumeL; 535 MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeR = pMixStruct->VolumeR; 536 MixerSettings[prp->s.ioctl.bCode & 0xF].Mute = pMixStruct->Mute; 537 VolumeL = (USHORT)pMixStruct->VolumeL; 538 VolumeR = (USHORT)pMixStruct->VolumeR; 539 if(prp->s.ioctl.bCode != BASSTREBLESET) { 540 if(pMixStruct->Mute == 1) 541 VolumeL = VolumeR = 0; 542 } 329 543 } 330 544 else 331 if((prp->s.ioctl.bCode & 0xF0) == 0x60) 545 if((prp->s.ioctl.bCode & 0xF0) == 0x60) 332 546 { 333 334 335 336 337 338 339 } 340 341 switch(prp->s.ioctl.bCode) {342 case MICSET:343 344 345 case LINESET:346 347 348 case CDSET:349 350 351 case VIDEOSET:352 353 354 case AUXSET:355 356 357 358 case BASSTREBLESET:359 360 361 547 if(DevHelp_VerifyAccess(SELECTOROF(pMixStruct), sizeof(MIXSTRUCT), OFFSETOF(pMixStruct), VERIFY_READONLY)) 548 { 549 dprintf(("Invalid IOCTL90 pointer %lx!!", (ULONG)pMixStruct)); 550 prp->usStatus |= RPERR | RPBADCMD; 551 return; 552 } 553 } 554 555 switch(prp->s.ioctl.bCode) { 556 case MICSET: 557 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETMICVOL, MAKE_VOLUME_LR(VolumeL, VolumeR)); 558 break; 559 case LINESET: 560 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETLINEINVOL, MAKE_VOLUME_LR(VolumeL, VolumeR)); 561 break; 562 case CDSET: 563 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETCDVOL, MAKE_VOLUME_LR(VolumeL, VolumeR)); 564 break; 565 case VIDEOSET: 566 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETVIDEOVOL, MAKE_VOLUME_LR(VolumeL, VolumeR)); 567 break; 568 case AUXSET: 569 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETAUXVOL, MAKE_VOLUME_LR(VolumeL, VolumeR)); 570 break; 571 572 case BASSTREBLESET: 573 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETBASS, MAKE_VOLUME_LR(VolumeL, VolumeL)); 574 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETTREBLE, MAKE_VOLUME_LR(VolumeR, VolumeR)); 575 break; 362 576 #if 0 363 case STREAMVOLSET:364 365 366 367 368 369 370 371 577 case STREAMVOLSET: 578 //release stream volume override? 579 if(pMixStruct->Mute == 2) { 580 fStreamVolIOCTL90 = FALSE; 581 break; 582 } 583 fStreamVolIOCTL90 = TRUE; 584 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETMASTERVOL, MAKE_VOLUME_LR(VolumeL, VolumeR)); 585 break; 372 586 #endif 373 587 374 case RECORDSRCSET:375 {376 int recsrc;377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 //case I90SRC_RES5:401 //case I90SRC_RES6:402 //case I90SRC_PHONE:403 404 405 406 407 break; 408 }409 case RECORDGAINSET:410 411 412 413 414 415 416 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETINPUTGAIN, MAKE_VOLUME_LR(VolumeL, VolumeR));417 418 419 case MICQUERY:420 case LINEQUERY:421 case AUXQUERY:422 case CDQUERY:423 case VIDEOQUERY:424 case RECORDSRCQUERY:425 case RECORDGAINQUERY:426 427 428 429 430 431 case BASSTREBLEQUERY:432 433 434 435 436 437 case APILEVELQUERY:438 439 440 441 442 443 444 445 446 447 case GETAPIMAP:448 449 450 451 452 453 454 455 588 case RECORDSRCSET: 589 { 590 int recsrc = MIX_RECSRC_LINE; 591 592 //release recording source override? 593 if(pMixStruct->Mute == 2) { 594 fRecSrcIOCTL90 = FALSE; 595 break; 596 } 597 fRecSrcIOCTL90 = TRUE; 598 switch(pMixStruct->VolumeL) { 599 case I90SRC_MIC: 600 recsrc = MIX_RECSRC_MIC; 601 break; 602 case I90SRC_CD: 603 recsrc = MIX_RECSRC_CD; 604 break; 605 case I90SRC_VIDEO: 606 recsrc = MIX_RECSRC_VIDEO; 607 break; 608 case I90SRC_LINE: 609 recsrc = MIX_RECSRC_LINE; 610 break; 611 case I90SRC_AUX: 612 recsrc = MIX_RECSRC_AUX; 613 break; 614 // case I90SRC_RES5: 615 // case I90SRC_RES6: 616 // case I90SRC_PHONE: 617 default: 618 break; 619 } 620 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETINPUTSRC, recsrc); 621 break; 622 } 623 case RECORDGAINSET: 624 //release recording gain override? 625 if(pMixStruct->Mute == 2) { 626 fRecGainIOCTL90 = FALSE; 627 break; 628 } 629 fRecGainIOCTL90 = TRUE; 630 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETINPUTGAIN, MAKE_VOLUME_LR(VolumeL, VolumeL)); 631 break; 632 633 case MICQUERY: 634 case LINEQUERY: 635 case AUXQUERY: 636 case CDQUERY: 637 case VIDEOQUERY: 638 case RECORDSRCQUERY: 639 case RECORDGAINQUERY: 640 pMixStruct->VolumeL = MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeL; 641 pMixStruct->VolumeR = MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeR; 642 pMixStruct->Mute = MixerSettings[prp->s.ioctl.bCode & 0xF].Mute; 643 break; 644 645 case BASSTREBLEQUERY: 646 pMixStruct->VolumeL = MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeL; 647 pMixStruct->VolumeR = MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeR; 648 pMixStruct->Mute = 3; //bass & treble 649 break; 650 651 case APILEVELQUERY: 652 if(DevHelp_VerifyAccess(SELECTOROF(pIoctlData), sizeof(ULONG), OFFSETOF(pIoctlData), VERIFY_READWRITE)) 653 { 654 dprintf(("Invalid IOCTL90 pointer %lx!!", (ULONG)pIoctlData)); 655 prp->usStatus |= RPERR | RPBADCMD; 656 return; 657 } 658 *pIoctlData = 2; 659 break; 660 661 case GETAPIMAP: 662 if(DevHelp_VerifyAccess(SELECTOROF(pIoctlMap), sizeof(SBLiveIOCTLMap), OFFSETOF(pIoctlMap), VERIFY_READWRITE)) 663 { 664 dprintf(("Invalid IOCTL90 pointer %lx!!", (ULONG)pMixStruct)); 665 prp->usStatus |= RPERR | RPBADCMD; 666 return; 667 } 668 _fmemcpy(pIoctlMap, SBLiveIOCTLMap, sizeof(SBLiveIOCTLMap)); 669 break; 456 670 // case STREAMVOLQUERY: 457 671 // case MONOINSET: … … 463 677 // case CALLBACKREG: 464 678 // case MSGBUF: 465 default:466 467 468 }679 default: 680 prp->usStatus |= RPERR | RPBADCMD; 681 return; 682 } 469 683 } 470 684 //****************************************************************************** … … 475 689 MIXSTRUCT mixinfo; 476 690 477 478 479 480 481 482 483 484 485 486 487 488 489 //// 490 //// 491 492 493 494 495 496 497 // 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 691 SBLiveIOCTLMap[MICSET] = 1; 692 SBLiveIOCTLMap[MICQUERY] = 1; 693 SBLiveIOCTLMap[LINESET] = 1; 694 SBLiveIOCTLMap[LINEQUERY] = 1; 695 SBLiveIOCTLMap[CDSET] = 1; 696 SBLiveIOCTLMap[CDQUERY] = 1; 697 SBLiveIOCTLMap[VIDEOSET] = 1; 698 SBLiveIOCTLMap[VIDEOQUERY] = 1; 699 SBLiveIOCTLMap[AUXSET] = 1; 700 SBLiveIOCTLMap[AUXQUERY] = 1; 701 SBLiveIOCTLMap[BASSTREBLESET] = 1; 702 SBLiveIOCTLMap[BASSTREBLEQUERY] = 1; 703 //// SBLiveIOCTLMap[STREAMVOLSET] = 1; 704 //// SBLiveIOCTLMap[STREAMVOLQUERY] = 1; 705 SBLiveIOCTLMap[RECORDSRCSET] = 1; 706 SBLiveIOCTLMap[RECORDSRCQUERY] = 1; 707 SBLiveIOCTLMap[RECORDGAINSET] = 1; 708 SBLiveIOCTLMap[RECORDGAINQUERY] = 1; 709 SBLiveIOCTLMap[APILEVELQUERY] = 1; 710 SBLiveIOCTLMap[GETAPIMAP] = 1; 711 // SBLiveIOCTLMap[CALLBACKREG] = 1; 712 713 //Set mic 714 rp.s.ioctl.bCode = MICSET; 715 rp.s.ioctl.pvData = (void FAR *)&mixinfo; 716 mixinfo.Mute = fMicMute; 717 mixinfo.VolumeR = mixinfo.VolumeL = 60; 718 IoctlMixer(&rp); 719 720 //Set line 721 rp.s.ioctl.bCode = LINESET; 722 rp.s.ioctl.pvData = (void FAR *)&mixinfo; 723 mixinfo.Mute = fLineMute; 724 mixinfo.VolumeR = mixinfo.VolumeL = 80; 725 IoctlMixer(&rp); 726 727 //Set CD 728 rp.s.ioctl.bCode = CDSET; 729 rp.s.ioctl.pvData = (void FAR *)&mixinfo; 730 mixinfo.Mute = fCDMute; 731 mixinfo.VolumeR = mixinfo.VolumeL = 80; 732 IoctlMixer(&rp); 733 734 //Set bass/treble 735 rp.s.ioctl.bCode = BASSTREBLESET; 736 rp.s.ioctl.pvData = (void FAR *)&mixinfo; 737 mixinfo.Mute = 3; 738 mixinfo.VolumeR = mixinfo.VolumeL = 50; 739 IoctlMixer(&rp); 740 741 //Set recording source to line in 742 rp.s.ioctl.bCode = RECORDSRCSET; 743 rp.s.ioctl.pvData = (void FAR *)&mixinfo; 744 mixinfo.Mute = 0; 745 mixinfo.VolumeL = I90SRC_LINE; 746 IoctlMixer(&rp); 747 748 //Release recording source override 749 rp.s.ioctl.bCode = RECORDSRCSET; 750 rp.s.ioctl.pvData = (void FAR *)&mixinfo; 751 mixinfo.Mute = 2; 752 mixinfo.VolumeL = I90SRC_LINE; 753 IoctlMixer(&rp); 754 755 //Set master volume 756 rp.s.ioctl.bCode = STREAMVOLSET; 757 rp.s.ioctl.pvData = (void FAR *)&mixinfo; 758 mixinfo.Mute = 0; 759 mixinfo.VolumeR = mixinfo.VolumeL = 90; 760 IoctlMixer(&rp); 761 762 //Release master volume override 763 rp.s.ioctl.bCode = STREAMVOLSET; 764 rp.s.ioctl.pvData = (void FAR *)&mixinfo; 765 mixinfo.Mute = 2; 766 mixinfo.VolumeR = mixinfo.VolumeL = 90; 767 IoctlMixer(&rp); 554 768 } 555 769 //****************************************************************************** … … 569 783 extern "C" void StrategyIoctl(PREQPACKET prp, USHORT LDev) 570 784 { 571 if(prp->s.ioctl.bCategory == 0x90) { 572 IoctlMixer(prp); 573 return; 574 } 575 if(prp->s.ioctl.bCategory != AUDIO_IOCTL_CAT) { 576 prp->usStatus |= RPERR | RPBADCMD; 577 return; 578 } 579 580 switch (prp->s.ioctl.bCode) { 581 case AUDIO_INIT: 582 IoctlAudioInit(prp, LDev); 583 break; 584 case AUDIO_CONTROL: 585 IoctlAudioControl(prp); 586 break; 587 case AUDIO_CAPABILITY: 588 IoctlAudioCapability(prp, LDev); 589 break; 590 default: 591 prp->usStatus |= RPERR | RPBADCMD; 592 break; 593 } 594 return; 785 if(prp->s.ioctl.bCategory == DAUDIO_IOCTL_CAT) { 786 IoctlDirectAudio(prp); 787 return; 788 } 789 790 if(prp->s.ioctl.bCategory == 0x90) { 791 IoctlMixer(prp); 792 return; 793 } 794 if(prp->s.ioctl.bCategory != AUDIO_IOCTL_CAT) { 795 prp->usStatus |= RPERR | RPBADCMD; 796 return; 797 } 798 799 switch (prp->s.ioctl.bCode) 800 { 801 case AUDIO_INIT: 802 IoctlAudioInit(prp, LDev); 803 break; 804 case AUDIO_CONTROL: 805 IoctlAudioControl(prp); 806 break; 807 case AUDIO_CAPABILITY: 808 IoctlAudioCapability(prp, LDev); 809 break; 810 default: 811 prp->usStatus |= RPERR | RPBADCMD; 812 break; 813 } 814 return; 595 815 } -
sbliveos2/trunk/drv16/makefile.os2
r148 r166 109 109 OBJS7=parse.obj queue.obj rm.obj rtmidi.obj 110 110 OBJS8=ssm_idc.obj strategy.obj stream.obj timer.obj vddentry.obj waudio.obj 111 OBJS9=waveplay.obj waverec.obj wavestrm.obj ossidc16.obj111 OBJS9=waveplay.obj waverec.obj wavestrm.obj dwavestrm.obj ossidc16.obj 112 112 OBJS=$(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) $(OBJS6) $(OBJS7) $(OBJS8) $(OBJS9) 113 113 -
sbliveos2/trunk/drv16/stream.cpp
r147 r166 88 88 void STREAM::ProcessEvents(void) 89 89 { 90 //SvL: BUGFIX: check all events 91 #if 1 92 if (qhEvent.IsElements()) { 93 PEVENT pnextevent = (PEVENT)qhEvent.Head(); 94 ULONG time = GetCurrentTime(); 95 while(pnextevent) { 96 ULONG eventtime = pnextevent->GetEventTime(); 97 if (eventtime <= time) 98 pnextevent->Report(time); 99 pnextevent = (PEVENT)pnextevent->pNext; 100 } 101 } 102 #else 90 103 if (qhEvent.IsElements()) { 91 104 PEVENT pnextevent = (PEVENT)qhEvent.Head(); … … 95 108 pnextevent->Report(time); 96 109 } 97 98 } 110 #endif 111 } 112 99 113 ULONG STREAM::EnableEvent(PDDCMDCONTROL pControl) 100 114 { … … 174 188 175 189 176 virtual ULONG STREAM::Write(PSTREAMBUF pbuf, unsigneduLength)190 virtual ULONG STREAM::Write(PSTREAMBUF pbuf, ULONG uLength) 177 191 { 178 192 qhInProcess.PushOnTail((PQUEUEELEMENT)new STREAMBUFFER(uLength, pbuf)); -
sbliveos2/trunk/drv16/stream.hpp
r142 r166 82 82 virtual ULONG Register(PDDCMDREGISTER); 83 83 void DeRegister(void); 84 virtual ULONG Write(PSTREAMBUF, unsigned);84 virtual ULONG Write(PSTREAMBUF, ULONG); 85 85 virtual ULONG Read(PSTREAMBUF, unsigned) = 0; 86 86 virtual ULONG GetCurrentTime(void) = 0; 87 virtual ULONG GetCurrentPos(void) = 0; 87 88 virtual void SetCurrentTime(ULONG time) = 0; 88 89 virtual ULONG StartStream(void) = 0; … … 94 95 virtual void SetInputGain(ULONG gain); 95 96 virtual void SetVolume(ULONG volume); 97 ULONG GetVolume() { return volume; }; 96 98 virtual void SetBalance(ULONG balance); 97 99 virtual BOOL SetMasterVol(ULONG volume); … … 104 106 ULONG ulCurrentTime; 105 107 PAUDIOHW pahw; // pointer to the hardware object for this stream 106 v oid ReturnBuffer(void); // returns one buffer108 virtual void ReturnBuffer(void); // returns one buffer 107 109 void ReturnBuffers(void); // returns all buffers 108 110 void ProcessEvents(void); -
sbliveos2/trunk/drv16/strmbuff.hpp
r142 r166 44 44 typedef STREAMBUFFER *PSTREAMBUFFER; 45 45 46 47 class STREAMBUFFEREX : public STREAMBUFFER 48 { 49 public: 50 STREAMBUFFEREX(ULONG bufsize, PSTREAMBUF bufptr, ULONG lockHandle): 51 STREAMBUFFER(bufsize, bufptr), hLock(lockHandle), fDone(FALSE) 52 {}; 53 54 ULONG hLock; 55 BOOL fDone; 56 57 }; 58 typedef STREAMBUFFEREX *PSTREAMBUFFEREX; 59 46 60 #endif -
sbliveos2/trunk/drv16/vddentry.asm
r151 r166 103 103 _OSSIDC_ENTRY ENDP 104 104 105 PUBLIC HookHandlerAsm_ 106 EXTERN _HookHandler:near 107 HookHandlerAsm_ PROC FAR 108 push eax 109 call _HookHandler 110 add sp, 4 111 retf 112 HookHandlerAsm_ ENDP 113 105 114 PUBLIC _inpd 106 115 _inpd proc near -
sbliveos2/trunk/drv16/wavestrm.cpp
r160 r166 316 316 } 317 317 318 ULONG WAVESTREAM::Write(PSTREAMBUF pbuf, unsigned uLength) 319 { 320 qhInProcess.PushOnTail((PQUEUEELEMENT)new STREAMBUFFER(uLength, pbuf)); 318 ULONG WAVESTREAM::Write(PSTREAMBUF pbuf, ULONG uLength) 319 { 320 PSTREAMBUFFER pStreamBuf = new STREAMBUFFER(uLength, pbuf); 321 322 return Write(pStreamBuf); 323 } 324 325 ULONG WAVESTREAM::Write(PSTREAMBUFFER pStreamBuf) 326 { 327 qhInProcess.PushOnTail((PQUEUEELEMENT)pStreamBuf); 321 328 dprintf2(("WAVESTREAM::Write: Push on tail %lx %d", ((PSTREAMBUFFER)qhInProcess.Head())->pBuffptr, ((PSTREAMBUFFER)qhInProcess.Head())->ulBuffsz)); 322 329 if(fUnderrun) { … … 376 383 } 377 384 385 ULONG WAVESTREAM::GetCurrentPos(void) 386 { 387 ULONG Processed; 388 389 if (ulStreamState == STREAM_STREAMING) // if the stream is active 390 { 391 if (ulStreamType & STREAM_WRITE) { 392 OSS16_StreamGetPos(this, &Processed); 393 } 394 else Processed = _ulBytesProcessed; 395 } 396 else Processed = _ulBytesProcessed; 397 398 return Processed; 399 } 400 378 401 // 379 402 // SetCurrentTime -
sbliveos2/trunk/drv16/wavestrm.hpp
r160 r166 39 39 void Process(void); // called every timer interrupt 40 40 virtual ULONG GetCurrentTime(void); 41 virtual ULONG GetCurrentPos(void); 41 42 virtual void SetCurrentTime(ULONG time); 42 43 virtual ULONG Read(PSTREAMBUF, unsigned); 43 virtual ULONG Write(PSTREAMBUF, unsigned); 44 virtual ULONG Write(PSTREAMBUF, ULONG); 45 ULONG Write(PSTREAMBUFFER); 44 46 virtual ULONG StartStream(void); 45 47 virtual ULONG StopStream(PCONTROL_PARM);
Note:
See TracChangeset
for help on using the changeset viewer.