⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 platform_win32.c

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
 *
 * This program is free software ; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 * $Id: platform_win32.c 622 2006-01-31 19:02:53Z picard $
 *
 * The Core Pocket Media Player
 * Copyright (c) 2004-2005 Gabor Kovacs
 *
 ****************************************************************************/

#include "../common.h"

#if defined(TARGET_WIN32) || defined(TARGET_WINCE)

#ifndef STRICT
#define STRICT
#endif
#include <windows.h>

// registry backups of original value
#define REG_BATTERYTIMEOUT	 0x2000
#define REG_ACTIMEOUT		 0x2001
#define REG_SCREENSAVER		 0x2002
#define REG_DISPPOWER	 	 0x2003

#define REG_ACSUSPEND		 0x2004
#define REG_BATTSUSPEND		 0x2005
#define REG_ACUSERIDLE		 0x2006
#define REG_BATTUSERIDLE	 0x2007
#define REG_ACSYSTEMIDLE	 0x2008
#define REG_BATTSYSTEMIDLE	 0x2009

#define REG_BATTERYTIMEOUT2  0x200A
#define REG_ACTIMEOUT2		 0x200B

void DMO_Init();
void DMO_Done();
void File_Init();
void File_Done();

#if defined(TARGET_WINCE)
#define HKEY_ROOT HKEY_LOCAL_MACHINE
#else
#define HKEY_ROOT HKEY_CURRENT_USER
#endif

#if defined(TARGET_WINCE)

#define POWER_NAME			1
#define POWER_UNSPEC		-1
#define POWER_D0			0
#define POWER_D4			4

#ifndef DISP_CHANGE_SUCCESSFUL
#define DISP_CHANGE_SUCCESSFUL 0
#endif
#ifndef CDS_TEST
#define CDS_TEST            0x00000002
#endif
#ifndef DM_DISPLAYORIENTATION
#define DM_DISPLAYORIENTATION 0x00800000L
#endif
#ifndef DM_DISPLAYQUERYORIENTATION 
#define DM_DISPLAYQUERYORIENTATION 0x01000000L
#endif
#ifndef DMDO_0
#define DMDO_0      0
#endif
#ifndef DMDO_90
#define DMDO_90     1
#endif
#ifndef DMDO_180
#define DMDO_180    2
#endif
#ifndef DMDO_270
#define DMDO_270    4
#endif

#define SPI_GETOEMINFO				258
#define SPI_GETPLATFORMTYPE			257

typedef struct MSGQUEUEOPTIONS2 
{
	DWORD dwSize;
	DWORD dwFlags;
	DWORD dwMaxMessages;
	DWORD cbMaxMessage;
	BOOL  bReadAccess;

} MSGQUEUEOPTIONS2;

BOOL (WINAPI* FuncCeSetThreadQuantum)(HANDLE, DWORD) = NULL;
static HANDLE (WINAPI* FuncSetPowerRequirement)(PVOID,int,ULONG,PVOID,ULONG) = NULL;
static DWORD (WINAPI* FuncReleasePowerRequirement)(HANDLE) = NULL;
static DWORD (WINAPI* FuncSetDevicePower)(PVOID,DWORD,int) = NULL;
static DWORD (WINAPI* FuncGetDevicePower)(PVOID,DWORD,int*) = NULL;
static BOOL (WINAPI* FuncSHGetDocumentsFolder)(LPCTSTR,LPTSTR) = NULL;
static BOOL (WINAPI* FuncSHGetSpecialFolderPath)(HWND,LPTSTR,int,BOOL) = NULL;
static LONG (WINAPI* FuncChangeDisplaySettingsEx)(LPCTSTR,LPDEVMODE,HWND,DWORD,LPVOID) = NULL;
static BOOL (WINAPI* FuncSetKMode)(BOOL) = NULL;
static BOOL (WINAPI* FuncRedrawWindow)(HWND,CONST RECT*,HRGN,UINT) = NULL;
static void (WINAPI* FuncSHIdleTimerReset)() = NULL;
static BOOL (WINAPI* FuncReadMsgQueue)(HANDLE hMsgQ, LPVOID lpBuffer, DWORD cbBufferSize, LPDWORD lpNumberOfBytesRead, DWORD dwTimeout, DWORD *pdwFlags) = NULL;
static HANDLE (WINAPI* FuncCreateMsgQueue)(LPCWSTR lpName, MSGQUEUEOPTIONS2* lpOptions) = NULL;
static BOOL (WINAPI* FuncCloseMsgQueue)(HANDLE hMsgQ) = NULL;
static HANDLE (WINAPI* FuncRequestPowerNotifications)(HANDLE  hMsgQ,DWORD Flags) = NULL;
static DWORD (WINAPI* FuncStopPowerNotifications)(HANDLE h) = NULL;

