コード例 #1
0
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--;
}
コード例 #2
0
ファイル: Win-DirectSound.c プロジェクト: iSound/PlayerPRO
//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--;
}