Example #1
0
int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
                    LPSTR lpszCmdLine, int nCmdShow )
{
    TIMERINFO ti;
    DWORD beforeTickCountFast, afterTickCountFast;
    DWORD beforeTickCountSlow, afterTickCountSlow, i;
    BYTE __huge *hpvSrc;
    BYTE __huge *hpvDest;
    char szBuffer[256];
    
    hpvSrc = GlobalAllocPtr( GMEM_MOVEABLE, BLOCK_SIZE );
    hpvDest = GlobalAllocPtr( GMEM_MOVEABLE, BLOCK_SIZE );
    if ( !hpvSrc || !hpvDest )
    {
        MessageBox(0, "Couldn't allocate src/dest segs", 0, MB_OK);
        return 0;
    }

    // Call the 32 bit function once without timing it to let it switch
    // to a 32 bit segment.
    memcpy32( SELECTOROF(hpvDest), OFFSETOF(hpvDest),
              SELECTOROF(hpvSrc), OFFSETOF(hpvSrc),
              BLOCK_SIZE );

    ti.dwSize = sizeof(ti);
    TimerCount(&ti);
    beforeTickCountFast = ti.dwmsThisVM;

    // Now call the 32 bit function again, this time timing it.
    memcpy32( SELECTOROF(hpvDest), OFFSETOF(hpvDest),
              SELECTOROF(hpvSrc), OFFSETOF(hpvSrc),
              BLOCK_SIZE );
          
    TimerCount( &ti );
    afterTickCountFast = ti.dwmsThisVM;
    
    TimerCount(&ti);
    beforeTickCountSlow = ti.dwmsThisVM;

    for ( i=0; i < BLOCK_SIZE; i++)
        *hpvDest++ = *hpvSrc++;
        
    TimerCount( &ti );
    afterTickCountSlow = ti.dwmsThisVM;
    
    wsprintf(szBuffer,
            "32 bit move:       %lu milliseconds\r\n"
            "huge pointer move: %lu milliseconds",
            afterTickCountFast - beforeTickCountFast,
            afterTickCountSlow - beforeTickCountSlow);
    MessageBox( 0, szBuffer, "MIX1632 - Matt Pietrek 1994", MB_OK );

    return 0;
}
Example #2
0
void fastPoll( void )
	{
	RANDOM_STATE randomState;
	BYTE buffer[ RANDOM_BUFSIZE ];
	SYSHEAPINFO sysHeapInfo;
	MEMMANINFO memManInfo;
	TIMERINFO timerInfo;
	POINT point;

	initRandomData( randomState, buffer, RANDOM_BUFSIZE );

	/* Get various basic pieces of system information: Handle of the window
	   with mouse capture, handle of window with input focus, amount of
	   space in global heap, whether system queue has any events, cursor
	   position for last message, 55 ms time for last message, number of
	   active tasks, 55 ms time since Windows started, current mouse cursor
	   position, current caret position */
	addRandomValue( randomState, GetCapture() );
	addRandomValue( randomState, GetFocus() );
	addRandomValue( randomState, GetFreeSpace( 0 ) );
	addRandomValue( randomState, GetInputState() );
	addRandomValue( randomState, GetMessagePos() );
	addRandomValue( randomState, GetMessageTime() );
	addRandomValue( randomState, GetNumTasks() );
	addRandomValue( randomState, GetTickCount() );
	GetCursorPos( &point );
	addRandomData( randomState, &point, sizeof( POINT ) );
	GetCaretPos( &point );
	addRandomData( randomState, &point, sizeof( POINT ) );

	/* Get the largest free memory block, number of lockable pages, number of
	   unlocked pages, number of free and used pages, and number of swapped
	   pages */
	memManInfo.dwSize = sizeof( MEMMANINFO );
	MemManInfo( &memManInfo );
	addRandomData( randomState, &memManInfo, sizeof( MEMMANINFO ) );

	/* Get the execution times of the current task and VM to approximately
	   1ms resolution */
	timerInfo.dwSize = sizeof( TIMERINFO );
	TimerCount( &timerInfo );
	addRandomData( randomState, &timerInfo, sizeof( TIMERINFO ) );

	/* Get the percentage free and segment of the user and GDI heap */
	sysHeapInfo.dwSize = sizeof( SYSHEAPINFO );
	SystemHeapInfo( &sysHeapInfo );
	addRandomData( randomState, &sysHeapInfo, sizeof( SYSHEAPINFO ) );

	/* Flush any remaining data through */
	endRandomData( randomState, 25 );
	}