static HMODULE CoreDLL = NULL;
static HMODULE CEShellDLL = NULL;
static HANDLE BacklightEvent = NULL;
static HANDLE PowerHandle = NULL;

#endif

static HMODULE AygShellDLL = NULL;

static const tchar_t RegBacklight[] = T("ControlPanel\\Backlight");
static const tchar_t RegBatteryTimeout[] = T("BatteryTimeout");
static const tchar_t RegACTimeout[] = T("ACTimeout");
static const tchar_t RegScreenSaver[] = T("ControlPanel\\ScreenSaver");
static const tchar_t RegMode[] = T("Mode");
static const tchar_t RegPower[] = T("ControlPanel\\Power");
static const tchar_t RegDisplay[] = T("Display");

static const tchar_t RegPowerTimouts[] = T("SYSTEM\\CurrentControlSet\\Control\\Power\\Timeouts");
static const tchar_t RegBattUserIdle[] = T("BattUserIdle");
static const tchar_t RegACUserIdle[] = T("ACUserIdle");
static const tchar_t RegBattSystemIdle[] = T("BattSystemIdle");
static const tchar_t RegACSystemIdle[] = T("ACSystemIdle");
static const tchar_t RegBattSuspend[] = T("BattSuspend");
static const tchar_t RegACSuspend[] = T("ACSuspend");

static const tchar_t RegCASIOBacklight[] = T("Drivers\\CASIO\\BackLight");
static const tchar_t RegTimeoutBattery[] = T("TimeoutBattery");
static const tchar_t RegTimeoutExPower[] = T("TimeoutExPower");

#define GETVFRAMEPHYSICAL			6144
#define GETVFRAMELEN				6145
#define DBGDRIVERSTAT				6146
#define SETPOWERMANAGEMENT			6147
#define GETPOWERMANAGEMENT			6148

typedef struct VIDEO_POWER_MANAGEMENT {
    ULONG Length;
    ULONG DPMSVersion;
    ULONG PowerState;
} VIDEO_POWER_MANAGEMENT;

static rgb Palette[256];
static tchar_t DocumentPath[MAX_PATH]; //important! has to be the MAX_PATH
static tchar_t SystemPath[MAX_PATH]; //important! has to be the MAX_PATH
static bool_t DisplayPower = 1;
static int Orientation = -1;
static bool_t WaitCursor = 0;
static bool_t WaitCursorDisable = 0;
static stream* Debug = NULL;

#if defined(MIPS)
int GetTimeFreq() 
{ 
	return 1000; 
}
int GetTimeTick()
{
	SYSTEMTIME t;
	GetSystemTime(&t);
	return (t.wDay*24+t.wHour)*60*60*1000+(t.wMinute*60+t.wSecond)*1000+t.wMilliseconds;
}
void GetTimeCycle(int* p)
{
	SYSTEMTIME i,j;
	int n=0;
	GetSystemTime(&i);
	do
	{
		++n;
		GetSystemTime(&j);
	}
	while (j.wMilliseconds==i.wMilliseconds);
	p[0] = (j.wDay*24+j.wHour)*60*60*1000+(j.wMinute*60+j.wSecond)*1000+j.wMilliseconds;
	p[1] = n;
}
#elif defined(TARGET_WINCE)
int GetTimeFreq() 
{ 
	return 1000; 
}
int GetTimeTick()
{
	return GetTickCount();
}
void GetTimeCycle(int* p)
{
	int n=1;
	int j;
	int i = GetTickCount();
	while ((j = GetTickCount())==i)
		++n;
	p[0] = j;
	p[1] = n;
}
#else
int GetTimeFreq() 
{ 
	return 1000; 
}
int GetTimeTick()
{
	return timeGetTime();
}
void GetTimeCycle(int* p)
{
	int n=1;
	int j;
	int i = timeGetTime();
	while ((j = timeGetTime())==i)
		++n;
	p[0] = j;
	p[1] = n;
}
#endif

void ReleaseModule(void** Module)
{
	if (*Module)
	{
		FreeLibrary(*Module);
		*Module = NULL;
	}
}

