Ignore:
Timestamp:
Apr 30, 2001, 11:08:00 PM (24 years ago)
Author:
sandervl
Message:

DirectAudio interface updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sbliveos2/trunk/drv16/ioctl.cpp

    r172 r178  
    5353BOOL      fRecGainIOCTL90     = FALSE;
    5454
     55int       numFreeStreams      = SBLIVECAPS_MAXSTREAMS;
     56
    5557/**@internal
    5658 * @param    PREQPACKET pointer to the strategy request packet
     
    208210
    209211   if (p->usIOCtlRequest != AUDIO_CHANGE) {
    210     p->sReturnCode = INVALID_REQUEST;
    211     prp->usStatus |= RPERR | RPBADCMD;
    212     return;
     212       p->sReturnCode = INVALID_REQUEST;
     213       prp->usStatus |= RPERR | RPBADCMD;
     214       return;
    213215   }
    214216   p->sReturnCode=0;
     
    220222   addr += sizeof(MCI_AUDIO_CHANGE);
    221223   if(addr >= 0x10000UL) {
    222     dprintf(("Invalid MCI_AUDIO_CHANGE pointer %lx!!", (ULONG)pAudChange));
    223     p->sReturnCode = INVALID_REQUEST;
    224     prp->usStatus |= RPERR | RPBADCMD;
    225     return;
     224       dprintf(("Invalid MCI_AUDIO_CHANGE pointer %lx!!", (ULONG)pAudChange));
     225       p->sReturnCode = INVALID_REQUEST;
     226       prp->usStatus |= RPERR | RPBADCMD;
     227       return;
    226228   }
    227229   pMasterVol = (LPMCI_TRACK_INFO)pAudChange->pvDevInfo;
     
    231233   addr += sizeof(MCI_TRACK_INFO);
    232234   if(addr >= 0x10000UL) {
    233     dprintf(("Invalid MCI_TRACK_INFO pointer %lx!!", (ULONG)pMasterVol));
    234     p->sReturnCode = INVALID_REQUEST;
    235     prp->usStatus |= RPERR | RPBADCMD;
    236     return;
     235       dprintf(("Invalid MCI_TRACK_INFO pointer %lx!!", (ULONG)pMasterVol));
     236       p->sReturnCode = INVALID_REQUEST;
     237       prp->usStatus |= RPERR | RPBADCMD;
     238       return;
    237239   }
    238240
    239241   pStream = FindStream_fromFile((ULONG) prp->s.ioctl.usSysFileNum);
    240242   if(pStream == NULL) {
    241     dprintf(("IoctlAudioControl stream %lx not found!", (ULONG) prp->s.ioctl.usSysFileNum));
    242     DebugInt3();
    243     return;
     243       dprintf(("IoctlAudioControl stream %lx not found!", (ULONG) prp->s.ioctl.usSysFileNum));
     244       DebugInt3();
     245       return;
    244246   }
    245247   if(pAudChange->lBalance != AUDIO_IGNORE)
    246     pStream->SetBalance(pAudChange->lBalance);
     248       pStream->SetProperty(PROPERTY_BALANCE, pAudChange->lBalance);
    247249
    248250   if(pAudChange->lVolume != AUDIO_IGNORE) {
    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));
     251       // stream volume ranges from 0 to 0x7FFFFFFF (linear)
     252       volume = pAudChange->lVolume >> 16UL;
     253       volume = (volume*100UL)/0x7FFFUL;
     254       dprintf(("Set stream volume of %x to %d", prp->s.ioctl.usSysFileNum, volume));
     255       pStream->SetProperty(PROPERTY_VOLUME, MAKE_VOLUME_LR(volume, volume));
    254256   }
    255257
    256258   if(pMasterVol && pMasterVol->usMasterVolume != AUDIO_IGNORE) {
    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));
     259       // master volume ranges from 0 to 0x7FFF (linear)
     260       volume = pMasterVol->usMasterVolume;
     261       volume = (volume*100UL)/0x7FFFUL;
     262       if(volume > 100) {
     263           volume = 100;
     264       }
     265       dprintf(("Set mastervolume to %d", volume));
     266       pStream->SetProperty(PROPERTY_MASTERVOL, MAKE_VOLUME_LR(volume, volume));
    265267   }
    266268   if(!fRecSrcIOCTL90) {
     
    273275        case LEFT_LINE_INPUT:
    274276        case RIGHT_LINE_INPUT:
    275             pStream->SetInputSrc(MIX_RECSRC_LINE);
     277            pStream->SetProperty(PROPERTY_INPUTSRC, MIX_RECSRC_LINE);
    276278            break;
    277279
    278280        case MIC_INPUT:
    279281        case BOOSTED_MIC_INPUT:
    280             pStream->SetInputSrc(MIX_RECSRC_MIC);
     282            pStream->SetProperty(PROPERTY_INPUTSRC, MIX_RECSRC_MIC);
    281283            break;
    282284
     
    288290        case MIDI_IN_PORT:
    289291//      case LOOPBACK:
    290             pStream->SetInputSrc(MIX_RECSRC_MIXER);
     292            pStream->SetProperty(PROPERTY_INPUTSRC, MIX_RECSRC_MIXER);
    291293            break;
    292294        }
     
    294296   }
    295297   if(!fRecGainIOCTL90 && pAudChange->lGain != AUDIO_IGNORE) {
    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));
     298       // input ranges from 0 to 0x7FFFFFFF (linear)
     299       volume = pAudChange->lGain >> 16UL;
     300       volume = (volume*100UL)/0x7FFFUL;
     301       if(volume > 100) {
     302           volume = 100;
     303       }
     304       dprintf(("Set input gain of %x to %d", prp->s.ioctl.usSysFileNum, volume));
     305       pStream->SetProperty(PROPERTY_INPUTGAIN, MAKE_VOLUME_LR(volume, volume));
    304306   }
    305307}
     
    418420        }
    419421    }
    420 
     422    else
     423    if(prp->s.ioctl.bCode == DAUDIO_QUERYCAPS)
     424    {
     425        LPDAUDIO_CAPS lpCaps = (LPDAUDIO_CAPS) prp->s.ioctl.pvData;
     426        PWAVEAUDIO pHWobj;
     427
     428        if(DevHelp_VerifyAccess(SELECTOROF(lpCaps), sizeof(DAUDIO_CAPS), OFFSETOF(lpCaps), VERIFY_READWRITE) ||
     429           lpCaps->dwSize != sizeof(DAUDIO_CAPS))
     430        {
     431            dprintf(("Invalid DAUDIO_CAPS pointer %lx!!", (ULONG)lpCaps));
     432            prp->usStatus |= RPERR | RPBADCMD;
     433            return;
     434        }
     435        // get the pointer to the hardware object
     436        // call DevCaps
     437        // bailout if no hardware object is returned..
     438        pHWobj = (PWAVEAUDIO)GetHardwareDevice(AUDIOHW_WAVE_PLAY);
     439        if (pHWobj)
     440        {
     441            pHWobj->DevCaps(lpCaps);
     442            lpCaps->dwFreeHwMixingAllBuffers       = numFreeStreams;
     443            lpCaps->dwFreeHwMixingStaticBuffers    = numFreeStreams;
     444            lpCaps->dwFreeHwMixingStreamingBuffers = numFreeStreams;
     445            return;
     446        }
     447        else {
     448            prp->usStatus |= RPERR;
     449            return;
     450        }
     451    }
    421452    PSTREAM pStream;
    422453
     
    447478    case DAUDIO_SETVOLUME:
    448479    {
    449         pStream->SetVolume(MAKE_VOLUME_LR(pDAudioCmd->Vol.VolumeL, pDAudioCmd->Vol.VolumeR));
     480        pStream->SetProperty(PROPERTY_VOLUME, MAKE_VOLUME_LR(pDAudioCmd->Vol.VolumeL, pDAudioCmd->Vol.VolumeR));
    450481        break;
    451482    }
    452483
    453484    case DAUDIO_GETVOLUME:
    454         pDAudioCmd->Vol.VolumeL = GET_VOLUME_L(pStream->GetVolume());
    455         pDAudioCmd->Vol.VolumeR = GET_VOLUME_R(pStream->GetVolume());
     485        pDAudioCmd->Vol.VolumeL = GET_VOLUME_L(pStream->GetProperty(PROPERTY_VOLUME));
     486        pDAudioCmd->Vol.VolumeR = GET_VOLUME_R(pStream->GetProperty(PROPERTY_VOLUME));
    456487        break;
    457488
    458489    case DAUDIO_START:
    459         rc = pStream->StartStream();
     490        if(numFreeStreams > 0) {
     491              rc = pStream->StartStream();
     492              if(!rc) numFreeStreams--;
     493        }
     494        else  rc = 1; //fail
     495
    460496        break;
    461497
     
    463499    {
    464500        CONTROL_PARM cParm;
     501        int          fActive = pStream->isActive();
     502
    465503        rc = pStream->StopStream(&cParm);
     504        if(!rc && fActive) numFreeStreams++;
    466505        break;
    467506    }
     
    480519    case DAUDIO_GETPOS:
    481520        pDAudioCmd->Pos.ulCurrentPos = pStream->GetCurrentPos();
     521        pDAudioCmd->Pos.ulWritePos   = pStream->GetCurrentWritePos();
    482522        break;
    483523
     
    486526        rc = pStream->Write((PSTREAMBUF)pDAudioCmd->Buffer.lpBuffer, pDAudioCmd->Buffer.ulBufferLength);
    487527        break;
     528    }
     529
     530    case DAUDIO_SETPROPERTY:
     531    {
     532        rc = pStream->SetProperty(pDAudioCmd->SetProperty.type, pDAudioCmd->SetProperty.value);
    488533    }
    489534
     
    506551    }
    507552
     553    case DAUDIO_QUERYVERSION:
     554        pDAudioCmd->Version.ulVersion = DAUDIO_VERSION;
     555        break;
    508556    }
    509557
Note: See TracChangeset for help on using the changeset viewer.