Changeset 166 for sbliveos2/trunk/drv16
- Timestamp:
- Mar 22, 2001, 7:13:01 PM (25 years ago)
- Location:
- sbliveos2/trunk/drv16
- Files:
-
- 2 added
- 8 edited
-
dwavestrm.cpp (added)
-
dwavestrm.hpp (added)
-
ioctl.cpp (modified) (10 diffs)
-
makefile.os2 (modified) (1 diff)
-
stream.cpp (modified) (3 diffs)
-
stream.hpp (modified) (3 diffs)
-
strmbuff.hpp (modified) (1 diff)
-
vddentry.asm (modified) (1 diff)
-
wavestrm.cpp (modified) (2 diffs)
-
wavestrm.hpp (modified) (1 diff)
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 p->sReturnCode = INVALID_REQUEST;208 prp->usStatus |= RPERR | RPBADCMD;209 return;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 dprintf(("Invalid MCI_AUDIO_CHANGE pointer %lx!!", (ULONG)pAudChange));220 p->sReturnCode = INVALID_REQUEST;221 prp->usStatus |= RPERR | RPBADCMD;222 return;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 dprintf(("Invalid MCI_TRACK_INFO pointer %lx!!", (ULONG)pMasterVol));231 p->sReturnCode = INVALID_REQUEST;232 prp->usStatus |= RPERR | RPBADCMD;233 return;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 dprintf(("IoctlAudioControl stream %lx not found!", (ULONG) prp->s.ioctl.usSysFileNum));239 DebugInt3();240 return;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 pStream->SetBalance(pAudChange->lBalance);246 pStream->SetBalance(pAudChange->lBalance); 244 247 245 248 if(pAudChange->lVolume != AUDIO_IGNORE) { 246 // stream volume ranges from 0 to 0x7FFFFFFF (linear)247 volume = pAudChange->lVolume >> 16UL;248 volume = (volume*100UL)/0x7FFFUL;249 dprintf(("Set stream volume of %x to %d", prp->s.ioctl.usSysFileNum, volume));250 pStream->SetVolume(MAKE_VOLUME_LR(volume, volume));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 // master volume ranges from 0 to 0x7FFF (linear)255 volume = pMasterVol->usMasterVolume;256 volume = (volume*100UL)/0x7FFFUL; 257 if(volume > 100) {258 volume = 100;259 }260 dprintf(("Set mastervolume to %d", volume));261 pStream->SetMasterVol(MAKE_VOLUME_LR(volume, volume));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 switch(pAudChange->rInputList[0].ulDevType) {267 case NULL_INPUT:268 break; //continue;269 case STEREO_LINE_INPUT:270 case LEFT_LINE_INPUT:271 case RIGHT_LINE_INPUT:272 pStream->SetInputSrc(MIX_RECSRC_LINE);273 break;274 275 case MIC_INPUT:276 case BOOSTED_MIC_INPUT:277 pStream->SetInputSrc(MIX_RECSRC_MIC);278 break;279 280 case PHONE_LINE_INPUT:281 case HANDSET_INPUT:282 case SYNTH_INPUT:283 case DIGITAL_PHONE_LINE_INPUT:284 case DIGITAL_HANDSET_INPUT:285 case MIDI_IN_PORT:286 // case LOOPBACK:287 pStream->SetInputSrc(MIX_RECSRC_MIXER);288 break;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 if(DevHelp_VerifyAccess(SELECTOROF(pMixStruct), sizeof(MIXSTRUCT), OFFSETOF(pMixStruct), VERIFY_READWRITE))315 {316 dprintf(("Invalid IOCTL90 pointer %lx!!", (ULONG)pMixStruct));317 prp->usStatus |= RPERR | RPBADCMD;318 return;319 }320 MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeL = pMixStruct->VolumeL;321 MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeR = pMixStruct->VolumeR;322 MixerSettings[prp->s.ioctl.bCode & 0xF].Mute = pMixStruct->Mute;323 VolumeL = (USHORT)pMixStruct->VolumeL;324 VolumeR = (USHORT)pMixStruct->VolumeR;325 if(prp->s.ioctl.bCode != BASSTREBLESET) {326 if(pMixStruct->Mute == 1)327 VolumeL = VolumeR = 0;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 if(DevHelp_VerifyAccess(SELECTOROF(pMixStruct), sizeof(MIXSTRUCT), OFFSETOF(pMixStruct), VERIFY_READONLY))334 {335 dprintf(("Invalid IOCTL90 pointer %lx!!", (ULONG)pMixStruct));336 prp->usStatus |= RPERR | RPBADCMD;337 return;338 }339 } 340 341 switch(prp->s.ioctl.bCode) {342 case MICSET:343 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETMICVOL, MAKE_VOLUME_LR(VolumeL, VolumeR));344 break;345 case LINESET:346 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETLINEINVOL, MAKE_VOLUME_LR(VolumeL, VolumeR));347 break;348 case CDSET:349 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETCDVOL, MAKE_VOLUME_LR(VolumeL, VolumeR));350 break;351 case VIDEOSET:352 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETVIDEOVOL, MAKE_VOLUME_LR(VolumeL, VolumeR));353 break;354 case AUXSET:355 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETAUXVOL, MAKE_VOLUME_LR(VolumeL, VolumeR));356 break;357 358 case BASSTREBLESET:359 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETBASS, MAKE_VOLUME_LR(VolumeL, VolumeL));360 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETTREBLE, MAKE_VOLUME_LR(VolumeR, VolumeR));361 break;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 //release stream volume override?365 if(pMixStruct->Mute == 2) {366 fStreamVolIOCTL90 = FALSE;367 break;368 }369 fStreamVolIOCTL90 = TRUE;370 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETMASTERVOL, MAKE_VOLUME_LR(VolumeL, VolumeR));371 break;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 //release recording source override?379 if(pMixStruct->Mute == 2) {380 fRecSrcIOCTL90 = FALSE;381 break;382 }383 fRecSrcIOCTL90 = TRUE;384 switch(pMixStruct->VolumeL) {385 case I90SRC_MIC:386 recsrc = MIX_RECSRC_MIC;387 break;388 case I90SRC_CD:389 recsrc = MIX_RECSRC_CD;390 break;391 case I90SRC_VIDEO:392 recsrc = MIX_RECSRC_VIDEO;393 break;394 case I90SRC_LINE:395 recsrc = MIX_RECSRC_LINE;396 break;397 case I90SRC_AUX:398 recsrc = MIX_RECSRC_AUX;399 break;400 //case I90SRC_RES5:401 //case I90SRC_RES6:402 //case I90SRC_PHONE:403 default:404 break;405 }406 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETINPUTSRC, recsrc);407 break; 408 }409 case RECORDGAINSET:410 //release recording gain override?411 if(pMixStruct->Mute == 2) {412 fRecGainIOCTL90 = FALSE;413 break;414 }415 fRecGainIOCTL90 = TRUE;416 OSS16_SetGlobalVol(prp->s.ioctl.usSysFileNum, MIX_SETINPUTGAIN, MAKE_VOLUME_LR(VolumeL, VolumeR));417 break;418 419 case MICQUERY:420 case LINEQUERY:421 case AUXQUERY:422 case CDQUERY:423 case VIDEOQUERY:424 case RECORDSRCQUERY:425 case RECORDGAINQUERY:426 pMixStruct->VolumeL = MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeL;427 pMixStruct->VolumeR = MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeR;428 pMixStruct->Mute = MixerSettings[prp->s.ioctl.bCode & 0xF].Mute;429 break;430 431 case BASSTREBLEQUERY:432 pMixStruct->VolumeL = MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeL;433 pMixStruct->VolumeR = MixerSettings[prp->s.ioctl.bCode & 0xF].VolumeR;434 pMixStruct->Mute = 3; //bass & treble435 break;436 437 case APILEVELQUERY:438 if(DevHelp_VerifyAccess(SELECTOROF(pIoctlData), sizeof(ULONG), OFFSETOF(pIoctlData), VERIFY_READWRITE))439 {440 dprintf(("Invalid IOCTL90 pointer %lx!!", (ULONG)pIoctlData));441 prp->usStatus |= RPERR | RPBADCMD;442 return;443 }444 *pIoctlData = 2;445 break;446 447 case GETAPIMAP:448 if(DevHelp_VerifyAccess(SELECTOROF(pIoctlMap), sizeof(SBLiveIOCTLMap), OFFSETOF(pIoctlMap), VERIFY_READWRITE))449 {450 dprintf(("Invalid IOCTL90 pointer %lx!!", (ULONG)pMixStruct));451 prp->usStatus |= RPERR | RPBADCMD;452 return;453 }454 _fmemcpy(pIoctlMap, SBLiveIOCTLMap, sizeof(SBLiveIOCTLMap));455 break;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 prp->usStatus |= RPERR | RPBADCMD;467 return;468 }679 default: 680 prp->usStatus |= RPERR | RPBADCMD; 681 return; 682 } 469 683 } 470 684 //****************************************************************************** … … 475 689 MIXSTRUCT mixinfo; 476 690 477 SBLiveIOCTLMap[MICSET] = 1;478 SBLiveIOCTLMap[MICQUERY] = 1;479 SBLiveIOCTLMap[LINESET] = 1;480 SBLiveIOCTLMap[LINEQUERY] = 1;481 SBLiveIOCTLMap[CDSET] = 1;482 SBLiveIOCTLMap[CDQUERY] = 1;483 SBLiveIOCTLMap[VIDEOSET] = 1;484 SBLiveIOCTLMap[VIDEOQUERY] = 1;485 SBLiveIOCTLMap[AUXSET] = 1;486 SBLiveIOCTLMap[AUXQUERY] = 1;487 SBLiveIOCTLMap[BASSTREBLESET] = 1;488 SBLiveIOCTLMap[BASSTREBLEQUERY] = 1;489 //// SBLiveIOCTLMap[STREAMVOLSET] = 1;490 //// SBLiveIOCTLMap[STREAMVOLQUERY] = 1;491 SBLiveIOCTLMap[RECORDSRCSET] = 1;492 SBLiveIOCTLMap[RECORDSRCQUERY] = 1;493 SBLiveIOCTLMap[RECORDGAINSET] = 1;494 SBLiveIOCTLMap[RECORDGAINQUERY] = 1;495 SBLiveIOCTLMap[APILEVELQUERY] = 1;496 SBLiveIOCTLMap[GETAPIMAP] = 1;497 // SBLiveIOCTLMap[CALLBACKREG] = 1;498 499 //Set mic500 rp.s.ioctl.bCode = MICSET;501 rp.s.ioctl.pvData = (void FAR *)&mixinfo;502 mixinfo.Mute = fMicMute;503 mixinfo.VolumeR = mixinfo.VolumeL = 60;504 IoctlMixer(&rp);505 506 //Set line507 rp.s.ioctl.bCode = LINESET;508 rp.s.ioctl.pvData = (void FAR *)&mixinfo;509 mixinfo.Mute = fLineMute;510 mixinfo.VolumeR = mixinfo.VolumeL = 80;511 IoctlMixer(&rp);512 513 //Set CD514 rp.s.ioctl.bCode = CDSET;515 rp.s.ioctl.pvData = (void FAR *)&mixinfo;516 mixinfo.Mute = fCDMute;517 mixinfo.VolumeR = mixinfo.VolumeL = 80;518 IoctlMixer(&rp);519 520 //Set bass/treble521 rp.s.ioctl.bCode = BASSTREBLESET;522 rp.s.ioctl.pvData = (void FAR *)&mixinfo;523 mixinfo.Mute = 3;524 mixinfo.VolumeR = mixinfo.VolumeL = 50;525 IoctlMixer(&rp);526 527 //Set recording source to line in528 rp.s.ioctl.bCode = RECORDSRCSET;529 rp.s.ioctl.pvData = (void FAR *)&mixinfo;530 mixinfo.Mute = 0;531 mixinfo.VolumeL = I90SRC_LINE;532 IoctlMixer(&rp);533 534 //Release recording source override535 rp.s.ioctl.bCode = RECORDSRCSET;536 rp.s.ioctl.pvData = (void FAR *)&mixinfo;537 mixinfo.Mute = 2;538 mixinfo.VolumeL = I90SRC_LINE;539 IoctlMixer(&rp);540 541 //Set master volume542 rp.s.ioctl.bCode = STREAMVOLSET;543 rp.s.ioctl.pvData = (void FAR *)&mixinfo;544 mixinfo.Mute = 0;545 mixinfo.VolumeR = mixinfo.VolumeL = 90;546 IoctlMixer(&rp);547 548 //Release master volume override549 rp.s.ioctl.bCode = STREAMVOLSET;550 rp.s.ioctl.pvData = (void FAR *)&mixinfo;551 mixinfo.Mute = 2;552 mixinfo.VolumeR = mixinfo.VolumeL = 90;553 IoctlMixer(&rp);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.