void GetProc(void** Module,void* Ptr,const tchar_t* ProcName,int Optional)
{
	FARPROC* Func = (FARPROC*)Ptr;
	if (*Module)
	{
#if !defined(TARGET_WINCE) && defined(UNICODE)
		char ProcName8[256];
		TcsToStr(ProcName8,sizeof(ProcName8),ProcName);
		*Func = GetProcAddress(*Module,ProcName8);
#else
		*Func = GetProcAddress(*Module,ProcName);
#endif
		if (!*Func && !Optional)
			ReleaseModule(Module);
	}
	else
		*Func = NULL;
}

int DefaultLang()
{
	tchar_t Lang[16];
	if (GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SABBREVLANGNAME,Lang,TSIZEOF(Lang)) >= 2)
	{
		tcsupr(Lang);
		if (tcscmp(Lang,T("JPN"))==0) tcscpy_s(Lang,TSIZEOF(Lang),T("JA"));
		if (tcscmp(Lang,T("GER"))==0) tcscpy_s(Lang,TSIZEOF(Lang),T("DE"));
		if (tcscmp(Lang,T("SPA"))==0) tcscpy_s(Lang,TSIZEOF(Lang),T("ES"));

		// special three letter cases: Chinese traditional (CHT) and Chinese simplified (CHS)
		if (tcscmp(Lang,T("CHS"))==0 || tcscmp(Lang,T("ZHI"))==0 || tcscmp(Lang,T("ZHM"))==0)
			return FOURCC('C','H','S','_');
		else
		if (tcscmp(Lang,T("CHT"))==0 || tcscmp(Lang,T("ZHH"))==0)
			return FOURCC('C','H','T','_');
		else
		if (tcscmp(Lang,T("PTB"))==0)
			return FOURCC('P','T','B','_');
		else
			return FOURCC(Lang[0],Lang[1],'_','_'); // two letter version
	}
	return LANG_DEFAULT;
}

void PlatformDetect(platform* p)
{
#if defined(TARGET_WINCE)
	tchar_t OemUpper[64];
	HKEY Key;
	RECT WorkArea;
#endif
	OSVERSIONINFO Ver;

	Ver.dwOSVersionInfoSize = sizeof(Ver);
	GetVersionEx(&Ver);
	p->Ver = Ver.dwMajorVersion*100 + Ver.dwMinorVersion;
	stprintf_s(p->Version,TSIZEOF(p->Version),T("%d.%02d"),p->Ver/100,p->Ver%100);

#if defined(TARGET_WINCE)

	p->WMPVersion = 9;
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, T("SOFTWARE\\Microsoft\\MediaPlayer\\ASFCodecs"), 0, KEY_READ, &Key) == ERROR_SUCCESS)
	{
		p->WMPVersion = 10;
		RegCloseKey(Key);
	}

	p->Type = TYPE_WINCE;
	if (SystemParametersInfo(SPI_GETPLATFORMTYPE,sizeof(p->PlatformType),p->PlatformType,0)!=0)
	{
		if (tcsicmp(p->PlatformType,T("PocketPC"))==0)
			p->Type = TYPE_POCKETPC;
		else
		if (tcsicmp(p->PlatformType,T("Smartphone"))==0)
			p->Type = TYPE_SMARTPHONE;
	}
	else
	if (GetLastError()==ERROR_ACCESS_DENIED)
	{
		tcscpy_s(p->PlatformType,TSIZEOF(p->PlatformType),T("Smartphone"));
		p->Type = TYPE_SMARTPHONE;
	}
	else
		tcscpy_s(p->PlatformType,TSIZEOF(p->PlatformType),T("Windows CE"));

	SystemParametersInfo(SPI_GETOEMINFO,sizeof(p->OemInfo),p->OemInfo,0);
	tcscpy_s(OemUpper,TSIZEOF(OemUpper),p->OemInfo);
	tcsupr(OemUpper);

