Changeset 151 for portaudio/trunk/pa_win_wmme
- Timestamp:
- 04/17/02 02:27:05 (8 years ago)
- File:
-
- 1 edited
-
portaudio/trunk/pa_win_wmme/pa_win_wmme.c (modified) (38 diffs)
Legend:
- Unmodified
- Added
- Removed
-
portaudio/trunk/pa_win_wmme/pa_win_wmme.c
r150 r151 46 46 PLB20010422 - apply Mike Berry's changes for CodeWarrior on PC 47 47 including condition including of memory.h, 48 and explicit typecasting on memory allocation48 and explicit typecasting on memory allocation 49 49 PLB20010802 - use GlobalAlloc for sDevicesPtr instead of PaHost_AllocFastMemory 50 50 PLB20010816 - pass process instead of thread to SetPriorityClass() … … 54 54 RDB20020411 - various renaming cleanups, factored streamData alloc and cpu usage init 55 55 RDB20020417 - stopped counting WAVE_MAPPER when there were no real devices 56 refactoring, renaming and fixed a few edge case bugs 56 57 */ 57 58 … … 171 172 static const char sMapperSuffixInput[] = " - Input"; 172 173 static const char sMapperSuffixOutput[] = " - Output"; 174 175 #if PA_TRACK_MEMORY 173 176 static int sNumAllocations = 0; 177 #endif 174 178 175 179 /************************************************* Macros ********/ … … 177 181 #define PaDeviceIdToWinId(id) (((id) < sNumInputDevices) ? (id - 1) : (id - sNumInputDevices - 1)) 178 182 /************************************************* Prototypes **********/ 179 static Pa_QueryDevices( void ); 183 184 void Pa_InitializeNumDevices( void ); 185 PaError Pa_AllocateDevicePtrs( void ); 186 180 187 static void CALLBACK Pa_TimerCallback(UINT uID, UINT uMsg, 181 188 DWORD dwUser, DWORD dw1, DWORD dw2); … … 187 194 static void PaHost_FreeTrackedMemory( void *addr ); 188 195 189 190 /*191 FIXME: PaHost_GetStreamRepresentation() should be migrated to pa_lib.c192 */193 static internalPortAudioStream* PaHost_GetStreamRepresentation( PortAudioStream *stream )194 {195 internalPortAudioStream* result = (internalPortAudioStream*) stream;196 197 if( result == NULL || result->past_Magic != PA_MAGIC )198 return NULL;199 else200 return result;201 }202 196 /*******************************************************************/ 203 197 static PaError PaHost_AllocateWMMEStreamData( internalPortAudioStream *stream ) … … 288 282 /****************************************** END CPU UTILIZATION *******/ 289 283 290 /* FIXME: this function should be renamed */ 291 static PaError Pa_QueryDevices( void ) 292 { 293 int numBytes; 294 284 static void Pa_InitializeNumDevices( void ) 285 { 295 286 sNumInputDevices = waveInGetNumDevs(); 296 287 if( sNumInputDevices > 0 ) 288 { 297 289 sNumInputDevices += 1; /* add one extra for the WAVE_MAPPER */ 298 299 sDefaultInputDeviceID = 0; 290 sDefaultInputDeviceID = 0; 291 } 292 else 293 { 294 sDefaultInputDeviceID = paNoDevice; 295 } 300 296 301 297 sNumOutputDevices = waveOutGetNumDevs(); 302 298 if( sNumOutputDevices > 0 ) 299 { 303 300 sNumOutputDevices += 1; /* add one extra for the WAVE_MAPPER */ 304 305 sDefaultOutputDeviceID = sNumInputDevices; 301 sDefaultOutputDeviceID = sNumInputDevices; 302 } 303 else 304 { 305 sDefaultOutputDeviceID = paNoDevice; 306 } 306 307 307 308 sNumDevices = sNumInputDevices + sNumOutputDevices; 308 309 } 310 311 static PaError Pa_AllocateDevicePtrs( void ) 312 { 313 int numBytes; 314 int i; 315 309 316 /* Allocate structures to hold device info. */ 310 317 /* PLB20010402 - was allocating too much memory. */ 311 318 /* numBytes = sNumDevices * sizeof(PaDeviceInfo); // PLB20010402 */ 312 numBytes = sNumDevices * sizeof(PaDeviceInfo *); /* PLB20010402 */ 313 sDevicePtrs = (PaDeviceInfo **) PaHost_AllocateTrackedMemory( numBytes ); /* MEM */ 314 if( sDevicePtrs == NULL ) return paInsufficientMemory; 319 320 if( sNumDevices > 0 ) 321 { 322 numBytes = sNumDevices * sizeof(PaDeviceInfo *); /* PLB20010402 */ 323 sDevicePtrs = (PaDeviceInfo **) PaHost_AllocateTrackedMemory( numBytes ); /* MEM */ 324 if( sDevicePtrs == NULL ) return paInsufficientMemory; 325 326 for( i = 0; i < sNumDevices; i++ ) 327 sDevicePtrs[i] = NULL; /* RDB20020417 explicitly set each ptr to NULL */ 328 } 329 else 330 { 331 sDevicePtrs = NULL; 332 } 333 315 334 return paNoError; 316 335 } … … 323 342 int Pa_CountDevices() 324 343 { 325 if( sNumDevices <= 0 ) Pa_Initialize(); 326 return sNumDevices; 344 if( PaHost_IsInitialized() ) 345 return sNumDevices; 346 else 347 return 0; 327 348 } 328 349 /************************************************************************* … … 484 505 if( woc.dwFormats & WAVE_FORMAT_4M16 ||woc.dwFormats & WAVE_FORMAT_4S16 ) 485 506 sampleRates[ deviceInfo->numSampleRates++ ] = 44100.; 507 486 508 /* Add a sample rate to the list if we can do stereo 16 bit at that rate 487 509 * based on opening the device successfully. */ … … 538 560 return recommendedID; 539 561 } 540 static PaError Pa_MaybeQueryDevices( void )541 {542 if( sNumDevices == 0 )543 {544 return Pa_QueryDevices();545 }546 return 0;547 }548 562 /********************************************************************** 549 563 * Check for environment variable, else query devices and use result. … … 551 565 PaDeviceID Pa_GetDefaultInputDeviceID( void ) 552 566 { 553 Pa Errorresult;567 PaDeviceID result; 554 568 555 569 result = PaHost_GetEnvDefaultDeviceID( PA_REC_IN_DEV_ENV_NAME ); 556 if( result < 0 ) 557 { 558 result = Pa_MaybeQueryDevices(); 559 if( result < 0 ) return result; 570 if( result == paNoDevice || result < 0 || result >= sNumInputDevices ) 571 { 560 572 result = sDefaultInputDeviceID; 561 573 } … … 564 576 PaDeviceID Pa_GetDefaultOutputDeviceID( void ) 565 577 { 566 Pa Errorresult;578 PaDeviceID result; 567 579 568 580 result = PaHost_GetEnvDefaultDeviceID( PA_REC_OUT_DEV_ENV_NAME ); 569 if( result < 0 ) 570 { 571 result = Pa_MaybeQueryDevices(); 572 if( result < 0 ) return result; 581 if( result == paNoDevice || result < sNumInputDevices || result >= sNumDevices ) 582 { 573 583 result = sDefaultOutputDeviceID; 574 584 } … … 588 598 PRINT(("WARNING - Underflow Simulation Enabled - Expect a Big Glitch!!!\n")); 589 599 #endif 590 return Pa_MaybeQueryDevices(); 600 601 602 Pa_InitializeNumDevices(); 603 604 return Pa_AllocateDevicePtrs(); 591 605 } 592 606 … … 608 622 { 609 623 PaError result = paNoError; 610 long bytesEmpty = 0; 611 long bytesFilled = 0; 612 long buffersEmpty = 0; 613 MMRESULT mresult; 624 MMRESULT mmresult; 614 625 char *inBufPtr; 615 626 char *outBufPtr; … … 698 709 if( gotInput ) 699 710 { 700 m result = waveInAddBuffer( wmmeStreamData->hWaveIn,711 mmresult = waveInAddBuffer( wmmeStreamData->hWaveIn, 701 712 &wmmeStreamData->inputBuffers[ wmmeStreamData->currentInputBuffer ], 702 713 sizeof(WAVEHDR) ); 703 if( m result != MMSYSERR_NOERROR )714 if( mmresult != MMSYSERR_NOERROR ) 704 715 { 705 sPaHostError = m result;716 sPaHostError = mmresult; 706 717 result = paHostError; 707 718 break; … … 716 727 AddTraceMessage( "Pa_TimeSlice: writing buffer ", wmmeStreamData->currentOutputBuffer ); 717 728 #endif 718 m result = waveOutWrite( wmmeStreamData->hWaveOut,729 mmresult = waveOutWrite( wmmeStreamData->hWaveOut, 719 730 &wmmeStreamData->outputBuffers[ wmmeStreamData->currentOutputBuffer ], 720 731 sizeof(WAVEHDR) ); 721 if( m result != MMSYSERR_NOERROR )732 if( mmresult != MMSYSERR_NOERROR ) 722 733 { 723 sPaHostError = m result;734 sPaHostError = mmresult; 724 735 result = paHostError; 725 736 break; … … 886 897 PaError PaHost_OpenInputStream( internalPortAudioStream *stream ) 887 898 { 888 MMRESULT mr;889 899 PaError result = paNoError; 900 MMRESULT mmresult; 890 901 PaWMMEStreamData *wmmeStreamData; 891 902 int i; … … 919 930 inputMmId = PaDeviceIdToWinId( stream->past_InputDeviceID ); 920 931 #if PA_USE_TIMER_CALLBACK 921 m r= waveInOpen( &wmmeStreamData->hWaveIn, inputMmId, &wfx,932 mmresult = waveInOpen( &wmmeStreamData->hWaveIn, inputMmId, &wfx, 922 933 0, 0, CALLBACK_NULL ); 923 934 #else 924 m r= waveInOpen( &wmmeStreamData->hWaveIn, inputMmId, &wfx,935 mmresult = waveInOpen( &wmmeStreamData->hWaveIn, inputMmId, &wfx, 925 936 (DWORD)wmmeStreamData->bufferEvent, (DWORD) stream, CALLBACK_EVENT ); 926 937 #endif 927 if( m r!= MMSYSERR_NOERROR )938 if( mmresult != MMSYSERR_NOERROR ) 928 939 { 929 940 ERR_RPT(("PortAudio: PaHost_OpenInputStream() failed!\n")); 930 941 result = paHostError; 931 sPaHostError = m r;942 sPaHostError = mmresult; 932 943 goto error; 933 944 } … … 950 961 wmmeStreamData->inputBuffers[i].dwBufferLength = wmmeStreamData->bytesPerHostInputBuffer; 951 962 wmmeStreamData->inputBuffers[i].dwUser = i; 952 if( ( m r= waveInPrepareHeader( wmmeStreamData->hWaveIn, &wmmeStreamData->inputBuffers[i], sizeof(WAVEHDR) )) != MMSYSERR_NOERROR )963 if( ( mmresult = waveInPrepareHeader( wmmeStreamData->hWaveIn, &wmmeStreamData->inputBuffers[i], sizeof(WAVEHDR) )) != MMSYSERR_NOERROR ) 953 964 { 954 965 result = paHostError; 955 sPaHostError = m r;966 sPaHostError = mmresult; 956 967 goto error; 957 968 } … … 965 976 PaError PaHost_OpenOutputStream( internalPortAudioStream *stream ) 966 977 { 967 MMRESULT mr;968 978 PaError result = paNoError; 979 MMRESULT mmresult; 969 980 PaWMMEStreamData *wmmeStreamData; 970 981 int i; … … 999 1010 outputMmID = PaDeviceIdToWinId( stream->past_OutputDeviceID ); 1000 1011 #if PA_USE_TIMER_CALLBACK 1001 m r= waveOutOpen( &wmmeStreamData->hWaveOut, outputMmID, &wfx,1012 mmresult = waveOutOpen( &wmmeStreamData->hWaveOut, outputMmID, &wfx, 1002 1013 0, 0, CALLBACK_NULL ); 1003 1014 #else … … 1011 1022 } 1012 1023 wmmeStreamData->abortEventInited = 1; 1013 m r= waveOutOpen( &wmmeStreamData->hWaveOut, outputMmID, &wfx,1024 mmresult = waveOutOpen( &wmmeStreamData->hWaveOut, outputMmID, &wfx, 1014 1025 (DWORD)wmmeStreamData->bufferEvent, (DWORD) stream, CALLBACK_EVENT ); 1015 1026 #endif 1016 if( m r!= MMSYSERR_NOERROR )1027 if( mmresult != MMSYSERR_NOERROR ) 1017 1028 { 1018 1029 ERR_RPT(("PortAudio: PaHost_OpenOutputStream() failed!\n")); 1019 1030 result = paHostError; 1020 sPaHostError = m r;1031 sPaHostError = mmresult; 1021 1032 goto error; 1022 1033 } … … 1039 1050 wmmeStreamData->outputBuffers[i].dwBufferLength = wmmeStreamData->bytesPerHostOutputBuffer; 1040 1051 wmmeStreamData->outputBuffers[i].dwUser = i; 1041 if( (m r= waveOutPrepareHeader( wmmeStreamData->hWaveOut, &wmmeStreamData->outputBuffers[i], sizeof(WAVEHDR) )) != MMSYSERR_NOERROR )1052 if( (mmresult = waveOutPrepareHeader( wmmeStreamData->hWaveOut, &wmmeStreamData->outputBuffers[i], sizeof(WAVEHDR) )) != MMSYSERR_NOERROR ) 1042 1053 { 1043 1054 result = paHostError; 1044 sPaHostError = m r;1055 sPaHostError = mmresult; 1045 1056 goto error; 1046 1057 } … … 1192 1203 { 1193 1204 PaError result = paNoError; 1194 MMRESULT m r;1205 MMRESULT mmresult; 1195 1206 int i; 1196 1207 PaWMMEStreamData *wmmeStreamData = PaHost_GetWMMEStreamData( stream ); … … 1200 1211 if( stream->past_OutputDeviceID != paNoDevice ) 1201 1212 { 1202 if( (m r= waveOutPause( wmmeStreamData->hWaveOut )) != MMSYSERR_NOERROR )1213 if( (mmresult = waveOutPause( wmmeStreamData->hWaveOut )) != MMSYSERR_NOERROR ) 1203 1214 { 1204 1215 result = paHostError; 1205 sPaHostError = m r;1216 sPaHostError = mmresult; 1206 1217 goto error; 1207 1218 } … … 1209 1220 { 1210 1221 ZeroMemory( wmmeStreamData->outputBuffers[i].lpData, wmmeStreamData->outputBuffers[i].dwBufferLength ); 1211 m r= waveOutWrite( wmmeStreamData->hWaveOut, &wmmeStreamData->outputBuffers[i], sizeof(WAVEHDR) );1212 if( m r!= MMSYSERR_NOERROR )1222 mmresult = waveOutWrite( wmmeStreamData->hWaveOut, &wmmeStreamData->outputBuffers[i], sizeof(WAVEHDR) ); 1223 if( mmresult != MMSYSERR_NOERROR ) 1213 1224 { 1214 1225 result = paHostError; 1215 sPaHostError = m r;1226 sPaHostError = mmresult; 1216 1227 goto error; 1217 1228 } … … 1219 1230 } 1220 1231 wmmeStreamData->currentOutputBuffer = 0; 1221 if( (m r= waveOutRestart( wmmeStreamData->hWaveOut )) != MMSYSERR_NOERROR )1232 if( (mmresult = waveOutRestart( wmmeStreamData->hWaveOut )) != MMSYSERR_NOERROR ) 1222 1233 { 1223 1234 result = paHostError; 1224 sPaHostError = m r;1235 sPaHostError = mmresult; 1225 1236 goto error; 1226 1237 } … … 1228 1239 1229 1240 error: 1230 DBUG(("PaHost_StartOutput: wave returned m r = 0x%X.\n", mr));1241 DBUG(("PaHost_StartOutput: wave returned mmresult = 0x%X.\n", mmresult)); 1231 1242 return result; 1232 1243 } … … 1235 1246 { 1236 1247 PaError result = paNoError; 1237 MMRESULT m r;1248 MMRESULT mmresult; 1238 1249 int i; 1239 1250 PaWMMEStreamData *wmmeStreamData = PaHost_GetWMMEStreamData( internalStream ); … … 1245 1256 for( i=0; i<wmmeStreamData->numHostBuffers; i++ ) 1246 1257 { 1247 m r= waveInAddBuffer( wmmeStreamData->hWaveIn, &wmmeStreamData->inputBuffers[i], sizeof(WAVEHDR) );1248 if( m r!= MMSYSERR_NOERROR )1258 mmresult = waveInAddBuffer( wmmeStreamData->hWaveIn, &wmmeStreamData->inputBuffers[i], sizeof(WAVEHDR) ); 1259 if( mmresult != MMSYSERR_NOERROR ) 1249 1260 { 1250 1261 result = paHostError; 1251 sPaHostError = m r;1262 sPaHostError = mmresult; 1252 1263 goto error; 1253 1264 } 1254 1265 } 1255 1266 wmmeStreamData->currentInputBuffer = 0; 1256 m r= waveInStart( wmmeStreamData->hWaveIn );1257 DBUG(("Pa_StartStream: waveInStart returned = 0x%X.\n", m r));1258 if( m r!= MMSYSERR_NOERROR )1267 mmresult = waveInStart( wmmeStreamData->hWaveIn ); 1268 DBUG(("Pa_StartStream: waveInStart returned = 0x%X.\n", mmresult)); 1269 if( mmresult != MMSYSERR_NOERROR ) 1259 1270 { 1260 1271 result = paHostError; 1261 sPaHostError = m r;1272 sPaHostError = mmresult; 1262 1273 goto error; 1263 1274 } … … 1403 1414 PaError PaHost_StopInput( internalPortAudioStream *stream, int abort ) 1404 1415 { 1405 MMRESULT m r;1416 MMRESULT mmresult; 1406 1417 PaWMMEStreamData *wmmeStreamData = PaHost_GetWMMEStreamData( stream ); 1407 1418 1408 1419 if( wmmeStreamData == NULL ) return paNoError; /* FIXME: why return paNoError? */ 1409 (void) abort; /* FIXME: what is this?*/1420 (void) abort; /* unused parameter */ 1410 1421 1411 1422 if( wmmeStreamData->hWaveIn != NULL ) 1412 1423 { 1413 m r= waveInReset( wmmeStreamData->hWaveIn );1414 if( m r!= MMSYSERR_NOERROR )1415 { 1416 sPaHostError = m r;1424 mmresult = waveInReset( wmmeStreamData->hWaveIn ); 1425 if( mmresult != MMSYSERR_NOERROR ) 1426 { 1427 sPaHostError = mmresult; 1417 1428 return paHostError; 1418 1429 } … … 1423 1434 PaError PaHost_StopOutput( internalPortAudioStream *internalStream, int abort ) 1424 1435 { 1425 MMRESULT m r;1436 MMRESULT mmresult; 1426 1437 PaWMMEStreamData *wmmeStreamData = PaHost_GetWMMEStreamData( internalStream ); 1427 1438 1428 1439 if( wmmeStreamData == NULL ) return paNoError; /* FIXME: why return paNoError? */ 1429 (void) abort; /* FIXME: what is this?*/1440 (void) abort; /* unused parameter */ 1430 1441 1431 1442 #if PA_TRACE_START_STOP … … 1434 1445 if( wmmeStreamData->hWaveOut != NULL ) 1435 1446 { 1436 m r= waveOutReset( wmmeStreamData->hWaveOut );1437 if( m r!= MMSYSERR_NOERROR )1438 { 1439 sPaHostError = m r;1447 mmresult = waveOutReset( wmmeStreamData->hWaveOut ); 1448 if( mmresult != MMSYSERR_NOERROR ) 1449 { 1450 sPaHostError = mmresult; 1440 1451 return paHostError; 1441 1452 } … … 1518 1529 if( (hresult > 0) && (hresult < PA_ENV_BUF_SIZE) ) 1519 1530 { 1520 minLatencyMsec = atoi( envbuf ); 1531 minLatencyMsec = atoi( envbuf ); /* REVIEW: will we crash if the environment variable contains some nasty value? */ 1521 1532 } 1522 1533 else … … 1609 1620 void PaHost_FreeFastMemory( void *addr, long numBytes ) 1610 1621 { 1622 (void) numBytes; /* unused parameter */ 1623 1611 1624 PaHost_FreeTrackedMemory( addr ); /* MEM */ 1612 1625 } … … 1639 1652 PaError PaHost_StreamActive( internalPortAudioStream *internalStream ) 1640 1653 { 1641 //internalPortAudioStream *internalStream = PaHost_GetStreamRepresentation( stream );1642 PaWMMEStreamData *wmmeStreamData = PaHost_GetWMMEStreamData( internalStream );1643 1644 1654 if( internalStream == NULL ) return paBadStreamPtr; 1645 if( wmmeStreamData == NULL ) return paInternalError;1646 1647 /*1648 FIXME: why are we dereferencing wmmeStreamData here at all?1649 */1650 1655 1651 1656 return (PaError) internalStream->past_IsActive; … … 1657 1662 static PaError PaHost_UpdateStreamTime( PaWMMEStreamData *wmmeStreamData ) 1658 1663 { 1659 MMRESULT m r;1664 MMRESULT mmresult; 1660 1665 MMTIME mmtime; 1661 1666 mmtime.wType = TIME_SAMPLES; … … 1663 1668 if( wmmeStreamData->hWaveOut != NULL ) 1664 1669 { 1665 m r= waveOutGetPosition( wmmeStreamData->hWaveOut, &mmtime, sizeof(mmtime) );1670 mmresult = waveOutGetPosition( wmmeStreamData->hWaveOut, &mmtime, sizeof(mmtime) ); 1666 1671 } 1667 1672 else 1668 1673 { 1669 mr = waveInGetPosition( wmmeStreamData->hWaveIn, &mmtime, sizeof(mmtime) ); 1670 } 1671 if( mr != MMSYSERR_NOERROR ) 1672 { 1673 sPaHostError = mr; 1674 mmresult = waveInGetPosition( wmmeStreamData->hWaveIn, &mmtime, sizeof(mmtime) ); 1675 } 1676 1677 if( mmresult != MMSYSERR_NOERROR ) 1678 { 1679 sPaHostError = mmresult; 1674 1680 return paHostError; 1675 1681 } 1676 /* This data has two variables and is shared by foreground and background. */ 1677 /* So we need to make it thread safe. */ 1682 1683 /* This data has two variables and is shared by foreground and background. 1684 * So we need to make it thread safe. */ 1678 1685 EnterCriticalSection( &wmmeStreamData->streamLock ); 1679 1686 wmmeStreamData->framesPlayed += ((long)mmtime.u.sample) - wmmeStreamData->lastPosition; 1680 1687 wmmeStreamData->lastPosition = (long)mmtime.u.sample; 1681 1688 LeaveCriticalSection( &wmmeStreamData->streamLock ); 1689 1682 1690 return paNoError; 1683 1691 } … … 1696 1704 /*************************************************************************/ 1697 1705 1706 1707
Note: See TracChangeset
for help on using the changeset viewer.
