Changeset 391 for OCO/trunk/drv16/waudio.cpp
- Timestamp:
- Oct 8, 2008, 11:28:16 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
OCO/trunk/drv16/waudio.cpp
r369 r391 13 13 /**@internal %W% 14 14 * @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 16 16 * The default byte order for > 8 bps is little endian 17 17 * (important for devices that support both formats) … … 226 226 //NOTE2: The default byte order for > 8 bps is little endian 227 227 228 switch(ulBitsPerSample) 228 switch(ulBitsPerSample) 229 229 { 230 230 case 8: … … 234 234 //default = signed 235 235 ulFlags |= TWOS_COMPLEMENT; 236 236 237 237 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_LE)) 238 238 { … … 242 242 break; 243 243 case 24: 244 if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_SIGNED) 244 if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_24BPS_SIGNED) 245 245 { 246 246 ulFlags |= TWOS_COMPLEMENT; … … 255 255 break; 256 256 case 32: 257 if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_SIGNED) 257 if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_32BPS_SIGNED) 258 258 { 259 259 ulFlags |= TWOS_COMPLEMENT; … … 284 284 break; 285 285 286 default: 286 default: 287 287 DebugInt3(); 288 288 return 0; … … 293 293 //Get the OSS data format for the specified stream parameters 294 294 //****************************************************************************** 295 ULONG WAVEAUDIO::QueryOSSDataFormat(ULONG ulOperation, ULONG ulDataType, 295 ULONG WAVEAUDIO::QueryOSSDataFormat(ULONG ulOperation, ULONG ulDataType, 296 296 ULONG ulBitsPerSample) 297 297 { 298 298 ULONG ulDataFormat; 299 299 PWAVE_CAPS pWaveCaps; 300 300 301 301 if(ulOperation == OPERATION_PLAY) { 302 302 pWaveCaps = &devCaps[ulDeviceNr].waveOutCaps; … … 310 310 //NOTE1: The default for 8 bps is unsigned and signed for > 8 bps !!! 311 311 //NOTE2: The default byte order for > 8 bps is little endian 312 switch(ulBitsPerSample) 312 switch(ulBitsPerSample) 313 313 { 314 314 case 8: 315 315 //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) 317 317 { 318 318 ulDataFormat = OSS32_PCM_FORMAT_U8; … … 323 323 case 16: 324 324 //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) 326 326 {//signed LE or BE 327 327 //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) 329 329 { 330 330 ulDataFormat = OSS32_PCM_FORMAT_S16_LE; … … 332 332 else ulDataFormat = OSS32_PCM_FORMAT_S16_BE; 333 333 } 334 else 334 else 335 335 {//unsigned LE or BE 336 336 //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) 338 338 { 339 339 ulDataFormat = OSS32_PCM_FORMAT_U16_LE; … … 345 345 case 24: 346 346 //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) 348 348 {//signed LE or BE 349 349 //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) 351 351 { 352 352 ulDataFormat = OSS32_PCM_FORMAT_S24_LE; … … 354 354 else ulDataFormat = OSS32_PCM_FORMAT_S24_BE; 355 355 } 356 else 356 else 357 357 {//unsigned LE or BE 358 358 //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) 360 360 { 361 361 ulDataFormat = OSS32_PCM_FORMAT_U24_LE; … … 367 367 case 32: 368 368 //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) 370 370 {//signed LE or BE 371 371 //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) 373 373 { 374 374 ulDataFormat = OSS32_PCM_FORMAT_S32_LE; … … 376 376 else ulDataFormat = OSS32_PCM_FORMAT_S32_BE; 377 377 } 378 else 378 else 379 379 {//unsigned LE or BE 380 380 //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) 382 382 { 383 383 ulDataFormat = OSS32_PCM_FORMAT_U32_LE; … … 406 406 break; 407 407 408 default: 408 default: 409 409 DebugInt3(); 410 410 return 0; … … 415 415 //Setup conversion type & factor required for specified wave data format 416 416 //****************************************************************************** 417 BOOL WAVEAUDIO::SetupConversion(PWAVECONFIGINFO pConfigInfo, 418 ULONG ulOperation, ULONG ulDataType, 417 BOOL WAVEAUDIO::SetupConversion(PWAVECONFIGINFO pConfigInfo, 418 ULONG ulOperation, ULONG ulDataType, 419 419 ULONG ulNumChannels, ULONG ulBitsPerSample) 420 420 { … … 424 424 425 425 usConversion = CONVERT_NONE; 426 426 427 427 if(ulOperation == OPERATION_PLAY) { 428 428 pWaveCaps = &devCaps[ulDeviceNr].waveOutCaps; … … 464 464 case DATATYPE_WAVEFORM: 465 465 case PCM: 466 switch(ulBitsPerSample) 466 switch(ulBitsPerSample) 467 467 { 468 468 case 8: 469 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_8BPS)) 469 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_8BPS)) 470 470 { 471 471 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS)) { … … 477 477 else usConversion |= CONVERT_16_8; 478 478 479 if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_SIGNED) 479 if(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS_SIGNED) 480 480 { 481 481 if(ulOperation == OPERATION_PLAY) { … … 487 487 } 488 488 else 489 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_U8) && 489 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_U8) && 490 490 (pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_S8)) 491 491 { … … 502 502 503 503 case 16: 504 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS)) 504 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_16BPS)) 505 505 { 506 506 if(!(pWaveCaps->ulDataFormats & OSS32_CAPS_PCM_FORMAT_8BPS)) { 507 507 DebugInt3(); 508 508 return FALSE; 509 } 509 } 510 510 if(ulOperation == OPERATION_PLAY) 511 511 usConversion |= CONVERT_16_8; 512 512 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) 515 515 { 516 516 if(ulOperation == OPERATION_PLAY) { … … 522 522 } 523 523 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)) 526 526 { 527 527 if(ulOperation == OPERATION_PLAY) … … 546 546 case DATATYPE_ADPCM_AVC: 547 547 case DATATYPE_CT_ADPCM: 548 default: 548 default: 549 549 DebugInt3(); 550 550 return FALSE; … … 615 615 dprintf(("CONVERT_8_UNSIGNED_TO_8_UNSIGNED_STEREO_MONO")); 616 616 break; 617 617 618 618 case CONVERT_8_SIGNED_TO_8_SIGNED_STEREO_MONO: 619 619 pConfigInfo->ulConversionFactor = CONVERSION_FACTOR(0,1); //factor 0.5 … … 718 718 dprintf(("CONVERT_16_UNSIGNED_TO_16_UNSIGNED_STEREO_MONO")); 719 719 break; 720 720 721 721 case CONVERT_16_SIGNED_TO_16_SIGNED_STEREO_MONO: 722 722 pConfigInfo->ulConversionFactor = CONVERSION_FACTOR(0,1); //factor 0.5 … … 754 754 dprintf(("CONVERT_16_SIGNED_TO_8_UNSIGNED_STEREO_MONO")); 755 755 break; 756 756 757 757 default: 758 758 pConfigInfo->ulConversionFactor = CONVERSION_FACTOR(0,0); //factor 1 … … 778 778 } 779 779 780 if(pConfigInfo->fSampleRateConversion) 780 if(pConfigInfo->fSampleRateConversion) 781 781 { 782 if(QuerySampleFormat(ulOperation, pConfigInfo) == TRUE) 782 if(QuerySampleFormat(ulOperation, pConfigInfo) == TRUE) 783 783 { 784 784 if(pConfigInfo->ulHwBitsPerSample == 8) { … … 788 788 else pConfigInfo->pfnSRateConv = SRateConvert8Mono; 789 789 } 790 else 790 else 791 791 if(pConfigInfo->ulHwBitsPerSample == 16) { 792 792 if(pConfigInfo->ulHwNumChannels == 2) { … … 966 966 //Find the closest matching samplerate from the OSS srate capability flags 967 967 //****************************************************************************** 968 ULONG WAVEAUDIO::FindMatchingSampleRate(ULONG ulSampleRate, ULONG ulOSSSRateFlags, 968 ULONG WAVEAUDIO::FindMatchingSampleRate(ULONG ulSampleRate, ULONG ulOSSSRateFlags, 969 969 ULONG FAR *pulNrSampleRates, ULONG FAR *pulFixedSampleRate) 970 970 { … … 980 980 if(ulOSSSRateFlags & OSS32_CAPS_PCM_RATE_8000) { 981 981 sampleRates[nrSampleRates++] = 8000; 982 } 982 } 983 983 if(ulOSSSRateFlags & OSS32_CAPS_PCM_RATE_11025) { 984 984 sampleRates[nrSampleRates++] = 11025; … … 1021 1021 if(nrSampleRates <= 2 && pulFixedSampleRate) { 1022 1022 //sampleRates[0] = 44100; /* hardware set to 44100 */ 1023 *pulFixedSampleRate = sampleRates[0]; 1023 *pulFixedSampleRate = sampleRates[0]; 1024 1024 nrSampleRates = 1; 1025 1025 } … … 1053 1053 1054 1054 if ( pCaps->ulOperation != OPERATION_PLAY && 1055 pCaps->ulOperation != OPERATION_RECORD ) 1055 pCaps->ulOperation != OPERATION_RECORD ) 1056 1056 { 1057 1057 pCaps->ulSupport = UNSUPPORTED_OPERATION; 1058 1058 return; 1059 1059 } 1060 1060 1061 1061 if(pCaps->ulOperation == OPERATION_PLAY) { 1062 1062 pWaveCaps = &devCaps[ulDeviceNr].waveOutCaps; … … 1064 1064 else pWaveCaps = &devCaps[ulDeviceNr].waveInCaps; 1065 1065 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) 1068 1068 { 1069 1069 if(pCaps->ulChannels > pWaveCaps->ulMaxChannels) { … … 1079 1079 //Determine supported rates 1080 1080 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) 1083 1083 {//supports all sample rates from min to max 1084 1084 if (ulSampleRate < pWaveCaps->ulMinRate) { … … 1111 1111 // Determine the ulDataSubType and update any format specific flags 1112 1112 // Note: All data types have more than one value. 1113 switch ( pCaps->ulDataType ) 1113 switch ( pCaps->ulDataType ) 1114 1114 { 1115 1115 case DATATYPE_NULL: //Warp 3 buggy data type … … 1122 1122 case 16: 1123 1123 //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 1125 1125 // wave data ourselves (same for mono/stereo). 1126 1126 break; … … 1163 1163 pCaps->ulDataSubType = aaulAlaw[usSampleRateIndex][pCaps->ulChannels-1]; 1164 1164 break; 1165 1165 1166 1166 case DATATYPE_MULAW: 1167 1167 case DATATYPE_RIFF_MULAW: … … 1179 1179 pCaps->ulDataSubType = aaulMulaw[usSampleRateIndex][pCaps->ulChannels-1]; 1180 1180 break; 1181 1181 1182 1182 case DATATYPE_ADPCM_AVC: 1183 1183 case DATATYPE_CT_ADPCM: … … 1194 1194 pCaps->ulDataSubType = aaulMulaw[usSampleRateIndex][pCaps->ulChannels-1]; 1195 1195 break; 1196 1196 1197 1197 default: 1198 1198 pCaps->ulSupport = UNSUPPORTED_DATATYPE; 1199 1199 return; 1200 1200 } // end switch 1201 1201 1202 1202 pCaps->ulFlags |= FIXED | // Fixed length data 1203 1203 LEFT_ALIGNED | // Left align bits on byte bndry … … 1240 1240 pCaps->ulResourceUnits = 1; 1241 1241 } 1242 1242 1243 1243 if ( pCaps->ulOperation == OPERATION_PLAY) 1244 1244 pCaps->ulResourceClass = 1; … … 1287 1287 #pragma on (unreferenced) 1288 1288 { 1289 ULONG ulBytesPerIRQ; 1290 1289 ULONG ulBytesPerIRQ; 1290 1291 1291 #ifdef DEBUG 1292 1292 dprintf(("WAVEAUDIO::ConfigDev")); … … 1323 1323 } /* endswitch */ 1324 1324 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 1352 1326 // The consume rate is the number of bytes consumed by this data format 1353 1327 // per second. It calculated by taking the following equation: … … 1357 1331 pConfigInfo->ulSampleSize = (pConfigInfo->ulBitsPerSample*pConfigInfo->ulNumChannels)/8; 1358 1332 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 1360 1356 return TRUE; 1361 1357 } … … 1463 1459 //NOTE: Can only be used for small numbers (up to about 4mb)!! (overflow) 1464 1460 //****************************************************************************** 1465 ULONG WAVEAUDIO::ConvertLength(ULONG length, PWAVECONFIGINFO pConfigInfo) 1461 ULONG WAVEAUDIO::ConvertLength(ULONG length, PWAVECONFIGINFO pConfigInfo) 1466 1462 { 1467 1463 ULONG newlen; … … 1475 1471 } 1476 1472 if(newlen && pConfigInfo->fSampleRateConversion) { 1477 newlen = SRATE_CONVERT_LENGTH(newlen, pConfigInfo->ulSRatePosition, 1473 newlen = SRATE_CONVERT_LENGTH(newlen, pConfigInfo->ulSRatePosition, 1478 1474 pConfigInfo->ulSRateIncrement); 1479 1475 } … … 1486 1482 //NOTE: Can only be used for small numbers (up to about 4mb)!! (overflow) 1487 1483 //****************************************************************************** 1488 ULONG WAVEAUDIO::ConvertLengthInvert(ULONG length, PWAVECONFIGINFO pConfigInfo) 1484 ULONG WAVEAUDIO::ConvertLengthInvert(ULONG length, PWAVECONFIGINFO pConfigInfo) 1489 1485 { 1490 1486 ULONG newlen,tmp,len; … … 1504 1500 1505 1501 if (!tmp) return 0; 1506 1507 if (pConfigInfo->usConversion != CONVERT_NONE) 1502 1503 if (pConfigInfo->usConversion != CONVERT_NONE) 1508 1504 { 1509 1505 newlen = CONVERT_LENGTH_INVERT (tmp, pConfigInfo->ulConversionFactor); … … 1524 1520 /*PS++ 1525 1521 if(newlen && pConfigInfo->fSampleRateConversion) { 1526 newlen = SRATE_CONVERT_LENGTH_INVERT(newlen, pConfigInfo->ulSRatePosition, 1522 newlen = SRATE_CONVERT_LENGTH_INVERT(newlen, pConfigInfo->ulSRatePosition, 1527 1523 pConfigInfo->ulSRateIncrement); 1528 1524 }
Note:
See TracChangeset
for help on using the changeset viewer.