gps/GPSResources/tcpmp/common/advanced.c

286 lines
11 KiB
C
Executable File

/*****************************************************************************
*
* 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: advanced.c 615 2006-01-26 16:57:51Z picard $
*
* The Core Pocket Media Player
* Copyright (c) 2004-2005 Gabor Kovacs
*
****************************************************************************/
#include "common.h"
typedef struct advanced
{
node Node;
bool_t OldShell;
bool_t SlowVideo;
bool_t ColorLookup;
bool_t NoBackLight;
bool_t HomeScreen;
bool_t NoWMMX;
bool_t IDCTSwap;
bool_t VR41XX;
bool_t KeyFollowDir;
bool_t MemoryOverride;
bool_t BenchFromPos;
bool_t AviFrameRate;
bool_t Priority;
bool_t SystemVolume;
bool_t WidcommAudio;
bool_t WidcommDLL;
tick_t DropTolerance;
tick_t SkipTolerance;
tick_t AVOffset;
bool_t NoBatteryWarning;
bool_t NoEventChecking;
bool_t CardPlugins;
bool_t WaveoutPriority;
bool_t NoDeblocking;
bool_t BlinkLED;
} advanced;
static const datatable Params[] =
{
{ ADVANCED_NOBACKLIGHT, TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
{ ADVANCED_HOMESCREEN, TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#if defined(TARGET_WINCE)
{ ADVANCED_OLDSHELL, TYPE_BOOL, DF_SETUP|DF_RESTART|DF_CHECKLIST },
#endif
#if defined(ARM)
{ ADVANCED_NOWMMX, TYPE_BOOL, DF_SETUP|DF_CHECKLIST|DF_RESTART },
#endif
#if !defined(SH3) && !defined(MIPS)
{ ADVANCED_SLOW_VIDEO, TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#endif
#if defined(ARM) || defined(_M_IX86)
{ ADVANCED_IDCTSWAP, TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#endif
#if !defined(SH3)
{ ADVANCED_COLOR_LOOKUP,TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#endif
{ ADVANCED_KEYFOLLOWDIR,TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#if defined(TARGET_PALMOS)
{ ADVANCED_MEMORYOVERRIDE, TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#endif
{ ADVANCED_PRIORITY, TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#if !defined(SH3) && !defined(TARGET_PALMOS)
{ ADVANCED_SYSTEMVOLUME, TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#endif
#if defined(MIPS)
{ ADVANCED_VR41XX,TYPE_BOOL, DF_SETUP|DF_CHECKLIST|DF_RESTART },
#endif
{ ADVANCED_BENCHFROMPOS,TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
{ ADVANCED_AVIFRAMERATE,TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#if defined(TARGET_WINCE)
{ ADVANCED_WIDCOMMAUDIO,TYPE_BOOL, DF_SETUP|DF_CHECKLIST|DF_RESTART },
#endif
#if defined(TARGET_WINCE) || defined(TARGET_WIN32)
// { ADVANCED_WAVEOUTPRIORITY, TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#endif
#if defined(TARGET_PALMOS)
{ ADVANCED_NOBATTERYWARNING,TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
{ ADVANCED_NOEVENTCHECKING,TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
{ ADVANCED_CARDPLUGINS,TYPE_BOOL, DF_SETUP|DF_CHECKLIST|DF_NOSAVE|DF_RESTART },
{ ADVANCED_BLINKLED,TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
#endif
{ ADVANCED_NODEBLOCKING,TYPE_BOOL, DF_SETUP|DF_CHECKLIST },
{ ADVANCED_AVOFFSET, TYPE_TICK, DF_SETUP|DF_MINMAX|DF_MSEC|DF_GAP|DF_NEG|DF_RESYNC, -2*TICKSPERSEC, 2*TICKSPERSEC },
{ ADVANCED_DROPTOL, TYPE_TICK, DF_SETUP|DF_MINMAX|DF_MSEC, 0, TICKSPERSEC },
{ ADVANCED_SKIPTOL, TYPE_TICK, DF_SETUP|DF_MINMAX|DF_MSEC, 0, 5*TICKSPERSEC },
{ ADVANCED_WIDCOMMDLL, TYPE_BOOL, DF_SETUP|DF_HIDDEN },
DATATABLE_END(ADVANCED_ID)
};
static int Enum(advanced* p, int* No, datadef* Param)
{
int Result = NodeEnumTable(No,Param,Params);
if (Result == ERR_NONE)
{
#if defined(TARGET_WINCE)
if (Param->No == ADVANCED_WIDCOMMAUDIO && !p->WidcommDLL)
Param->Flags |= DF_HIDDEN;
if (Param->No == ADVANCED_OLDSHELL && (
(QueryPlatform(PLATFORM_CAPS) & CAPS_OLDSHELL) ||
QueryPlatform(PLATFORM_TYPENO) == TYPE_SMARTPHONE ||
(QueryPlatform(PLATFORM_TYPENO) == TYPE_POCKETPC && QueryPlatform(PLATFORM_VER) >= 421)))
Param->Flags |= DF_HIDDEN;
#endif
#if defined(TARGET_PALMOS)
if (Param->No == ADVANCED_MEMORYOVERRIDE && !MemGetInfo(NULL))
Param->Flags |= DF_HIDDEN;
#endif
if (Param->No == ADVANCED_NOWMMX && !(QueryPlatform(PLATFORM_CAPS) & CAPS_ARM_WMMX))
Param->Flags |= DF_HIDDEN;
if (Param->No == ADVANCED_HOMESCREEN && QueryPlatform(PLATFORM_TYPENO) != TYPE_SMARTPHONE)
Param->Flags |= DF_HIDDEN;
if (Param->No == ADVANCED_VR41XX && !(QueryPlatform(PLATFORM_CAPS) != CAPS_MIPS_VR41XX))
Param->Flags |= DF_HIDDEN;
}
return Result;
}
static int Get(advanced* p, int No, void* Data, int Size)
{
int Result = ERR_INVALID_PARAM;
switch (No)
{
case ADVANCED_OLDSHELL: GETVALUE(p->OldShell,bool_t); break;
case ADVANCED_HOMESCREEN: GETVALUE(p->HomeScreen,bool_t); break;
case ADVANCED_NOBACKLIGHT: GETVALUE(p->NoBackLight,bool_t); break;
case ADVANCED_VR41XX: GETVALUE(p->VR41XX,bool_t); break;
case ADVANCED_IDCTSWAP: GETVALUE(p->IDCTSwap,bool_t); break;
case ADVANCED_NOWMMX: GETVALUE(p->NoWMMX,bool_t); break;
case ADVANCED_NODEBLOCKING: GETVALUE(p->NoDeblocking,bool_t); break;
case ADVANCED_BLINKLED: GETVALUE(p->BlinkLED,bool_t); break;
case ADVANCED_PRIORITY: GETVALUE(p->Priority,bool_t); break;
case ADVANCED_SYSTEMVOLUME: GETVALUE(p->SystemVolume,bool_t); break;
case ADVANCED_SLOW_VIDEO: GETVALUE(p->SlowVideo,bool_t); break;
case ADVANCED_COLOR_LOOKUP: GETVALUE(p->ColorLookup,bool_t); break;
case ADVANCED_DROPTOL: GETVALUE(p->DropTolerance,tick_t); break;
case ADVANCED_SKIPTOL: GETVALUE(p->SkipTolerance,tick_t); break;
case ADVANCED_AVOFFSET: GETVALUE(p->AVOffset,tick_t); break;
case ADVANCED_BENCHFROMPOS: GETVALUE(p->BenchFromPos,bool_t); break;
case ADVANCED_AVIFRAMERATE: GETVALUE(p->AviFrameRate,bool_t); break;
case ADVANCED_WIDCOMMAUDIO: GETVALUE(p->WidcommAudio,bool_t); break;
case ADVANCED_WIDCOMMDLL: GETVALUE(p->WidcommDLL,bool_t); break;
case ADVANCED_KEYFOLLOWDIR: GETVALUE(p->KeyFollowDir,bool_t); break;
case ADVANCED_WAVEOUTPRIORITY: GETVALUE(p->WaveoutPriority,bool_t); break;
case ADVANCED_MEMORYOVERRIDE: GETVALUE(p->MemoryOverride,bool_t); break;
case ADVANCED_NOBATTERYWARNING: GETVALUE(p->NoBatteryWarning,bool_t); break;
case ADVANCED_NOEVENTCHECKING: GETVALUE(p->NoEventChecking,bool_t); break;
case ADVANCED_CARDPLUGINS: GETVALUE(p->CardPlugins,bool_t); break;
}
return Result;
}
static int Set(advanced* p, int No, const void* Data, int Size)
{
int Result = ERR_INVALID_PARAM;
switch (No)
{
case ADVANCED_OLDSHELL: SETVALUE(p->OldShell,bool_t,ERR_NONE); break;
case ADVANCED_HOMESCREEN: SETVALUE(p->HomeScreen,bool_t,ERR_NONE); break;
case ADVANCED_NOBACKLIGHT: SETVALUE(p->NoBackLight,bool_t,ERR_NONE); break;
case ADVANCED_VR41XX: SETVALUE(p->VR41XX,bool_t,ERR_NONE); break;
case ADVANCED_IDCTSWAP: SETVALUECMP(p->IDCTSwap,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_NOWMMX: SETVALUE(p->NoWMMX,bool_t,ERR_NONE); break;
case ADVANCED_BLINKLED: SETVALUE(p->BlinkLED,bool_t,ERR_NONE); break;
case ADVANCED_NODEBLOCKING: SETVALUECMP(p->NoDeblocking,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_PRIORITY: SETVALUECMP(p->Priority,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_SYSTEMVOLUME: SETVALUECMP(p->SystemVolume,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_SLOW_VIDEO: SETVALUECMP(p->SlowVideo,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_COLOR_LOOKUP: SETVALUECMP(p->ColorLookup,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_DROPTOL: SETVALUECMP(p->DropTolerance,tick_t,NodeSettingsChanged(),EqInt); break;
case ADVANCED_SKIPTOL: SETVALUECMP(p->SkipTolerance,tick_t,NodeSettingsChanged(),EqInt); break;
case ADVANCED_AVOFFSET: SETVALUECMP(p->AVOffset,tick_t,NodeSettingsChanged(),EqInt); break;
case ADVANCED_BENCHFROMPOS: SETVALUE(p->BenchFromPos,bool_t,ERR_NONE); break;
case ADVANCED_AVIFRAMERATE: SETVALUECMP(p->AviFrameRate,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_WIDCOMMAUDIO: SETVALUE(p->WidcommAudio,bool_t,ERR_NONE); break;
case ADVANCED_KEYFOLLOWDIR: SETVALUE(p->KeyFollowDir,bool_t,ERR_NONE); break;
case ADVANCED_WAVEOUTPRIORITY: SETVALUECMP(p->WaveoutPriority,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_MEMORYOVERRIDE: SETVALUECOND(p->MemoryOverride,bool_t,ERR_NONE,MemGetInfo(NULL)); break;
case ADVANCED_NOBATTERYWARNING: SETVALUE(p->NoBatteryWarning,bool_t,ERR_NONE); break;
case ADVANCED_NOEVENTCHECKING: SETVALUECMP(p->NoEventChecking,bool_t,NodeSettingsChanged(),EqBool); break;
case ADVANCED_CARDPLUGINS: SETVALUE(p->CardPlugins,bool_t,ERR_NONE); break;
case ADVANCED_WIDCOMMDLL:
assert(Size==sizeof(bool_t));
if (p->WidcommDLL && !*(bool_t*)Data)
p->WidcommAudio = 1;
break;
}
return Result;
}
bool_t QueryAdvanced(int Param)
{
node* Advanced = Context()->Advanced;
bool_t Value=0;
if (Advanced)
Advanced->Get(Advanced,Param,&Value,sizeof(Value));
return Value;
}
static int Create(advanced* p)
{
int Caps = QueryPlatform(PLATFORM_CAPS);
video Desktop;
QueryDesktop(&Desktop);
p->Node.Enum = (nodeenum)Enum,
p->Node.Get = (nodeget)Get,
p->Node.Set = (nodeset)Set,
p->SlowVideo = 0;
#if defined(TARGET_WINCE)
p->SystemVolume = QueryPlatform(PLATFORM_VER) < 421;
#else
p->SystemVolume = 0;
#endif
p->BenchFromPos = 0;
p->VR41XX = 1;
p->MemoryOverride = 0;
p->KeyFollowDir = HaveDPad();
p->ColorLookup = !(Caps & CAPS_MIPS_VR41XX) && !(Caps & CAPS_ARM_XSCALE);
p->OldShell = (Caps & CAPS_OLDSHELL) != 0;
p->DropTolerance = (TICKSPERSEC*55)/1000;
p->SkipTolerance = (TICKSPERSEC*700)/1000;
p->AVOffset = 0;
p->BlinkLED = 1;
#if defined(TARGET_PALMOS)
// causes major problems on Sony TJ35, like screen not turning off with audio, or hold/power button not working...
//p->NoEventChecking = (QueryPlatform(PLATFORM_CAPS) & CAPS_SONY)!=0;
#endif
#if defined(TARGET_WINCE)
{
tchar_t FileName[MAXPATH];
GetSystemPath(FileName,TSIZEOF(FileName),T("BtCeAvIf.dll"));
p->WidcommAudio = p->WidcommDLL = FileExits(FileName);
}
#endif
return ERR_NONE;
}
static const nodedef Advanced =
{
sizeof(advanced)|CF_GLOBAL|CF_SETTINGS,
ADVANCED_ID,
NODE_CLASS,
PRI_MAXIMUM+50,
(nodecreate)Create,
NULL,
};
void Advanced_Init()
{
NodeRegisterClass(&Advanced);
Context()->Advanced = NodeEnumObject(NULL,ADVANCED_ID);
}
void Advanced_Done()
{
Context()->Advanced = NULL;
NodeUnRegisterClass(ADVANCED_ID);
}