#if defined(ARM)
	if (tcsstr(OemUpper,T("NOVOGO")))
		p->Model = MODEL_NOVOGO; // more models...
	else
	if (tcsstr(OemUpper,T("TYPHOON")))
		p->Model = MODEL_SPV_C500_ORIGROM;
	else
	if (tcsstr(OemUpper,T("PW10B")) ||
		tcsstr(OemUpper,T("PW10A")))
	{
		p->Model = MODEL_O2_XDA;
		p->Caps |= CAPS_ONLY12BITRGB;
	}
	else
	if (tcsstr(OemUpper,T("Compal P6C")))
		p->Model = MODEL_AMIGO_600C;
	else
	if (tcsstr(OemUpper,T("Pocket PC J710")))
		p->Model = MODEL_CASIO_E200;
	else
	if (tcsstr(OemUpper,T("JORNADA")))
	{
		p->Caps |= CAPS_LANDSCAPE;
		if (tcsstr(OemUpper,T("680")))
			p->Model = MODEL_JORNADA_680;
		else
		if (tcsstr(OemUpper,T("690")))
			p->Model = MODEL_JORNADA_690;
		else
		if (tcsstr(OemUpper,T("710")))
			p->Model = MODEL_JORNADA_710;
		else
		if (tcsstr(OemUpper,T("720")))
			p->Model = MODEL_JORNADA_720;
	}
	else
	if (tcsstr(OemUpper,T("IPAQ")))
	{
		p->Caps |= CAPS_PORTRAIT;
		if (tcsstr(OemUpper,T("H3600")))
		{
			p->Model = MODEL_IPAQ_H3600;
			p->Caps |= CAPS_ONLY12BITRGB;
		}
		else
		if (tcsstr(OemUpper,T("H3700")))
		{
			p->Model = MODEL_IPAQ_H3700;
			p->Caps |= CAPS_ONLY12BITRGB;
		}
		else
		if (tcsstr(OemUpper,T("H3800")))
			p->Model = MODEL_IPAQ_H3800;
		else
		if (tcsstr(OemUpper,T("H3900")))
			p->Model = MODEL_IPAQ_H3900;
		else
		if (tcsstr(OemUpper,T("HX4700")))
			p->Model = MODEL_IPAQ_HX4700;
	}
	else
	if (tcsstr(OemUpper,T("TOSHIBA")))
	{
		p->Caps |= CAPS_PORTRAIT;
		if (tcsstr(OemUpper,T("E740")))
			p->Model = MODEL_TOSHIBA_E740;
		else
		if (tcsstr(OemUpper,T("E750")))
			p->Model = MODEL_TOSHIBA_E750;
		else
		if (tcsstr(OemUpper,T("E80")))
			p->Model = MODEL_TOSHIBA_E800;
	}
	else
	if (tcsstr(OemUpper,T("AXIM")))
	{
		if (tcscmp(OemUpper+tcslen(OemUpper)-2,T("X5"))==0)
			p->Model = MODEL_AXIM_X5;

		if (tcscmp(OemUpper+tcslen(OemUpper)-3,T("X50"))==0 ||
			tcscmp(OemUpper+tcslen(OemUpper)-4,T("X50V"))==0)
			p->Model = MODEL_AXIM_X50;
	}
	else
	if (tcsstr(OemUpper,T("LOOX")))
	{
		if (tcsstr(OemUpper,T("720")))
			p->Model = MODEL_LOOX_720;
	}
	else
	if (tcsstr(OemUpper,T("NEXIO")))
	{
		if (tcsstr(OemUpper,T("XP40")))
			p->Model = MODEL_NEXIO_XP40;
		else
		if (tcsstr(OemUpper,T("XP30")))
			p->Model = MODEL_NEXIO_XP30;
	}

#elif defined(MIPS)
	if (tcsstr(OemUpper,T("BSQUARE")))
	{
		tcscpy_s(OemUpper,TSIZEOF(OemUpper),p->PlatformType);
		tcsupr(OemUpper);

		if (tcsstr(OemUpper,T("ALCHEMY")))
			p->Model = MODEL_BSQUARE_ALCHEMY;

		tcscpy_s(OemUpper,TSIZEOF(OemUpper),p->OemInfo);
		tcsupr(OemUpper);
	}

	if (tcsstr(OemUpper,T("POCKET")))
	{
		if (tcsstr(OemUpper,T(" J74")))
		{
			p->Model = MODEL_CASIO_BE300;
			p->Caps |= CAPS_OLDSHELL;
		}
	}

	if (tcsstr(OemUpper,T("POCKET PC")))
	{
		p->Caps |= CAPS_PORTRAIT;
		if (tcsstr(OemUpper,T(" J67")))
			p->Model = MODEL_CASIO_E125;
		else
		if (tcsstr(OemUpper,T(" J76")))
			p->Model = MODEL_CASIO_EM500;
		else
		if (tcsstr(OemUpper,T(" J58")))
			p->Model = MODEL_CASIO_E115;
		else
		if (tcsstr(OemUpper,T(" J53")) || tcsstr(OemUpper,T(" JX53")))
			p->Model = MODEL_CASIO_E105;
	}

	if (tcsstr(OemUpper,T("HC-VJ")))
		p->Model = MODEL_INTERMEC_6651;
	
	if (tcsstr(OemUpper,T("JVC")))
	{
		if (tcsstr(OemUpper,T("C33")))
			p->Model = MODEL_JVC_C33;
	}

	if (tcsstr(OemUpper,T("COMPAQ AERO 15")))
		p->Model = MODEL_COMPAQ_AERO_1500;