Example #3
0
////////////////////////////////////////////////////
// 功能: 
// 输入: 
// 输出:
// 返回: 
// 说明: 
////////////////////////////////////////////////////
static void JzThreadPlayFile(DWORD p)
{
	PAK_VFILE vfile;
	PAK_OBJECT obj;
	PMEDIA_TASK task;
	VIDEO_PARAM video;
	MEDIALIB_STATUS player_status;
	MESSAGE msg;
	int cur_time;
	int duration;
	int msgid;
	int ret,jmp_ret;
	int max_wsize;
	int max_time;
	short *pcm,*pData;
	int fade,begin_time;
 	int obj_del = 1;
	int wlen;
	int block_num;
	int	time_out;
	DWORD init_start_time,init_end_time;

#ifdef MPLAYER_PRINTF_ENABEL
	syslog_set_global_level(PRINT_INFO);
#endif

	// 获取打开信息
	obj = (PAK_OBJECT)p;
	task = &obj->Task;
	vfile = &obj->File;
	init_start_time = TimerCount();
	kdebug(mod_audio, PRINT_INFO, "mplayer init player time = %d\n",init_start_time);
	obj->PlayerType = task->ExterdType;
#ifdef CONFIG_MAKE_BIOS
	task->ExterdType = 0;
#endif
	pcm          = NULL;
	obj->hDac    = NULL;
	video.hMutex = NULL;

	//初始化mplayer使用变量
	nMplayerDelay      = 0;
	nMplayerSamplerate = 0;
	nMplayerChannels   = 0;
	nMplayerAudioStart = 0;

	//初始化回调函数
	if( (ret = MediaLibInit(obj)) < 0 )
	{
		kdebug(mod_audio, PRINT_ERROR, "MediaLibInit failed\n");
		*obj->bReady = -1;
		if( ret != -2 )
			MediaLibClose(obj);
 		goto ThreadEnd;
	}
	kdebug(mod_audio, PRINT_INFO, "mplayer MediaLibInit end = %d\n",TimerCount());

	if( task->ExterdType )
	{
		//防止SD卡播放时,拔出SD卡,导致MPLAYER在初始化阶段死机
		obj->JzAvDecoder->fMplayerInit = 1;
		kdebug(mod_audio, PRINT_INFO, "set jump error addr\n");
		jmp_ret = ksetjmp(obj->JzAvDecoder->AudioJumpBuf);
		if( jmp_ret == 1 )
		{
			kdebug(mod_audio, PRINT_ERROR, "audio error, jump to end\n");
			*obj->bReady = -1;
			if( pcm )
				kfree(pcm);
			if( obj->hDac )
				DacClose(obj->hDac);
			if(video.hMutex)
				kMutexDestroy(video.hMutex);
			MediaLibClose(obj);
			goto ThreadEnd;
		}
	}

	//打开音频库
	if( MediaLibOpen(obj, 0) < 0 )
	{	//音频库打开失败
		kdebug(mod_audio, PRINT_ERROR, "MediaLibOpen failed\n");
		*obj->bReady = -1;
		MediaLibClose(obj);
 		goto ThreadEnd;
	}
	kdebug(mod_audio, PRINT_INFO, "mplayer MediaLibOpen end = %d\n",TimerCount());

	//得到音频库信息
	if( MediaLibGetInfo(obj) < 0 )
	{	//得到音频库信息失败
		kdebug(mod_audio, PRINT_ERROR, "MediaLibGetInfo failed\n");
		*obj->bReady = -1;
		MediaLibClose(obj);
 		goto ThreadEnd;
	}

	if( !obj->Info.bHasAudio  )
	{	//没有音频数据,直接退出
		*obj->bReady = -1;
		MediaLibClose(obj);
 		goto ThreadEnd;
	}

	if(obj->Info.bHasVideo)
	{
		//有视频,但是播放区域为空,直接退出(MP3里面播放改名的RMVB等。。。。)
		if( !(task->ShowRect.w  && task->ShowRect.h) )
		{
			*obj->bReady = -1;
			MediaLibClose(obj);
 			goto ThreadEnd;
		}
	}
	kdebug(mod_audio, PRINT_INFO, "mplayer MediaLibGetInfo end = %d\n",TimerCount());

	if( obj->PlayerType )
	{	//设置视频的显示区域以及位置
		if( task->ShowRect.w  && task->ShowRect.h )
			MplayerResizeVideo(obj,task);
		else
		{
			kdebug(mod_audio, PRINT_WARNING, "can't play video\n");
			obj->JzAvDecoder->fIpuEnable = 1;
		}
	}
	else
	{
		obj->StartTime = task->ShowRect.x;
		obj->EndTime   = task->ShowRect.y;
	}

	//申请播放PCM的内存
	block_num = MAX_PCM_GET_LEN;
	pcm = (short*)kmalloc(block_num);
	if( pcm == NULL )
	{
		kdebug(mod_audio, PRINT_ERROR, "memory lose pcm == null\n");
		*obj->bReady = -1;
		MediaLibClose(obj);
		goto ThreadEnd;
	}
	kdebug(mod_audio, PRINT_INFO, "mplayer kmalloc pcm end = %d\n",TimerCount());

	//MPLAYER播放器使用,用来设置从MPLAYER读到的PCM数据以及长度
	if( obj->PlayerType )
	{	//外部播放器使用变量
		pMediaPcmData = (BYTE*)pcm;
		nMediaPcmLen  = 0;
	}

	// 打开DAC设备,并设置DAC设备采样率、声道
	*obj->bReady = 1;
	obj->hDac = DacOpen();
	if(obj->hDac == NULL)
	{
		kdebug(mod_audio, PRINT_ERROR, "dac open error\n");
		kfree(pcm);
		MediaLibClose(obj);
		goto ThreadEnd;
	}
	if(DacSetSamplerate(obj->hDac, obj->Info.AudioSamplerate, obj->Info.AudioChannels) < 0)
	{
		kdebug(mod_audio, PRINT_ERROR, "set samplerate error\n");
		kfree(pcm);
		DacClose(obj->hDac);
		MediaLibClose(obj);
		goto ThreadEnd;
	}

	kdebug(mod_audio, PRINT_INFO, "mplayer dacopen end = %d\n",TimerCount());
	DacSetTempo(obj->hDac, obj->Task.Tempo);
	DacSetVolume(obj->hDac, obj->Task.Volume);
	kdebug(mod_audio, PRINT_INFO, "volume = %d, tempo=%d\n",obj->Task.Volume, obj->Task.Tempo);


	// 计算每次写入PCM数据最大值(1K的整数倍)
	max_wsize =  50 * (obj->Info.AudioSamplerate * obj->Info.AudioChannels * sizeof(short)) / 1000;
	max_wsize = ((max_wsize + 1023) / 1024) * 1024;
	max_time = (max_wsize * 1000) / (obj->Info.AudioSamplerate * obj->Info.AudioChannels * sizeof(short));

	begin_time = MediaLibPlay(obj);
	if( begin_time < 0 )
	{
		kdebug(mod_audio, PRINT_ERROR, "MediaLibPlay failed\n");
		if(video.hMutex)
			kMutexDestroy(video.hMutex);
		*obj->bReady = -1;
		DacClose(obj->hDac);
		MediaLibClose(obj);
		kfree(pcm);
		goto ThreadEnd;
	}

	// 设置视频输出
	if (obj->Info.bHasVideo)
	{
		// 启动视频解码线程
		video.obj = obj;
		video.fPlayVideo = 1;
		video.hMutex = kMutexCreate();
		video.audio_frame_time = 0;
		video.video_frame_time = 0;
		kdebug(mod_audio, PRINT_INFO, "create video thread\n");
		KernelThread(PRIO_USER+2, AkThreadVideoPlay, (DWORD)&video, 0x8000);
	}
	else
	{
		video.obj = obj;
		video.hMutex = NULL;
		video.fPlayVideo = 0;
		video.audio_frame_time = 0;
		video.video_frame_time = 0;
	}
		
	// 发送WM_MEDIA_OPEN消息
	if(task->hWnd)
	{
		msg.hWnd = task->hWnd;
		msg.Data.v = 0;
		msg.hWndSrc = 0;
		msg.MsgId = WM_MEDIA_OPEN;
		msg.Param = 0;
#if defined(STC_EXP)
		sGuiMsgPutMsg(&msg);
#else
		GuiMsgPutMsg(&msg);
#endif
	}

	// 循环解压并播放
	fade = 0;
	duration = 0;
	fPlayMedia = 1;
	obj->RecDuration = 0;

	if( task->ExterdType )
		obj->JzAvDecoder->fMplayerInit = 0;
	init_end_time = TimerCount();
	kdebug(mod_audio, PRINT_INFO, "mplayer start play time = %d\n",init_end_time);
	kdebug(mod_audio, PRINT_INFO, "playe init time = %dms\n",(init_end_time-init_start_time)*10);
	kdebug(mod_audio,PRINT_INFO,"obj->StartTime = %d, Obj->EndTime = %d\n",obj->StartTime,obj->EndTime);
	while(!obj->bClose && !obj->bTerminate)
	{
		// 解码音频数据
		if(video.hMutex)
			kMutexWait(video.hMutex);

		//得到PCM数据
		player_status = MediaLibGetStatus(obj);
		wlen = MediaLibGetPcm(obj,(BYTE*)pcm,block_num);
//		kprintf("wlen = %d\n",wlen);
		if((wlen<0) || (player_status==MEDIALIB_END) || (player_status==MEDIALIB_ERR))
		{
			DacWriteEnd(obj->hDac, 0);
			if(MEDIALIB_ERR == player_status)
			{
				kdebug(mod_media, PRINT_ERROR, "media lib error!\n");
				obj->bClose = 2;
			}
			else
				obj->bClose = 1;
			if(video.hMutex)
				kMutexRelease(video.hMutex);
			kdebug(mod_audio, PRINT_INFO, "wlen = %d, player_status = %d\n",wlen,player_status);
			break;
		}

		// 获取当前音频解码时间
		cur_time = MediaLibGetAudioCurTime(obj);
//		kprintf("cur time = %d\n",cur_time);
		if( obj->StartTime )
		{
			MediaLibSeek(obj,obj->StartTime);
			obj->StartTime = 0;
			wlen = 0;
		}

		if( obj->EndTime && cur_time >= obj->EndTime )
		{	//定时播放,如果播放时间到,则直接播放结束
			DacWriteEnd(obj->hDac, 0);
			obj->bClose = 1;
			if(video.hMutex)
				kMutexRelease(video.hMutex);
			kprintf("play seek end: cur time = %d, end time = %d\n",cur_time,obj->EndTime);
			break;
		}

		if(video.hMutex)
			kMutexRelease(video.hMutex);

		if( nMplayerAudioStart == 0 && video.hMutex)
		{
			time_out = 100;
			nMplayerAudioStart = 1;
			while( nMplayerAudioStart != 3 && time_out--)
				sTimerSleep(10,NULL);
			if( !time_out )
				kprintf("!!!!!!!! WARNNING : wait video time out !!!!!!!!\n");
			nMplayerAudioStart = 4;
		}

		// 输出音频数据到DA
		pData = pcm;
		obj->RecDuration = cur_time;
 		while(wlen > 0)
		{
			DWORD wsize;
			int ctl_code;

			// 写入PCM数据到DAC设备
			wsize = (wlen > max_wsize) ? max_wsize : wlen;
			if(fade)
			{
				int s;
				short pcms;
				pcms = wsize / sizeof(short);
				for(s=0; s<pcms; s++)
				{
					int tmp;
					tmp = (int)pData[s];
					tmp = (tmp * (pcms - s)) / pcms;
					pData[s] = (short)tmp;
				}
				DacWrite(obj->hDac, pData, wsize);
				DacWriteEnd(obj->hDac, 0);
				break;
			}
			else
			{
				if( DacWrite(obj->hDac, pData, wsize) == 0 )
				{	//出错,返回值为0
					kdebug(mod_audio, PRINT_ERROR, "dac write is 0 \n");
					obj->bClose = 1;
					break;
				}
			}

			// 提高当前时间精度
			if( wsize == max_wsize )
				obj->RecDuration += max_time;
			else
				obj->RecDuration += (wsize * 1000) / (obj->Info.AudioSamplerate * obj->Info.AudioChannels * sizeof(short));

			pData += wsize / sizeof(short);
			wlen -= wsize;
			
			// 控制动作处理
			if(video.hMutex)
				kMutexWait(video.hMutex);
			ctl_code = JzSrvProcMsg(obj);
			player_status = MediaLibGetStatus(obj);
			if(video.hMutex)
				kMutexRelease(video.hMutex);

 			// 等待退出暂停状态
			while( MEDIALIB_PAUSE == player_status && !obj->bClose && !obj->bTerminate)
			{
				sTimerSleep(100, NULL);

				if(video.hMutex)
					kMutexWait(video.hMutex);
				ctl_code = JzSrvProcMsg(obj);
				player_status = MediaLibGetStatus(obj);
				if(video.hMutex)
					kMutexRelease(video.hMutex);
			}
			
			// 检查是否退出
			if(obj->bTerminate)
			{
// 				if(fade == 0 && wlen == 0)
// 				{
// 					wlen = MediaLibGetPcm(obj,(BYTE*)pcm,block_num);
// 					pData = pcm;
// 					if(wlen < 0)
// 					{
// 						wlen = 0;
// 					}
// 				}
				kdebug(mod_audio, PRINT_INFO, "fade len:%d\n", wlen);
				fade = 1;
			}
 		}
	}

	//如果是强行退出,则直接关闭MOS管,方式喀嚓声
	if( obj->bTerminate && GetDacChannel() <= 1 )
	{
		kdebug(mod_audio, PRINT_INFO, "terminate media, close mute mos\n");
	}

	init_start_time = TimerCount();
	kdebug(mod_audio, PRINT_INFO, "close meidia start : %d\n",init_start_time);

	// 是否用于视频的互斥量
	if(video.hMutex)
	{	//等待视频结束
		while( 1 )
		{
			if( !video.fPlayVideo )
				break;
			sTimerSleep(10, NULL);
		}
		kMutexDestroy(video.hMutex);
	}

	// 关闭DAC设备
	DacClose(obj->hDac);
	MediaLibClose(obj);
	kfree(pcm);

	init_end_time = TimerCount();
	kdebug(mod_audio, PRINT_INFO, "close meidia end : %d - %dms\n",init_end_time, (init_end_time - init_start_time)*10);
ThreadEnd:
	fPlayMedia = 0;
	WinClipMask(NULL);

	//MPLAYER播放器使用,用来设置从MPLAYER读到的PCM数据以及长度
	if( obj->PlayerType )
	{	//外部播放器使用变量
		pMediaPcmData = NULL;
		nMediaPcmLen  = 0;
	}

	// 设置线程结束标志	
	msgid = 0;
	if(obj->bTerminate || (obj->bClose == 2))
	{	
		msgid = WM_MEDIA_TERMINATE;
		msg.MsgId = msgid;
		msg.hWnd = task->hWnd;
	}
	else if(obj->bClose)
	{	
		msgid = WM_MEDIA_CLOSE;
		msg.MsgId = msgid;
		msg.hWnd = task->hWnd;
	}
	else
	{
		// 未启动播放即结束
		msgid = 0;
		*obj->bReady = -1;
	}
	
	// 设置返回消息参数	
	if((obj->bTerminate == 2))
		msg.Data.v = 1;
	else if(obj->bClose == 2)
		msg.Data.v = 2;
	else
		msg.Data.v = 0;
	
	// 删除对象
	if(obj->bTerminate == 1)
		obj_del = 0;
	else
		JzSrvDestroyNotify(task);
	
	// 发送WM_MEDIA_CLOSE消息
	if(msgid)
	{
		msg.hWndSrc = 0;
		msg.Param = 0;
	#if defined(STC_EXP)
		sGuiMsgPutMsg(&msg);
	#else
		GuiMsgPutMsg(&msg);
	#endif
	}
	
	// 增加Terminate标记,方便退出
	if(!obj_del)
		obj->bTerminate++;

	kdebug(mod_audio, PRINT_INFO, "medialib close finish\n");
#ifdef MPLAYER_PRINTF_ENABEL
	syslog_set_global_level(PRINT_NOTICE);
#endif
#if defined(STC_EXP)
	sThreadTerminate(sThreadSelf());
#else
	ThreadTerminate(ThreadSelf());
#endif
}
Example #4
0
////////////////////////////////////////////////////
// 功能: 
// 输入: 
// 输出:
// 返回: 
// 说明: 
////////////////////////////////////////////////////
static void AkThreadVideoPlay(DWORD p)
{
	PVIDEO_PARAM video = (PVIDEO_PARAM)p;
	PAK_OBJECT obj;
	DWORD pre_audio_time;
	DWORD audio_time;
	DWORD frame_time;
	DWORD delay_time;
	DWORD totle_time;
	DWORD totle_fps;
	RECT *show_rect;
	int pts;
	int pass_frame;
	MEDIALIB_STATUS player_status;
			
	frame_time = 0;
	audio_time = 0;
	pre_audio_time = 0;
	pass_frame = 0;
	delay_time = 0;
	totle_time = 0;
	totle_fps  = 0;
	video->fPlayVideo = 1;
	frame_time = TimerCount();
	obj = video->obj;
	MxuEnable();

	show_rect = &obj->Task.ShowRect;
	WinClipMask(show_rect);
	while(!obj->bClose && !obj->bTerminate)
	{
		kMutexWait(video->hMutex);

		if( !nMplayerAudioStart || nMplayerAudioStart == 3 )
		{
			kMutexRelease(video->hMutex);
			sTimerSleep(10, NULL);
			continue;
		}

		if( nMplayerAudioStart == 1 )
			nMplayerAudioStart = 2;

		// 获取音频时间	
		audio_time = obj->RecDuration;
		
		// 矫正同步时间
		{
			DWORD tick;
			tick = TimerCount();
			pts  = MediaLibGetYuv(obj);
			totle_time += TimerCount() - tick;
			totle_fps++;
		}

		if( nMplayerAudioStart == 2 )
			nMplayerAudioStart = 3;
		
//		kprintf("%d,%d\n",pts,audio_time);
		if(pts < 0)
		{
			player_status = MediaLibGetStatus(obj);
			if (MEDIALIB_ERR == player_status)
			{
				kdebug(mod_video, PRINT_ERROR, "video decode error!\n");
				obj->bClose = 2;
				kMutexRelease(video->hMutex);
				break;
			}
			else if(MEDIALIB_PAUSE == player_status)
			{
				kMutexRelease(video->hMutex);
				
				// 等待退出暂停状态
				do
				{
					sTimerSleep(100, NULL);
					kMutexWait(video->hMutex);
					player_status = MediaLibGetStatus(obj);
					kMutexRelease(video->hMutex);
				}while((MEDIALIB_PAUSE == player_status) && !obj->bClose && !obj->bTerminate);
				
				// 重新设置系数				
				frame_time = 0;
				audio_time = 0;
				pre_audio_time = 0;
				frame_time = TimerCount();
				
				// 继续解压循环
				continue;
			}
			else
			{
				obj->bClose = 1;
				kMutexRelease(video->hMutex);
				break;
			}
		}
		player_status = MediaLibGetStatus(obj);
		if(player_status == MEDIALIB_ERR)
		{
			kdebug(mod_video, PRINT_ERROR, "video decode error!\n");
			obj->bClose = 2;
			kMutexRelease(video->hMutex);
			break;
		}

		kMutexRelease(video->hMutex);

		// 等待退出暂停状态
		while( MEDIALIB_PAUSE == player_status && !obj->bClose && !obj->bTerminate)
		{
			sTimerSleep(100, NULL);

			kMutexWait(video->hMutex);
			player_status = MediaLibGetStatus(obj);
			kMutexRelease(video->hMutex);
		}
	}
	WinClipMask(NULL);
	kdebug(mod_video, PRINT_INFO, "totle_fps = %d, total_time = %d\n",totle_fps,totle_time);
	kdebug(mod_video, PRINT_INFO, "video thread close\n");
	video->fPlayVideo = 0;
#if defined(STC_EXP)
	sThreadTerminate(sThreadSelf());
#else
	ThreadTerminate(ThreadSelf());
#endif
}