Ignore:
Timestamp:
Oct 8, 2008, 11:28:16 PM (17 years ago)
Author:
rjerant
Message:

Add GetHwPtr() to code base

File:
1 edited

Legend:

Unmodified
Added
Removed
  • OCO/trunk/drv16/waudio.cpp

    r369 r391  
    1313/**@internal %W%
    1414 * @notes
    15  *  The default for 8 bps is unsigned and signed for > 8 bps 
     15 *  The default for 8 bps is unsigned and signed for > 8 bps
    1616 *  The default byte order for > 8 bps is little endian
    1717 *  (important for devices that support both formats)
     
    226226       //NOTE2: The default byte order for > 8 bps is little endian
    227227
    228        switch(ulBitsPerSample) 
     228       switch(ulBitsPerSample)
    229229       {
    230230       case 8:
     
    234234           //default = signed
    235235           ulFlags |= TWOS_COMPLEMENT;
    236            
     236
    237237           if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_LE))
    238238           {
     
    242242           break;
    243243       case 24:
    244            if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_SIGNED) 
     244           if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_SIGNED)
    245245           {
    246246               ulFlags |= TWOS_COMPLEMENT;
     
    255255           break;
    256256       case 32:
    257            if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_SIGNED) 
     257           if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_SIGNED)
    258258           {
    259259               ulFlags |= TWOS_COMPLEMENT;
     
    284284       break;
    285285
    286    default: 
     286   default:
    287287       DebugInt3();
    288288       return 0;
     
    293293//Get the OSS data format for the specified stream parameters
    294294//******************************************************************************
    295 ULONG WAVEAUDIO::QueryOSSDataFormat(ULONG ulOperation, ULONG ulDataType, 
     295ULONG WAVEAUDIO::QueryOSSDataFormat(ULONG ulOperation, ULONG ulDataType,
    296296                                    ULONG ulBitsPerSample)
    297297{
    298298   ULONG ulDataFormat;
    299299   PWAVE_CAPS pWaveCaps;
    300  
     300
    301301   if(ulOperation == OPERATION_PLAY) {
    302302        pWaveCaps = &devCaps[ulDeviceNr].waveOutCaps;
     
    310310       //NOTE1: The default for 8 bps is unsigned and signed for > 8 bps !!!
    311311       //NOTE2: The default byte order for > 8 bps is little endian
    312        switch(ulBitsPerSample) 
     312       switch(ulBitsPerSample)
    313313       {
    314314       case 8:
    315315           //Default is unsigned, so check that first
    316            if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_U8) 
     316           if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_U8)
    317317           {
    318318                ulDataFormat = OSS32_PCM_FORMAT_U8;
     
    323323       case 16:
    324324           //Default is signed, so check that first
    325            if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_SIGNED) 
     325           if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_SIGNED)
    326326           {//signed LE or BE
    327327               //Default is LE, so check that first
    328                if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_LE) 
     328               if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_LE)
    329329               {
    330330                    ulDataFormat = OSS32_PCM_FORMAT_S16_LE;
     
    332332               else ulDataFormat = OSS32_PCM_FORMAT_S16_BE;
    333333           }
    334            else 
     334           else
    335335           {//unsigned LE or BE
    336336               //Default is LE, so check that first
    337                if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_LE) 
     337               if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_LE)
    338338               {
    339339                    ulDataFormat = OSS32_PCM_FORMAT_U16_LE;
     
    345345       case 24:
    346346           //Default is signed, so check that first
    347            if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_SIGNED) 
     347           if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_SIGNED)
    348348           {//signed LE or BE
    349349               //Default is LE, so check that first
    350                if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_LE) 
     350               if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_LE)
    351351               {
    352352                    ulDataFormat = OSS32_PCM_FORMAT_S24_LE;
     
    354354               else ulDataFormat = OSS32_PCM_FORMAT_S24_BE;
    355355           }
    356            else 
     356           else
    357357           {//unsigned LE or BE
    358358               //Default is LE, so check that first
    359                if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_LE) 
     359               if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_LE)
    360360               {
    361361                    ulDataFormat = OSS32_PCM_FORMAT_U24_LE;
     
    367367       case 32:
    368368           //Default is signed, so check that first
    369            if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_SIGNED) 
     369           if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_SIGNED)
    370370           {//signed LE or BE
    371371               //Default is LE, so check that first
    372                if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_LE) 
     372               if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_LE)
    373373               {
    374374                    ulDataFormat = OSS32_PCM_FORMAT_S32_LE;
     
    376376               else ulDataFormat = OSS32_PCM_FORMAT_S32_BE;
    377377           }
    378            else 
     378           else
    379379           {//unsigned LE or BE
    380380               //Default is LE, so check that first
    381                if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_LE) 
     381               if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_LE)
    382382               {
    383383                    ulDataFormat = OSS32_PCM_FORMAT_U32_LE;
     
    406406       break;
    407407
    408    default: 
     408   default:
    409409       DebugInt3();
    410410       return 0;
     
    415415//Setup conversion type & factor required for specified wave data format
    416416//******************************************************************************
    417 BOOL WAVEAUDIO::SetupConversion(PWAVECONFIGINFO pConfigInfo, 
    418                                 ULONG ulOperation, ULONG ulDataType, 
     417BOOL WAVEAUDIO::SetupConversion(PWAVECONFIGINFO pConfigInfo,
     418                                ULONG ulOperation, ULONG ulDataType,
    419419                                ULONG ulNumChannels, ULONG ulBitsPerSample)
    420420{
     
    424424
    425425    usConversion = CONVERT_NONE;
    426    
     426
    427427    if(ulOperation == OPERATION_PLAY) {
    428428         pWaveCaps = &devCaps[ulDeviceNr].waveOutCaps;
     
    464464    case DATATYPE_WAVEFORM:
    465465    case PCM:
    466         switch(ulBitsPerSample) 
     466        switch(ulBitsPerSample)
    467467        {
    468468        case 8:
    469             if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_8BPS)) 
     469            if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_8BPS))
    470470            {
    471471                if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS)) {
     
    477477                else usConversion |= CONVERT_16_8;
    478478
    479                 if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_SIGNED) 
     479                if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_SIGNED)
    480480                {
    481481                    if(ulOperation == OPERATION_PLAY) {
     
    487487            }
    488488            else
    489             if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_U8) && 
     489            if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_U8) &&
    490490                (pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_S8))
    491491            {
     
    502502
    503503        case 16:
    504             if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS)) 
     504            if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS))
    505505            {
    506506                if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_8BPS)) {
    507507                    DebugInt3();
    508508                    return FALSE;
    509                 }             
     509                }
    510510                if(ulOperation == OPERATION_PLAY)
    511511                     usConversion |= CONVERT_16_8;
    512512                else usConversion |= CONVERT_8_16;
    513            
    514                 if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_U8) 
     513
     514                if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_U8)
    515515                {
    516516                    if(ulOperation == OPERATION_PLAY) {
     
    522522            }
    523523            else
    524             if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_SIGNED) && 
    525                 (pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_UNSIGNED)) 
     524            if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_SIGNED) &&
     525                (pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_UNSIGNED))
    526526            {
    527527                if(ulOperation == OPERATION_PLAY)
     
    546546    case DATATYPE_ADPCM_AVC:
    547547    case DATATYPE_CT_ADPCM:
    548     default: 
     548    default:
    549549        DebugInt3();
    550550        return FALSE;
     
    615615        dprintf(("CONVERT_8_UNSIGNED_TO_8_UNSIGNED_STEREO_MONO"));
    616616        break;
    617    
     617
    618618    case CONVERT_8_SIGNED_TO_8_SIGNED_STEREO_MONO:
    619619        pConfigInfo->ulConversionFactor = CONVERSION_FACTOR(0,1);   //factor 0.5
     
    718718        dprintf(("CONVERT_16_UNSIGNED_TO_16_UNSIGNED_STEREO_MONO"));
    719719        break;
    720    
     720
    721721    case CONVERT_16_SIGNED_TO_16_SIGNED_STEREO_MONO:
    722722        pConfigInfo->ulConversionFactor = CONVERSION_FACTOR(0,1);   //factor 0.5
     
    754754        dprintf(("CONVERT_16_SIGNED_TO_8_UNSIGNED_STEREO_MONO"));
    755755        break;
    756    
     756
    757757    default:
    758758        pConfigInfo->ulConversionFactor = CONVERSION_FACTOR(0,0);   //factor 1
     
    778778    }
    779779
    780     if(pConfigInfo->fSampleRateConversion) 
     780    if(pConfigInfo->fSampleRateConversion)
    781781    {
    782         if(QuerySampleFormat(ulOperation, pConfigInfo) == TRUE) 
     782        if(QuerySampleFormat(ulOperation, pConfigInfo) == TRUE)
    783783        {
    784784            if(pConfigInfo->ulHwBitsPerSample == 8) {
     
    788788                else pConfigInfo->pfnSRateConv = SRateConvert8Mono;
    789789            }
    790             else 
     790            else
    791791            if(pConfigInfo->ulHwBitsPerSample == 16) {
    792792                if(pConfigInfo->ulHwNumChannels == 2) {
     
    966966//Find the closest matching samplerate from the OSS srate capability flags
    967967//******************************************************************************
    968 ULONG WAVEAUDIO::FindMatchingSampleRate(ULONG ulSampleRate, ULONG ulOSSSRateFlags, 
     968ULONG WAVEAUDIO::FindMatchingSampleRate(ULONG ulSampleRate, ULONG ulOSSSRateFlags,
    969969                                        ULONG FAR *pulNrSampleRates, ULONG FAR *pulFixedSampleRate)
    970970{
     
    980980    if(ulOSSSRateFlags & OSS32_CAPS_PCM_RATE_8000) {
    981981        sampleRates[nrSampleRates++] = 8000;
    982     }                                               
     982    }
    983983    if(ulOSSSRateFlags & OSS32_CAPS_PCM_RATE_11025) {
    984984        sampleRates[nrSampleRates++] = 11025;
     
    10211021        if(nrSampleRates <= 2 && pulFixedSampleRate) {
    10221022            //sampleRates[0] = 44100; /* hardware set to 44100 */
    1023             *pulFixedSampleRate = sampleRates[0]; 
     1023            *pulFixedSampleRate = sampleRates[0];
    10241024            nrSampleRates = 1;
    10251025        }
     
    10531053
    10541054    if ( pCaps->ulOperation != OPERATION_PLAY &&
    1055          pCaps->ulOperation != OPERATION_RECORD ) 
     1055         pCaps->ulOperation != OPERATION_RECORD )
    10561056    {
    10571057        pCaps->ulSupport = UNSUPPORTED_OPERATION;
    10581058        return;
    10591059    }
    1060    
     1060
    10611061    if(pCaps->ulOperation == OPERATION_PLAY) {
    10621062         pWaveCaps = &devCaps[ulDeviceNr].waveOutCaps;
     
    10641064    else pWaveCaps = &devCaps[ulDeviceNr].waveInCaps;
    10651065
    1066     // We always support stereo and mono 
    1067     if (pCaps->ulChannels != 1 && pCaps->ulChannels != 2) 
     1066    // We always support stereo and mono
     1067    if (pCaps->ulChannels != 1 && pCaps->ulChannels != 2)
    10681068    {
    10691069        if(pCaps->ulChannels > pWaveCaps->ulMaxChannels) {
     
    10791079    //Determine supported rates
    10801080    ulSampleRate = pCaps->ulSamplingRate; //save the sampling rate called with
    1081    
    1082     if(pWaveCaps->ulRateFlags & OSS32_CAPS_PCM_RATE_CONTINUOUS) 
     1081
     1082    if(pWaveCaps->ulRateFlags & OSS32_CAPS_PCM_RATE_CONTINUOUS)
    10831083    {//supports all sample rates from min to max
    10841084        if (ulSampleRate < pWaveCaps->ulMinRate) {
     
    11111111    // Determine the ulDataSubType and update any format specific flags
    11121112    // Note: All data types have more than one value.
    1113     switch ( pCaps->ulDataType ) 
     1113    switch ( pCaps->ulDataType )
    11141114    {
    11151115    case DATATYPE_NULL: //Warp 3 buggy data type
     
    11221122        case 16:
    11231123            //NOTE: We always support 8 & 16 bits playback & recording; if the card
    1124             //      can't handle one of these formats, then we'll convert the 
     1124            //      can't handle one of these formats, then we'll convert the
    11251125            //      wave data ourselves (same for mono/stereo).
    11261126            break;
     
    11631163        pCaps->ulDataSubType = aaulAlaw[usSampleRateIndex][pCaps->ulChannels-1];
    11641164        break;
    1165    
     1165
    11661166    case DATATYPE_MULAW:
    11671167    case DATATYPE_RIFF_MULAW:
     
    11791179        pCaps->ulDataSubType = aaulMulaw[usSampleRateIndex][pCaps->ulChannels-1];
    11801180        break;
    1181    
     1181
    11821182    case DATATYPE_ADPCM_AVC:
    11831183    case DATATYPE_CT_ADPCM:
     
    11941194        pCaps->ulDataSubType = aaulMulaw[usSampleRateIndex][pCaps->ulChannels-1];
    11951195        break;
    1196    
     1196
    11971197    default:
    11981198        pCaps->ulSupport = UNSUPPORTED_DATATYPE;
    11991199        return;
    12001200    } // end switch
    1201    
     1201
    12021202    pCaps->ulFlags |= FIXED        |    // Fixed length data
    12031203                      LEFT_ALIGNED |    // Left align bits on byte bndry
     
    12401240        pCaps->ulResourceUnits = 1;
    12411241    }
    1242    
     1242
    12431243    if ( pCaps->ulOperation == OPERATION_PLAY)
    12441244        pCaps->ulResourceClass = 1;
     
    12871287#pragma on (unreferenced)
    12881288{
    1289          ULONG  ulBytesPerIRQ; 
    1290          
     1289         ULONG  ulBytesPerIRQ;
     1290
    12911291#ifdef DEBUG
    12921292    dprintf(("WAVEAUDIO::ConfigDev"));
     
    13231323    } /* endswitch */
    13241324
    1325           // Calculate the BytesPerIRQ
    1326           // The BytesPerIRQ is the number of bytes consumed by this data format
    1327           // for every interrupt generated by the codec.
    1328           // This information is returned to the WAVESTREAM which uses it in
    1329           // buffer management decisions....
    1330           // rjj Fix for Bug #18 28082008
    1331          
    1332           ulBytesPerIRQ = pConfigInfo->ulSampleRate;
    1333           ulBytesPerIRQ >>= 5; // 32 interrupts per second
    1334                                // we can tweak this as needed but generally this should do rjj
    1335          
    1336           if (pConfigInfo->ulBitsPerSample == 16) {
    1337                 ulBytesPerIRQ <<= 1;
    1338           }
    1339           if (pConfigInfo->ulNumChannels == 2) {
    1340                 ulBytesPerIRQ <<= 1;
    1341           }
    1342           // make sure it's an even multiple of 64
    1343           ulBytesPerIRQ += 0x00000040;
    1344           ulBytesPerIRQ &= 0xFFFFFFC0;
    1345                
    1346           if (ulBytesPerIRQ > 0x800) {
    1347                 ulBytesPerIRQ = 0x800;
    1348           }
    1349           pConfigInfo->ulBytesPerIRQ = ulBytesPerIRQ;
    1350 
    1351           // Calculate the PCMConsumeRate
     1325    // Calculate the PCMConsumeRate
    13521326    // The consume rate is the number of bytes consumed by this data format
    13531327    // per second. It calculated by taking the following equation:
     
    13571331    pConfigInfo->ulSampleSize     = (pConfigInfo->ulBitsPerSample*pConfigInfo->ulNumChannels)/8;
    13581332    pConfigInfo->ulPCMConsumeRate = pConfigInfo->ulSampleRate * pConfigInfo->ulSampleSize;
    1359    
     1333
     1334    // Calculate the BytesPerIRQ
     1335    // The BytesPerIRQ is the number of bytes consumed by this data format
     1336    // for every interrupt generated by the codec.
     1337    // This information is returned to the WAVESTREAM which uses it in
     1338    // buffer management decisions....
     1339    // basic formula is  (sampling rate * ((BitsPerSample * NumChannels) /8) / Number of Interrupts per Second
     1340    // or pConfigInfo->ulPCMConsumeRate / Number of Interrupts Per Second
     1341    // rjj Fix for Bug #18 28082008
     1342
     1343    //ulBytesPerIRQ = pConfigInfo->ulPCMConsumeRate >> 5;  // 32 interrupts per second
     1344    ulBytesPerIRQ = pConfigInfo->ulPCMConsumeRate >> 6;  // 64 interrupts per second
     1345                                                         // we can tweak this as needed but generally this should do rjj
     1346    // make sure it's an even multiple of 64
     1347    ulBytesPerIRQ += 0x00000040;
     1348    ulBytesPerIRQ &= 0xFFFFFFC0;
     1349
     1350    if (ulBytesPerIRQ > 0x800) {
     1351          ulBytesPerIRQ = 0x800;
     1352    }
     1353    pConfigInfo->ulBytesPerIRQ = ulBytesPerIRQ;
     1354
     1355
    13601356    return TRUE;
    13611357}
     
    14631459//NOTE: Can only be used for small numbers (up to about 4mb)!! (overflow)
    14641460//******************************************************************************
    1465 ULONG WAVEAUDIO::ConvertLength(ULONG length, PWAVECONFIGINFO pConfigInfo) 
     1461ULONG WAVEAUDIO::ConvertLength(ULONG length, PWAVECONFIGINFO pConfigInfo)
    14661462{
    14671463    ULONG newlen;
     
    14751471    }
    14761472    if(newlen && pConfigInfo->fSampleRateConversion) {
    1477         newlen = SRATE_CONVERT_LENGTH(newlen, pConfigInfo->ulSRatePosition, 
     1473        newlen = SRATE_CONVERT_LENGTH(newlen, pConfigInfo->ulSRatePosition,
    14781474                                      pConfigInfo->ulSRateIncrement);
    14791475    }
     
    14861482//NOTE: Can only be used for small numbers (up to about 4mb)!! (overflow)
    14871483//******************************************************************************
    1488 ULONG WAVEAUDIO::ConvertLengthInvert(ULONG length, PWAVECONFIGINFO pConfigInfo) 
     1484ULONG WAVEAUDIO::ConvertLengthInvert(ULONG length, PWAVECONFIGINFO pConfigInfo)
    14891485{
    14901486    ULONG newlen,tmp,len;
     
    15041500
    15051501    if (!tmp) return 0;
    1506    
    1507     if (pConfigInfo->usConversion != CONVERT_NONE) 
     1502
     1503    if (pConfigInfo->usConversion != CONVERT_NONE)
    15081504    {
    15091505        newlen =  CONVERT_LENGTH_INVERT (tmp, pConfigInfo->ulConversionFactor);
     
    15241520/*PS++
    15251521    if(newlen && pConfigInfo->fSampleRateConversion) {
    1526         newlen = SRATE_CONVERT_LENGTH_INVERT(newlen, pConfigInfo->ulSRatePosition, 
     1522        newlen = SRATE_CONVERT_LENGTH_INVERT(newlen, pConfigInfo->ulSRatePosition,
    15271523                                             pConfigInfo->ulSRateIncrement);
    15281524    }
Note: See TracChangeset for help on using the changeset viewer.