void LC3Sound::TimeProc( UINT IDEvent, /* identifies timer event */ UINT uReserved, /* not used */ DWORD_PTR dwUser, /* application-defined instance data */ DWORD_PTR dwReserved1, /* not used */ DWORD_PTR dwReserved2 /* not used */ ) { DWORD pos, posp; static volatile int timersema=0; /* use semaphore to prevent entering the mixing routines twice.. do we need this ? */ if(++timersema==1) { lpSwSamp->GetCurrentPosition( &pos, &posp); { if( !DirectSave( soundData)) { memset(soundData, 0x80, BUFSIZE); } WriteDataToBuffer( lpSwSamp, 0, (unsigned char*) soundData, BUFSIZE); } } timersema--; }
//TODO: we should probably do something to prevent thread contention static void CALLBACK TimeProc( UINT IDEvent, /* identifies timer event */ UINT uReserved, /* not used */ DWORD_PTR dwUser, /* application-defined instance data */ DWORD_PTR dwReserved1, /* not used */ DWORD_PTR dwReserved2 /* not used */ ) { DWORD pos, posp; static volatile int timersema=0; /* use semaphore to prevent entering the mixing routines twice.. do we need this ? */ if(++timersema==1) { MADDriverRec *WinMADDriver = (MADDriverRec*) dwUser; if(WinMADDriver->Reading == false) { switch(WinMADDriver->DriverSettings.outPutBits) { case 8: memset(WinMADDriver->currentBuf, 0x80, WinMADDriver->WIN95BUFFERSIZE); break; case 16: memset(WinMADDriver->currentBuf, 0, WinMADDriver->WIN95BUFFERSIZE); break; } } WinMADDriver->lpSwSamp->lpVtbl->GetCurrentPosition(WinMADDriver->lpSwSamp, &pos, &posp); if(pos > WinMADDriver->WIN95BUFFERSIZE/2 && WinMADDriver->OnOff == true) { WinMADDriver->OnOff = false; if (!DirectSave(WinMADDriver->currentBuf, NULL, WinMADDriver)) { switch(WinMADDriver->DriverSettings.outPutBits) { case 8: memset(WinMADDriver->currentBuf, 0x80, WinMADDriver->WIN95BUFFERSIZE/2); break; case 16: memset(WinMADDriver->currentBuf, 0, WinMADDriver->WIN95BUFFERSIZE/2); break; } } if (!WriteDataToBuffer(WinMADDriver->lpSwSamp, 0, (unsigned char*) WinMADDriver->currentBuf, WinMADDriver->WIN95BUFFERSIZE/2)) { //DEBUG debugger("ERR"); } } else if (WinMADDriver->OnOff == false && (pos < WinMADDriver->WIN95BUFFERSIZE/2)) { WinMADDriver->OnOff = true; if (!DirectSave(WinMADDriver->currentBuf + WinMADDriver->WIN95BUFFERSIZE/2, NULL, WinMADDriver)) { switch(WinMADDriver->DriverSettings.outPutBits) { case 8: memset(WinMADDriver->currentBuf + WinMADDriver->WIN95BUFFERSIZE/2, 0x80, WinMADDriver->WIN95BUFFERSIZE/2); break; case 16: memset(WinMADDriver->currentBuf + WinMADDriver->WIN95BUFFERSIZE/2, 0, WinMADDriver->WIN95BUFFERSIZE/2); break; } } if (!WriteDataToBuffer(WinMADDriver->lpSwSamp, WinMADDriver->WIN95BUFFERSIZE/2, (unsigned char*) (WinMADDriver->currentBuf + WinMADDriver->WIN95BUFFERSIZE/2), WinMADDriver->WIN95BUFFERSIZE/2)) { //DEBUG debugger("ERR"); } } if (WinMADDriver->WIN95BUFFERSIZE - pos > 1700) WinMADDriver->OscilloWavePtr = WinMADDriver->currentBuf + pos; else WinMADDriver->OscilloWavePtr = WinMADDriver->currentBuf; } timersema--; }