Changeset 391
- Timestamp:
- Oct 8, 2008, 11:28:16 PM (17 years ago)
- Location:
- OCO/trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
OCO/trunk/drv16/ossidc16.cpp
r288 r391 151 151 { 152 152 IDC32_PACKET idcpacket; 153 153 154 154 _fmemset(&idcpacket, 0, sizeof(idcpacket)); 155 155 … … 214 214 _fmemset(&idcpacket, 0, sizeof(idcpacket)); 215 215 216 if(SELECTOROF(pHwParams) != _SS()) 216 if(SELECTOROF(pHwParams) != _SS()) 217 217 {//must be located on the stack! 218 218 dprintf(("OSS16_WaveSetFormat error. Invalid stack segment for parameters...")); … … 228 228 //****************************************************************************** 229 229 //****************************************************************************** 230 OSSRET DBGCALLCONV OSS16_WaveAddBuffer(OSSSTREAMID StreamId, LINEAR pBuffer, ULONG size, 230 OSSRET DBGCALLCONV OSS16_WaveAddBuffer(OSSSTREAMID StreamId, LINEAR pBuffer, ULONG size, 231 231 ULONG FAR *lpBytesTransferred) 232 { 232 { 233 233 IDC32_PACKET idcpacket; 234 234 OSSRET ret; … … 241 241 idcpacket.buffer.size = size; 242 242 ret = CallOSS32(IDC32_WAVE_ADDBUFFER, &idcpacket); 243 243 244 244 *lpBytesTransferred = idcpacket.buffer.transferred; 245 245 return ret; … … 257 257 idcpacket.streamid = StreamId; 258 258 ret = CallOSS32(IDC32_WAVE_GETPOS, &idcpacket); 259 259 260 260 *lpPosition = idcpacket.getpos.position; 261 261 return ret; … … 273 273 idcpacket.streamid = StreamId; 274 274 ret = CallOSS32(IDC32_WAVE_GETSPACE, &idcpacket); 275 275 276 276 *lpBytesLeft = idcpacket.getspace.bytesavail; 277 277 return ret; … … 279 279 //****************************************************************************** 280 280 //****************************************************************************** 281 //****************************************************************************** 282 //****************************************************************************** 283 OSSRET DBGCALLCONV OSS16_WaveGetHwPtr(OSSSTREAMID StreamId, ULONG FAR *lpBytesLeft) 284 { 285 IDC32_PACKET idcpacket; 286 OSSRET ret; 287 288 _fmemset(&idcpacket, 0, sizeof(idcpacket)); 289 290 idcpacket.fileid = FindStreamFileId_fromStreamId(StreamId); 291 idcpacket.streamid = StreamId; 292 ret = CallOSS32(IDC32_WAVE_GETHWPTR, &idcpacket); 293 294 *lpBytesLeft = idcpacket.getspace.bytesavail; 295 return ret; 296 } 281 297 OSSRET DBGCALLCONV OSS16_WaveSetVolume(OSSSTREAMID StreamId, ULONG volume) 282 298 { … … 344 360 _fmemset(&idcpacket, 0, sizeof(idcpacket)); 345 361 346 if(SELECTOROF(buffer) != _SS()) 362 if(SELECTOROF(buffer) != _SS()) 347 363 {//must be located on the stack! 348 364 DebugInt3(); … … 617 633 ULONG idcptr = (ULONG)IDCTable.ProtIDCEntry; 618 634 ULONG idcparm; 619 635 620 636 if(idcptr == 0) 621 637 return OSSERR_ACCESS_DENIED; … … 673 689 { 674 690 // dprintf(("OSSIDC ep. cmd: %x param1: %x, param2: %x",cmd, param1, param2)); 675 switch(cmd & 0xFFFF) 691 switch(cmd & 0xFFFF) 676 692 { 677 693 case IDC16_INIT: … … 837 853 if (pWaveCaps->ulChanFlags & OSS32_CAPS_PCM_CHAN_5_1) 838 854 dprintf ((" OSS32_CAPS_PCM_CHAN_5_1")); 839 855 840 856 841 857 dprintf ((" ulMinRate %ld", pWaveCaps->ulMinRate)); -
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 } -
OCO/trunk/drv16/waudio.hpp
r369 r391 76 76 ULONG ulDataType; // type of data (PCM, MuLaw, ALaw etc) Input 77 77 ULONG ulPCMConsumeRate; // number of bytes consumed/produced per sec Output 78 78 ULONG ulBytesPerIRQ; // The number of bytes consumed per irq rjj Fix for Bug #18 28082008 79 79 80 80 ULONG ulFragsize; … … 122 122 123 123 //Setup conversion type & factor required for specified wave data format 124 BOOL SetupConversion(PWAVECONFIGINFO pConfigInfo, 125 ULONG ulOperation, ULONG ulDataType, 124 BOOL SetupConversion(PWAVECONFIGINFO pConfigInfo, 125 ULONG ulOperation, ULONG ulDataType, 126 126 ULONG ulNumChannels, ULONG ulBitsPerSample); 127 127 … … 136 136 virtual BOOL Transfer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, LINEAR pUserBuffer, ULONG ulBytesToTransfer, ULONG FAR *pulBytesTransferred) = 0; 137 137 virtual BOOL GetPosition(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulStreamPosition) = 0; 138 virtual BOOL GetHwPtr(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulHwPtr) = 0; 138 139 virtual BOOL GetSpace(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulStreamSpace) = 0; 139 140 virtual BOOL AddBuffer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, LINEAR pUserBuffer, ULONG ulBytesToTransfer, ULONG FAR *pulBytesTransferred) = 0; -
OCO/trunk/drv16/wavehw.hpp
r258 r391 40 40 virtual BOOL GetPosition(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulStreamPosition); 41 41 virtual BOOL GetSpace(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulStreamSpace); 42 virtual BOOL GetHwPtr(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulHwPtr); 42 43 43 44 virtual BOOL SetVolume(OSSSTREAMID StreamId, OSSSTREAMID mixerStreamId, ULONG ulVolume); … … 61 62 virtual BOOL GetPosition(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulStreamPosition); 62 63 virtual BOOL GetSpace(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulStreamSpace); 64 virtual BOOL GetHwPtr(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulHwPtr); 63 65 64 66 virtual BOOL SetVolume(OSSSTREAMID StreamId, OSSSTREAMID mixerStreamId, ULONG ulVolume); -
OCO/trunk/drv16/waveplay.cpp
r288 r391 233 233 //while the stream is playing. 234 234 ULONG minimumsize = ulFirstBufSize/2; 235 if(minimumsize && minimumsize < fragsize) 235 if(minimumsize && minimumsize < fragsize) 236 236 { 237 237 while(minimumsize < fragsize) fragsize = fragsize / 2; 238 238 239 if(fragsize < ulPCMConsumeRate/256) 239 if(fragsize < ulPCMConsumeRate/256) 240 240 {//lower limit; don't accept extremely small buffers 241 241 fragsize = ulPCMConsumeRate/256; 242 242 } 243 } 243 } 244 244 samplesize = (int)pConfigInfo->ulHwSampleSize; 245 245 … … 280 280 //Convert (if required) and write wave data to audio device 281 281 //****************************************************************************** 282 BOOL WAVEPLAY::Transfer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, 283 LINEAR pUserBuffer, ULONG ulBytesToTransfer, 282 BOOL WAVEPLAY::Transfer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, 283 LINEAR pUserBuffer, ULONG ulBytesToTransfer, 284 284 ULONG FAR *pulBytesTransferred) 285 285 { … … 301 301 // if (!waveOpened) return TRUE; 302 302 303 if(pConfigInfo->usConversion == CONVERT_NONE) 303 if(pConfigInfo->usConversion == CONVERT_NONE) 304 304 { 305 305 #ifdef DEBUG 306 306 dprintf(("Transfer. NoConv ulB %ld",ulBytesToTransfer)); 307 307 #endif /* DEBUG */ 308 if(AddBuffer(StreamId, pConfigInfo, pUserBuffer, ulBytesToTransfer, pulBytesTransferred) == FALSE) 308 if(AddBuffer(StreamId, pConfigInfo, pUserBuffer, ulBytesToTransfer, pulBytesTransferred) == FALSE) 309 309 { 310 310 *pulBytesTransferred = 0; … … 320 320 ulCvtBufferSize = min(CONVERSION_BUFFER_SIZE, ulCvtBufferSize); 321 321 322 //convert back from conversion to 'real' 322 //convert back from conversion to 'real' 323 323 ulBytesToTransfer = CONVERT_LENGTH(ulCvtBufferSize, CONVERSION_INVERT(pConfigInfo->ulConversionFactor)); 324 324 … … 331 331 } 332 332 pConfigInfo->pfnConvert(pUserBuffer, ulBytesToTransfer, pConfigInfo->pConversionBuffer); 333 if(AddBuffer(StreamId, pConfigInfo, pConfigInfo->pConversionBuffer, ulCvtBufferSize, pulBytesTransferred) == FALSE) 333 if(AddBuffer(StreamId, pConfigInfo, pConfigInfo->pConversionBuffer, ulCvtBufferSize, pulBytesTransferred) == FALSE) 334 334 { 335 335 *pulBytesTransferred = 0; 336 336 return FALSE; 337 337 } 338 //convert back from conversion to 'real' 338 //convert back from conversion to 'real' 339 339 *pulBytesTransferred = CONVERT_LENGTH(*pulBytesTransferred, CONVERSION_INVERT(pConfigInfo->ulConversionFactor)); 340 340 if(*pulBytesTransferred & (pConfigInfo->ulSampleSize-1)) { … … 355 355 // Perform sample rate conversion if required, else send buffer directly to ALSA 356 356 //****************************************************************************** 357 BOOL WAVEPLAY::AddBuffer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, LINEAR pUserBuffer, 357 BOOL WAVEPLAY::AddBuffer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, LINEAR pUserBuffer, 358 358 ULONG ulBytesToTransfer, ULONG FAR *pulBytesTransferred) 359 359 { … … 378 378 379 379 //bytes to convert is bounded by bytes to transfer & max conversion buffer size 380 ulCvtBufferSize = SRATE_CONVERT_LENGTH(ulBytesToTransfer, pConfigInfo->ulSRatePosition, 380 ulCvtBufferSize = SRATE_CONVERT_LENGTH(ulBytesToTransfer, pConfigInfo->ulSRatePosition, 381 381 pConfigInfo->ulSRateIncrement); 382 382 ulCvtBufferSize = min(CONVERSION_BUFFER_SIZE, ulCvtBufferSize); 383 383 //round to sample boundary 384 384 ulCvtBufferSize &= ~(pConfigInfo->ulHwSampleSize - 1); 385 385 386 386 if(ulCvtBufferSize == 0) { 387 387 *pulBytesTransferred = ulBytesToTransfer; 388 if(pConfigInfo->ulSRatePosition >= pConfigInfo->ulSRateIncrement) { 388 if(pConfigInfo->ulSRatePosition >= pConfigInfo->ulSRateIncrement) { 389 389 pConfigInfo->ulSRatePosition -= pConfigInfo->ulSRateIncrement; 390 390 } … … 394 394 return TRUE; 395 395 } 396 pConfigInfo->pfnSRateConv(pUserBuffer, ulCvtBufferSize, pConfigInfo->pSRateConvBuffer, 396 pConfigInfo->pfnSRateConv(pUserBuffer, ulCvtBufferSize, pConfigInfo->pSRateConvBuffer, 397 397 pConfigInfo->ulSRatePosition, pConfigInfo->ulSRateIncrement); 398 398 //PS++ !!!!! This don't be !!!!!!! … … 413 413 } 414 414 if((rc = OSS16_WaveAddBuffer(StreamId, pConfigInfo->pSRateConvBuffer, ulCvtBufferSize, pulBytesTransferred)) != OSSERR_SUCCESS || 415 *pulBytesTransferred == 0) 415 *pulBytesTransferred == 0) 416 416 { 417 417 if(rc == OSSERR_BUFFER_FULL) { … … 425 425 ulHwSampleCount = *pulBytesTransferred/pConfigInfo->ulHwSampleSize; 426 426 427 //convert back from conversion to 'real' 428 ulSampleCount = SRATE_CONVERT_LENGTH_INVERT(ulHwSampleCount, 429 pConfigInfo->ulSRatePosition, 427 //convert back from conversion to 'real' 428 ulSampleCount = SRATE_CONVERT_LENGTH_INVERT(ulHwSampleCount, 429 pConfigInfo->ulSRatePosition, 430 430 pConfigInfo->ulSRateIncrement); 431 431 … … 447 447 *pulBytesTransferred = ulSampleCount*pConfigInfo->ulHwSampleSize; 448 448 } 449 else 450 { 451 if( (rc=OSS16_WaveAddBuffer(StreamId, pUserBuffer, ulBytesToTransfer, pulBytesTransferred)) != OSSERR_SUCCESS) 449 else 450 { 451 if( (rc=OSS16_WaveAddBuffer(StreamId, pUserBuffer, ulBytesToTransfer, pulBytesTransferred)) != OSSERR_SUCCESS) 452 452 { 453 453 *pulBytesTransferred = 0; … … 500 500 //round to sample boundary 501 501 *pulStreamSpace =cvt & ( ~(pConfigInfo->ulSampleSize - 1)); 502 return TRUE; 503 } 504 //****************************************************************************** 505 //Get Bytes written to cyclic buffer (+ take conversion factor into account) 506 //****************************************************************************** 507 BOOL WAVEPLAY::GetHwPtr(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulHwPtr) 508 { 509 ULONG space,cvt; 510 511 if(OSS16_WaveGetHwPtr(StreamId, &space) != OSSERR_SUCCESS) { 512 *pulHwPtr = 0; 513 #ifdef DEBUG 514 dprintf(("OSS16_WAVEPLAY::WaveGetHwPtr: Failed")); 515 #endif /* DEBUG */ 516 return FALSE; 517 } 518 cvt = ConvertLengthInvert(space, pConfigInfo); 519 //round to sample boundary 520 *pulHwPtr = cvt & ( ~(pConfigInfo->ulSampleSize - 1)); 502 521 return TRUE; 503 522 } -
OCO/trunk/drv16/waverec.cpp
r252 r391 41 41 BOOL WAVEREC::Open(ULONG ulDevice, ULONG ulStreamType, ULONG ulSysFileNum, OSSSTREAMID FAR *pStreamId) 42 42 { 43 if(StreamId == 0) 44 { 45 if(OSS16_WaveOpen(ulDevice, ulStreamType, ulSysFileNum, pStreamId) != OSSERR_SUCCESS) 43 if(StreamId == 0) 44 { 45 if(OSS16_WaveOpen(ulDevice, ulStreamType, ulSysFileNum, pStreamId) != OSSERR_SUCCESS) 46 46 { 47 47 dprintf(("OSS16_WaveOpen failed!!")); … … 67 67 BOOL WAVEREC::Close(OSSSTREAMID StreamId) 68 68 { 69 if(devCaps[ulDeviceNr].waveInCaps.nrStreams > 1) 69 if(devCaps[ulDeviceNr].waveInCaps.nrStreams > 1) 70 70 { 71 71 return OSS16_WaveClose(StreamId) == OSSERR_SUCCESS; … … 115 115 //while the stream is playing. 116 116 ULONG minimumsize = (ulFirstBufSize/2); 117 if(minimumsize && minimumsize < fragsize) 117 if(minimumsize && minimumsize < fragsize) 118 118 { 119 119 while(minimumsize < fragsize) fragsize = fragsize / 2; 120 121 if(fragsize < ulPCMConsumeRate/256) 120 121 if(fragsize < ulPCMConsumeRate/256) 122 122 {//lower limit; don't accept extremely small buffers 123 123 fragsize = ulPCMConsumeRate/256; 124 124 } 125 } 125 } 126 126 samplesize = (int)pConfigInfo->ulHwSampleSize; 127 127 … … 133 133 134 134 dprintf(("WAVEREC::ConfigDev: Fragment size %d", (USHORT)fragsize)); 135 135 136 136 hwparam.ulSampleRate = pConfigInfo->ulHwSampleRate; 137 137 hwparam.ulBitsPerSample = pConfigInfo->ulHwBitsPerSample; … … 147 147 //Read and convert (if required) wave data from audio device 148 148 //****************************************************************************** 149 BOOL WAVEREC::Transfer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, 150 LINEAR pUserBuffer, ULONG ulBytesToTransfer, 149 BOOL WAVEREC::Transfer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, 150 LINEAR pUserBuffer, ULONG ulBytesToTransfer, 151 151 ULONG FAR *pulBytesTransferred) 152 152 { 153 if(pConfigInfo->usConversion == CONVERT_NONE) 154 { 155 if(AddBuffer(StreamId, pConfigInfo, pUserBuffer, ulBytesToTransfer, pulBytesTransferred) == FALSE) 153 if(pConfigInfo->usConversion == CONVERT_NONE) 154 { 155 if(AddBuffer(StreamId, pConfigInfo, pUserBuffer, ulBytesToTransfer, pulBytesTransferred) == FALSE) 156 156 { 157 157 *pulBytesTransferred = 0; … … 159 159 } 160 160 } 161 else 162 { 163 if(pConfigInfo->pfnConvert) 161 else 162 { 163 if(pConfigInfo->pfnConvert) 164 164 { 165 165 ULONG ulCvtBufferSize; … … 169 169 ulCvtBufferSize = min(CONVERSION_BUFFER_SIZE, ulCvtBufferSize); 170 170 171 if(AddBuffer(StreamId, pConfigInfo, pConfigInfo->pConversionBuffer, ulCvtBufferSize, pulBytesTransferred) == FALSE) 171 if(AddBuffer(StreamId, pConfigInfo, pConfigInfo->pConversionBuffer, ulCvtBufferSize, pulBytesTransferred) == FALSE) 172 172 { 173 173 *pulBytesTransferred = 0; … … 198 198 // Perform sample rate conversion if required, else send buffer directly to ALSA 199 199 //****************************************************************************** 200 BOOL WAVEREC::AddBuffer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, LINEAR pUserBuffer, 200 BOOL WAVEREC::AddBuffer(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, LINEAR pUserBuffer, 201 201 ULONG ulBytesToTransfer, ULONG FAR *pulBytesTransferred) 202 202 { 203 if(pConfigInfo->fSampleRateConversion) 203 if(pConfigInfo->fSampleRateConversion) 204 204 { 205 205 ULONG ulCvtBufferSize, ulHwSampleCount, ulSampleCount; … … 207 207 208 208 //bytes to convert is bounded by bytes to transfer & max conversion buffer size 209 ulCvtBufferSize = SRATE_CONVERT_LENGTH_INVERT(ulBytesToTransfer, pConfigInfo->ulSRatePosition, 209 ulCvtBufferSize = SRATE_CONVERT_LENGTH_INVERT(ulBytesToTransfer, pConfigInfo->ulSRatePosition, 210 210 pConfigInfo->ulSRateIncrement); 211 211 ulCvtBufferSize = min(CONVERSION_BUFFER_SIZE, ulCvtBufferSize); 212 212 213 213 //round to sample boundary 214 214 ulCvtBufferSize &= ~(pConfigInfo->ulHwSampleSize - 1); 215 215 if(ulCvtBufferSize == 0) { 216 216 *pulBytesTransferred = ulBytesToTransfer; 217 if(pConfigInfo->ulSRatePosition >= pConfigInfo->ulSRateIncrement) { 217 if(pConfigInfo->ulSRatePosition >= pConfigInfo->ulSRateIncrement) { 218 218 pConfigInfo->ulSRatePosition -= pConfigInfo->ulSRateIncrement; 219 219 } … … 223 223 224 224 if(OSS16_WaveAddBuffer(StreamId, pConfigInfo->pSRateConvBuffer, ulCvtBufferSize, pulBytesTransferred) != OSSERR_SUCCESS || 225 *pulBytesTransferred == 0) 225 *pulBytesTransferred == 0) 226 226 { 227 227 *pulBytesTransferred = 0; … … 229 229 } 230 230 ulHwSampleCount = *pulBytesTransferred/pConfigInfo->ulHwSampleSize; 231 232 //convert back from conversion to 'real' 233 ulSampleCount = SRATE_CONVERT_LENGTH(ulHwSampleCount, pConfigInfo->ulSRatePosition, 231 232 //convert back from conversion to 'real' 233 ulSampleCount = SRATE_CONVERT_LENGTH(ulHwSampleCount, pConfigInfo->ulSRatePosition, 234 234 pConfigInfo->ulSRateIncrement); 235 235 *pulBytesTransferred = ulSampleCount*pConfigInfo->ulHwSampleSize; 236 236 237 237 if(ulSampleCount == 0) { 238 238 return FALSE; … … 245 245 246 246 //convert recorded audio data 247 pConfigInfo->pfnSRateConv(pConfigInfo->pSRateConvBuffer, *pulBytesTransferred, pUserBuffer, 247 pConfigInfo->pfnSRateConv(pConfigInfo->pSRateConvBuffer, *pulBytesTransferred, pUserBuffer, 248 248 pConfigInfo->ulSRatePosition, pConfigInfo->ulSRateIncrement); 249 249 … … 253 253 pConfigInfo->ulSRatePosition = (ULONG)lSRatePosition; 254 254 } 255 else 256 if(OSS16_WaveAddBuffer(StreamId, pUserBuffer, ulBytesToTransfer, pulBytesTransferred) != OSSERR_SUCCESS) 255 else 256 if(OSS16_WaveAddBuffer(StreamId, pUserBuffer, ulBytesToTransfer, pulBytesTransferred) != OSSERR_SUCCESS) 257 257 { 258 258 *pulBytesTransferred = 0; … … 293 293 //round to sample boundary 294 294 *pulStreamSpace &= ~(pConfigInfo->ulSampleSize - 1); 295 return TRUE; 296 } 297 //****************************************************************************** 298 //Get Bytes written to cyclic buffer (+ take conversion factor into account) 299 //****************************************************************************** 300 BOOL WAVEREC::GetHwPtr(OSSSTREAMID StreamId, PWAVECONFIGINFO pConfigInfo, ULONG FAR *pulHwPtr) 301 { 302 ULONG space,cvt; 303 304 if(OSS16_WaveGetHwPtr(StreamId, &space) != OSSERR_SUCCESS) { 305 *pulHwPtr = 0; 306 #ifdef DEBUG 307 dprintf(("OSS16_WAVEREC::WaveGetHwPtr: Failed")); 308 #endif /* DEBUG */ 309 return FALSE; 310 } 311 cvt = ConvertLengthInvert(space, pConfigInfo); 312 //round to sample boundary 313 *pulHwPtr = cvt & ( ~(pConfigInfo->ulSampleSize - 1)); 295 314 return TRUE; 296 315 } -
OCO/trunk/include/ossidc.h
r266 r391 39 39 40 40 //IDC communication packet 41 typedef struct 41 typedef struct 42 42 { 43 43 OSSSTREAMID streamid; //IN: stream id … … 131 131 #define IDC32_WAVE_GETPOS 0x1B 132 132 #define IDC32_WAVE_SETVOLUME 0x1C 133 #define IDC32_WAVE_GETHWPTR 0x1D 133 134 134 135 #define IDC32_MIXER_OPEN 0x20 … … 246 247 247 248 248 typedef struct 249 typedef struct 249 250 { 250 251 char name[SIZE_DEVICE_NAME]; … … 255 256 256 257 #define SIZE_DEVICE_NAME 32 257 typedef struct 258 typedef struct 258 259 { 259 260 ULONG nrchannels; … … 335 336 typedef struct { 336 337 ULONG nrStreams; //nr of activate wave streams supported 337 ULONG ulMinChannels; //min nr of channels 338 ULONG ulMaxChannels; //max nr of channels 338 ULONG ulMinChannels; //min nr of channels 339 ULONG ulMaxChannels; //max nr of channels 339 340 ULONG ulChanFlags; //channel flags 340 341 ULONG ulMinRate; //min sample rate -
OCO/trunk/include/ossidc16.h
r266 r391 70 70 OSSRET DBGCALLCONV OSS16_WaveGetSpace(OSSSTREAMID StreamId, ULONG FAR *lpBytesLeft); 71 71 OSSRET DBGCALLCONV OSS16_WaveSetVolume(OSSSTREAMID StreamId, ULONG volume); 72 OSSRET DBGCALLCONV OSS16_WaveGetHwPtr(OSSSTREAMID StreamId, ULONG FAR *lpPosition); 72 73 73 74 OSSRET DBGCALLCONV OSS16_MixOpen(ULONG devicenr, OSSSTREAMID FAR *pStreamid);
Note:
See TracChangeset
for help on using the changeset viewer.