#elif defined(SH3)
	if (tcsstr(OemUpper,T("JORNADA")))
	{
		if (tcsstr(OemUpper,T(" 43")))
		{
			p->Caps |= CAPS_ONLY12BITRGB;
		}
		if (tcsstr(OemUpper,T(" 54")))
		{
			p->Model = MODEL_JORNADA_540;
			p->Caps |= CAPS_ONLY12BITRGB | CAPS_PORTRAIT;
		}
	}
#endif

	if (!AygShellDLL && p->Ver < 300)
		p->Caps |= CAPS_OLDSHELL;

	// detect fake navigator bar and use old style menu
	if (p->Type != TYPE_SMARTPHONE && AygShellDLL && 
		SystemParametersInfo(SPI_GETWORKAREA,0,&WorkArea,0) && WorkArea.top==0)
		p->Caps |= CAPS_OLDSHELL;

#else
	tcscpy_s(p->PlatformType,TSIZEOF(p->PlatformType),T("Windows"));
	p->Type = TYPE_WIN32;
#endif
}

#if defined(TARGET_WINCE)

/*
#define PBT_TRANSITION      1

#define POWER_STATE(i)		((i)&0xFFFF0000)
#define POWER_STATE_ON		0x00010000
#define POWER_STATE_SUSPEND 0x00200000

typedef struct POWER_BROADCAST
{
	DWORD Message;
	DWORD Flags;
	DWORD Length;
	WCHAR SystemPowerState[64];

} POWER_BROADCAST;

static HANDLE Power = NULL;
static HANDLE PowerMsgQueue = NULL;
static HANDLE PowerExitEvent = NULL;
static HANDLE PowerThreadHandle = NULL;

static DWORD WINAPI PowerThread( LPVOID Parameter )
{
	DWORD PowerState = POWER_STATE_ON;
	POWER_BROADCAST Msg;
	DWORD Size;
	DWORD Flags;
	HANDLE Handles[2];
	
	Handles[0] = PowerExitEvent;
	Handles[1] = PowerMsgQueue;

	for (;;)
	{
		DWORD Result = WaitForMultipleObjects(2, Handles, FALSE, INFINITE);
		if (Result == WAIT_OBJECT_0 || Result == WAIT_ABANDONED_0)
			break;

		if (FuncReadMsgQueue(PowerMsgQueue,&Msg,sizeof(Msg),&Size,0,&Flags))
		{
			if (Size >= sizeof(DWORD)*2 && Msg.Message == PBT_TRANSITION && Msg.Flags &&
				PowerState != POWER_STATE(Msg.Flags))
			{
				PowerState = POWER_STATE(Msg.Flags);
				if (PowerState == POWER_STATE_ON || PowerState == POWER_STATE_SUSPEND)
				{
					bool_t b = PowerState == POWER_STATE_SUSPEND;
					node* Player = Context()->Player;
					if (Player)
						Player->Set(Player,PLAYER_POWEROFF,&b,sizeof(b));
				}
			}
		}
	}

	return 0;
}

static void Power_Init()
{
	DWORD Id;
	MSGQUEUEOPTIONS2 MsgOpt;

	if (FuncRequestPowerNotifications && FuncReadMsgQueue && FuncStopPowerNotifications &&
		FuncCreateMsgQueue && FuncCloseMsgQueue)
	{
		memset(&MsgOpt,0,sizeof(MsgOpt));
		MsgOpt.dwSize = sizeof(MsgOpt);
		MsgOpt.dwFlags = 0;
		MsgOpt.dwMaxMessages = 8;
		MsgOpt.cbMaxMessage = sizeof(POWER_BROADCAST);
		MsgOpt.bReadAccess = TRUE;

		PowerExitEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
		if (PowerExitEvent)
		{
			PowerMsgQueue = FuncCreateMsgQueue(NULL,&MsgOpt);
			if (PowerMsgQueue)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -