Merge pull request #1551 from PCSX2/clang-format-v2

Clang format v2
This commit is contained in:
Gregory Hainaut 2016-09-08 22:53:21 +02:00 committed by GitHub
commit c03b388786
114 changed files with 11877 additions and 11602 deletions

View File

@ -70,7 +70,7 @@ PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
PointerAlignment: Right
ReflowComments: true
SortIncludes: false
SpaceAfterCStyleCast: false

View File

@ -5,6 +5,18 @@ set -x
ret=0
if command -v clang-format-3.8 > /dev/null ; then
clang_format=clang-format-3.8
else
if command -v clang-format > /dev/null ; then
clang_format=clang-format
else
return 2;
fi
fi
$clang_format -version
# Doesn't work as travis only populate a single branch history
#branch=`git rev-parse --abbrev-ref HEAD`
@ -36,7 +48,6 @@ files=`git diff --name-only --diff-filter=ACMRT $diff_range -- $PWD | \
grep -v "${1}common/" | \
grep -v "${1}pcsx2/" | \
grep -v "${1}plugins/cdvdGigaherz/" | \
grep -v "${1}plugins/CDVDiso/" | \
grep -v "${1}plugins/CDVDisoEFP/" | \
grep -v "${1}plugins/CDVDlinuz/" | \
grep -v "${1}plugins/CDVDolio/" | \
@ -44,8 +55,6 @@ files=`git diff --name-only --diff-filter=ACMRT $diff_range -- $PWD | \
grep -v "${1}plugins/dev9ghzdrk/" | \
grep -v "${1}plugins/GSdx/" | \
grep -v "${1}plugins/GSdx_legacy/" | \
grep -v "${1}plugins/LilyPad/" | \
grep -v "${1}plugins/onepad/" | \
grep -v "${1}plugins/PeopsSPU2/" | \
grep -v "${1}plugins/spu2-x/" | \
grep -v "${1}plugins/SSSPSXPAD/" | \
@ -67,7 +76,7 @@ files=`git diff --name-only --diff-filter=ACMRT $diff_range -- $PWD | \
# Check remaining files are clang-format compliant
for f in $files
do
clang-format -style=file -output-replacements-xml $f | grep "<replacement " >/dev/null
$clang_format -style=file -output-replacements-xml $f | grep "<replacement " >/dev/null
if [ $? -ne 1 ]
then
echo "file $f did not match clang-format"

View File

@ -20,7 +20,7 @@
#define __CDVDISO_H__
#ifdef _MSC_VER
#pragma warning(disable:4018)
#pragma warning(disable : 4018)
#endif
#include "PS2Edefs.h"
@ -31,7 +31,7 @@
#ifdef _MSC_VER
#define EXPORT_C_(type) extern "C" __declspec(dllexport) type CALLBACK
#else
#define EXPORT_C_(type) extern "C" __attribute__((stdcall,externally_visible,visibility("default"))) type
#define EXPORT_C_(type) extern "C" __attribute__((stdcall, externally_visible, visibility("default"))) type
#endif
#else
@ -39,40 +39,61 @@
#ifdef _MSC_VER
#define EXPORT_C_(type) __declspec(dllexport) type __stdcall
#else
#define EXPORT_C_(type) __attribute__((stdcall,externally_visible,visibility("default"))) type
#define EXPORT_C_(type) __attribute__((stdcall, externally_visible, visibility("default"))) type
#endif
#endif
EXPORT_C_(u32) PS2EgetLibType();
EXPORT_C_(u32) PS2EgetLibVersion2(u32 type);
EXPORT_C_(char*) PS2EgetLibName();
EXPORT_C_(u32)
PS2EgetLibType();
EXPORT_C_(u32)
PS2EgetLibVersion2(u32 type);
EXPORT_C_(char *)
PS2EgetLibName();
EXPORT_C_(s32) CDVDinit();
EXPORT_C_(s32) CDVDopen(const char* pTitleFilename);
EXPORT_C_(void) CDVDclose();
EXPORT_C_(void) CDVDshutdown();
EXPORT_C_(s32) CDVDreadTrack(u32 lsn, int mode);
EXPORT_C_(s32)
CDVDinit();
EXPORT_C_(s32)
CDVDopen(const char *pTitleFilename);
EXPORT_C_(void)
CDVDclose();
EXPORT_C_(void)
CDVDshutdown();
EXPORT_C_(s32)
CDVDreadTrack(u32 lsn, int mode);
// return can be NULL (for async modes)
EXPORT_C_(u8*) CDVDgetBuffer();
EXPORT_C_(u8 *)
CDVDgetBuffer();
EXPORT_C_(s32) CDVDreadSubQ(u32 lsn, cdvdSubQ* subq);//read subq from disc (only cds have subq data)
EXPORT_C_(s32) CDVDgetTN(cdvdTN *Buffer); //disk information
EXPORT_C_(s32) CDVDgetTD(u8 Track, cdvdTD *Buffer); //track info: min,sec,frame,type
EXPORT_C_(s32) CDVDgetTOC(void* toc); //gets ps2 style toc from disc
EXPORT_C_(s32) CDVDgetDiskType(); //CDVD_TYPE_xxxx
EXPORT_C_(s32) CDVDgetTrayStatus(); //CDVD_TRAY_xxxx
EXPORT_C_(s32) CDVDctrlTrayOpen(); //open disc tray
EXPORT_C_(s32) CDVDctrlTrayClose(); //close disc tray
EXPORT_C_(s32)
CDVDreadSubQ(u32 lsn, cdvdSubQ *subq); //read subq from disc (only cds have subq data)
EXPORT_C_(s32)
CDVDgetTN(cdvdTN *Buffer); //disk information
EXPORT_C_(s32)
CDVDgetTD(u8 Track, cdvdTD *Buffer); //track info: min,sec,frame,type
EXPORT_C_(s32)
CDVDgetTOC(void *toc); //gets ps2 style toc from disc
EXPORT_C_(s32)
CDVDgetDiskType(); //CDVD_TYPE_xxxx
EXPORT_C_(s32)
CDVDgetTrayStatus(); //CDVD_TRAY_xxxx
EXPORT_C_(s32)
CDVDctrlTrayOpen(); //open disc tray
EXPORT_C_(s32)
CDVDctrlTrayClose(); //close disc tray
// extended funcs
EXPORT_C_(void) CDVDconfigure();
EXPORT_C_(void) CDVDabout();
EXPORT_C_(s32) CDVDtest();
EXPORT_C_(void) CDVDnewDiskCB(void (*callback)());
EXPORT_C_(void)
CDVDconfigure();
EXPORT_C_(void)
CDVDabout();
EXPORT_C_(s32)
CDVDtest();
EXPORT_C_(void)
CDVDnewDiskCB(void (*callback)());
#define CDVD_LOG __Log
extern FILE *cdvdLog;
@ -98,12 +119,12 @@ typedef struct
extern _cdIso cdIso[8];
#define CD_FRAMESIZE_RAW 2352
#define DATA_SIZE (CD_FRAMESIZE_RAW-12)
#define DATA_SIZE (CD_FRAMESIZE_RAW - 12)
#define itob(i) ((i)/10*16 + (i)%10) /* u_char to BCD */
#define btoi(b) ((b)/16*10 + (b)%16) /* BCD to u_char */
#define itob(i) ((i) / 10 * 16 + (i) % 10) /* u_char to BCD */
#define btoi(b) ((b) / 16 * 10 + (b) % 16) /* BCD to u_char */
#define MSF2SECT(m,s,f) (((m)*60+(s)-2)*75+(f))
#define MSF2SECT(m, s, f) (((m)*60 + (s)-2) * 75 + (f))
extern const u8 version;
extern const u8 revision;

View File

@ -41,11 +41,10 @@ FILE *cdvdLog = NULL;
static char cdvdCurrentIso[MAX_PATH];
char *methods[] =
{
{
".Z - compress faster",
".BZ - compress better",
NULL
};
NULL};
#ifdef PCSX2_DEBUG
char *LibName = "Linuz Iso CDVD (Debug) ";
@ -68,7 +67,7 @@ s32 msf_to_lba(u8 m, u8 s, u8 f)
return lsn;
}
void lba_to_msf(s32 lba, u8* m, u8* s, u8* f)
void lba_to_msf(s32 lba, u8 *m, u8 *s, u8 *f)
{
lba += 150;
*m = lba / (60 * 75);
@ -76,21 +75,24 @@ void lba_to_msf(s32 lba, u8* m, u8* s, u8* f)
*f = lba % 75;
}
#define btoi(b) ((b)/16*10 + (b)%16) /* BCD to u_char */
#define itob(i) ((i)/10*16 + (i)%10) /* u_char to BCD */
#define btoi(b) ((b) / 16 * 10 + (b) % 16) /* BCD to u_char */
#define itob(i) ((i) / 10 * 16 + (i) % 10) /* u_char to BCD */
EXPORT_C_(char*) PS2EgetLibName()
EXPORT_C_(char *)
PS2EgetLibName()
{
return LibName;
}
EXPORT_C_(u32) PS2EgetLibType()
EXPORT_C_(u32)
PS2EgetLibType()
{
return PS2E_LT_CDVD;
}
EXPORT_C_(u32) PS2EgetLibVersion2(u32 type)
EXPORT_C_(u32)
PS2EgetLibVersion2(u32 type)
{
return (version << 16) | (revision << 8) | build;
}
@ -100,26 +102,26 @@ void __Log(char *fmt, ...)
{
va_list list;
if (cdvdLog == NULL) return;
if (cdvdLog == NULL)
return;
va_start(list, fmt);
vfprintf(cdvdLog, fmt, list);
va_end(list);
}
#else
#define __Log 0&&
#define __Log 0 &&
#endif
EXPORT_C_(s32) CDVDinit()
EXPORT_C_(s32)
CDVDinit()
{
#ifdef PCSX2_DEBUG
cdvdLog = fopen("logs/cdvdLog.txt", "w");
if (cdvdLog == NULL)
{
if (cdvdLog == NULL) {
cdvdLog = fopen("cdvdLog.txt", "w");
if (cdvdLog == NULL)
{
if (cdvdLog == NULL) {
SysMessage("Can't create cdvdLog.txt");
return -1;
}
@ -133,30 +135,33 @@ EXPORT_C_(s32) CDVDinit()
return 0;
}
EXPORT_C_(void) CDVDshutdown()
EXPORT_C_(void)
CDVDshutdown()
{
cdvdCurrentIso[0] = 0;
#ifdef CDVD_LOG
if (cdvdLog != NULL) fclose(cdvdLog);
if (cdvdLog != NULL)
fclose(cdvdLog);
#endif
}
EXPORT_C_(s32) CDVDopen(const char* pTitle)
EXPORT_C_(s32)
CDVDopen(const char *pTitle)
{
LoadConf();
if (pTitle != NULL) strcpy(IsoFile, pTitle);
if (*IsoFile == 0) strcpy(IsoFile, cdvdCurrentIso);
if (pTitle != NULL)
strcpy(IsoFile, pTitle);
if (*IsoFile == 0)
{
strcpy(IsoFile, cdvdCurrentIso);
if (*IsoFile == 0) {
char temp[256];
CfgOpenFile();
if (IsoFile[0] == 0)
{
if (IsoFile[0] == 0) {
// user pressed CANCEL
return 1;
}
@ -168,8 +173,7 @@ EXPORT_C_(s32) CDVDopen(const char* pTitle)
}
iso = isoOpen(IsoFile);
if (iso == NULL)
{
if (iso == NULL) {
SysMessage("Error loading %s\nMake sure the iso file is not mounted in any disk emulation software!", IsoFile);
return -1;
}
@ -181,8 +185,7 @@ EXPORT_C_(s32) CDVDopen(const char* pTitle)
else
cdtype = CDVD_TYPE_PS2CD;
if (BlockDump)
{
if (BlockDump) {
char fname_only[MAX_PATH];
#ifdef _WIN32
@ -190,11 +193,10 @@ EXPORT_C_(s32) CDVDopen(const char* pTitle)
_splitpath(IsoFile, NULL, NULL, fname, ext);
_makepath(fname_only, NULL, NULL, fname, NULL);
#else
char* p, *plast;
char *p, *plast;
plast = p = strchr(IsoFile, '/');
while (p != NULL)
{
while (p != NULL) {
plast = p;
p = strchr(p + 1, '/');
}
@ -208,40 +210,44 @@ EXPORT_C_(s32) CDVDopen(const char* pTitle)
plast = p = strchr(fname_only, '.');
while (p != NULL)
{
while (p != NULL) {
plast = p;
p = strchr(p + 1, '.');
}
if (plast != NULL) *plast = 0;
if (plast != NULL)
*plast = 0;
#endif
strcat(fname_only, ".dump");
fdump = isoCreate(fname_only, ISOFLAGS_BLOCKDUMP);
if (fdump) isoSetFormat(fdump, iso->blockofs, iso->blocksize, iso->blocks);
}
else
{
if (fdump)
isoSetFormat(fdump, iso->blockofs, iso->blocksize, iso->blocks);
} else {
fdump = NULL;
}
return 0;
}
EXPORT_C_(void) CDVDclose()
EXPORT_C_(void)
CDVDclose()
{
if (!iso) return;
if (!iso)
return;
strcpy(cdvdCurrentIso, IsoFile);
isoClose(iso);
if (fdump != NULL) isoClose(fdump);
if (fdump != NULL)
isoClose(fdump);
}
EXPORT_C_(s32) CDVDreadSubQ(u32 lsn, cdvdSubQ* subq)
EXPORT_C_(s32)
CDVDreadSubQ(u32 lsn, cdvdSubQ *subq)
{
if (!iso) return -1;
if (!iso)
return -1;
// fake it
u8 min, sec, frm;
@ -257,14 +263,15 @@ EXPORT_C_(s32) CDVDreadSubQ(u32 lsn, cdvdSubQ* subq)
subq->pad = 0;
lba_to_msf(lsn + (2*75), &min, &sec, &frm);
lba_to_msf(lsn + (2 * 75), &min, &sec, &frm);
subq->discM = itob(min);
subq->discS = itob(sec);
subq->discF = itob(frm);
return 0;
}
EXPORT_C_(s32) CDVDgetTN(cdvdTN *Buffer)
EXPORT_C_(s32)
CDVDgetTN(cdvdTN *Buffer)
{
Buffer->strack = 1;
Buffer->etrack = 1;
@ -272,16 +279,15 @@ EXPORT_C_(s32) CDVDgetTN(cdvdTN *Buffer)
return 0;
}
EXPORT_C_(s32) CDVDgetTD(u8 Track, cdvdTD *Buffer)
EXPORT_C_(s32)
CDVDgetTD(u8 Track, cdvdTD *Buffer)
{
if (!iso) return -1;
if (!iso)
return -1;
if (Track == 0)
{
if (Track == 0) {
Buffer->lsn = iso->blocks;
}
else
{
} else {
Buffer->type = CDVD_MODE1_TRACK;
Buffer->lsn = 0;
}
@ -291,46 +297,45 @@ EXPORT_C_(s32) CDVDgetTD(u8 Track, cdvdTD *Buffer)
static s32 layer1start = -1;
static bool testForPartitionInfo( const u8 (&tempbuffer)[CD_FRAMESIZE_RAW] )
static bool testForPartitionInfo(const u8 (&tempbuffer)[CD_FRAMESIZE_RAW])
{
const int off = iso->blockofs;
// test for: CD001
return (
(tempbuffer[off+1] == 0x43) &&
(tempbuffer[off+2] == 0x44) &&
(tempbuffer[off+3] == 0x30) &&
(tempbuffer[off+4] == 0x30) &&
(tempbuffer[off+5] == 0x31)
);
(tempbuffer[off + 1] == 0x43) &&
(tempbuffer[off + 2] == 0x44) &&
(tempbuffer[off + 3] == 0x30) &&
(tempbuffer[off + 4] == 0x30) &&
(tempbuffer[off + 5] == 0x31));
}
EXPORT_C_(s32) CDVDgetTOC(void* toc)
EXPORT_C_(s32)
CDVDgetTOC(void *toc)
{
if (!iso) return -1;
if (!iso)
return -1;
u8 type = CDVDgetDiskType();
u8* tocBuff = (u8*)toc;
u8 *tocBuff = (u8 *)toc;
//__Log("CDVDgetTOC\n");
if (type == CDVD_TYPE_DVDV || type == CDVD_TYPE_PS2DVD)
{
if (type == CDVD_TYPE_DVDV || type == CDVD_TYPE_PS2DVD) {
// get dvd structure format
// scsi command 0x43
memset(tocBuff, 0, 2048);
if (layer1start != -2 && iso->blocks >= 0x300000)
{
if (layer1start != -2 && iso->blocks >= 0x300000) {
//int off = iso->blockofs;
// dual sided
tocBuff[ 0] = 0x24;
tocBuff[ 1] = 0x02;
tocBuff[ 2] = 0xF2;
tocBuff[ 3] = 0x00;
tocBuff[ 4] = 0x41;
tocBuff[ 5] = 0x95;
tocBuff[0] = 0x24;
tocBuff[1] = 0x02;
tocBuff[2] = 0xF2;
tocBuff[3] = 0x00;
tocBuff[4] = 0x41;
tocBuff[5] = 0x95;
tocBuff[14] = 0x60; // dual sided, ptp
@ -340,8 +345,7 @@ EXPORT_C_(s32) CDVDgetTOC(void* toc)
tocBuff[19] = 0x00;
// search for it
if (layer1start == -1)
{
if (layer1start == -1) {
printf("CDVD: searching for layer1...");
/*tempbuffer = (u8*)malloc(CD_FRAMESIZE_RAW * 10);
@ -361,41 +365,36 @@ EXPORT_C_(s32) CDVDgetTOC(void* toc)
uint midsector = (iso->blocks / 2) & ~0xf;
uint deviation = 0;
while( (layer1start == -1) && (deviation < midsector-16) )
{
while ((layer1start == -1) && (deviation < midsector - 16)) {
u8 tempbuffer[CD_FRAMESIZE_RAW];
isoReadBlock(iso, tempbuffer, midsector-deviation);
isoReadBlock(iso, tempbuffer, midsector - deviation);
if(testForPartitionInfo( tempbuffer ))
layer1start = midsector-deviation;
else
{
isoReadBlock(iso, tempbuffer, midsector+deviation);
if( testForPartitionInfo( tempbuffer ) )
layer1start = midsector+deviation;
if (testForPartitionInfo(tempbuffer))
layer1start = midsector - deviation;
else {
isoReadBlock(iso, tempbuffer, midsector + deviation);
if (testForPartitionInfo(tempbuffer))
layer1start = midsector + deviation;
}
if( layer1start != -1 )
{
if( tempbuffer[iso->blockofs] != 0x01 )
{
fprintf( stderr, "(LinuzCDVDiso): Invalid partition type on layer 1!? (type=0x%x)", tempbuffer[iso->blockofs] );
if (layer1start != -1) {
if (tempbuffer[iso->blockofs] != 0x01) {
fprintf(stderr, "(LinuzCDVDiso): Invalid partition type on layer 1!? (type=0x%x)", tempbuffer[iso->blockofs]);
}
}
deviation += 16;
}
if (layer1start == -1)
{
if (layer1start == -1) {
printf("(LinuzCDVDiso): Couldn't find second layer on dual layer... ignoring\n");
// fake it
tocBuff[ 0] = 0x04;
tocBuff[ 1] = 0x02;
tocBuff[ 2] = 0xF2;
tocBuff[ 3] = 0x00;
tocBuff[ 4] = 0x86;
tocBuff[ 5] = 0x72;
tocBuff[0] = 0x04;
tocBuff[1] = 0x02;
tocBuff[2] = 0xF2;
tocBuff[3] = 0x00;
tocBuff[4] = 0x86;
tocBuff[5] = 0x72;
tocBuff[16] = 0x00;
tocBuff[17] = 0x03;
@ -413,26 +412,22 @@ EXPORT_C_(s32) CDVDgetTOC(void* toc)
tocBuff[21] = (layer1start >> 16) & 0xff;
tocBuff[22] = (layer1start >> 8) & 0xff;
tocBuff[23] = (layer1start >> 0) & 0xff;
}
else
{
} else {
// fake it
tocBuff[ 0] = 0x04;
tocBuff[ 1] = 0x02;
tocBuff[ 2] = 0xF2;
tocBuff[ 3] = 0x00;
tocBuff[ 4] = 0x86;
tocBuff[ 5] = 0x72;
tocBuff[0] = 0x04;
tocBuff[1] = 0x02;
tocBuff[2] = 0xF2;
tocBuff[3] = 0x00;
tocBuff[4] = 0x86;
tocBuff[5] = 0x72;
tocBuff[16] = 0x00;
tocBuff[17] = 0x03;
tocBuff[18] = 0x00;
tocBuff[19] = 0x00;
}
}
else if ((type == CDVD_TYPE_CDDA) || (type == CDVD_TYPE_PS2CDDA) ||
(type == CDVD_TYPE_PS2CD) || (type == CDVD_TYPE_PSCDDA) || (type == CDVD_TYPE_PSCD))
{
} else if ((type == CDVD_TYPE_CDDA) || (type == CDVD_TYPE_PS2CDDA) ||
(type == CDVD_TYPE_PS2CD) || (type == CDVD_TYPE_PSCDDA) || (type == CDVD_TYPE_PSCD)) {
// cd toc
// (could be replaced by 1 command that reads the full toc)
u8 min, sec, frm;
@ -440,12 +435,12 @@ EXPORT_C_(s32) CDVDgetTOC(void* toc)
cdvdTN diskInfo;
cdvdTD trackInfo;
memset(tocBuff, 0, 1024);
if (CDVDgetTN(&diskInfo) == -1)
{
if (CDVDgetTN(&diskInfo) == -1) {
diskInfo.etrack = 0;
diskInfo.strack = 1;
}
if (CDVDgetTD(0, &trackInfo) == -1) trackInfo.lsn = 0;
if (CDVDgetTD(0, &trackInfo) == -1)
trackInfo.lsn = 0;
tocBuff[0] = 0x41;
tocBuff[1] = 0x00;
@ -464,46 +459,43 @@ EXPORT_C_(s32) CDVDgetTOC(void* toc)
tocBuff[27] = itob(min);
tocBuff[28] = itob(sec);
for (i = diskInfo.strack; i <= diskInfo.etrack; i++)
{
for (i = diskInfo.strack; i <= diskInfo.etrack; i++) {
err = CDVDgetTD(i, &trackInfo);
lba_to_msf(trackInfo.lsn, &min, &sec, &frm);
tocBuff[i*10+30] = trackInfo.type;
tocBuff[i*10+32] = err == -1 ? 0 : itob(i); //number
tocBuff[i*10+37] = itob(min);
tocBuff[i*10+38] = itob(sec);
tocBuff[i*10+39] = itob(frm);
tocBuff[i * 10 + 30] = trackInfo.type;
tocBuff[i * 10 + 32] = err == -1 ? 0 : itob(i); //number
tocBuff[i * 10 + 37] = itob(min);
tocBuff[i * 10 + 38] = itob(sec);
tocBuff[i * 10 + 39] = itob(frm);
}
}
else
} else
return -1;
return 0;
}
EXPORT_C_(s32) CDVDreadTrack(u32 lsn, int mode)
EXPORT_C_(s32)
CDVDreadTrack(u32 lsn, int mode)
{
if (!iso) return -1;
if (!iso)
return -1;
int _lsn = lsn;
//__Log("CDVDreadTrack: %x %x\n", lsn, mode);
if (_lsn < 0)
{
// lsn = 2097152 + (-_lsn);
if (_lsn < 0) {
// lsn = 2097152 + (-_lsn);
lsn = iso->blocks - (-_lsn);
}
// printf ("CDRreadTrack %d\n", lsn);
// printf ("CDRreadTrack %d\n", lsn);
isoReadBlock(iso, cdbuffer, lsn);
if (fdump != NULL)
{
if (fdump != NULL) {
isoWriteBlock(fdump, cdbuffer, lsn);
}
pbuffer = cdbuffer;
switch (mode)
{
switch (mode) {
case CDVD_MODE_2352:
break;
case CDVD_MODE_2340:
@ -520,39 +512,46 @@ EXPORT_C_(s32) CDVDreadTrack(u32 lsn, int mode)
return 0;
}
EXPORT_C_(u8*) CDVDgetBuffer()
EXPORT_C_(u8 *)
CDVDgetBuffer()
{
return pbuffer;
}
EXPORT_C_(s32) CDVDgetDiskType()
EXPORT_C_(s32)
CDVDgetDiskType()
{
return cdtype;
}
EXPORT_C_(s32) CDVDgetTrayStatus()
EXPORT_C_(s32)
CDVDgetTrayStatus()
{
return CDVD_TRAY_CLOSE;
}
EXPORT_C_(s32) CDVDctrlTrayOpen()
EXPORT_C_(s32)
CDVDctrlTrayOpen()
{
return 0;
}
EXPORT_C_(s32) CDVDctrlTrayClose()
EXPORT_C_(s32)
CDVDctrlTrayClose()
{
return 0;
}
EXPORT_C_(s32) CDVDtest()
EXPORT_C_(s32)
CDVDtest()
{
if (*IsoFile == 0) return 0;
if (*IsoFile == 0)
return 0;
iso = isoOpen(IsoFile);
if (iso == NULL) return -1;
if (iso == NULL)
return -1;
isoClose(iso);
return 0;
}

View File

@ -18,7 +18,7 @@
#include "Config.h"
const char *s_strIniPath="./inis/CDVDiso.ini";
const char *s_strIniPath = "./inis/CDVDiso.ini";
GtkWidget *AboutDlg, *ConfDlg, *MsgDlg, *FileSel;
GtkWidget *Edit, *CdEdit;
@ -31,8 +31,7 @@ void LoadConf()
strcpy(cfg, s_strIniPath);
f = fopen(cfg, "r");
if (f == NULL)
{
if (f == NULL) {
printf("Unable to load %s\n", cfg);
strcpy(IsoFile, DEV_DEF);
strcpy(CdDev, CDDEV_DEF);
@ -45,8 +44,10 @@ void LoadConf()
fscanf(f, "CdDev = %[^\n]\n", CdDev);
fscanf(f, "BlockDump = %d\n", &BlockDump);
if (!strncmp(IsoFile, "CdDev =", 9)) *IsoFile = 0; // quick fix
if (*CdDev == 0) strcpy(CdDev, CDDEV_DEF);
if (!strncmp(IsoFile, "CdDev =", 9))
*IsoFile = 0; // quick fix
if (*CdDev == 0)
strcpy(CdDev, CDDEV_DEF);
fclose(f);
}
@ -63,8 +64,7 @@ void SaveConf()
strcpy(cfg, s_strIniPath);
f = fopen(cfg, "w");
if (f == NULL)
{
if (f == NULL) {
printf("Unable to save %s\n", cfg);
return;
}
@ -147,7 +147,8 @@ void SysMessageLoc(char *fmt, ...)
vsprintf(msg, fmt, list);
va_end(list);
if (msg[strlen(msg)-1] == '\n') msg[strlen(msg)-1] = 0;
if (msg[strlen(msg) - 1] == '\n')
msg[strlen(msg) - 1] = 0;
w = strlen(msg) * 6 + 20;
@ -181,7 +182,7 @@ void SysMessageLoc(char *fmt, ...)
gtk_main();
}
void OnOk (GtkButton *button, gpointer user_data)
void OnOk(GtkButton *button, gpointer user_data)
{
const char *tmp;
@ -191,7 +192,8 @@ void OnOk (GtkButton *button, gpointer user_data)
tmp = gtk_entry_get_text(GTK_ENTRY(CdEdit));
strcpy(CdDev, tmp);
if is_checked(ConfDlg, "checkBlockDump")
if
is_checked(ConfDlg, "checkBlockDump")
BlockDump = 1;
else
BlockDump = 0;
@ -242,7 +244,8 @@ void OnFileSel(GtkButton *button, gpointer user_data)
}
EXPORT_C_(void) CDVDconfigure()
EXPORT_C_(void)
CDVDconfigure()
{
int i;
@ -277,16 +280,16 @@ EXPORT_C_(void) CDVDconfigure()
gtk_widget_show_all(ConfDlg);
gtk_main();
}
void OnAboutOk(GtkMenuItem * menuitem, gpointer userdata)
void OnAboutOk(GtkMenuItem *menuitem, gpointer userdata)
{
gtk_widget_hide(AboutDlg);
gtk_main_quit();
}
EXPORT_C_(void) CDVDabout()
EXPORT_C_(void)
CDVDabout()
{
GtkWidget *Label;
GtkWidget *Ok;

View File

@ -31,9 +31,8 @@
#include <bzlib.h>
#include <gtk/gtk.h>
#ifdef __cplusplus
extern "C"
{
#ifdef __cplusplus
extern "C" {
#endif
#include "support.h"
@ -59,7 +58,7 @@ extern GtkWidget *AboutDlg, *ConfDlg, *MsgDlg, *FileSel;
extern GtkWidget *Edit, *CdEdit;
extern bool stop;
extern GtkWidget *Method,*Progress;
extern GtkWidget *Method, *Progress;
extern GtkWidget *BtnCompress, *BtnDecompress;
extern GtkWidget *BtnCreate, *BtnCreateZ;
@ -67,7 +66,7 @@ extern GList *methodlist;
// Make it easier to check and set checkmarks in the gui
#define is_checked(main_widget, widget_name) (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name))))
#define set_checked(main_widget,widget_name, state) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name)), state)
#define set_checked(main_widget, widget_name, state) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name)), state)
extern void OnFileSel(GtkButton *button, gpointer user_data);
@ -78,4 +77,3 @@ extern void OnCreate(GtkButton *button, gpointer user_data);
extern void OnCreateZ(GtkButton *button, gpointer user_data);
extern void OnOk(GtkButton *button, gpointer user_data);
extern void OnCancel(GtkButton *button, gpointer user_data);

View File

@ -20,7 +20,7 @@
unsigned char Zbuf[CD_FRAMESIZE_RAW * 10 * 2];
GtkWidget *Method,*Progress;
GtkWidget *Method, *Progress;
GtkWidget *BtnCompress, *BtnDecompress;
GtkWidget *BtnCreate, *BtnCreateZ;
@ -48,8 +48,10 @@ void UpdZmode()
const char *tmp;
tmp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(Method)->entry));
if (!strcmp(tmp, methods[0])) Zmode = 1;
else Zmode = 2;
if (!strcmp(tmp, methods[0]))
Zmode = 1;
else
Zmode = 2;
}
char buffer[2352 * 10];
@ -58,7 +60,7 @@ void OnCompress(GtkButton *button, gpointer user_data)
{
struct stat buf;
u32 lsn;
u8 cdbuff[10*2352];
u8 cdbuff[10 * 2352];
char Zfile[256];
const char *tmp;
int ret = 0;
@ -69,11 +71,12 @@ void OnCompress(GtkButton *button, gpointer user_data)
strcpy(IsoFile, tmp);
UpdZmode();
if (Zmode == 1) sprintf(Zfile, "%s.Z2", IsoFile);
if (Zmode == 2) sprintf(Zfile, "%s.BZ2", IsoFile);
if (Zmode == 1)
sprintf(Zfile, "%s.Z2", IsoFile);
if (Zmode == 2)
sprintf(Zfile, "%s.BZ2", IsoFile);
if (stat(Zfile, &buf) != -1)
{
if (stat(Zfile, &buf) != -1) {
/*char str[256];*/
return;
/* sprintf(str, "'%s' already exists, overwrite?", Zfile);
@ -83,9 +86,11 @@ void OnCompress(GtkButton *button, gpointer user_data)
}
src = isoOpen(IsoFile);
if (src == NULL) return;
if (src == NULL)
return;
dst = isoCreate(Zfile, Zmode == 1 ? ISOFLAGS_Z2 : ISOFLAGS_BZ2);
if (dst == NULL) return;
if (dst == NULL)
return;
gtk_widget_set_sensitive(BtnCompress, FALSE);
gtk_widget_set_sensitive(BtnDecompress, FALSE);
@ -93,38 +98,38 @@ void OnCompress(GtkButton *button, gpointer user_data)
gtk_widget_set_sensitive(BtnCreateZ, FALSE);
stop = false;
for (lsn = 0; lsn < src->blocks; lsn++)
{
for (lsn = 0; lsn < src->blocks; lsn++) {
printf("block %d ", lsn);
putchar(13);
fflush(stdout);
ret = isoReadBlock(src, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
ret = isoWriteBlock(dst, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
gtk_progress_bar_update(GTK_PROGRESS_BAR(Progress), (lsn * 100) / src->blocks);
while (gtk_events_pending()) gtk_main_iteration();
if (stop) break;
while (gtk_events_pending())
gtk_main_iteration();
if (stop)
break;
}
isoClose(src);
isoClose(dst);
if (!stop) gtk_entry_set_text(GTK_ENTRY(Edit), IsoFile);
if (!stop)
gtk_entry_set_text(GTK_ENTRY(Edit), IsoFile);
gtk_widget_set_sensitive(BtnCompress, TRUE);
gtk_widget_set_sensitive(BtnDecompress, TRUE);
gtk_widget_set_sensitive(BtnCreate, TRUE);
gtk_widget_set_sensitive(BtnCreateZ, TRUE);
if (!stop)
{
if (ret == -1)
{
if (!stop) {
if (ret == -1) {
SysMessageLoc("Error compressing iso image");
}
else
{
} else {
SysMessageLoc("Iso image compressed OK");
}
}
@ -256,13 +261,11 @@ void OnDecompress(GtkButton *button, gpointer user_data)
void incSector()
{
param[2]++;
if (param[2] == 75)
{
if (param[2] == 75) {
param[2] = 0;
param[1]++;
}
if (param[1] == 60)
{
if (param[1] == 60) {
param[1] = 0;
param[0]++;
}
@ -273,8 +276,7 @@ long CDR_open(void)
if (cddev != -1)
return 0;
cddev = open(CdDev, O_RDONLY);
if (cddev == -1)
{
if (cddev == -1) {
printf("CDR: Could not open %s\n", CdDev);
return -1;
}
@ -284,7 +286,8 @@ long CDR_open(void)
long CDR_close(void)
{
if (cddev == -1) return 0;
if (cddev == -1)
return 0;
close(cddev);
cddev = -1;
@ -299,7 +302,8 @@ long CDR_getTN(unsigned char *buffer)
{
struct cdrom_tochdr toc;
if (ioctl(cddev, CDROMREADTOCHDR, &toc) == -1) return -1;
if (ioctl(cddev, CDROMREADTOCHDR, &toc) == -1)
return -1;
buffer[0] = toc.cdth_trk0; // start track
buffer[1] = toc.cdth_trk1; // end track
@ -316,11 +320,13 @@ long CDR_getTD(unsigned char track, unsigned char *buffer)
{
struct cdrom_tocentry entry;
if (track == 0) track = 0xaa; // total time
if (track == 0)
track = 0xaa; // total time
entry.cdte_track = track;
entry.cdte_format = CDROM_MSF;
if (ioctl(cddev, CDROMREADTOCENTRY, &entry) == -1) return -1;
if (ioctl(cddev, CDROMREADTOCENTRY, &entry) == -1)
return -1;
buffer[0] = entry.cdte_addr.msf.minute; /* minute */
buffer[1] = entry.cdte_addr.msf.second; /* second */
@ -340,7 +346,8 @@ unsigned char *CDR_readTrack(unsigned char *time)
cr.msf.cdmsf_sec0 = time[1];
cr.msf.cdmsf_frame0 = time[2];
if (ioctl(cddev, CDROMREADRAW, &cr) == -1) return NULL;
if (ioctl(cddev, CDROMREADRAW, &cr) == -1)
return NULL;
return cr.buf;
}
@ -369,26 +376,22 @@ void OnCreate(GtkButton *button, gpointer user_data)
tmp = gtk_entry_get_text(GTK_ENTRY(Edit));
strcpy(IsoFile, tmp);
if (stat(IsoFile, &buf) == 0)
{
if (stat(IsoFile, &buf) == 0) {
printf("File %s Already exists\n", IsoFile);
return;
}
if (CDR_open() == -1)
{
if (CDR_open() == -1) {
return;
}
if (CDR_getTD(ftrack, start) == -1)
{
if (CDR_getTD(ftrack, start) == -1) {
printf("Error getting TD\n");
CDR_close();
return;
}
if (CDR_getTD(ltrack, end) == -1)
{
if (CDR_getTD(ltrack, end) == -1) {
printf("Error getting TD\n");
CDR_close();
@ -396,8 +399,7 @@ void OnCreate(GtkButton *button, gpointer user_data)
}
f = fopen(IsoFile, "wb");
if (f == NULL)
{
if (f == NULL) {
CDR_close();
printf("Error opening %s", IsoFile);
return;
@ -424,17 +426,15 @@ void OnCreate(GtkButton *button, gpointer user_data)
if ((param[0] == end[0]) & (param[1] == end[1]) & (param[2] == end[2]))
break;
buffer = CDR_readTrack(param);
if (buffer == NULL)
{
if (buffer == NULL) {
int i;
for (i = 0; i < 10; i++)
{
for (i = 0; i < 10; i++) {
buffer = CDR_readTrack(param);
if (buffer != NULL) break;
if (buffer != NULL)
break;
}
if (buffer == NULL)
{
if (buffer == NULL) {
printf("Error Reading %2d:%2d:%2d\n", param[0], param[1], param[2]);
buffer = bufferz;
buffer[12] = param[0];
@ -448,8 +448,7 @@ void OnCreate(GtkButton *button, gpointer user_data)
count += CD_FRAMESIZE_RAW;
printf("reading %2d:%2d:%2d ", param[0], param[1], param[2]);
if ((time(NULL) - Ttime) != 0)
{
if ((time(NULL) - Ttime) != 0) {
i = (count / 1024) / (time(NULL) - Ttime);
printf("( %5dKbytes/s, %dX)", i, i / 150);
}
@ -462,8 +461,10 @@ void OnCreate(GtkButton *button, gpointer user_data)
p++;
per = ((float)p / s);
gtk_progress_bar_update(GTK_PROGRESS_BAR(Progress), per);
while (gtk_events_pending()) gtk_main_iteration();
if (stop) break;
while (gtk_events_pending())
gtk_main_iteration();
if (stop)
break;
}
Ttime = time(NULL) - Ttime;
@ -479,7 +480,8 @@ void OnCreate(GtkButton *button, gpointer user_data)
gtk_widget_set_sensitive(BtnCreate, TRUE);
gtk_widget_set_sensitive(BtnCreateZ, TRUE);
if (!stop) SysMessageLoc("Iso Image Created OK");
if (!stop)
SysMessageLoc("Iso Image Created OK");
}
void OnCreateZ(GtkButton *button, gpointer user_data)
@ -511,19 +513,17 @@ void OnCreateZ(GtkButton *button, gpointer user_data)
UpdZmode();
if (Zmode == 1)
{
if (Zmode == 1) {
blocks = 1;
if (strstr(IsoFile, ".Z") == NULL) strcat(IsoFile, ".Z");
}
else
{
if (strstr(IsoFile, ".Z") == NULL)
strcat(IsoFile, ".Z");
} else {
blocks = 10;
if (strstr(IsoFile, ".bz") == NULL) strcat(IsoFile, ".bz");
if (strstr(IsoFile, ".bz") == NULL)
strcat(IsoFile, ".bz");
}
if (stat(IsoFile, &buf) == 0)
{
if (stat(IsoFile, &buf) == 0) {
printf("File %s Already exists\n", IsoFile);
return;
}
@ -536,22 +536,20 @@ void OnCreateZ(GtkButton *button, gpointer user_data)
t = fopen(table, "wb");
if (t == NULL) return;
if (CDR_open() == -1)
{
if (t == NULL)
return;
if (CDR_open() == -1) {
fclose(t);
return;
}
if (CDR_getTD(ftrack, start) == -1)
{
if (CDR_getTD(ftrack, start) == -1) {
printf("Error getting TD\n");
CDR_close();
fclose(t);
return;
}
if (CDR_getTD(ltrack, end) == -1)
{
if (CDR_getTD(ltrack, end) == -1) {
printf("Error getting TD\n");
CDR_close();
fclose(t);
@ -559,8 +557,7 @@ void OnCreateZ(GtkButton *button, gpointer user_data)
}
f = fopen(IsoFile, "wb");
if (f == NULL)
{
if (f == NULL) {
CDR_close();
fclose(t);
printf("Error opening %s", IsoFile);
@ -587,24 +584,21 @@ void OnCreateZ(GtkButton *button, gpointer user_data)
unsigned char Zbuf[CD_FRAMESIZE_RAW * 10 * 2];
float per;
for (b = 0; b < blocks; b++)
{
for (b = 0; b < blocks; b++) {
if ((param[0] == end[0]) & (param[1] == end[1]) & (param[2] == end[2]))
break;
buffer = CDR_readTrack(param);
if (buffer == NULL)
{
if (buffer == NULL) {
int i;
for (i = 0; i < 10; i++)
{
for (i = 0; i < 10; i++) {
buffer = CDR_readTrack(param);
if (buffer != NULL) break;
if (buffer != NULL)
break;
}
if (buffer == NULL)
{
if (buffer == NULL) {
printf("Error Reading %2d:%2d:%2d\n", param[0], param[1], param[2]);
buffer = bufferz;
buffer[12] = param[0];
@ -624,10 +618,11 @@ void OnCreateZ(GtkButton *button, gpointer user_data)
if (Zmode == 1)
compress(Zbuf, &size, cdbuffer, CD_FRAMESIZE_RAW);
else
BZ2_bzBuffToBuffCompress((char*)Zbuf, (unsigned int*)&size, (char*)cdbuffer, CD_FRAMESIZE_RAW * 10, 1, 0, 30);
BZ2_bzBuffToBuffCompress((char *)Zbuf, (unsigned int *)&size, (char *)cdbuffer, CD_FRAMESIZE_RAW * 10, 1, 0, 30);
fwrite(&c, 1, 4, t);
if (Zmode == 1) fwrite(&size, 1, 2, t);
if (Zmode == 1)
fwrite(&size, 1, 2, t);
fwrite(Zbuf, 1, size, f);
@ -636,8 +631,7 @@ void OnCreateZ(GtkButton *button, gpointer user_data)
count += CD_FRAMESIZE_RAW * blocks;
printf("reading %2d:%2d:%2d ", param[0], param[1], param[2]);
if ((time(NULL) - Ttime) != 0)
{
if ((time(NULL) - Ttime) != 0) {
i = (count / 1024) / (time(NULL) - Ttime);
printf("( %5dKbytes/s, %dX)", i, i / 150);
}
@ -649,13 +643,17 @@ void OnCreateZ(GtkButton *button, gpointer user_data)
per = ((float)p / s);
gtk_progress_bar_update(GTK_PROGRESS_BAR(Progress), per);
while (gtk_events_pending()) gtk_main_iteration();
while (gtk_events_pending())
gtk_main_iteration();
if (stop) break;
if (stop)
break;
}
if (Zmode == 2) fwrite(&c, 1, 4, f);
if (Zmode == 2)
fwrite(&c, 1, 4, f);
if (!stop) gtk_entry_set_text(GTK_ENTRY(Edit), IsoFile);
if (!stop)
gtk_entry_set_text(GTK_ENTRY(Edit), IsoFile);
Ttime = time(NULL) - Ttime;
Tm = gmtime(&Ttime);
@ -671,5 +669,6 @@ void OnCreateZ(GtkButton *button, gpointer user_data)
gtk_widget_set_sensitive(BtnCreate, TRUE);
gtk_widget_set_sensitive(BtnCreateZ, TRUE);
if (!stop) SysMessageLoc("Compressed Iso Image Created OK");
if (!stop)
SysMessageLoc("Compressed Iso Image Created OK");
}

View File

@ -1,34 +1,26 @@
#include <gtk/gtk.h>
void
OnFileSel (GtkButton *button,
void OnFileSel(GtkButton *button,
gpointer user_data);
void
OnStop (GtkButton *button,
void OnStop(GtkButton *button,
gpointer user_data);
void
OnCompress (GtkButton *button,
void OnCompress(GtkButton *button,
gpointer user_data);
void
OnDecompress (GtkButton *button,
void OnDecompress(GtkButton *button,
gpointer user_data);
void
OnCreate (GtkButton *button,
void OnCreate(GtkButton *button,
gpointer user_data);
void
OnCreateZ (GtkButton *button,
void OnCreateZ(GtkButton *button,
gpointer user_data);
void
OnOk (GtkButton *button,
void OnOk(GtkButton *button,
gpointer user_data);
void
OnCancel (GtkButton *button,
void OnCancel(GtkButton *button,
gpointer user_data);

View File

@ -2,4 +2,4 @@
* DO NOT EDIT THIS FILE - it is generated by Glade.
*/
GtkWidget* create_Config (void);
GtkWidget *create_Config(void);

View File

@ -3,7 +3,7 @@
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#include <config.h>
#endif
#include <gtk/gtk.h>
@ -12,24 +12,24 @@
* Standard gettext macros.
*/
#ifdef ENABLE_NLS
# include <libintl.h>
# undef _
# define _(String) dgettext (PACKAGE, String)
# define Q_(String) g_strip_context ((String), gettext (String))
# ifdef gettext_noop
# define N_(String) gettext_noop (String)
# else
# define N_(String) (String)
# endif
#include <libintl.h>
#undef _
#define _(String) dgettext(PACKAGE, String)
#define Q_(String) g_strip_context((String), gettext(String))
#ifdef gettext_noop
#define N_(String) gettext_noop(String)
#else
# define textdomain(String) (String)
# define gettext(String) (String)
# define dgettext(Domain,Message) (Message)
# define dcgettext(Domain,Message,Type) (Message)
# define bindtextdomain(Domain,Directory) (Domain)
# define _(String) (String)
# define Q_(String) g_strip_context ((String), (String))
# define N_(String) (String)
#define N_(String) (String)
#endif
#else
#define textdomain(String) (String)
#define gettext(String) (String)
#define dgettext(Domain, Message) (Message)
#define dcgettext(Domain, Message, Type) (Message)
#define bindtextdomain(Domain, Directory) (Domain)
#define _(String) (String)
#define Q_(String) g_strip_context((String), (String))
#define N_(String) (String)
#endif
@ -43,12 +43,12 @@
* or alternatively any widget in the component, and the name of the widget
* you want returned.
*/
GtkWidget* lookup_widget (GtkWidget *widget,
GtkWidget *lookup_widget(GtkWidget *widget,
const gchar *widget_name);
/* Use this function to set the directory containing installed pixmaps. */
void add_pixmap_directory (const gchar *directory);
void add_pixmap_directory(const gchar *directory);
/*
@ -56,14 +56,13 @@ void add_pixmap_directory (const gchar *directory);
*/
/* This is used to create the pixmaps used in the interface. */
GtkWidget* create_pixmap (GtkWidget *widget,
GtkWidget *create_pixmap(GtkWidget *widget,
const gchar *filename);
/* This is used to create the pixbufs used in the interface. */
GdkPixbuf* create_pixbuf (const gchar *filename);
GdkPixbuf *create_pixbuf(const gchar *filename);
/* This is used to set ATK action descriptions. */
void glade_set_atk_action_description (AtkAction *action,
void glade_set_atk_action_description(AtkAction *action,
const gchar *action_name,
const gchar *description);

View File

@ -4,14 +4,15 @@
#include "../CDVDiso.h"
#define GetKeyV(name, var, s, t) \
size = s; type = t; \
RegQueryValueEx(myKey, name, 0, &type, (LPBYTE) var, &size);
size = s; \
type = t; \
RegQueryValueEx(myKey, name, 0, &type, (LPBYTE)var, &size);
#define GetKeyVdw(name, var) \
GetKeyV(name, var, 4, REG_DWORD);
#define SetKeyV(name, var, s, t) \
RegSetValueEx(myKey, name, 0, t, (LPBYTE) var, s);
RegSetValueEx(myKey, name, 0, t, (LPBYTE)var, s);
#define SetKeyVdw(name, var) \
SetKeyV(name, var, 4, REG_DWORD);
@ -37,8 +38,7 @@ void LoadConf()
memset(IsoFile, 0, sizeof(IsoFile));
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\PS2Eplugin\\CDVD\\CDVDiso", 0, KEY_ALL_ACCESS, &myKey) != ERROR_SUCCESS)
{
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\PS2Eplugin\\CDVD\\CDVDiso", 0, KEY_ALL_ACCESS, &myKey) != ERROR_SUCCESS) {
SaveConf();
return;
}

View File

@ -1,3 +1,2 @@
void SaveConf();
void LoadConf();

View File

@ -67,8 +67,7 @@ int _GetFile(char *out)
ofn.lpstrDefExt = NULL;
ofn.Flags = OFN_HIDEREADONLY;
if (GetOpenFileName((LPOPENFILENAME)&ofn))
{
if (GetOpenFileName((LPOPENFILENAME)&ofn)) {
strcpy(out, szFileName);
return 1;
}
@ -82,13 +81,12 @@ int _OpenFile(int saveConf)
int retval = 0;
// for saving the pcsx2 current working directory;
char* cwd_pcsx2 = _getcwd(NULL, MAXFILENAME);
char *cwd_pcsx2 = _getcwd(NULL, MAXFILENAME);
if (IsoCWD[0] != 0)
_chdir(IsoCWD);
if (_GetFile(IsoFile) == 1)
{
if (_GetFile(IsoFile) == 1) {
// Save the user's new cwd:
if (_getcwd(IsoCWD, MAXFILENAME) == NULL)
IsoCWD[0] = 0;
@ -100,8 +98,7 @@ int _OpenFile(int saveConf)
}
// Restore Pcsx2's path.
if (cwd_pcsx2 != NULL)
{
if (cwd_pcsx2 != NULL) {
_chdir(cwd_pcsx2);
free(cwd_pcsx2);
cwd_pcsx2 = NULL;
@ -116,12 +113,9 @@ void CfgOpenFile()
void UpdZmode()
{
if (ComboBox_GetCurSel(hMethod) == 0)
{
if (ComboBox_GetCurSel(hMethod) == 0) {
Zmode = 1;
}
else
{
} else {
Zmode = 2;
}
}
@ -131,8 +125,7 @@ void SysUpdate()
{
MSG msg;
while (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
while (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
@ -141,7 +134,7 @@ void SysUpdate()
void OnCompress()
{
u32 lsn;
u8 cdbuff[10*2352];
u8 cdbuff[10 * 2352];
char Zfile[256];
int ret;
isoFile *src;
@ -150,62 +143,57 @@ void OnCompress()
Edit_GetText(hIsoFile, IsoFile, 256);
UpdZmode();
if (Zmode == 1)
{
if (Zmode == 1) {
sprintf(Zfile, "%s.Z2", IsoFile);
}
else
{
} else {
sprintf(Zfile, "%s.BZ2", IsoFile);
}
src = isoOpen(IsoFile);
if (src == NULL) return;
if (Zmode == 1)
{
if (src == NULL)
return;
if (Zmode == 1) {
dst = isoCreate(Zfile, ISOFLAGS_Z2);
}
else
{
} else {
dst = isoCreate(Zfile, ISOFLAGS_BZ2);
}
if (dst == NULL) return;
if (dst == NULL)
return;
isoSetFormat(dst, src->blockofs, src->blocksize, src->blocks);
Button_Enable(GetDlgItem(hDlg, IDC_COMPRESSISO), FALSE);
Button_Enable(GetDlgItem(hDlg, IDC_DECOMPRESSISO), FALSE);
stop = 0;
for (lsn = 0; lsn < src->blocks; lsn++)
{
for (lsn = 0; lsn < src->blocks; lsn++) {
//printf("block %d ", lsn);
//putchar(13);
//fflush(stdout);
ret = isoReadBlock(src, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
ret = isoWriteBlock(dst, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
SendMessage(hProgress, PBM_SETPOS, (lsn * 100) / src->blocks, 0);
SysUpdate();
if (stop) break;
if (stop)
break;
}
isoClose(src);
isoClose(dst);
if (!stop) Edit_SetText(hIsoFile, Zfile);
if (!stop)
Edit_SetText(hIsoFile, Zfile);
Button_Enable(GetDlgItem(hDlg, IDC_COMPRESSISO), TRUE);
Button_Enable(GetDlgItem(hDlg, IDC_DECOMPRESSISO), TRUE);
if (!stop)
{
if (ret == -1)
{
if (!stop) {
if (ret == -1) {
SysMessage("Error compressing iso image");
}
else
{
} else {
SysMessage("Iso image compressed OK");
}
}
@ -214,7 +202,7 @@ void OnCompress()
void OnDecompress()
{
char file[256];
u8 cdbuff[10*2352];
u8 cdbuff[10 * 2352];
u32 lsn;
isoFile *src;
isoFile *dst;
@ -223,52 +211,48 @@ void OnDecompress()
Edit_GetText(hIsoFile, IsoFile, 256);
src = isoOpen(IsoFile);
if (src == NULL) return;
if (src == NULL)
return;
strcpy(file, IsoFile);
if (src->flags & ISOFLAGS_Z)
{
if (src->flags & ISOFLAGS_Z) {
file[strlen(file) - 2] = 0;
}
else
if (src->flags & ISOFLAGS_Z2)
{
} else if (src->flags & ISOFLAGS_Z2) {
file[strlen(file) - 3] = 0;
}
else
if (src->flags & ISOFLAGS_BZ2)
{
} else if (src->flags & ISOFLAGS_BZ2) {
file[strlen(file) - 3] = 0;
}
else
{
} else {
SysMessage("%s is not a compressed image", IsoFile);
return;
}
dst = isoCreate(file, 0);
if (dst == NULL) return;
if (dst == NULL)
return;
isoSetFormat(dst, src->blockofs, src->blocksize, src->blocks);
Button_Enable(GetDlgItem(hDlg, IDC_COMPRESSISO), FALSE);
Button_Enable(GetDlgItem(hDlg, IDC_DECOMPRESSISO), FALSE);
stop = 0;
for (lsn = 0; lsn < src->blocks; lsn++)
{
for (lsn = 0; lsn < src->blocks; lsn++) {
printf("block %d ", lsn);
putchar(13);
fflush(stdout);
ret = isoReadBlock(src, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
ret = isoWriteBlock(dst, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
SendMessage(hProgress, PBM_SETPOS, (lsn * 100) / src->blocks, 0);
SysUpdate();
if (stop) break;
if (stop)
break;
}
if (!stop) Edit_SetText(hIsoFile, file);
if (!stop)
Edit_SetText(hIsoFile, file);
isoClose(src);
isoClose(dst);
@ -276,14 +260,10 @@ void OnDecompress()
Button_Enable(GetDlgItem(hDlg, IDC_COMPRESSISO), TRUE);
Button_Enable(GetDlgItem(hDlg, IDC_DECOMPRESSISO), TRUE);
if (!stop)
{
if (ret == -1)
{
if (!stop) {
if (ret == -1) {
SysMessage("Error decompressing iso image");
}
else
{
} else {
SysMessage("Iso image decompressed OK");
}
}
@ -293,8 +273,7 @@ BOOL CALLBACK ConfigureDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int i;
switch (uMsg)
{
switch (uMsg) {
case WM_INITDIALOG:
hDlg = hW;
LoadConf();
@ -304,8 +283,7 @@ BOOL CALLBACK ConfigureDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
hMethod = GetDlgItem(hW, IDC_METHOD);
hBlockDump = GetDlgItem(hW, IDC_BLOCKDUMP);
for (i = 0; methods[i] != NULL; i++)
{
for (i = 0; methods[i] != NULL; i++) {
ComboBox_AddString(hMethod, methods[i]);
}
@ -319,8 +297,7 @@ BOOL CALLBACK ConfigureDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
switch (LOWORD(wParam)) {
case IDC_SELECTISO:
if (_OpenFile(FALSE) == 1)
Edit_SetText(hIsoFile, IsoFile);
@ -354,7 +331,8 @@ BOOL CALLBACK ConfigureDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
return FALSE;
}
EXPORT_C_(void) CDVDconfigure()
EXPORT_C_(void)
CDVDconfigure()
{
DialogBox(hInst,
MAKEINTRESOURCE(IDD_CONFIG),
@ -364,14 +342,12 @@ EXPORT_C_(void) CDVDconfigure()
BOOL CALLBACK AboutDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
switch (uMsg) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
switch (LOWORD(wParam)) {
case IDOK:
EndDialog(hW, TRUE);
return FALSE;
@ -380,7 +356,8 @@ BOOL CALLBACK AboutDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
return FALSE;
}
EXPORT_C_(void) CDVDabout()
EXPORT_C_(void)
CDVDabout()
{
DialogBox(hInst,
MAKEINTRESOURCE(IDD_ABOUT),
@ -395,4 +372,3 @@ BOOL APIENTRY DllMain(HANDLE hModule, // DLL INIT
hInst = (HINSTANCE)hModule;
return TRUE; // very quick :)
}

View File

@ -3,13 +3,13 @@
#define _FILE_OFFSET_BITS 64
#ifdef __GNUC__
# ifndef _LARGEFILE_SOURCE
# define _LARGEFILE_SOURCE
# endif
#ifndef _LARGEFILE_SOURCE
#define _LARGEFILE_SOURCE
#endif
# ifndef _LARGEFILE64_SOURCE
# define _LARGEFILE64_SOURCE
# endif
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
#endif
#endif
#ifdef _WIN32
@ -116,15 +116,13 @@ void *_openfile(const char *filename, int flags)
{
HANDLE handle;
// printf("_openfile %s, %d\n", filename, flags & O_RDONLY);
if (flags & O_WRONLY)
{
// printf("_openfile %s, %d\n", filename, flags & O_RDONLY);
if (flags & O_WRONLY) {
int _flags = CREATE_NEW;
if (flags & O_CREAT) _flags = CREATE_ALWAYS;
if (flags & O_CREAT)
_flags = CREATE_ALWAYS;
handle = CreateFile(filename, GENERIC_WRITE, 0, NULL, _flags, 0, NULL);
}
else
{
} else {
handle = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
}
@ -134,7 +132,7 @@ void *_openfile(const char *filename, int flags)
u64 _tellfile(void *handle)
{
u64 ofs;
PLONG _ofs = (LONG*) & ofs;
PLONG _ofs = (LONG *)&ofs;
_ofs[1] = 0;
_ofs[0] = SetFilePointer(handle, 0, &_ofs[1], FILE_CURRENT);
return ofs;
@ -143,14 +141,11 @@ u64 _tellfile(void *handle)
int _seekfile(void *handle, u64 offset, int whence)
{
u64 ofs = (u64)offset;
PLONG _ofs = (LONG*) & ofs;
// printf("_seekfile %p, %d_%d\n", handle, _ofs[1], _ofs[0]);
if (whence == SEEK_SET)
{
PLONG _ofs = (LONG *)&ofs;
// printf("_seekfile %p, %d_%d\n", handle, _ofs[1], _ofs[0]);
if (whence == SEEK_SET) {
SetFilePointer(handle, _ofs[0], &_ofs[1], FILE_BEGIN);
}
else
{
} else {
SetFilePointer(handle, _ofs[0], &_ofs[1], FILE_END);
}
return 0;
@ -160,9 +155,9 @@ int _readfile(void *handle, void *dst, int size)
{
DWORD ret;
// printf("_readfile %p %d\n", handle, size);
// printf("_readfile %p %d\n", handle, size);
ReadFile(handle, dst, size, &ret, NULL);
// printf("_readfile ret %d; %d\n", ret, GetLastError());
// printf("_readfile ret %d; %d\n", ret, GetLastError());
return ret;
}
@ -170,10 +165,10 @@ int _writefile(void *handle, const void *src, int size)
{
DWORD ret;
// printf("_writefile %p, %d\n", handle, size);
// _seekfile(handle, _tellfile(handle));
// printf("_writefile %p, %d\n", handle, size);
// _seekfile(handle, _tellfile(handle));
WriteFile(handle, src, size, &ret, NULL);
// printf("_writefile ret %d\n", ret);
// printf("_writefile ret %d\n", ret);
return ret;
}
@ -198,14 +193,12 @@ void *_openfile(const char *filename, int flags)
u64 _tellfile(void *handle)
{
FILE* fp = (FILE*)handle;
FILE *fp = (FILE *)handle;
s64 cursize = ftell(fp);
if (cursize == -1)
{
if (cursize == -1) {
// try 64bit
cursize = ftello64(fp);
if (cursize < -1)
{
if (cursize < -1) {
// zero top 32 bits
cursize &= 0xffffffff;
}
@ -215,26 +208,27 @@ u64 _tellfile(void *handle)
int _seekfile(void *handle, u64 offset, int whence)
{
int seekerr = fseeko64((FILE*)handle, offset, whence);
int seekerr = fseeko64((FILE *)handle, offset, whence);
if (seekerr == -1) printf("failed to seek\n");
if (seekerr == -1)
printf("failed to seek\n");
return seekerr;
}
int _readfile(void *handle, void *dst, int size)
{
return fread(dst, 1, size, (FILE*)handle);
return fread(dst, 1, size, (FILE *)handle);
}
int _writefile(void *handle, const void *src, int size)
{
return fwrite(src, 1, size, (FILE*)handle);
return fwrite(src, 1, size, (FILE *)handle);
}
void _closefile(void *handle)
{
fclose((FILE*)handle);
fclose((FILE *)handle);
}
#endif
@ -244,11 +238,13 @@ int detect(isoFile *iso)
u8 buf[2448];
struct cdVolDesc *volDesc;
if (isoReadBlock(iso, buf, 16) == -1) return -1;
if (isoReadBlock(iso, buf, 16) == -1)
return -1;
volDesc = (struct cdVolDesc *)(buf + 24);
if (strncmp((char*)volDesc->volID, "CD001", 5)) return 0;
if (strncmp((char *)volDesc->volID, "CD001", 5))
return 0;
if (volDesc->rootToc.tocSize == 2048)
iso->type = ISOTYPE_CD;
@ -266,18 +262,16 @@ int _isoReadZtable(isoFile *iso)
sprintf(table, "%s.table", iso->filename);
handle = _openfile(table, O_RDONLY);
if (handle == NULL)
{
if (handle == NULL) {
printf("Error loading %s\n", table);
return -1;
}
_seekfile(handle, 0, SEEK_END);
size = _tellfile(handle);
iso->Ztable = (char*)malloc(size);
iso->Ztable = (char *)malloc(size);
if (iso->Ztable == NULL)
{
if (iso->Ztable == NULL) {
return -1;
}
@ -300,18 +294,16 @@ int _isoReadZ2table(isoFile *iso)
sprintf(table, "%s.table", iso->filename);
handle = _openfile(table, O_RDONLY);
if (handle == NULL)
{
if (handle == NULL) {
printf("Error loading %s\n", table);
return -1;
}
_seekfile(handle, 0, SEEK_END);
size = _tellfile(handle);
Ztable = (u32*)malloc(size);
Ztable = (u32 *)malloc(size);
if (Ztable == NULL)
{
if (Ztable == NULL) {
return -1;
}
@ -319,20 +311,18 @@ int _isoReadZ2table(isoFile *iso)
_readfile(handle, Ztable, size);
_closefile(handle);
iso->Ztable = (char*)malloc(iso->blocks * 8);
iso->Ztable = (char *)malloc(iso->blocks * 8);
if (iso->Ztable == NULL)
{
if (iso->Ztable == NULL) {
free(Ztable);
return -1;
}
ofs = 16;
for (i = 0; i < iso->blocks; i++)
{
*(u32*)&iso->Ztable[i*8+0] = ofs;
*(u32*)&iso->Ztable[i*8+4] = Ztable[i];
for (i = 0; i < iso->blocks; i++) {
*(u32 *)&iso->Ztable[i * 8 + 0] = ofs;
*(u32 *)&iso->Ztable[i * 8 + 4] = Ztable[i];
ofs += Ztable[i];
}
@ -352,23 +342,23 @@ int _isoReadBZ2table(isoFile *iso)
sprintf(table, "%s.table", iso->filename);
handle = _openfile(table, O_RDONLY);
if (handle == NULL)
{
if (handle == NULL) {
printf("Error loading %s\n", table);
return -1;
}
_seekfile(handle, 0, SEEK_END);
size = _tellfile(handle);
Ztable = (u32*)malloc(size);
if (Ztable == NULL) return -1;
Ztable = (u32 *)malloc(size);
if (Ztable == NULL)
return -1;
_seekfile(handle, 0, SEEK_SET);
_readfile(handle, Ztable, size);
_closefile(handle);
iso->Ztable = (char*)malloc(iso->blocks * 8);
if (iso->Ztable == NULL){
iso->Ztable = (char *)malloc(iso->blocks * 8);
if (iso->Ztable == NULL) {
free(Ztable);
return -1;
}
@ -376,17 +366,15 @@ int _isoReadBZ2table(isoFile *iso)
ofs = 16;
for (i = 0; i < iso->blocks / 16; i++)
{
*(u32*)&iso->Ztable[i*8+0] = ofs;
*(u32*)&iso->Ztable[i*8+4] = Ztable[i];
for (i = 0; i < iso->blocks / 16; i++) {
*(u32 *)&iso->Ztable[i * 8 + 0] = ofs;
*(u32 *)&iso->Ztable[i * 8 + 4] = Ztable[i];
ofs += Ztable[i];
}
if (iso->blocks & 0xf)
{
*(u32*)&iso->Ztable[i*8+0] = ofs;
*(u32*)&iso->Ztable[i*8+4] = Ztable[i];
if (iso->blocks & 0xf) {
*(u32 *)&iso->Ztable[i * 8 + 0] = ofs;
*(u32 *)&iso->Ztable[i * 8 + 4] = Ztable[i];
ofs += Ztable[i];
}
@ -402,13 +390,13 @@ int _isoReadDtable(isoFile *iso)
_seekfile(iso->handle, 0, SEEK_END);
iso->dtablesize = (_tellfile(iso->handle) - 16) / (iso->blocksize + 4);
iso->dtable = (u32*)malloc(iso->dtablesize * 4);
iso->dtable = (u32 *)malloc(iso->dtablesize * 4);
for (i = 0; i < iso->dtablesize; i++)
{
_seekfile(iso->handle, 16 + (iso->blocksize + 4)*i, SEEK_SET);
for (i = 0; i < iso->dtablesize; i++) {
_seekfile(iso->handle, 16 + (iso->blocksize + 4) * i, SEEK_SET);
ret = _readfile(iso->handle, &iso->dtable[i], 4);
if (ret < 4) return -1;
if (ret < 4)
return -1;
}
return 0;
@ -422,10 +410,8 @@ int isoDetect(isoFile *iso) // based on florin's CDVDbin detection code :)
iso->type = ISOTYPE_ILLEGAL;
len = strlen(iso->filename);
if (len >= 2)
{
if (!strncmp(iso->filename + (len - 2), ".Z", 2))
{
if (len >= 2) {
if (!strncmp(iso->filename + (len - 2), ".Z", 2)) {
iso->flags = ISOFLAGS_Z;
iso->blocksize = 2352;
_isoReadZtable(iso);
@ -436,38 +422,32 @@ int isoDetect(isoFile *iso) // based on florin's CDVDbin detection code :)
_seekfile(iso->handle, 0, SEEK_SET);
_readfile(iso->handle, buf, 4);
if (strncmp(buf, "BDV2", 4) == 0)
{
if (strncmp(buf, "BDV2", 4) == 0) {
iso->flags = ISOFLAGS_BLOCKDUMP;
_readfile(iso->handle, &iso->blocksize, 4);
_readfile(iso->handle, &iso->blocks, 4);
_readfile(iso->handle, &iso->blockofs, 4);
_isoReadDtable(iso);
return detect(iso) == 1 ? 0 : -1;
}
else if (strncmp(buf, "Z V2", 4) == 0)
{
} else if (strncmp(buf, "Z V2", 4) == 0) {
iso->flags = ISOFLAGS_Z2;
_readfile(iso->handle, &iso->blocksize, 4);
_readfile(iso->handle, &iso->blocks, 4);
_readfile(iso->handle, &iso->blockofs, 4);
_isoReadZ2table(iso);
return detect(iso) == 1 ? 0 : -1;
}
else if (strncmp(buf, "BZV2", 4) == 0)
{
} else if (strncmp(buf, "BZV2", 4) == 0) {
iso->flags = ISOFLAGS_BZ2;
_readfile(iso->handle, &iso->blocksize, 4);
_readfile(iso->handle, &iso->blocks, 4);
_readfile(iso->handle, &iso->blockofs, 4);
iso->buflsn = -1;
iso->buffer = (u8*)malloc(iso->blocksize * 16);
if (iso->buffer == NULL) return -1;
iso->buffer = (u8 *)malloc(iso->blocksize * 16);
if (iso->buffer == NULL)
return -1;
_isoReadBZ2table(iso);
return detect(iso) == 1 ? 0 : -1;
}
else
{
} else {
iso->blocks = 16;
}
@ -475,61 +455,71 @@ int isoDetect(isoFile *iso) // based on florin's CDVDbin detection code :)
iso->blocksize = 2048;
iso->offset = 0;
iso->blockofs = 24;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// RAW 2336
iso->blocksize = 2336;
iso->offset = 0;
iso->blockofs = 16;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// RAW 2352
iso->blocksize = 2352;
iso->offset = 0;
iso->blockofs = 0;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// RAWQ 2448
iso->blocksize = 2448;
iso->offset = 0;
iso->blockofs = 0;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// NERO ISO 2048
iso->blocksize = 2048;
iso->offset = 150 * 2048;
iso->blockofs = 24;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// NERO RAW 2352
iso->blocksize = 2352;
iso->offset = 150 * 2048;
iso->blockofs = 0;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// NERO RAWQ 2448
iso->blocksize = 2448;
iso->offset = 150 * 2048;
iso->blockofs = 0;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// ISO 2048
iso->blocksize = 2048;
iso->offset = -8;
iso->blockofs = 24;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// RAW 2352
iso->blocksize = 2352;
iso->offset = -8;
iso->blockofs = 0;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
// RAWQ 2448
iso->blocksize = 2448;
iso->offset = -8;
iso->blockofs = 0;
if (detect(iso) == 1) return 0;
if (detect(iso) == 1)
return 0;
iso->offset = 0;
iso->blocksize = 2352;
@ -544,35 +534,33 @@ isoFile *isoOpen(const char *filename)
isoFile *iso;
int i;
iso = (isoFile*)malloc(sizeof(isoFile));
if (iso == NULL) return NULL;
iso = (isoFile *)malloc(sizeof(isoFile));
if (iso == NULL)
return NULL;
memset(iso, 0, sizeof(isoFile));
strcpy(iso->filename, filename);
iso->handle = _openfile(iso->filename, O_RDONLY);
if (iso->handle == NULL)
{
if (iso->handle == NULL) {
printf("Error loading %s\n", iso->filename);
free(iso);
return NULL;
}
if (isoDetect(iso) == -1) return NULL;
if (isoDetect(iso) == -1)
return NULL;
printf("detected blocksize = %d\n", iso->blocksize);
if (strlen(iso->filename) > 3 && strncmp(iso->filename + (strlen(iso->filename) - 3), "I00", 3) == 0)
{
if (strlen(iso->filename) > 3 && strncmp(iso->filename + (strlen(iso->filename) - 3), "I00", 3) == 0) {
_closefile(iso->handle);
iso->flags |= ISOFLAGS_MULTI;
iso->blocks = 0;
for (i = 0; i < 8; i++)
{
for (i = 0; i < 8; i++) {
iso->filename[strlen(iso->filename) - 1] = '0' + i;
iso->multih[i].handle = _openfile(iso->filename, O_RDONLY);
if (iso->multih[i].handle == NULL)
{
if (iso->multih[i].handle == NULL) {
break;
}
iso->multih[i].slsn = iso->blocks;
@ -582,14 +570,12 @@ isoFile *isoOpen(const char *filename)
iso->multih[i].elsn = iso->blocks - 1;
}
if (i == 0)
{
if (i == 0) {
return NULL;
}
}
if (iso->flags == 0)
{
if (iso->flags == 0) {
_seekfile(iso->handle, 0, SEEK_END);
iso->blocks = (u32)((_tellfile(iso->handle) - iso->offset) /
(iso->blocksize));
@ -611,8 +597,9 @@ isoFile *isoCreate(const char *filename, int flags)
isoFile *iso;
char Zfile[256];
iso = (isoFile*)malloc(sizeof(isoFile));
if (iso == NULL) return NULL;
iso = (isoFile *)malloc(sizeof(isoFile));
if (iso == NULL)
return NULL;
memset(iso, 0, sizeof(isoFile));
strcpy(iso->filename, filename);
@ -622,20 +609,17 @@ isoFile *isoCreate(const char *filename, int flags)
iso->blocksize = CD_FRAMESIZE_RAW;
iso->blocksize = 2048;
if (iso->flags & (ISOFLAGS_Z | ISOFLAGS_Z2 | ISOFLAGS_BZ2))
{
if (iso->flags & (ISOFLAGS_Z | ISOFLAGS_Z2 | ISOFLAGS_BZ2)) {
sprintf(Zfile, "%s.table", iso->filename);
iso->htable = _openfile(Zfile, O_WRONLY);
if (iso->htable == NULL)
{
if (iso->htable == NULL) {
free(iso);
return NULL;
}
}
iso->handle = _openfile(iso->filename, O_WRONLY | O_CREAT);
if (iso->handle == NULL)
{
if (iso->handle == NULL) {
printf("Error loading %s\n", iso->filename);
free(iso);
return NULL;
@ -654,29 +638,39 @@ int isoSetFormat(isoFile *iso, int blockofs, int blocksize, int blocks)
printf("blockofs = %d\n", iso->blockofs);
printf("blocksize = %d\n", iso->blocksize);
printf("blocks = %d\n", iso->blocks);
if (iso->flags & ISOFLAGS_Z2)
{
if (_writefile(iso->handle, "Z V2", 4) < 4) return -1;
if (_writefile(iso->handle, &blocksize, 4) < 4) return -1;
if (_writefile(iso->handle, &blocks, 4) < 4) return -1;
if (_writefile(iso->handle, &blockofs, 4) < 4) return -1;
if (iso->flags & ISOFLAGS_Z2) {
if (_writefile(iso->handle, "Z V2", 4) < 4)
return -1;
if (_writefile(iso->handle, &blocksize, 4) < 4)
return -1;
if (_writefile(iso->handle, &blocks, 4) < 4)
return -1;
if (_writefile(iso->handle, &blockofs, 4) < 4)
return -1;
}
if (iso->flags & ISOFLAGS_BZ2)
{
if (_writefile(iso->handle, "BZV2", 4) < 4) return -1;
if (_writefile(iso->handle, &blocksize, 4) < 4) return -1;
if (_writefile(iso->handle, &blocks, 4) < 4) return -1;
if (_writefile(iso->handle, &blockofs, 4) < 4) return -1;
if (iso->flags & ISOFLAGS_BZ2) {
if (_writefile(iso->handle, "BZV2", 4) < 4)
return -1;
if (_writefile(iso->handle, &blocksize, 4) < 4)
return -1;
if (_writefile(iso->handle, &blocks, 4) < 4)
return -1;
if (_writefile(iso->handle, &blockofs, 4) < 4)
return -1;
iso->buflsn = -1;
iso->buffer = (u8*)malloc(iso->blocksize * 16);
if (iso->buffer == NULL) return -1;
iso->buffer = (u8 *)malloc(iso->blocksize * 16);
if (iso->buffer == NULL)
return -1;
}
if (iso->flags & ISOFLAGS_BLOCKDUMP)
{
if (_writefile(iso->handle, "BDV2", 4) < 4) return -1;
if (_writefile(iso->handle, &blocksize, 4) < 4) return -1;
if (_writefile(iso->handle, &blocks, 4) < 4) return -1;
if (_writefile(iso->handle, &blockofs, 4) < 4) return -1;
if (iso->flags & ISOFLAGS_BLOCKDUMP) {
if (_writefile(iso->handle, "BDV2", 4) < 4)
return -1;
if (_writefile(iso->handle, &blocksize, 4) < 4)
return -1;
if (_writefile(iso->handle, &blocks, 4) < 4)
return -1;
if (_writefile(iso->handle, &blockofs, 4) < 4)
return -1;
}
return 0;
@ -711,12 +705,11 @@ int _isoReadBlock(isoFile *iso, u8 *dst, int lsn)
u64 ofs = (u64)lsn * iso->blocksize + iso->offset;
int ret;
// printf("_isoReadBlock %d, blocksize=%d, blockofs=%d\n", lsn, iso->blocksize, iso->blockofs);
// printf("_isoReadBlock %d, blocksize=%d, blockofs=%d\n", lsn, iso->blocksize, iso->blockofs);
memset(dst, 0, iso->blockofs);
_seekfile(iso->handle, ofs, SEEK_SET);
ret = _readfile(iso->handle, dst + iso->blockofs, iso->blocksize);
if (ret < iso->blocksize)
{
if (ret < iso->blocksize) {
printf("read error %d\n", ret);
return -1;
}
@ -728,17 +721,16 @@ int _isoReadBlockZ(isoFile *iso, u8 *dst, int lsn)
{
u32 pos, p;
uLongf size;
u8 Zbuf[CD_FRAMESIZE_RAW*2];
u8 Zbuf[CD_FRAMESIZE_RAW * 2];
int ret;
// printf("_isoReadBlockZ %d, %d\n", lsn, iso->blocksize);
pos = *(unsigned long*) & iso->Ztable[lsn * 6];
p = *(unsigned short*) & iso->Ztable[lsn * 6 + 4];
// printf("%d, %d\n", pos, p);
// printf("_isoReadBlockZ %d, %d\n", lsn, iso->blocksize);
pos = *(unsigned long *)&iso->Ztable[lsn * 6];
p = *(unsigned short *)&iso->Ztable[lsn * 6 + 4];
// printf("%d, %d\n", pos, p);
_seekfile(iso->handle, pos, SEEK_SET);
ret = _readfile(iso->handle, Zbuf, p);
if (ret < p)
{
if (ret < p) {
printf("error reading block!!\n");
return -1;
}
@ -753,17 +745,16 @@ int _isoReadBlockZ2(isoFile *iso, u8 *dst, int lsn)
{
u32 pos, p;
uLongf size;
u8 Zbuf[16*1024];
u8 Zbuf[16 * 1024];
int ret;
// printf("_isoReadBlockZ2 %d, %d\n", lsn, iso->blocksize);
pos = *(u32*) & iso->Ztable[lsn*8];
p = *(u32*) & iso->Ztable[lsn*8+4];
// printf("%d, %d\n", pos, p);
// printf("_isoReadBlockZ2 %d, %d\n", lsn, iso->blocksize);
pos = *(u32 *)&iso->Ztable[lsn * 8];
p = *(u32 *)&iso->Ztable[lsn * 8 + 4];
// printf("%d, %d\n", pos, p);
_seekfile(iso->handle, pos, SEEK_SET);
ret = _readfile(iso->handle, Zbuf, p);
if (ret < p)
{
if (ret < p) {
printf("error reading block!!\n");
return -1;
}
@ -778,42 +769,39 @@ int _isoReadBlockBZ2(isoFile *iso, u8 *dst, int lsn)
{
u32 pos, p;
u32 size;
u8 Zbuf[64*1024];
u8 Zbuf[64 * 1024];
int ret;
if ((lsn / 16) == iso->buflsn)
{
if ((lsn / 16) == iso->buflsn) {
memset(dst, 0, iso->blockofs);
memcpy(dst + iso->blockofs, iso->buffer + (iso->blocksize*(lsn&0xf)), iso->blocksize);
memcpy(dst + iso->blockofs, iso->buffer + (iso->blocksize * (lsn & 0xf)), iso->blocksize);
return 0;
}
iso->buflsn = lsn / 16;
// printf("_isoReadBlockBZ2 %d, %d\n", lsn, iso->blocksize);
pos = *(u32*) & iso->Ztable[(lsn/16)*8];
p = *(u32*) & iso->Ztable[(lsn/16)*8+4];
// printf("%d, %d\n", pos, p);
// printf("_isoReadBlockBZ2 %d, %d\n", lsn, iso->blocksize);
pos = *(u32 *)&iso->Ztable[(lsn / 16) * 8];
p = *(u32 *)&iso->Ztable[(lsn / 16) * 8 + 4];
// printf("%d, %d\n", pos, p);
_seekfile(iso->handle, pos, SEEK_SET);
ret = _readfile(iso->handle, Zbuf, p);
if (ret < p)
{
if (ret < p) {
printf("error reading block!!\n");
return -1;
}
size = iso->blocksize * 64;
ret = BZ2_bzBuffToBuffDecompress((s8*)iso->buffer, &size, (s8*)Zbuf, p, 0, 0);
ret = BZ2_bzBuffToBuffDecompress((s8 *)iso->buffer, &size, (s8 *)Zbuf, p, 0, 0);
if (ret != BZ_OK)
{
if (ret != BZ_OK) {
printf("_isoReadBlockBZ2 %d, %d\n", lsn, iso->blocksize);
printf("%d, %d\n", pos, p);
printf("error on BZ2: %d\n", ret);
}
memset(dst, 0, iso->blockofs);
memcpy(dst + iso->blockofs, iso->buffer + (iso->blocksize*(lsn&0xf)), iso->blocksize);
memcpy(dst + iso->blockofs, iso->buffer + (iso->blocksize * (lsn & 0xf)), iso->blocksize);
return 0;
}
@ -823,15 +811,16 @@ int _isoReadBlockD(isoFile *iso, u8 *dst, int lsn)
int ret;
int i;
// printf("_isoReadBlockD %d, blocksize=%d, blockofs=%d\n", lsn, iso->blocksize, iso->blockofs);
// printf("_isoReadBlockD %d, blocksize=%d, blockofs=%d\n", lsn, iso->blocksize, iso->blockofs);
memset(dst, 0, iso->blockofs);
for (i = 0; i < iso->dtablesize;i++)
{
if (iso->dtable[i] != lsn) continue;
for (i = 0; i < iso->dtablesize; i++) {
if (iso->dtable[i] != lsn)
continue;
_seekfile(iso->handle, 16 + i*(iso->blocksize + 4) + 4, SEEK_SET);
_seekfile(iso->handle, 16 + i * (iso->blocksize + 4) + 4, SEEK_SET);
ret = _readfile(iso->handle, dst + iso->blockofs, iso->blocksize);
if (ret < iso->blocksize) return -1;
if (ret < iso->blocksize)
return -1;
return 0;
}
@ -846,24 +835,22 @@ int _isoReadBlockM(isoFile *iso, u8 *dst, int lsn)
int ret;
int i;
for (i = 0; i < 8; i++)
{
for (i = 0; i < 8; i++) {
if (lsn >= iso->multih[i].slsn &&
lsn <= iso->multih[i].elsn)
{
lsn <= iso->multih[i].elsn) {
break;
}
}
if (i == 8) return -1;
if (i == 8)
return -1;
ofs = (u64)(lsn - iso->multih[i].slsn) * iso->blocksize + iso->offset;
// printf("_isoReadBlock %d, blocksize=%d, blockofs=%d\n", lsn, iso->blocksize, iso->blockofs);
// printf("_isoReadBlock %d, blocksize=%d, blockofs=%d\n", lsn, iso->blocksize, iso->blockofs);
memset(dst, 0, iso->blockofs);
_seekfile(iso->multih[i].handle, ofs, SEEK_SET);
ret = _readfile(iso->multih[i].handle, dst + iso->blockofs, iso->blocksize);
if (ret < iso->blocksize)
{
if (ret < iso->blocksize) {
printf("read error %d\n", ret);
return -1;
}
@ -875,8 +862,7 @@ int isoReadBlock(isoFile *iso, u8 *dst, int lsn)
{
int ret;
if (lsn > iso->blocks)
{
if (lsn > iso->blocks) {
printf("isoReadBlock: %d > %d\n", lsn, iso->blocks);
return -1;
}
@ -894,10 +880,10 @@ int isoReadBlock(isoFile *iso, u8 *dst, int lsn)
else
ret = _isoReadBlock(iso, dst, lsn);
if (ret == -1) return ret;
if (ret == -1)
return ret;
if (iso->type == ISOTYPE_CD)
{
if (iso->type == ISOTYPE_CD) {
LSNtoMSF(dst + 12, lsn);
dst[15] = 2;
}
@ -911,11 +897,12 @@ int _isoWriteBlock(isoFile *iso, u8 *src, int lsn)
u64 ofs = (u64)lsn * iso->blocksize + iso->offset;
int ret;
// printf("_isoWriteBlock %d (ofs=%d)\n", iso->blocksize, ofs);
// printf("_isoWriteBlock %d (ofs=%d)\n", iso->blocksize, ofs);
_seekfile(iso->handle, ofs, SEEK_SET);
ret = _writefile(iso->handle, src + iso->blockofs, iso->blocksize);
// printf("_isoWriteBlock %d\n", ret);
if (ret < iso->blocksize) return -1;
// printf("_isoWriteBlock %d\n", ret);
if (ret < iso->blocksize)
return -1;
return 0;
}
@ -927,21 +914,22 @@ int _isoWriteBlockZ(isoFile *iso, u8 *src, int lsn)
u8 Zbuf[CD_FRAMESIZE_RAW];
int ret;
// printf("_isoWriteBlockZ %d\n", iso->blocksize);
// printf("_isoWriteBlockZ %d\n", iso->blocksize);
size = 2352;
compress(Zbuf, &size, src, 2352);
// printf("_isoWriteBlockZ %d\n", size);
// printf("_isoWriteBlockZ %d\n", size);
pos = (u32)_tellfile(iso->handle);
ret = _writefile(iso->htable, &pos, 4);
if (ret < 4) return -1;
if (ret < 4)
return -1;
ret = _writefile(iso->htable, &size, 2);
if (ret < 2) return -1;
if (ret < 2)
return -1;
ret = _writefile(iso->handle, Zbuf, size);
// printf("_isoWriteBlockZ %d\n", ret);
if (ret < size)
{
// printf("_isoWriteBlockZ %d\n", ret);
if (ret < size) {
printf("error writing block!!\n");
return -1;
}
@ -952,20 +940,20 @@ int _isoWriteBlockZ(isoFile *iso, u8 *src, int lsn)
int _isoWriteBlockZ2(isoFile *iso, u8 *src, int lsn)
{
uLongf size;
u8 Zbuf[1024*16];
u8 Zbuf[1024 * 16];
int ret;
// printf("_isoWriteBlockZ %d\n", iso->blocksize);
// printf("_isoWriteBlockZ %d\n", iso->blocksize);
size = 1024 * 16;
compress(Zbuf, &size, src + iso->blockofs, iso->blocksize);
// printf("_isoWriteBlockZ %d\n", size);
// printf("_isoWriteBlockZ %d\n", size);
ret = _writefile(iso->htable, (u8*) & size, 4);
if (ret < 4) return -1;
ret = _writefile(iso->htable, (u8 *)&size, 4);
if (ret < 4)
return -1;
ret = _writefile(iso->handle, Zbuf, size);
// printf("_isoWriteBlockZ %d\n", ret);
if (ret < size)
{
// printf("_isoWriteBlockZ %d\n", ret);
if (ret < size) {
printf("error writing block!!\n");
return -1;
}
@ -977,12 +965,14 @@ int _isoWriteBlockD(isoFile *iso, u8 *src, int lsn)
{
int ret;
// printf("_isoWriteBlock %d (ofs=%d)\n", iso->blocksize, ofs);
// printf("_isoWriteBlock %d (ofs=%d)\n", iso->blocksize, ofs);
ret = _writefile(iso->handle, &lsn, 4);
if (ret < 4) return -1;
if (ret < 4)
return -1;
ret = _writefile(iso->handle, src + iso->blockofs, iso->blocksize);
// printf("_isoWriteBlock %d\n", ret);
if (ret < iso->blocksize) return -1;
// printf("_isoWriteBlock %d\n", ret);
if (ret < iso->blocksize)
return -1;
return 0;
}
@ -990,40 +980,37 @@ int _isoWriteBlockD(isoFile *iso, u8 *src, int lsn)
int _isoWriteBlockBZ2(isoFile *iso, u8 *src, int lsn)
{
u32 size;
u8 Zbuf[64*1024];
u8 Zbuf[64 * 1024];
int blocks;
int ret;
memcpy(iso->buffer + (iso->blocksize*(lsn&0xf)), src + iso->blockofs, iso->blocksize);
memcpy(iso->buffer + (iso->blocksize * (lsn & 0xf)), src + iso->blockofs, iso->blocksize);
if (lsn == (iso->blocks - 1))
{
if (lsn == (iso->blocks - 1)) {
blocks = (lsn & 0xf) + 1;
}
else
{
} else {
blocks = 16;
if ((lsn & 0xf) != 0xf) return 0;
if ((lsn & 0xf) != 0xf)
return 0;
}
// printf("_isoWriteBlockBZ2 %d\n", iso->blocksize);
// printf("_isoWriteBlockBZ2 %d\n", iso->blocksize);
size = 64 * 1024;
ret = BZ2_bzBuffToBuffCompress((s8*)Zbuf, (u32*) & size, (s8*)iso->buffer, iso->blocksize * blocks, 9, 0, 30);
ret = BZ2_bzBuffToBuffCompress((s8 *)Zbuf, (u32 *)&size, (s8 *)iso->buffer, iso->blocksize * blocks, 9, 0, 30);
if (ret != BZ_OK)
{
if (ret != BZ_OK) {
printf("error on BZ2: %d\n", ret);
}
// printf("_isoWriteBlockBZ2 %d\n", size);
// printf("_isoWriteBlockBZ2 %d\n", size);
ret = _writefile(iso->htable, (u8*) & size, 4);
if (ret < 4) return -1;
ret = _writefile(iso->htable, (u8 *)&size, 4);
if (ret < 4)
return -1;
ret = _writefile(iso->handle, Zbuf, size);
// printf("_isoWriteBlockZ %d\n", ret);
// printf("_isoWriteBlockZ %d\n", ret);
if (ret < size)
{
if (ret < size) {
printf("error writing block!!\n");
return -1;
}
@ -1046,15 +1033,19 @@ int isoWriteBlock(isoFile *iso, u8 *src, int lsn)
else
ret = _isoWriteBlock(iso, src, lsn);
if (ret == -1) return ret;
if (ret == -1)
return ret;
return 0;
}
void isoClose(isoFile *iso)
{
if (iso->handle) _closefile(iso->handle);
if (iso->htable) _closefile(iso->htable);
if (iso->buffer) free(iso->buffer);
if (iso->handle)
_closefile(iso->handle);
if (iso->htable)
_closefile(iso->htable);
if (iso->buffer)
free(iso->buffer);
free(iso);
}

View File

@ -2,7 +2,7 @@
#define __LIBISO_H__
#ifdef _MSC_VER
#pragma warning(disable:4018)
#pragma warning(disable : 4018)
#endif
#define ISOTYPE_ILLEGAL 0
@ -17,10 +17,10 @@
#define ISOFLAGS_BZ2 0x0010
#define CD_FRAMESIZE_RAW 2352
#define DATA_SIZE (CD_FRAMESIZE_RAW-12)
#define DATA_SIZE (CD_FRAMESIZE_RAW - 12)
#define itob(i) ((i)/10*16 + (i)%10) /* u_char to BCD */
#define btoi(b) ((b)/16*10 + (b)%16) /* BCD to u_char */
#define itob(i) ((i) / 10 * 16 + (i) % 10) /* u_char to BCD */
#define btoi(b) ((b) / 16 * 10 + (b) % 16) /* BCD to u_char */
typedef struct
{

View File

@ -29,23 +29,19 @@ void Compress(char *filename, int mode)
{
struct stat buf;
u32 lsn;
u8 cdbuff[1024*16];
u8 cdbuff[1024 * 16];
char Zfile[256];
int ret = 0;
isoFile *src;
isoFile *dst;
if (mode == 1)
{
if (mode == 1) {
sprintf(Zfile, "%s.Z2", filename);
}
else
{
} else {
sprintf(Zfile, "%s.BZ2", filename);
}
if (stat(Zfile, &buf) != -1)
{
if (stat(Zfile, &buf) != -1) {
printf("'%s' already exists\n", Zfile);
return;
/* sprintf(str, "'%s' already exists, overwrite?", Zfile);
@ -56,38 +52,35 @@ void Compress(char *filename, int mode)
printf("src %s; dst %s\n", filename, Zfile);
src = isoOpen(filename);
if (src == NULL) return;
if (src == NULL)
return;
if (mode == 1)
{
if (mode == 1) {
dst = isoCreate(Zfile, ISOFLAGS_Z2);
}
else
{
} else {
dst = isoCreate(Zfile, ISOFLAGS_BZ2);
}
isoSetFormat(dst, src->blockofs, src->blocksize, src->blocks);
if (dst == NULL) return;
if (dst == NULL)
return;
for (lsn = 0; lsn < src->blocks; lsn++)
{
for (lsn = 0; lsn < src->blocks; lsn++) {
printf("block %d ", lsn);
putchar(13);
fflush(stdout);
ret = isoReadBlock(src, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
ret = isoWriteBlock(dst, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
}
isoClose(src);
isoClose(dst);
if (ret == -1)
{
if (ret == -1) {
printf("Error compressing iso image\n");
}
else
{
} else {
printf("Iso image compressed OK\n");
}
}
@ -96,14 +89,15 @@ void Decompress(char *filename)
{
struct stat buf;
char file[256];
u8 cdbuff[10*2352];
u8 cdbuff[10 * 2352];
u32 lsn;
isoFile *src;
isoFile *dst;
int ret = 0;
src = isoOpen(filename);
if (src == NULL) return;
if (src == NULL)
return;
strcpy(file, filename);
if (src->flags & ISOFLAGS_Z)
@ -112,14 +106,12 @@ void Decompress(char *filename)
file[strlen(file) - 3] = 0;
else if (src->flags & ISOFLAGS_BZ2)
file[strlen(file) - 3] = 0;
else
{
else {
printf("%s is not a compressed image\n", filename);
return;
}
if (stat(file, &buf) != -1)
{
if (stat(file, &buf) != -1) {
char str[256];
sprintf(str, "'%s' already exists", file);
isoClose(src);
@ -127,18 +119,20 @@ void Decompress(char *filename)
}
dst = isoCreate(file, 0);
if (dst == NULL) return;
if (dst == NULL)
return;
isoSetFormat(dst, src->blockofs, src->blocksize, src->blocks);
for (lsn = 0; lsn < src->blocks; lsn++)
{
for (lsn = 0; lsn < src->blocks; lsn++) {
printf("block %d ", lsn);
putchar(13);
fflush(stdout);
ret = isoReadBlock(src, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
ret = isoWriteBlock(dst, cdbuff, lsn);
if (ret == -1) break;
if (ret == -1)
break;
}
isoClose(src);

View File

@ -27,7 +27,7 @@ const unsigned char version = PS2E_CDVD_VERSION;
const unsigned char revision = 0;
const unsigned char build = 6;
EXPORT_C_(char*)
EXPORT_C_(char *)
PS2EgetLibName()
{
snprintf(libraryName, 255, "CDVDnull Driver %lld%s", SVN_REV, SVN_MODS ? "m" : "");
@ -53,7 +53,7 @@ CDVDinit()
}
EXPORT_C_(s32)
CDVDopen(const char* pTitle)
CDVDopen(const char *pTitle)
{
return 0;
}
@ -75,32 +75,32 @@ CDVDreadTrack(u32 lsn, int mode)
}
// return can be NULL (for async modes)
EXPORT_C_(u8*)
EXPORT_C_(u8 *)
CDVDgetBuffer()
{
return NULL;
}
EXPORT_C_(s32)
CDVDreadSubQ(u32 lsn, cdvdSubQ* subq)
CDVDreadSubQ(u32 lsn, cdvdSubQ *subq)
{
return -1;
}
EXPORT_C_(s32)
CDVDgetTN(cdvdTN* Buffer)
CDVDgetTN(cdvdTN *Buffer)
{
return -1;
}
EXPORT_C_(s32)
CDVDgetTD(u8 Track, cdvdTD* Buffer)
CDVDgetTD(u8 Track, cdvdTD *Buffer)
{
return -1;
}
EXPORT_C_(s32)
CDVDgetTOC(void* toc)
CDVDgetTOC(void *toc)
{
return -1;
}

View File

@ -38,5 +38,5 @@ extern const unsigned char revision;
extern const unsigned char build;
extern const unsigned int minor;
extern void SysMessage(const char* fmt, ...);
extern void SysMessage(const char *fmt, ...);
#endif /* __CDVD_H__ */

View File

@ -15,7 +15,7 @@
void SaveConf();
void LoadConf();
void SysMessage(const char* fmt, ...);
void SysMessage(const char *fmt, ...);
#define is_checked(main_widget, widget_name) (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name))))
#define set_checked(main_widget, widget_name, state) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name)), state)

View File

@ -36,7 +36,7 @@ string s_strIniPath = "inis";
string s_strLogPath = "logs";
u8 phyregs[16];
s8* fwregs;
s8 *fwregs;
Config conf;
PluginLog FWLog;
@ -50,7 +50,7 @@ void LogInit()
}
EXPORT_C_(void)
FWsetLogDir(const char* dir)
FWsetLogDir(const char *dir)
{
// Get the path to the log directory.
s_strLogPath = (dir == NULL) ? "logs" : dir;
@ -66,7 +66,7 @@ PS2EgetLibType()
return PS2E_LT_FW;
}
EXPORT_C_(char*)
EXPORT_C_(char *)
PS2EgetLibName()
{
snprintf(libraryName, 255, "FWnull Driver %lld%s", SVN_REV, SVN_MODS ? "m" : "");
@ -89,7 +89,7 @@ FWinit()
memset(phyregs, 0, sizeof(phyregs));
// Initializing our registers.
fwregs = (s8*)calloc(0x10000, 1);
fwregs = (s8 *)calloc(0x10000, 1);
if (fwregs == NULL) {
FWLog.Message("Error allocating Memory");
return -1;
@ -108,7 +108,7 @@ FWshutdown()
}
EXPORT_C_(s32)
FWopen(void* pDsp)
FWopen(void *pDsp)
{
FWLog.WriteLn("Opening FWnull.");
@ -278,14 +278,14 @@ FWirqCallback(void (*callback)())
}
EXPORT_C_(void)
FWsetSettingsDir(const char* dir)
FWsetSettingsDir(const char *dir)
{
// Find out from pcsx2 where we are supposed to put our ini file.
s_strIniPath = (dir == NULL) ? "inis" : dir;
}
EXPORT_C_(s32)
FWfreeze(int mode, freezeData* data)
FWfreeze(int mode, freezeData *data)
{
// This should store or retrieve any information, for if emulation
// gets suspended, or for savestates.

View File

@ -23,9 +23,9 @@
#include "PS2Eext.h"
// Our main memory storage, and defines for accessing it.
extern s8* fwregs;
#define fwRs32(mem) (*(s32*)&fwregs[(mem)&0xffff])
#define fwRu32(mem) (*(u32*)&fwregs[(mem)&0xffff])
extern s8 *fwregs;
#define fwRs32(mem) (*(s32 *)&fwregs[(mem)&0xffff])
#define fwRu32(mem) (*(u32 *)&fwregs[(mem)&0xffff])
//PHY Access Address for ease of use :P
#define PHYACC fwRu32(0x8414)

View File

@ -21,8 +21,8 @@ extern HINSTANCE hInst;
void SaveConfig()
{
Config* Conf1 = &conf;
char* szTemp;
Config *Conf1 = &conf;
char *szTemp;
char szIniFile[256], szValue[256];
GetModuleFileName(GetModuleHandle((LPCSTR)hInst), szIniFile, 256);
@ -37,11 +37,11 @@ void SaveConfig()
void LoadConfig()
{
FILE* fp;
FILE *fp;
Config* Conf1 = &conf;
char* szTemp;
Config *Conf1 = &conf;
char *szTemp;
char szIniFile[256], szValue[256];
GetModuleFileName(GetModuleHandle((LPCSTR)hInst), szIniFile, 256);

View File

@ -23,7 +23,7 @@
HINSTANCE hInst;
void SysMessage(char* fmt, ...)
void SysMessage(char *fmt, ...)
{
va_list list;
char tmp[512];

View File

@ -42,7 +42,7 @@ bool GSShift = false, GSAlt = false;
string s_strIniPath = "inis";
extern std::string s_strLogPath;
const char* s_iniFilename = "GSnull.ini";
const char *s_iniFilename = "GSnull.ini";
GSVars gs;
// Because I haven't bothered to get GSOpen2 working in Windows yet in GSNull.
@ -62,7 +62,7 @@ PS2EgetLibType()
return PS2E_LT_GS;
}
EXPORT_C_(char*)
EXPORT_C_(char *)
PS2EgetLibName()
{
#ifdef _MSC_VER
@ -80,7 +80,7 @@ PS2EgetLibVersion2(u32 type)
}
EXPORT_C_(void)
GSprintf(int timeout, char* fmt, ...)
GSprintf(int timeout, char *fmt, ...)
{
va_list list;
char msg[512];
@ -94,13 +94,13 @@ GSprintf(int timeout, char* fmt, ...)
// basic funcs
EXPORT_C_(void)
GSsetSettingsDir(const char* dir)
GSsetSettingsDir(const char *dir)
{
s_strIniPath = (dir == NULL) ? "inis" : dir;
}
EXPORT_C_(void)
GSsetLogDir(const char* dir)
GSsetLogDir(const char *dir)
{
// Get the path to the log directory.
s_strLogPath = (dir == NULL) ? "logs" : dir;
@ -130,7 +130,7 @@ GSshutdown()
}
EXPORT_C_(s32)
GSopen(void* pDsp, const char* Title, int multithread)
GSopen(void *pDsp, const char *Title, int multithread)
{
int err = 0;
GSLog::WriteLn("GS open.");
@ -148,7 +148,7 @@ GSopen(void* pDsp, const char* Title, int multithread)
#ifdef USE_GSOPEN2
EXPORT_C_(s32)
GSopen2(void* pDsp, u32 flags)
GSopen2(void *pDsp, u32 flags)
{
GSLog::WriteLn("GS open2.");
@ -181,7 +181,7 @@ GSirqCallback(void (*callback)())
}
EXPORT_C_(s32)
GSfreeze(int mode, freezeData* data)
GSfreeze(int mode, freezeData *data)
{
return 0;
}
@ -201,9 +201,9 @@ GSvsync(int field)
// returns the last tag processed (64 bits)
EXPORT_C_(void)
GSgetLastTag(u64* ptag)
GSgetLastTag(u64 *ptag)
{
*(u32*)ptag = gs.nPath3Hack;
*(u32 *)ptag = gs.nPath3Hack;
gs.nPath3Hack = 0;
}
@ -214,12 +214,12 @@ GSgifSoftReset(u32 mask)
}
EXPORT_C_(void)
GSreadFIFO(u64* mem)
GSreadFIFO(u64 *mem)
{
}
EXPORT_C_(void)
GSreadFIFO2(u64* mem, int qwc)
GSreadFIFO2(u64 *mem, int qwc)
{
}
@ -227,31 +227,31 @@ GSreadFIFO2(u64* mem, int qwc)
// GSkeyEvent gets called when there is a keyEvent from the PAD plugin
EXPORT_C_(void)
GSkeyEvent(keyEvent* ev)
GSkeyEvent(keyEvent *ev)
{
HandleKeyEvent(ev);
}
EXPORT_C_(void)
GSchangeSaveState(int, const char* filename)
GSchangeSaveState(int, const char *filename)
{
}
EXPORT_C_(void)
GSmakeSnapshot(char* path)
GSmakeSnapshot(char *path)
{
GSLog::WriteLn("Taking a snapshot.");
}
EXPORT_C_(void)
GSmakeSnapshot2(char* pathname, int* snapdone, int savejpg)
GSmakeSnapshot2(char *pathname, int *snapdone, int savejpg)
{
GSLog::WriteLn("Taking a snapshot to %s.", pathname);
}
EXPORT_C_(void)
GSsetBaseMem(void*)
GSsetBaseMem(void *)
{
}
@ -273,7 +273,7 @@ GSsetFrameSkip(int frameskip)
// returns a non zero value if successful
// for now, pData is not used
EXPORT_C_(int)
GSsetupRecording(int start, void* pData)
GSsetupRecording(int start, void *pData)
{
if (start)
GSLog::WriteLn("Pretending to record.");
@ -295,6 +295,6 @@ GSwriteCSR(u32 value)
}
EXPORT_C_(void)
GSgetDriverInfo(GSdriverInfo* info)
GSgetDriverInfo(GSdriverInfo *info)
{
}

View File

@ -81,10 +81,10 @@ namespace GSLog
{
extern bool Open();
extern void Close();
extern void Log(char* fmt, ...);
extern void Message(char* fmt, ...);
extern void Print(const char* fmt, ...);
extern void WriteLn(const char* fmt, ...);
extern void Log(char *fmt, ...);
extern void Message(char *fmt, ...);
extern void Print(const char *fmt, ...);
extern void WriteLn(const char *fmt, ...);
};
extern void SaveConfig();

View File

@ -32,7 +32,7 @@ std::string s_strLogPath("logs");
namespace GSLog
{
FILE* gsLog;
FILE *gsLog;
bool Open()
{
@ -63,7 +63,7 @@ void Close()
}
}
void Log(char* fmt, ...)
void Log(char *fmt, ...)
{
va_list list;
@ -75,7 +75,7 @@ void Log(char* fmt, ...)
va_end(list);
}
void Message(char* fmt, ...)
void Message(char *fmt, ...)
{
va_list list;
char msg[512];
@ -87,7 +87,7 @@ void Message(char* fmt, ...)
SysMessage("%s\n", msg);
}
void Print(const char* fmt, ...)
void Print(const char *fmt, ...)
{
va_list list;
char msg[512];
@ -101,7 +101,7 @@ void Print(const char* fmt, ...)
}
void WriteLn(const char* fmt, ...)
void WriteLn(const char *fmt, ...)
{
va_list list;
char msg[512];

View File

@ -29,11 +29,11 @@ extern GSVars gs;
PCSX2_ALIGNED16(u8 g_RealGSMem[0x2000]);
template <int index>
void _GSgifTransfer(const u32* pMem, u32 size)
void _GSgifTransfer(const u32 *pMem, u32 size)
{
// FUNCLOG
pathInfo* path = &gs.path[index];
pathInfo *path = &gs.path[index];
while (size > 0) {
//GSLog::Writeln(_T("Transfer(%08x, %d) START\n"), pMem, size);
@ -49,7 +49,7 @@ void _GSgifTransfer(const u32* pMem, u32 size)
if (path->tag.PRE && (path->tag.FLG == GIF_FLG_PACKED)) {
u32 tagprim = path->tag.PRIM;
GIFRegHandlerPRIM((u32*)&tagprim);
GIFRegHandlerPRIM((u32 *)&tagprim);
}
}
} else {
@ -150,34 +150,34 @@ void _GSgifTransfer(const u32* pMem, u32 size)
// Obsolete. Included because it's still in GSdef.
EXPORT_C_(void)
GSgifTransfer1(u32* pMem, u32 addr)
GSgifTransfer1(u32 *pMem, u32 addr)
{
#ifdef DO_GIF_TRANSFERS
_GSgifTransfer<0>((u32*)((u8*)pMem + addr), (0x4000 - addr) / 16);
_GSgifTransfer<0>((u32 *)((u8 *)pMem + addr), (0x4000 - addr) / 16);
#endif
}
EXPORT_C_(void)
GSgifTransfer(const u32* pMem, u32 size)
GSgifTransfer(const u32 *pMem, u32 size)
{
#ifdef DO_GIF_TRANSFERS
_GSgifTransfer<3>(const_cast<u32*>(pMem), size);
_GSgifTransfer<3>(const_cast<u32 *>(pMem), size);
#endif
}
EXPORT_C_(void)
GSgifTransfer2(u32* pMem, u32 size)
GSgifTransfer2(u32 *pMem, u32 size)
{
#ifdef DO_GIF_TRANSFERS
_GSgifTransfer<1>(const_cast<u32*>(pMem), size);
_GSgifTransfer<1>(const_cast<u32 *>(pMem), size);
#endif
}
EXPORT_C_(void)
GSgifTransfer3(u32* pMem, u32 size)
GSgifTransfer3(u32 *pMem, u32 size)
{
#ifdef DO_GIF_TRANSFERS
_GSgifTransfer<2>(const_cast<u32*>(pMem), size);
_GSgifTransfer<2>(const_cast<u32 *>(pMem), size);
#endif
}

View File

@ -47,14 +47,14 @@ union GIFTag
u64 REGS : 64;
};
void set(const u32* data)
void set(const u32 *data)
{
for (int i = 0; i <= 3; i++) {
ai32[i] = data[i];
}
}
GIFTag(u32* data)
GIFTag(u32 *data)
{
set(data);
}
@ -79,7 +79,7 @@ typedef struct
u32 adonly;
GIFTag tag;
void setTag(const u32* data)
void setTag(const u32 *data)
{
tag.set(data);
@ -123,10 +123,10 @@ typedef struct
} pathInfo;
extern void _GSgifPacket(pathInfo* path, const u32* pMem);
extern void _GSgifRegList(pathInfo* path, const u32* pMem);
extern void _GSgifPacket(pathInfo *path, const u32 *pMem);
extern void _GSgifRegList(pathInfo *path, const u32 *pMem);
template <int index>
extern void _GSgifTransfer(const u32* pMem, u32 size);
extern void _GSgifTransfer(const u32 *pMem, u32 size);
extern GIFRegHandler GIFPackedRegHandlers[];
extern GIFRegHandler GIFRegHandlers[];
#endif // GIFTRANSFER_H_INCLUDED

View File

@ -19,6 +19,6 @@
void SaveConf();
void LoadConf();
extern long CFGmessage(char* msg);
extern long CFGmessage(char *msg);
extern void CFGconfigure();
extern void CFGabout();

View File

@ -16,28 +16,28 @@
#include "GS.h"
#include "GSLinux.h"
Display* display;
Display *display;
int screen;
GtkScrolledWindow* win;
GtkScrolledWindow *win;
int GSOpenWindow(void* pDsp, const char* Title)
int GSOpenWindow(void *pDsp, const char *Title)
{
display = XOpenDisplay(0);
screen = DefaultScreen(display);
if (pDsp != NULL)
*(Display**)pDsp = display;
*(Display **)pDsp = display;
else
return -1;
return 0;
}
int GSOpenWindow2(void* pDsp, u32 flags)
int GSOpenWindow2(void *pDsp, u32 flags)
{
GtkWidget* widget;
GtkWidget *widget;
if (pDsp != NULL)
win = *(GtkScrolledWindow**)pDsp;
win = *(GtkScrolledWindow **)pDsp;
else
return -1;
@ -75,7 +75,7 @@ void GSProcessMessages()
}
void HandleKeyEvent(keyEvent* ev)
void HandleKeyEvent(keyEvent *ev)
{
switch (ev->evt) {
case KEYPRESS:

View File

@ -20,10 +20,10 @@
#include <X11/Xlib.h>
#include <X11/keysym.h>
extern int GSOpenWindow(void* pDsp, const char* Title);
extern int GSOpenWindow2(void* pDsp, u32 flags);
extern int GSOpenWindow(void *pDsp, const char *Title);
extern int GSOpenWindow2(void *pDsp, u32 flags);
extern void GSCloseWindow();
extern void GSProcessMessages();
extern void HandleKeyEvent(keyEvent* ev);
extern void HandleKeyEvent(keyEvent *ev);
#endif

View File

@ -25,35 +25,35 @@ GIFRegHandler GIFRegHandlers[256];
// For now, I'm just rigging this up to store all the register information coming in, without doing
// any of the normal processing.
void __gifCall GIFPackedRegHandlerNull(const u32* data)
void __gifCall GIFPackedRegHandlerNull(const u32 *data)
{
}
// All these just call their non-packed equivalent.
void __gifCall GIFPackedRegHandlerPRIM(const u32* data) { GIFRegHandlerPRIM(data); }
void __gifCall GIFPackedRegHandlerPRIM(const u32 *data) { GIFRegHandlerPRIM(data); }
template <u32 i>
void __gifCall GIFPackedRegHandlerTEX0(const u32* data)
void __gifCall GIFPackedRegHandlerTEX0(const u32 *data)
{
GIFRegHandlerTEX0<i>(data);
}
template <u32 i>
void __gifCall GIFPackedRegHandlerCLAMP(const u32* data)
void __gifCall GIFPackedRegHandlerCLAMP(const u32 *data)
{
GIFRegHandlerCLAMP<i>(data);
}
void __gifCall GIFPackedRegHandlerTEX0_1(const u32* data) { GIFRegHandlerTEX0<0>(data); }
void __gifCall GIFPackedRegHandlerTEX0_2(const u32* data) { GIFRegHandlerTEX0<1>(data); }
void __gifCall GIFPackedRegHandlerCLAMP_1(const u32* data) { GIFRegHandlerCLAMP<0>(data); }
void __gifCall GIFPackedRegHandlerCLAMP_2(const u32* data) { GIFRegHandlerCLAMP<1>(data); }
void __gifCall GIFPackedRegHandlerXYZF3(const u32* data) { GIFRegHandlerXYZF3(data); }
void __gifCall GIFPackedRegHandlerXYZ3(const u32* data) { GIFRegHandlerXYZ3(data); }
void __gifCall GIFPackedRegHandlerTEX0_1(const u32 *data) { GIFRegHandlerTEX0<0>(data); }
void __gifCall GIFPackedRegHandlerTEX0_2(const u32 *data) { GIFRegHandlerTEX0<1>(data); }
void __gifCall GIFPackedRegHandlerCLAMP_1(const u32 *data) { GIFRegHandlerCLAMP<0>(data); }
void __gifCall GIFPackedRegHandlerCLAMP_2(const u32 *data) { GIFRegHandlerCLAMP<1>(data); }
void __gifCall GIFPackedRegHandlerXYZF3(const u32 *data) { GIFRegHandlerXYZF3(data); }
void __gifCall GIFPackedRegHandlerXYZ3(const u32 *data) { GIFRegHandlerXYZ3(data); }
void __gifCall GIFPackedRegHandlerRGBA(const u32* data)
void __gifCall GIFPackedRegHandlerRGBA(const u32 *data)
{
GIFPackedRGBA* r = (GIFPackedRGBA*)(data);
GIFPackedRGBA *r = (GIFPackedRGBA *)(data);
gs.regs.RGBAQ.R = r->R;
gs.regs.RGBAQ.G = r->G;
gs.regs.RGBAQ.B = r->B;
@ -61,17 +61,17 @@ void __gifCall GIFPackedRegHandlerRGBA(const u32* data)
gs.regs.RGBAQ.Q = gs.q;
}
void __gifCall GIFPackedRegHandlerSTQ(const u32* data)
void __gifCall GIFPackedRegHandlerSTQ(const u32 *data)
{
GIFPackedSTQ* r = (GIFPackedSTQ*)(data);
GIFPackedSTQ *r = (GIFPackedSTQ *)(data);
gs.regs.ST.S = r->S;
gs.regs.ST.T = r->T;
gs.q = r->Q;
}
void __gifCall GIFPackedRegHandlerUV(const u32* data)
void __gifCall GIFPackedRegHandlerUV(const u32 *data)
{
GIFPackedUV* r = (GIFPackedUV*)(data);
GIFPackedUV *r = (GIFPackedUV *)(data);
gs.regs.UV.U = r->U;
gs.regs.UV.V = r->V;
}
@ -80,309 +80,309 @@ void __gifCall KickVertex(bool adc)
{
}
void __gifCall GIFPackedRegHandlerXYZF2(const u32* data)
void __gifCall GIFPackedRegHandlerXYZF2(const u32 *data)
{
GIFPackedXYZF2* r = (GIFPackedXYZF2*)(data);
GIFPackedXYZF2 *r = (GIFPackedXYZF2 *)(data);
gs.regs.XYZ.X = r->X;
gs.regs.XYZ.Y = r->Y;
gs.regs.XYZ.Z = r->Z;
gs.regs.FOG.F = r->F;
}
void __gifCall GIFPackedRegHandlerXYZ2(const u32* data)
void __gifCall GIFPackedRegHandlerXYZ2(const u32 *data)
{
GIFPackedXYZ2* r = (GIFPackedXYZ2*)(data);
GIFPackedXYZ2 *r = (GIFPackedXYZ2 *)(data);
gs.regs.XYZ.X = r->X;
gs.regs.XYZ.Y = r->Y;
gs.regs.XYZ.Z = r->Z;
}
void __gifCall GIFPackedRegHandlerFOG(const u32* data)
void __gifCall GIFPackedRegHandlerFOG(const u32 *data)
{
GIFPackedFOG* r = (GIFPackedFOG*)(data);
GIFPackedFOG *r = (GIFPackedFOG *)(data);
gs.regs.FOG.F = r->F;
}
void __gifCall GIFPackedRegHandlerA_D(const u32* data)
void __gifCall GIFPackedRegHandlerA_D(const u32 *data)
{
GIFPackedA_D* r = (GIFPackedA_D*)(data);
GIFPackedA_D *r = (GIFPackedA_D *)(data);
GIFRegHandlers[r->ADDR](data);
}
void __gifCall GIFPackedRegHandlerNOP(const u32* data)
void __gifCall GIFPackedRegHandlerNOP(const u32 *data)
{
}
void __gifCall GIFRegHandlerNull(const u32* data)
void __gifCall GIFRegHandlerNull(const u32 *data)
{
}
void __gifCall GIFRegHandlerRGBAQ(const u32* data)
void __gifCall GIFRegHandlerRGBAQ(const u32 *data)
{
GIFRegRGBAQ* r = (GIFRegRGBAQ*)(data);
GIFRegRGBAQ *r = (GIFRegRGBAQ *)(data);
gs.regs.RGBAQ._u64 = r->_u64;
}
void __gifCall GIFRegHandlerST(const u32* data)
void __gifCall GIFRegHandlerST(const u32 *data)
{
GIFRegST* r = (GIFRegST*)(data);
GIFRegST *r = (GIFRegST *)(data);
gs.regs.ST._u64 = r->_u64;
}
void __gifCall GIFRegHandlerUV(const u32* data)
void __gifCall GIFRegHandlerUV(const u32 *data)
{
GIFRegUV* r = (GIFRegUV*)(data);
GIFRegUV *r = (GIFRegUV *)(data);
gs.regs.UV._u64 = r->_u64;
}
void __gifCall GIFRegHandlerXYZF2(const u32* data)
void __gifCall GIFRegHandlerXYZF2(const u32 *data)
{
GIFRegXYZF* r = (GIFRegXYZF*)(data);
GIFRegXYZF *r = (GIFRegXYZF *)(data);
gs.regs.XYZF._u64 = r->_u64;
}
void __gifCall GIFRegHandlerXYZ2(const u32* data)
void __gifCall GIFRegHandlerXYZ2(const u32 *data)
{
GIFRegXYZ* r = (GIFRegXYZ*)(data);
GIFRegXYZ *r = (GIFRegXYZ *)(data);
gs.regs.XYZ._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerTEX0(const u32* data)
void __gifCall GIFRegHandlerTEX0(const u32 *data)
{
GIFRegTEX0* r = (GIFRegTEX0*)(data);
GIFRegTEX0 *r = (GIFRegTEX0 *)(data);
gs.ctxt_regs[i].TEX0._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerCLAMP(const u32* data)
void __gifCall GIFRegHandlerCLAMP(const u32 *data)
{
GIFRegCLAMP* r = (GIFRegCLAMP*)(data);
GIFRegCLAMP *r = (GIFRegCLAMP *)(data);
gs.ctxt_regs[i].CLAMP._u64 = r->_u64;
}
void __gifCall GIFRegHandlerFOG(const u32* data)
void __gifCall GIFRegHandlerFOG(const u32 *data)
{
GIFRegFOG* r = (GIFRegFOG*)(data);
GIFRegFOG *r = (GIFRegFOG *)(data);
gs.regs.FOG.F = r->F;
}
void __gifCall GIFRegHandlerXYZF3(const u32* data)
void __gifCall GIFRegHandlerXYZF3(const u32 *data)
{
GIFRegXYZF* r = (GIFRegXYZF*)(data);
GIFRegXYZF *r = (GIFRegXYZF *)(data);
gs.regs.XYZF._u64 = r->_u64;
}
void __gifCall GIFRegHandlerXYZ3(const u32* data)
void __gifCall GIFRegHandlerXYZ3(const u32 *data)
{
GIFRegXYZ* r = (GIFRegXYZ*)(data);
GIFRegXYZ *r = (GIFRegXYZ *)(data);
gs.regs.XYZ._u64 = r->_u64;
}
void __gifCall GIFRegHandlerNOP(const u32* data)
void __gifCall GIFRegHandlerNOP(const u32 *data)
{
}
template <u32 i>
void __fastcall GIFRegHandlerTEX1(const u32* data)
void __fastcall GIFRegHandlerTEX1(const u32 *data)
{
GIFRegTEX1* r = (GIFRegTEX1*)(data);
GIFRegTEX1 *r = (GIFRegTEX1 *)(data);
gs.ctxt_regs[i].TEX1._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerTEX2(const u32* data)
void __gifCall GIFRegHandlerTEX2(const u32 *data)
{
GIFRegTEX2* r = (GIFRegTEX2*)(data);
GIFRegTEX2 *r = (GIFRegTEX2 *)(data);
gs.ctxt_regs[i].TEX2._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerXYOFFSET(const u32* data)
void __gifCall GIFRegHandlerXYOFFSET(const u32 *data)
{
GIFRegXYOFFSET* r = (GIFRegXYOFFSET*)(data);
GIFRegXYOFFSET *r = (GIFRegXYOFFSET *)(data);
gs.ctxt_regs[i].XYOFFSET.OFX = r->OFX;
gs.ctxt_regs[i].XYOFFSET.OFY = r->OFY;
}
// Fill out the vertex queue(prim) and the attributes.
void __gifCall GIFRegHandlerPRIM(const u32* data)
void __gifCall GIFRegHandlerPRIM(const u32 *data)
{
GIFRegPRIM* r = (GIFRegPRIM*)(data);
GIFRegPRIM *r = (GIFRegPRIM *)(data);
gs.regs.PRIM._u64 = r->_u64;
}
// Fill out an alternate set of attributes.
void __gifCall GIFRegHandlerPRMODE(const u32* data)
void __gifCall GIFRegHandlerPRMODE(const u32 *data)
{
GIFRegPRMODE* r = (GIFRegPRMODE*)(data);
GIFRegPRMODE *r = (GIFRegPRMODE *)(data);
gs.regs.PRMODE._u64 = r->_u64;
}
// Switch between the primary set of attributes and the secondary.
void __gifCall GIFRegHandlerPRMODECONT(const u32* data)
void __gifCall GIFRegHandlerPRMODECONT(const u32 *data)
{
GIFRegPRMODECONT* r = (GIFRegPRMODECONT*)(data);
GIFRegPRMODECONT *r = (GIFRegPRMODECONT *)(data);
gs.regs.PRMODECONT._u64 = r->_u64;
}
void __gifCall GIFRegHandlerTEXCLUT(const u32* data)
void __gifCall GIFRegHandlerTEXCLUT(const u32 *data)
{
GIFRegTEXCLUT* r = (GIFRegTEXCLUT*)(data);
GIFRegTEXCLUT *r = (GIFRegTEXCLUT *)(data);
gs.regs.TEXCLUT._u64 = r->_u64;
}
void __gifCall GIFRegHandlerSCANMSK(const u32* data)
void __gifCall GIFRegHandlerSCANMSK(const u32 *data)
{
GIFRegSCANMSK* r = (GIFRegSCANMSK*)(data);
GIFRegSCANMSK *r = (GIFRegSCANMSK *)(data);
gs.regs.SCANMSK._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerMIPTBP1(const u32* data)
void __gifCall GIFRegHandlerMIPTBP1(const u32 *data)
{
GIFRegMIPTBP1* r = (GIFRegMIPTBP1*)(data);
GIFRegMIPTBP1 *r = (GIFRegMIPTBP1 *)(data);
gs.ctxt_regs[i].MIPTBP1._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerMIPTBP2(const u32* data)
void __gifCall GIFRegHandlerMIPTBP2(const u32 *data)
{
GIFRegMIPTBP2* r = (GIFRegMIPTBP2*)(data);
GIFRegMIPTBP2 *r = (GIFRegMIPTBP2 *)(data);
gs.ctxt_regs[i].MIPTBP2._u64 = r->_u64;
}
void __gifCall GIFRegHandlerTEXA(const u32* data)
void __gifCall GIFRegHandlerTEXA(const u32 *data)
{
GIFRegTEXA* r = (GIFRegTEXA*)(data);
GIFRegTEXA *r = (GIFRegTEXA *)(data);
gs.regs.TEXA._u64 = r->_u64;
}
void __gifCall GIFRegHandlerFOGCOL(const u32* data)
void __gifCall GIFRegHandlerFOGCOL(const u32 *data)
{
GIFRegFOGCOL* r = (GIFRegFOGCOL*)(data);
GIFRegFOGCOL *r = (GIFRegFOGCOL *)(data);
gs.regs.FOGCOL._u64 = r->_u64;
}
void __gifCall GIFRegHandlerTEXFLUSH(const u32* data)
void __gifCall GIFRegHandlerTEXFLUSH(const u32 *data)
{
GIFRegTEXFLUSH* r = (GIFRegTEXFLUSH*)(data);
GIFRegTEXFLUSH *r = (GIFRegTEXFLUSH *)(data);
gs.regs.TEXFLUSH._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerSCISSOR(const u32* data)
void __gifCall GIFRegHandlerSCISSOR(const u32 *data)
{
GIFRegSCISSOR* r = (GIFRegSCISSOR*)(data);
GIFRegSCISSOR *r = (GIFRegSCISSOR *)(data);
gs.ctxt_regs[i].SCISSOR._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerALPHA(const u32* data)
void __gifCall GIFRegHandlerALPHA(const u32 *data)
{
GIFRegALPHA* r = (GIFRegALPHA*)(data);
GIFRegALPHA *r = (GIFRegALPHA *)(data);
gs.ctxt_regs[i].ALPHA._u64 = r->_u64;
}
void __gifCall GIFRegHandlerDIMX(const u32* data)
void __gifCall GIFRegHandlerDIMX(const u32 *data)
{
GIFRegDIMX* r = (GIFRegDIMX*)(data);
GIFRegDIMX *r = (GIFRegDIMX *)(data);
gs.regs.DIMX._u64 = r->_u64;
}
void __gifCall GIFRegHandlerDTHE(const u32* data)
void __gifCall GIFRegHandlerDTHE(const u32 *data)
{
GIFRegDTHE* r = (GIFRegDTHE*)(data);
GIFRegDTHE *r = (GIFRegDTHE *)(data);
gs.regs.DTHE._u64 = r->_u64;
}
void __gifCall GIFRegHandlerCOLCLAMP(const u32* data)
void __gifCall GIFRegHandlerCOLCLAMP(const u32 *data)
{
GIFRegCOLCLAMP* r = (GIFRegCOLCLAMP*)(data);
GIFRegCOLCLAMP *r = (GIFRegCOLCLAMP *)(data);
gs.regs.COLCLAMP._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerTEST(const u32* data)
void __gifCall GIFRegHandlerTEST(const u32 *data)
{
GIFRegTEST* r = (GIFRegTEST*)(data);
GIFRegTEST *r = (GIFRegTEST *)(data);
gs.ctxt_regs[i].TEST._u64 = r->_u64;
}
void __gifCall GIFRegHandlerPABE(const u32* data)
void __gifCall GIFRegHandlerPABE(const u32 *data)
{
GIFRegPABE* r = (GIFRegPABE*)(data);
GIFRegPABE *r = (GIFRegPABE *)(data);
gs.regs.PABE._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerFBA(const u32* data)
void __gifCall GIFRegHandlerFBA(const u32 *data)
{
GIFRegFBA* r = (GIFRegFBA*)(data);
GIFRegFBA *r = (GIFRegFBA *)(data);
gs.ctxt_regs[i].FBA._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerFRAME(const u32* data)
void __gifCall GIFRegHandlerFRAME(const u32 *data)
{
GIFRegFRAME* r = (GIFRegFRAME*)(data);
GIFRegFRAME *r = (GIFRegFRAME *)(data);
gs.ctxt_regs[i].FRAME._u64 = r->_u64;
}
template <u32 i>
void __gifCall GIFRegHandlerZBUF(const u32* data)
void __gifCall GIFRegHandlerZBUF(const u32 *data)
{
GIFRegZBUF* r = (GIFRegZBUF*)(data);
GIFRegZBUF *r = (GIFRegZBUF *)(data);
gs.ctxt_regs[i].ZBUF._u64 = r->_u64;
}
void __gifCall GIFRegHandlerBITBLTBUF(const u32* data)
void __gifCall GIFRegHandlerBITBLTBUF(const u32 *data)
{
GIFRegBITBLTBUF* r = (GIFRegBITBLTBUF*)(data);
GIFRegBITBLTBUF *r = (GIFRegBITBLTBUF *)(data);
gs.regs.BITBLTBUF._u64 = r->_u64;
}
void __gifCall GIFRegHandlerTRXPOS(const u32* data)
void __gifCall GIFRegHandlerTRXPOS(const u32 *data)
{
GIFRegTRXPOS* r = (GIFRegTRXPOS*)(data);
GIFRegTRXPOS *r = (GIFRegTRXPOS *)(data);
gs.regs.TRXPOS._u64 = r->_u64;
}
void __gifCall GIFRegHandlerTRXREG(const u32* data)
void __gifCall GIFRegHandlerTRXREG(const u32 *data)
{
GIFRegTRXREG* r = (GIFRegTRXREG*)(data);
GIFRegTRXREG *r = (GIFRegTRXREG *)(data);
gs.regs.TRXREG._u64 = r->_u64;
}
void __gifCall GIFRegHandlerTRXDIR(const u32* data)
void __gifCall GIFRegHandlerTRXDIR(const u32 *data)
{
GIFRegTRXDIR* r = (GIFRegTRXDIR*)(data);
GIFRegTRXDIR *r = (GIFRegTRXDIR *)(data);
gs.regs.TRXDIR._u64 = r->_u64;
}
void __gifCall GIFRegHandlerHWREG(const u32* data)
void __gifCall GIFRegHandlerHWREG(const u32 *data)
{
GIFRegHWREG* r = (GIFRegHWREG*)(data);
GIFRegHWREG *r = (GIFRegHWREG *)(data);
gs.regs.HWREG._u64 = r->_u64;
}
void __gifCall GIFRegHandlerSIGNAL(const u32* data)
void __gifCall GIFRegHandlerSIGNAL(const u32 *data)
{
GIFRegSIGNAL* r = (GIFRegSIGNAL*)(data);
GIFRegSIGNAL *r = (GIFRegSIGNAL *)(data);
gs.regs.SIGNAL._u64 = r->_u64;
}
void __gifCall GIFRegHandlerFINISH(const u32* data)
void __gifCall GIFRegHandlerFINISH(const u32 *data)
{
GIFRegFINISH* r = (GIFRegFINISH*)(data);
GIFRegFINISH *r = (GIFRegFINISH *)(data);
gs.regs.FINISH._u64 = r->_u64;
}
void __gifCall GIFRegHandlerLABEL(const u32* data)
void __gifCall GIFRegHandlerLABEL(const u32 *data)
{
GIFRegLABEL* r = (GIFRegLABEL*)(data);
GIFRegLABEL *r = (GIFRegLABEL *)(data);
gs.regs.LABEL._u64 = r->_u64;
}

View File

@ -114,8 +114,8 @@ enum GIF_A_D_REG {
// In case we want to change to/from __fastcall for GIF register handlers:
#define __gifCall __fastcall
typedef void __gifCall FnType_GIFRegHandler(const u32* data);
typedef FnType_GIFRegHandler* GIFRegHandler;
typedef void __gifCall FnType_GIFRegHandler(const u32 *data);
typedef FnType_GIFRegHandler *GIFRegHandler;
extern FnType_GIFRegHandler GIFPackedRegHandlerNull;
extern FnType_GIFRegHandler GIFPackedRegHandlerRGBA;

View File

@ -21,8 +21,8 @@ extern HINSTANCE hInst;
void SaveConfig()
{
Config* Conf1 = &conf;
char* szTemp;
Config *Conf1 = &conf;
char *szTemp;
char szIniFile[256], szValue[256];
GetModuleFileName(GetModuleHandle((LPCSTR)hInst), szIniFile, 256);
@ -37,11 +37,11 @@ void SaveConfig()
void LoadConfig()
{
FILE* fp;
FILE *fp;
Config* Conf1 = &conf;
char* szTemp;
Config *Conf1 = &conf;
char *szTemp;
char szIniFile[256], szValue[256];
GetModuleFileName(GetModuleHandle((LPCSTR)hInst), szIniFile, 256);

View File

@ -33,7 +33,7 @@ LRESULT CALLBACK MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return 0;
}
int GSOpenWindow(void* pDsp, const char* Title)
int GSOpenWindow(void *pDsp, const char *Title)
{
WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
@ -49,7 +49,7 @@ int GSOpenWindow(void* pDsp, const char* Title)
}
if (pDsp != NULL)
*(uptr*)pDsp = (uptr)GShwnd;
*(uptr *)pDsp = (uptr)GShwnd;
return 0;
}
@ -64,6 +64,6 @@ void GSProcessMessages()
}
// GSkeyEvent gets called when there is a keyEvent from the PAD plugin
void HandleKeyEvent(keyEvent* ev)
void HandleKeyEvent(keyEvent *ev)
{
}

View File

@ -18,7 +18,7 @@
#include <windows.h>
#include <windowsx.h>
extern int GSOpenWindow(void* pDsp, const char* Title);
extern int GSOpenWindow(void *pDsp, const char *Title);
extern void GSCloseWindow();
extern void GSProcessMessages();
extern void HandleKeyEvent(keyEvent* ev);
extern void HandleKeyEvent(keyEvent *ev);

View File

@ -24,7 +24,7 @@
HINSTANCE hInst;
extern HWND GShwnd;
void SysMessage(char* fmt, ...)
void SysMessage(char *fmt, ...)
{
va_list list;
char tmp[512];

File diff suppressed because it is too large Load Diff

View File

@ -27,15 +27,17 @@ enum PadType {
PopnPad
};
const int numPadTypes= 4;
const int numPadTypes = 4;
extern const wchar_t *padTypes[numPadTypes];
struct PadConfig {
struct PadConfig
{
PadType type;
u8 autoAnalog;
};
struct GeneralConfig {
struct GeneralConfig
{
public:
PadConfig padConfigs[2][4];
@ -47,14 +49,17 @@ public:
// Derived value, calculated by GetInput().
u8 ignoreKeys;
union {
struct {
union
{
struct
{
u8 forceHide;
u8 mouseUnfocus;
u8 background;
u8 multipleBinding;
struct {
struct
{
u8 directInput;
u8 xInput;
u8 dualShock3;
@ -73,8 +78,8 @@ public:
u8 bools[15];
};
wchar_t lastSaveConfigPath[MAX_PATH+1];
wchar_t lastSaveConfigFileName[MAX_PATH+1];
wchar_t lastSaveConfigPath[MAX_PATH + 1];
wchar_t lastSaveConfigFileName[MAX_PATH + 1];
};
extern GeneralConfig config;

View File

@ -33,7 +33,8 @@
#include "Linux/JoyEvdev.h"
#endif
void EnumDevices(int hideDXXinput) {
void EnumDevices(int hideDXXinput)
{
// Needed for enumeration of some device types.
dm->ReleaseInput();
InputDeviceManager *oldDm = dm;

View File

@ -16,4 +16,3 @@
*/
void EnumDevices(int hideDXXinput);

View File

@ -25,14 +25,14 @@
Device *dev;
INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM lParam) {
INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM lParam)
{
int i;
HWND hWndList = GetDlgItem(hWnd, IDC_LIST);
static int fullRefresh;
if (dev) {
switch (uMsg) {
case WM_INITDIALOG:
{
case WM_INITDIALOG: {
fullRefresh = 1;
SetWindowText(hWnd, dev->displayName);
LVCOLUMNW c;
@ -47,16 +47,15 @@ INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM
LVITEM item;
item.mask = LVIF_TEXT;
item.iSubItem = 0;
for (i=0; i<dev->numVirtualControls; i++) {
item.pszText = dev->GetVirtualControlName(dev->virtualControls+i);
for (i = 0; i < dev->numVirtualControls; i++) {
item.pszText = dev->GetVirtualControlName(dev->virtualControls + i);
item.iItem = i;
ListView_InsertItem(hWndList, &item);
}
SetTimer(hWnd, 1, 200, 0);
}
//break;
case WM_TIMER:
{
case WM_TIMER: {
hWndButtonProc.SetWndHandle(hWndList);
InitInfo info = {0, 1, hWnd, &hWndButtonProc};
dm->Update(&info);
@ -67,14 +66,13 @@ INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM
//LockWindowUpdate(hWndList);
if (!dev->active) {
item.pszText = L"?";
for (i=0; i<dev->numVirtualControls; i++) {
for (i = 0; i < dev->numVirtualControls; i++) {
item.iItem = i;
ListView_SetItem(hWndList, &item);
}
fullRefresh = 1;
}
else {
for (i=0; i<dev->numVirtualControls; i++) {
} else {
for (i = 0; i < dev->numVirtualControls; i++) {
if (fullRefresh || dev->virtualControlState[i] != dev->oldVirtualControlState[i]) {
VirtualControl *c = dev->virtualControls + i;
@ -82,18 +80,17 @@ INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM
int val = dev->virtualControlState[i];
if (c->uid & (UID_POV)) {
wsprintfW(temp, L"%i", val);
}
else {
} else {
wchar_t *sign = L"";
if (val < 0) {
sign = L"-";
val = -val;
}
if ((c->uid& UID_AXIS) && val) {
if ((c->uid & UID_AXIS) && val) {
val = val;
}
val = (int)floor(0.5 + val * 1000.0 / (double)FULLY_DOWN);
wsprintfW(temp, L"%s%i.%03i", sign, val/1000, val%1000);
wsprintfW(temp, L"%s%i.%03i", sign, val / 1000, val % 1000);
}
item.pszText = temp;
item.iItem = i;
@ -106,17 +103,17 @@ INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM
//LockWindowUpdate(0);
//ShowWindow(hWndList, 1);
//UpdateWindow(hWnd);
}
break;
case WM_NOTIFY:
{
NMLVKEYDOWN *n = (NMLVKEYDOWN *) lParam;
} break;
case WM_NOTIFY: {
NMLVKEYDOWN *n = (NMLVKEYDOWN *)lParam;
// Don't always get the notification when testing DirectInput non-keyboard devices.
// Don't get it (Or want it) when testing keyboards.
if (n->hdr.idFrom != IDC_LIST || n->hdr.code != LVN_KEYDOWN || n->wVKey != VK_ESCAPE) break;
if (n->hdr.idFrom != IDC_LIST || n->hdr.code != LVN_KEYDOWN || n->wVKey != VK_ESCAPE)
break;
}
case WM_ACTIVATE:
if (uMsg == WM_ACTIVATE && wParam != WA_INACTIVE) break;
if (uMsg == WM_ACTIVATE && wParam != WA_INACTIVE)
break;
break;
case WM_CLOSE:
KillTimer(hWnd, 1);
@ -132,13 +129,16 @@ INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM
return 0;
}
void Diagnose(int id, HWND hWnd) {
void Diagnose(int id, HWND hWnd)
{
// init = 0;
dev = dm->devices[id];
for (int i=0; i<dm->numDevices; i++) {
if (i != id) dm->DisableDevice(i);
for (int i = 0; i < dm->numDevices; i++) {
if (i != id)
dm->DisableDevice(i);
// Shouldn't be needed.
else dm->EnableDevice(i);
else
dm->EnableDevice(i);
}
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIAG), hWnd, DiagDialog);
ClearKeyQueue();

View File

@ -32,43 +32,56 @@
// media SDK also be installed for a simple macro. This is
// simpler and less silly.
#ifndef SAFE_RELEASE
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
#define SAFE_RELEASE(p) \
{ \
if (p) { \
(p)->Release(); \
(p) = NULL; \
} \
}
#endif
// Aka htons, without the winsock dependency.
inline static u16 flipShort(u16 s) {
return (s>>8) | (s<<8);
inline static u16 flipShort(u16 s)
{
return (s >> 8) | (s << 8);
}
// Aka htonl, without the winsock dependency.
inline static u32 flipLong(u32 l) {
return (((u32)flipShort((u16)l))<<16) | flipShort((u16)(l>>16));
inline static u32 flipLong(u32 l)
{
return (((u32)flipShort((u16)l)) << 16) | flipShort((u16)(l >> 16));
}
static void GUIDtoString(wchar_t *data, const GUID *pg) {
static void GUIDtoString(wchar_t *data, const GUID *pg)
{
wsprintfW(data, L"%08X-%04X-%04X-%04X-%04X%08X",
pg->Data1, (u32)pg->Data2, (u32)pg->Data3,
flipShort(((u16*)pg->Data4)[0]),
flipShort(((u16*)pg->Data4)[1]),
flipLong(((u32*)pg->Data4)[1]));
flipShort(((u16 *)pg->Data4)[0]),
flipShort(((u16 *)pg->Data4)[1]),
flipLong(((u32 *)pg->Data4)[1]));
}
struct DirectInput8Data {
IDirectInput8* lpDI8;
struct DirectInput8Data
{
IDirectInput8 *lpDI8;
int refCount;
int deviceCount;
};
DirectInput8Data di8d = {0,0,0};
DirectInput8Data di8d = {0, 0, 0};
IDirectInput8* GetDirectInput() {
IDirectInput8 *GetDirectInput()
{
if (!di8d.lpDI8) {
if (FAILED(DirectInput8Create(hInst, 0x800, IID_IDirectInput8, (void**) &di8d.lpDI8, 0))) return 0;
if (FAILED(DirectInput8Create(hInst, 0x800, IID_IDirectInput8, (void **)&di8d.lpDI8, 0)))
return 0;
}
di8d.refCount++;
return di8d.lpDI8;
}
void ReleaseDirectInput() {
void ReleaseDirectInput()
{
if (di8d.refCount) {
di8d.refCount--;
if (!di8d.refCount) {
@ -78,42 +91,48 @@ void ReleaseDirectInput() {
}
}
static int StringToGUID(GUID *pg, wchar_t *dataw) {
static int StringToGUID(GUID *pg, wchar_t *dataw)
{
char data[100];
if (wcslen(dataw) > 50) return 0;
if (wcslen(dataw) > 50)
return 0;
int w = 0;
while (dataw[w]) {
data[w] = (char) dataw[w];
data[w] = (char)dataw[w];
w++;
}
data[w] = 0;
u32 temp[5];
sscanf(data, "%08X-%04X-%04X-%04X-%04X%08X",
&pg->Data1, temp, temp+1,
temp+2, temp+3, temp+4);
pg->Data2 = (u16) temp[0];
pg->Data3 = (u16) temp[1];
((u16*)pg->Data4)[0] = flipShort((u16)temp[2]);
((u16*)pg->Data4)[1] = flipShort((u16)temp[3]);
((u32*)pg->Data4)[1] = flipLong(temp[4]);
&pg->Data1, temp, temp + 1,
temp + 2, temp + 3, temp + 4);
pg->Data2 = (u16)temp[0];
pg->Data3 = (u16)temp[1];
((u16 *)pg->Data4)[0] = flipShort((u16)temp[2]);
((u16 *)pg->Data4)[1] = flipShort((u16)temp[3]);
((u32 *)pg->Data4)[1] = flipLong(temp[4]);
return 1;
}
struct DI8Effect {
struct DI8Effect
{
IDirectInputEffect *die;
int scale;
};
BOOL CALLBACK EnumDeviceObjectsCallback (LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef);
BOOL CALLBACK EnumDeviceObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef);
BOOL CALLBACK EnumEffectsCallback(LPCDIEFFECTINFOW pdei, LPVOID pvRef);
class DirectInputDevice : public Device {
class DirectInputDevice : public Device
{
public:
DI8Effect *diEffects;
IDirectInputDevice8 *did;
GUID guidInstance;
DirectInputDevice(DeviceType type, IDirectInputDevice8* did, wchar_t *displayName, wchar_t *instanceID, wchar_t *productID, GUID guid) : Device(DI, type, displayName, instanceID, productID) {
DirectInputDevice(DeviceType type, IDirectInputDevice8 *did, wchar_t *displayName, wchar_t *instanceID, wchar_t *productID, GUID guid)
: Device(DI, type, displayName, instanceID, productID)
{
diEffects = 0;
guidInstance = guid;
this->did = 0;
@ -122,13 +141,14 @@ public:
did->Release();
}
void SetEffect(ForceFeedbackBinding *binding, unsigned char force) {
void SetEffect(ForceFeedbackBinding *binding, unsigned char force)
{
int index = 0;
if (!diEffects) {
return;
}
for (int port=0; port<2; port++) {
for (int slot=0; slot<4; slot++) {
for (int port = 0; port < 2; port++) {
for (int slot = 0; slot < 4; slot++) {
unsigned int diff = binding - pads[port][slot].ffBindings;
if (diff < (unsigned int)pads[port][slot].numFFBindings) {
index += diff;
@ -142,7 +162,8 @@ public:
if (die) {
DIEFFECT dieffect;
memset(&dieffect, 0, sizeof(dieffect));
union {
union
{
DIPERIODIC periodic;
DIRAMPFORCE ramp;
DICONSTANTFORCE constant;
@ -150,21 +171,20 @@ public:
dieffect.dwSize = sizeof(dieffect);
dieffect.lpvTypeSpecificParams = &periodic;
int magnitude = abs((int)((force*10000*(__int64)diEffects[index].scale)/BASE_SENSITIVITY/255));
if (magnitude > 10000) magnitude = 10000;
int magnitude = abs((int)((force * 10000 * (__int64)diEffects[index].scale) / BASE_SENSITIVITY / 255));
if (magnitude > 10000)
magnitude = 10000;
int type = ffEffectTypes[binding->effectIndex].type;
if (type == EFFECT_CONSTANT) {
dieffect.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
constant.lMagnitude = magnitude;
}
else if (type == EFFECT_PERIODIC) {
} else if (type == EFFECT_PERIODIC) {
dieffect.cbTypeSpecificParams = sizeof(DIPERIODIC);
periodic.dwMagnitude = 0;
periodic.lOffset = magnitude;
periodic.dwPhase = 0;
periodic.dwPeriod = 2000000;
}
else if (type == EFFECT_RAMP) {
} else if (type == EFFECT_RAMP) {
dieffect.cbTypeSpecificParams = sizeof(DIRAMPFORCE);
ramp.lEnd = ramp.lStart = magnitude;
}
@ -174,11 +194,13 @@ public:
}
}
int Activate(InitInfo *initInfo) {
int Activate(InitInfo *initInfo)
{
int i;
IDirectInput8 *di8 = GetDirectInput();
Deactivate();
if (!di8) return 0;
if (!di8)
return 0;
if (DI_OK != di8->CreateDevice(guidInstance, &did, 0)) {
ReleaseDirectInput();
did = 0;
@ -186,10 +208,10 @@ public:
}
{
DIOBJECTDATAFORMAT *formats = (DIOBJECTDATAFORMAT*)calloc(numPhysicalControls, sizeof(DIOBJECTDATAFORMAT));
for (i=0; i<numPhysicalControls; i++) {
DIOBJECTDATAFORMAT *formats = (DIOBJECTDATAFORMAT *)calloc(numPhysicalControls, sizeof(DIOBJECTDATAFORMAT));
for (i = 0; i < numPhysicalControls; i++) {
formats[i].dwType = physicalControls[i].type | DIDFT_MAKEINSTANCE(physicalControls[i].id);
formats[i].dwOfs = 4*i;
formats[i].dwOfs = 4 * i;
}
DIDATAFORMAT format;
format.dwSize = sizeof(format);
@ -199,7 +221,7 @@ public:
format.dwNumObjs = numPhysicalControls;
format.rgodf = formats;
int res = did->SetDataFormat(&format);
for (i=0; i<numPhysicalControls; i++) {
for (i = 0; i < numPhysicalControls; i++) {
if (physicalControls[i].type == ABSAXIS) {
DIPROPRANGE prop;
prop.diph.dwHeaderSize = sizeof(DIPROPHEADER);
@ -230,11 +252,9 @@ public:
// Note: Have to use hWndTop to properly hide cursor for mouse device.
if (type == OTHER) {
did->SetCooperativeLevel(initInfo->hWndTop, DISCL_BACKGROUND | DISCL_EXCLUSIVE);
}
else if (type == KEYBOARD) {
} else if (type == KEYBOARD) {
did->SetCooperativeLevel(initInfo->hWndTop, DISCL_FOREGROUND);
}
else {
} else {
did->SetCooperativeLevel(initInfo->hWndTop, DISCL_FOREGROUND | DISCL_EXCLUSIVE);
}
if (did->Acquire() != DI_OK) {
@ -245,17 +265,18 @@ public:
}
AllocState();
int count = GetFFBindingCount();
diEffects = (DI8Effect*) calloc(count, sizeof(DI8Effect));
diEffects = (DI8Effect *)calloc(count, sizeof(DI8Effect));
i = 0;
for (int port=0; port<2; port++) {
for (int slot=0; slot<4; slot++) {
for (int port = 0; port < 2; port++) {
for (int slot = 0; slot < 4; slot++) {
int subIndex = i;
for (int j=0; j<pads[port][slot].numFFBindings; j++) {
for (int j = 0; j < pads[port][slot].numFFBindings; j++) {
ForceFeedbackBinding *b = 0;
b = &pads[port][slot].ffBindings[i-subIndex];
b = &pads[port][slot].ffBindings[i - subIndex];
ForceFeedbackEffectType *eff = ffEffectTypes + b->effectIndex;
GUID guid;
if (!StringToGUID(&guid, eff->effectID)) continue;
if (!StringToGUID(&guid, eff->effectID))
continue;
DIEFFECT dieffect;
memset(&dieffect, 0, sizeof(dieffect));
@ -264,31 +285,30 @@ public:
dieffect.dwDuration = 1000000;
dieffect.dwGain = 10000;
dieffect.dwTriggerButton = DIEB_NOTRIGGER;
union {
union
{
DIPERIODIC pediodic;
DIRAMPFORCE ramp;
DICONSTANTFORCE constant;
} stuff = {0,0,0,0};
} stuff = {0, 0, 0, 0};
if (eff->type == EFFECT_CONSTANT) {
dieffect.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
}
else if (eff->type == EFFECT_PERIODIC) {
} else if (eff->type == EFFECT_PERIODIC) {
dieffect.cbTypeSpecificParams = sizeof(DIPERIODIC);
}
else if (eff->type == EFFECT_RAMP) {
} else if (eff->type == EFFECT_RAMP) {
dieffect.cbTypeSpecificParams = sizeof(DIRAMPFORCE);
}
dieffect.lpvTypeSpecificParams = &stuff;
int maxForce = 0;
int numAxes = 0;
int *axes = (int*) malloc(sizeof(int) * 3 * numFFAxes);
DWORD *axisIDs = (DWORD*)(axes + numFFAxes);
LONG *dirList = (LONG*)(axisIDs + numFFAxes);
int *axes = (int *)malloc(sizeof(int) * 3 * numFFAxes);
DWORD *axisIDs = (DWORD *)(axes + numFFAxes);
LONG *dirList = (LONG *)(axisIDs + numFFAxes);
dieffect.rgdwAxes = axisIDs;
dieffect.rglDirection = dirList;
for (int k=0; k<numFFAxes; k++) {
for (int k = 0; k < numFFAxes; k++) {
if (b->axes[k].force) {
int force = abs(b->axes[k].force);
if (force > maxForce) {
@ -321,43 +341,46 @@ public:
return 1;
}
int Update() {
if (!active) return 0;
int Update()
{
if (!active)
return 0;
if (numPhysicalControls) {
HRESULT res = did->Poll();
// ??
if ((res != DI_OK && res != DI_NOEFFECT) ||
DI_OK != did->GetDeviceState(4*numPhysicalControls, physicalControlState)) {
DI_OK != did->GetDeviceState(4 * numPhysicalControls, physicalControlState)) {
Deactivate();
return 0;
}
for (int i=0; i<numPhysicalControls; i++) {
for (int i = 0; i < numPhysicalControls; i++) {
if (physicalControls[i].type & RELAXIS) {
physicalControlState[i] *= (FULLY_DOWN/3);
}
else if (physicalControls[i].type & BUTTON) {
physicalControlState[i] = (physicalControlState[i]&0x80) * FULLY_DOWN / 128;
physicalControlState[i] *= (FULLY_DOWN / 3);
} else if (physicalControls[i].type & BUTTON) {
physicalControlState[i] = (physicalControlState[i] & 0x80) * FULLY_DOWN / 128;
}
}
}
return 1;
}
int GetFFBindingCount() {
int GetFFBindingCount()
{
int count = 0;
for (int port = 0; port<2; port++) {
for (int slot = 0; slot<4; slot++) {
for (int port = 0; port < 2; port++) {
for (int slot = 0; slot < 4; slot++) {
count += pads[port][slot].numFFBindings;
}
}
return count;
}
void Deactivate() {
void Deactivate()
{
FreeState();
if (diEffects) {
int count = GetFFBindingCount();
for (int i=0; i<count; i++) {
for (int i = 0; i < count; i++) {
if (diEffects[i].die) {
diEffects[i].die->Stop();
diEffects[i].die->Release();
@ -375,24 +398,23 @@ public:
}
}
~DirectInputDevice() {
~DirectInputDevice()
{
}
};
BOOL CALLBACK EnumEffectsCallback(LPCDIEFFECTINFOW pdei, LPVOID pvRef) {
DirectInputDevice * did = (DirectInputDevice*) pvRef;
BOOL CALLBACK EnumEffectsCallback(LPCDIEFFECTINFOW pdei, LPVOID pvRef)
{
DirectInputDevice *did = (DirectInputDevice *)pvRef;
EffectType type;
int diType = DIEFT_GETTYPE(pdei->dwEffType);
if (diType == DIEFT_CONSTANTFORCE) {
type = EFFECT_CONSTANT;
}
else if (diType == DIEFT_RAMPFORCE) {
} else if (diType == DIEFT_RAMPFORCE) {
type = EFFECT_RAMP;
}
else if (diType == DIEFT_PERIODIC) {
} else if (diType == DIEFT_PERIODIC) {
type = EFFECT_PERIODIC;
}
else {
} else {
return DIENUM_CONTINUE;
}
wchar_t guidString[50];
@ -402,8 +424,9 @@ BOOL CALLBACK EnumEffectsCallback(LPCDIEFFECTINFOW pdei, LPVOID pvRef) {
return DIENUM_CONTINUE;
}
BOOL CALLBACK EnumDeviceObjectsCallback (LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) {
DirectInputDevice * did = (DirectInputDevice*) pvRef;
BOOL CALLBACK EnumDeviceObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef)
{
DirectInputDevice *did = (DirectInputDevice *)pvRef;
if (lpddoi->dwType & DIDFT_FFACTUATOR) {
did->AddFFAxis(lpddoi->tszName, lpddoi->dwType);
}
@ -425,8 +448,9 @@ BOOL CALLBACK EnumDeviceObjectsCallback (LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOI
// If too many objects, ignore extra buttons.
if ((did->numPhysicalControls > 255 && DIDFT_GETINSTANCE(lpddoi->dwType) > 255) && (type & (DIDFT_PSHBUTTON | DIDFT_TGLBUTTON))) {
int i;
for (i = did->numPhysicalControls-1; i>did->numPhysicalControls-4; i--) {
if (!lpddoi->tszName[0]) break;
for (i = did->numPhysicalControls - 1; i > did->numPhysicalControls - 4; i--) {
if (!lpddoi->tszName[0])
break;
const wchar_t *s1 = lpddoi->tszName;
const wchar_t *s2 = did->physicalControls[i].name;
while (*s1 && *s1 == *s2) {
@ -434,12 +458,14 @@ BOOL CALLBACK EnumDeviceObjectsCallback (LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOI
s2++;
}
// If perfect match with one of last 4 names, break.
if (!*s1 && !*s2) break;
if (!*s1 && !*s2)
break;
while (s1 != lpddoi->tszName && (s1[-1] >= '0' && s1[-1] <= '9')) s1--;
while (s1 != lpddoi->tszName && (s1[-1] >= '0' && s1[-1] <= '9'))
s1--;
int check = 0;
while (*s1 >= '0' && *s1 <= '9') {
check = check*10 + *s1 - '0';
check = check * 10 + *s1 - '0';
s1++;
}
while (*s2 >= '0' && *s2 <= '9') {
@ -447,16 +473,17 @@ BOOL CALLBACK EnumDeviceObjectsCallback (LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOI
}
// If perfect match other than final number > 30, then break.
// takes care of "button xx" case without causing issues with F keys.
if (!*s1 && !*s2 && check > 30) break;
if (!*s1 && !*s2 && check > 30)
break;
}
if (i != did->numPhysicalControls-4) {
if (i != did->numPhysicalControls - 4) {
return DIENUM_CONTINUE;
}
}
int vkey = 0;
if (lpddoi->tszName[0] && did->type == KEYBOARD) {
for (u32 i = 0; i<256; i++) {
for (u32 i = 0; i < 256; i++) {
wchar_t *t = GetVKStringW((u8)i);
if (!wcsicmp(lpddoi->tszName, t)) {
vkey = i;
@ -470,17 +497,17 @@ BOOL CALLBACK EnumDeviceObjectsCallback (LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOI
// Evil code from MS's site. If only they'd just made a way to get
// an XInput device's GUID directly in the first place...
BOOL IsXInputDevice( const GUID* pGuidProductFromDirectInput )
BOOL IsXInputDevice(const GUID *pGuidProductFromDirectInput)
{
IWbemLocator* pIWbemLocator = NULL;
IEnumWbemClassObject* pEnumDevices = NULL;
IWbemClassObject* pDevices[20] = {0};
IWbemServices* pIWbemServices = NULL;
IWbemLocator *pIWbemLocator = NULL;
IEnumWbemClassObject *pEnumDevices = NULL;
IWbemClassObject *pDevices[20] = {0};
IWbemServices *pIWbemServices = NULL;
BSTR bstrNamespace = NULL;
BSTR bstrDeviceID = NULL;
BSTR bstrClassName = NULL;
DWORD uReturned = 0;
bool bIsXinputDevice= false;
bool bIsXinputDevice = false;
UINT iDevice = 0;
VARIANT var;
HRESULT hr;
@ -490,118 +517,119 @@ BOOL IsXInputDevice( const GUID* pGuidProductFromDirectInput )
bool bCleanupCOM = SUCCEEDED(hr);
// Create WMI
hr = CoCreateInstance( __uuidof(WbemLocator),
hr = CoCreateInstance(__uuidof(WbemLocator),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IWbemLocator),
(LPVOID*) &pIWbemLocator);
if( FAILED(hr) || pIWbemLocator == NULL )
(LPVOID *)&pIWbemLocator);
if (FAILED(hr) || pIWbemLocator == NULL)
goto LCleanup;
bstrNamespace = SysAllocString( L"\\\\.\\root\\cimv2" );if( bstrNamespace == NULL ) goto LCleanup;
bstrClassName = SysAllocString( L"Win32_PNPEntity" ); if( bstrClassName == NULL ) goto LCleanup;
bstrDeviceID = SysAllocString( L"DeviceID" ); if( bstrDeviceID == NULL ) goto LCleanup;
bstrNamespace = SysAllocString(L"\\\\.\\root\\cimv2");
if (bstrNamespace == NULL)
goto LCleanup;
bstrClassName = SysAllocString(L"Win32_PNPEntity");
if (bstrClassName == NULL)
goto LCleanup;
bstrDeviceID = SysAllocString(L"DeviceID");
if (bstrDeviceID == NULL)
goto LCleanup;
// Connect to WMI
hr = pIWbemLocator->ConnectServer( bstrNamespace, NULL, NULL, 0L,
0L, NULL, NULL, &pIWbemServices );
if( FAILED(hr) || pIWbemServices == NULL )
hr = pIWbemLocator->ConnectServer(bstrNamespace, NULL, NULL, 0L,
0L, NULL, NULL, &pIWbemServices);
if (FAILED(hr) || pIWbemServices == NULL)
goto LCleanup;
// Switch security level to IMPERSONATE.
CoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );
CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
hr = pIWbemServices->CreateInstanceEnum( bstrClassName, 0, NULL, &pEnumDevices );
if( FAILED(hr) || pEnumDevices == NULL )
hr = pIWbemServices->CreateInstanceEnum(bstrClassName, 0, NULL, &pEnumDevices);
if (FAILED(hr) || pEnumDevices == NULL)
goto LCleanup;
// Loop over all devices
for( ;; )
{
for (;;) {
// Get 20 at a time
hr = pEnumDevices->Next( 10000, 20, pDevices, &uReturned );
if( FAILED(hr) )
hr = pEnumDevices->Next(10000, 20, pDevices, &uReturned);
if (FAILED(hr))
goto LCleanup;
if( uReturned == 0 )
if (uReturned == 0)
break;
for( iDevice=0; iDevice<uReturned; iDevice++ )
{
for (iDevice = 0; iDevice < uReturned; iDevice++) {
// For each device, get its device ID
hr = pDevices[iDevice]->Get( bstrDeviceID, 0L, &var, NULL, NULL );
if( SUCCEEDED( hr ) && var.vt == VT_BSTR && var.bstrVal != NULL )
{
hr = pDevices[iDevice]->Get(bstrDeviceID, 0L, &var, NULL, NULL);
if (SUCCEEDED(hr) && var.vt == VT_BSTR && var.bstrVal != NULL) {
// Check if the device ID contains "IG_". If it does, then it's an XInput device
// This information can not be found from DirectInput
if( wcsstr( var.bstrVal, L"IG_" ) )
{
if (wcsstr(var.bstrVal, L"IG_")) {
// If it does, then get the VID/PID from var.bstrVal
DWORD dwPid = 0, dwVid = 0;
WCHAR* strVid = wcsstr( var.bstrVal, L"VID_" );
WCHAR *strVid = wcsstr(var.bstrVal, L"VID_");
if (strVid) {
dwVid = wcstoul(strVid+4, 0, 16);
dwVid = wcstoul(strVid + 4, 0, 16);
}
WCHAR* strPid = wcsstr( var.bstrVal, L"PID_" );
WCHAR *strPid = wcsstr(var.bstrVal, L"PID_");
if (strPid) {
dwPid = wcstoul(strPid+4, 0, 16);
dwPid = wcstoul(strPid + 4, 0, 16);
}
// Compare the VID/PID to the DInput device
DWORD dwVidPid = MAKELONG( dwVid, dwPid );
if( dwVidPid == pGuidProductFromDirectInput->Data1 )
{
DWORD dwVidPid = MAKELONG(dwVid, dwPid);
if (dwVidPid == pGuidProductFromDirectInput->Data1) {
bIsXinputDevice = true;
goto LCleanup;
}
}
}
SAFE_RELEASE( pDevices[iDevice] );
SAFE_RELEASE(pDevices[iDevice]);
}
}
LCleanup:
if(bstrNamespace)
if (bstrNamespace)
SysFreeString(bstrNamespace);
if(bstrDeviceID)
if (bstrDeviceID)
SysFreeString(bstrDeviceID);
if(bstrClassName)
if (bstrClassName)
SysFreeString(bstrClassName);
for( iDevice=0; iDevice<20; iDevice++ )
SAFE_RELEASE( pDevices[iDevice] );
SAFE_RELEASE( pEnumDevices );
SAFE_RELEASE( pIWbemLocator );
SAFE_RELEASE( pIWbemServices );
for (iDevice = 0; iDevice < 20; iDevice++)
SAFE_RELEASE(pDevices[iDevice]);
SAFE_RELEASE(pEnumDevices);
SAFE_RELEASE(pIWbemLocator);
SAFE_RELEASE(pIWbemServices);
if( bCleanupCOM )
if (bCleanupCOM)
CoUninitialize();
return bIsXinputDevice;
}
struct DeviceEnumInfo {
struct DeviceEnumInfo
{
IDirectInput8 *di8;
int ignoreXInput;
};
BOOL CALLBACK EnumCallback (LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) {
IDirectInput8* di8 = ((DeviceEnumInfo*)pvRef)->di8;
BOOL CALLBACK EnumCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
{
IDirectInput8 *di8 = ((DeviceEnumInfo *)pvRef)->di8;
const wchar_t *name;
wchar_t temp[40];
//if (((DeviceEnumInfo*)pvRef)->ignoreXInput && lpddi->
if (lpddi->tszInstanceName[0]) {
name = lpddi->tszInstanceName;
}
else if (lpddi->tszProductName[0]) {
} else if (lpddi->tszProductName[0]) {
name = lpddi->tszProductName;
}
else {
wsprintfW (temp, L"Device %i", di8d.deviceCount);
} else {
wsprintfW(temp, L"Device %i", di8d.deviceCount);
name = temp;
}
di8d.deviceCount++;
wchar_t *fullName = (wchar_t *) malloc((wcslen(name) + 4) * sizeof(wchar_t));
wchar_t *fullName = (wchar_t *)malloc((wcslen(name) + 4) * sizeof(wchar_t));
wsprintf(fullName, L"DX %s", name);
wchar_t instanceID[100];
wchar_t productID[100];
@ -610,8 +638,7 @@ BOOL CALLBACK EnumCallback (LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) {
DeviceType type = OTHER;
if ((lpddi->dwDevType & 0xFF) == DI8DEVTYPE_KEYBOARD) {
type = KEYBOARD;
}
else if ((lpddi->dwDevType & 0xFF) == DI8DEVTYPE_MOUSE) {
} else if ((lpddi->dwDevType & 0xFF) == DI8DEVTYPE_MOUSE) {
type = MOUSE;
}
IDirectInputDevice8 *did;
@ -619,8 +646,7 @@ BOOL CALLBACK EnumCallback (LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) {
DirectInputDevice *dev = new DirectInputDevice(type, did, fullName, instanceID, productID, lpddi->guidInstance);
if (dev->numPhysicalControls || dev->numFFAxes) {
dm->AddDevice(dev);
}
else {
} else {
delete dev;
}
}
@ -628,13 +654,14 @@ BOOL CALLBACK EnumCallback (LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) {
return DIENUM_CONTINUE;
}
void EnumDirectInputDevices(int ignoreXInput) {
void EnumDirectInputDevices(int ignoreXInput)
{
DeviceEnumInfo enumInfo;
enumInfo.di8 = GetDirectInput();
if (!enumInfo.di8) return;
if (!enumInfo.di8)
return;
enumInfo.ignoreXInput = ignoreXInput;
di8d.deviceCount = 0;
enumInfo.di8->EnumDevices(DI8DEVCLASS_ALL, EnumCallback, &enumInfo, DIEDFL_ATTACHEDONLY);
ReleaseDirectInput();
}

View File

@ -41,15 +41,15 @@
unsigned int lastDS3Check = 0;
unsigned int lastDS3Enum = 0;
typedef void (__cdecl *_usb_init)(void);
typedef int (__cdecl *_usb_close)(usb_dev_handle *dev);
typedef int (__cdecl *_usb_get_string_simple)(usb_dev_handle *dev, int index, char *buf, size_t buflen);
typedef void(__cdecl *_usb_init)(void);
typedef int(__cdecl *_usb_close)(usb_dev_handle *dev);
typedef int(__cdecl *_usb_get_string_simple)(usb_dev_handle *dev, int index, char *buf, size_t buflen);
typedef usb_dev_handle *(__cdecl *_usb_open)(struct usb_device *dev);
typedef int (__cdecl *_usb_find_busses)(void);
typedef int (__cdecl *_usb_find_devices)(void);
typedef int(__cdecl *_usb_find_busses)(void);
typedef int(__cdecl *_usb_find_devices)(void);
typedef struct usb_bus *(__cdecl *_usb_get_busses)(void);
typedef usb_dev_handle *(__cdecl *_usb_open)(struct usb_device *dev);
typedef int (__cdecl *_usb_control_msg)(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);
typedef int(__cdecl *_usb_control_msg)(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);
_usb_init pusb_init;
_usb_close pusb_close;
@ -62,14 +62,16 @@ _usb_control_msg pusb_control_msg;
HMODULE hModLibusb = 0;
void UninitLibUsb() {
void UninitLibUsb()
{
if (hModLibusb) {
FreeLibrary(hModLibusb);
hModLibusb = 0;
}
}
void TryInitDS3(usb_device *dev) {
void TryInitDS3(usb_device *dev)
{
while (dev) {
if (dev->descriptor.idVendor == VID && dev->descriptor.idProduct == PID) {
usb_dev_handle *handle = pusb_open(dev);
@ -82,7 +84,7 @@ void TryInitDS3(usb_device *dev) {
}
}
if (dev->num_children) {
for (int i=0; i<dev->num_children; i++) {
for (int i = 0; i < dev->num_children; i++) {
TryInitDS3(dev->children[i]);
}
}
@ -90,7 +92,8 @@ void TryInitDS3(usb_device *dev) {
}
}
void DS3Enum(unsigned int time) {
void DS3Enum(unsigned int time)
{
if (time - lastDS3Enum < DOUBLE_ENUM_DELAY) {
return;
}
@ -99,7 +102,8 @@ void DS3Enum(unsigned int time) {
pusb_find_devices();
}
void DS3Check(unsigned int time) {
void DS3Check(unsigned int time)
{
if (time - lastDS3Check < DOUBLE_CHECK_DELAY) {
return;
}
@ -115,20 +119,21 @@ void DS3Check(unsigned int time) {
}
}
int InitLibUsb() {
int InitLibUsb()
{
if (hModLibusb) {
return 1;
}
hModLibusb = LoadLibraryA("C:\\windows\\system32\\libusb0.dll");
if (hModLibusb) {
if ((pusb_init = (_usb_init) GetProcAddress(hModLibusb, "usb_init")) &&
(pusb_close = (_usb_close) GetProcAddress(hModLibusb, "usb_close")) &&
(pusb_get_string_simple = (_usb_get_string_simple) GetProcAddress(hModLibusb, "usb_get_string_simple")) &&
(pusb_open = (_usb_open) GetProcAddress(hModLibusb, "usb_open")) &&
(pusb_find_busses = (_usb_find_busses) GetProcAddress(hModLibusb, "usb_find_busses")) &&
(pusb_find_devices = (_usb_find_devices) GetProcAddress(hModLibusb, "usb_find_devices")) &&
(pusb_get_busses = (_usb_get_busses) GetProcAddress(hModLibusb, "usb_get_busses")) &&
(pusb_control_msg = (_usb_control_msg) GetProcAddress(hModLibusb, "usb_control_msg"))) {
if ((pusb_init = (_usb_init)GetProcAddress(hModLibusb, "usb_init")) &&
(pusb_close = (_usb_close)GetProcAddress(hModLibusb, "usb_close")) &&
(pusb_get_string_simple = (_usb_get_string_simple)GetProcAddress(hModLibusb, "usb_get_string_simple")) &&
(pusb_open = (_usb_open)GetProcAddress(hModLibusb, "usb_open")) &&
(pusb_find_busses = (_usb_find_busses)GetProcAddress(hModLibusb, "usb_find_busses")) &&
(pusb_find_devices = (_usb_find_devices)GetProcAddress(hModLibusb, "usb_find_devices")) &&
(pusb_get_busses = (_usb_get_busses)GetProcAddress(hModLibusb, "usb_get_busses")) &&
(pusb_control_msg = (_usb_control_msg)GetProcAddress(hModLibusb, "usb_control_msg"))) {
pusb_init();
return 1;
}
@ -137,18 +142,21 @@ int InitLibUsb() {
return 0;
}
int DualShock3Possible() {
int DualShock3Possible()
{
return InitLibUsb();
}
#include <pshpack1.h>
struct MotorState {
struct MotorState
{
unsigned char duration;
unsigned char force;
};
struct LightState {
struct LightState
{
// 0xFF makes it stay on.
unsigned char duration;
// Have to make one or the other non-zero to turn on light.
@ -160,7 +168,8 @@ struct LightState {
};
// Data sent to DS3 to set state.
struct DS3Command {
struct DS3Command
{
unsigned char id;
unsigned char unsure;
// Small is first, then big.
@ -175,21 +184,25 @@ struct DS3Command {
#include <poppack.h>
int CharToAxis(unsigned char c) {
int CharToAxis(unsigned char c)
{
int v = (int)c + ((unsigned int)c >> 7);
return ((c-128) * FULLY_DOWN)>>7;
return ((c - 128) * FULLY_DOWN) >> 7;
}
int CharToButton(unsigned char c) {
int CharToButton(unsigned char c)
{
int v = (int)c + ((unsigned int)c >> 7);
return (v * FULLY_DOWN)>>8;
return (v * FULLY_DOWN) >> 8;
}
class DualShock3Device : public Device {
class DualShock3Device : public Device
{
// Cached last vibration values by pad and motor.
// Need this, as only one value is changed at a time.
int ps2Vibration[2][4][2];
int vibration[2];
public:
int index;
HANDLE hFile;
@ -205,12 +218,14 @@ public:
int writeQueued;
int writing;
int StartRead() {
int StartRead()
{
int res = ReadFile(hFile, &getState, sizeof(getState), 0, &readop);
return (res || GetLastError() == ERROR_IO_PENDING);
}
void QueueWrite() {
void QueueWrite()
{
// max of 2 queued writes allowed, one for either motor.
if (writeQueued < 2) {
writeQueued++;
@ -218,7 +233,8 @@ public:
}
}
int StartWrite() {
int StartWrite()
{
if (!writing && writeQueued) {
lastWrite = GetTickCount();
writing++;
@ -226,14 +242,15 @@ public:
sendState.motors[0].duration = 0x50;
sendState.motors[1].duration = 0x50;
int bigForce = vibration[0] * 256/FULLY_DOWN;
if (bigForce > 255) bigForce = 255;
sendState.motors[1].force = (unsigned char) bigForce;
sendState.motors[0].force = (unsigned char) (vibration[1] >= FULLY_DOWN/2);
int bigForce = vibration[0] * 256 / FULLY_DOWN;
if (bigForce > 255)
bigForce = 255;
sendState.motors[1].force = (unsigned char)bigForce;
sendState.motors[0].force = (unsigned char)(vibration[1] >= FULLY_DOWN / 2);
// Can't seem to have them both non-zero at once.
if (sendState.motors[writeCount&1].force) {
sendState.motors[(writeCount&1)^1].force = 0;
sendState.motors[(writeCount&1)^1].duration = 0;
if (sendState.motors[writeCount & 1].force) {
sendState.motors[(writeCount & 1) ^ 1].force = 0;
sendState.motors[(writeCount & 1) ^ 1].duration = 0;
}
writeCount++;
@ -243,7 +260,9 @@ public:
return 1;
}
DualShock3Device(int index, wchar_t *name, wchar_t *path) : Device(DS3, OTHER, name, path, L"DualShock 3") {
DualShock3Device(int index, wchar_t *name, wchar_t *path)
: Device(DS3, OTHER, name, path, L"DualShock 3")
{
writeCount = 0;
writing = 0;
writeQueued = 0;
@ -251,24 +270,23 @@ public:
memset(&writeop, 0, sizeof(writeop));
memset(&sendState, 0, sizeof(sendState));
sendState.id = 1;
int temp = (index&4);
sendState.lightFlags = (1 << (temp+1));
sendState.lights[3-temp].duration = 0xFF;
sendState.lights[3-temp].dunno[0] = 1;
sendState.lights[3-temp].on = 1;
int temp = (index & 4);
sendState.lightFlags = (1 << (temp + 1));
sendState.lights[3 - temp].duration = 0xFF;
sendState.lights[3 - temp].dunno[0] = 1;
sendState.lights[3 - temp].on = 1;
memset(ps2Vibration, 0, sizeof(ps2Vibration));
vibration[0] = vibration[1] = 0;
this->index = index;
int i;
for (i=0; i<16; i++) {
for (i = 0; i < 16; i++) {
if (i != 14 && i != 15 && i != 8 && i != 9) {
AddPhysicalControl(PRESSURE_BTN, i, 0);
}
else {
} else {
AddPhysicalControl(PSHBTN, i, 0);
}
}
for (; i<23; i++) {
for (; i < 23; i++) {
AddPhysicalControl(ABSAXIS, i, 0);
}
AddFFAxis(L"Big Motor", 0);
@ -277,7 +295,8 @@ public:
hFile = INVALID_HANDLE_VALUE;
}
wchar_t *GetPhysicalControlName(PhysicalControl *c) {
wchar_t *GetPhysicalControlName(PhysicalControl *c)
{
const static wchar_t *names[] = {
L"Square",
L"Cross",
@ -303,15 +322,17 @@ public:
L"Forward/Back Tilt",
L"???",
};
unsigned int i = (unsigned int) (c - physicalControls);
if (i < sizeof(names)/sizeof(names[0])) {
return (wchar_t*)names[i];
unsigned int i = (unsigned int)(c - physicalControls);
if (i < sizeof(names) / sizeof(names[0])) {
return (wchar_t *)names[i];
}
return Device::GetPhysicalControlName(c);
}
int Activate(InitInfo *initInfo) {
if (active) Deactivate();
int Activate(InitInfo *initInfo)
{
if (active)
Deactivate();
// Give grace period before get mad.
lastWrite = dataLastReceived = GetTickCount();
readop.hEvent = CreateEvent(0, 0, 0, 0);
@ -327,12 +348,13 @@ public:
return 1;
}
int Update() {
if (!active) return 0;
int Update()
{
if (!active)
return 0;
HANDLE h[2] = {
readop.hEvent,
writeop.hEvent
};
writeop.hEvent};
unsigned int time = GetTickCount();
if (time - lastWrite > UPDATE_INTERVAL) {
QueueWrite();
@ -358,20 +380,19 @@ public:
physicalControlState[11] = CharToButton(getState[16]);
physicalControlState[12] = CharToButton(getState[15]);
physicalControlState[13] = CharToButton(getState[14]);
physicalControlState[8] = ((getState[2]&4)/4) * FULLY_DOWN;
physicalControlState[9] = ((getState[2]&2)/2) * FULLY_DOWN;
physicalControlState[15] = ((getState[2]&1)/1) * FULLY_DOWN;
physicalControlState[14] = ((getState[2]&8)/8) * FULLY_DOWN;
physicalControlState[8] = ((getState[2] & 4) / 4) * FULLY_DOWN;
physicalControlState[9] = ((getState[2] & 2) / 2) * FULLY_DOWN;
physicalControlState[15] = ((getState[2] & 1) / 1) * FULLY_DOWN;
physicalControlState[14] = ((getState[2] & 8) / 8) * FULLY_DOWN;
physicalControlState[16] = CharToAxis(getState[6]);
physicalControlState[17] = CharToAxis(getState[7]);
physicalControlState[18] = CharToAxis(getState[8]);
physicalControlState[19] = CharToAxis(getState[9]);
physicalControlState[20] = CharToAxis(getState[42]+128);
physicalControlState[21] = CharToAxis(getState[44]+128);
physicalControlState[22] = CharToAxis(getState[46]+128);
physicalControlState[20] = CharToAxis(getState[42] + 128);
physicalControlState[21] = CharToAxis(getState[44] + 128);
physicalControlState[22] = CharToAxis(getState[46] + 128);
continue;
}
else if (res == WAIT_OBJECT_0+1) {
} else if (res == WAIT_OBJECT_0 + 1) {
writing = 0;
if (!writeQueued && (vibration[0] | vibration[1])) {
QueueWrite();
@ -380,10 +401,9 @@ public:
Deactivate();
return 0;
}
}
else {
if (time-dataLastReceived >= DEVICE_CHECK_DELAY) {
if (time-dataLastReceived >= DEVICE_ENUM_DELAY) {
} else {
if (time - dataLastReceived >= DEVICE_CHECK_DELAY) {
if (time - dataLastReceived >= DEVICE_ENUM_DELAY) {
DS3Enum(time);
}
DS3Check(time);
@ -395,12 +415,13 @@ public:
return 1;
}
void SetEffects(unsigned char port, unsigned int slot, unsigned char motor, unsigned char force) {
void SetEffects(unsigned char port, unsigned int slot, unsigned char motor, unsigned char force)
{
ps2Vibration[port][slot][motor] = force;
vibration[0] = vibration[1] = 0;
for (int p=0; p<2; p++) {
for (int s=0; s<4; s++) {
for (int i=0; i<pads[p][s].numFFBindings; i++) {
for (int p = 0; p < 2; p++) {
for (int s = 0; s < 4; s++) {
for (int i = 0; i < pads[p][s].numFFBindings; i++) {
// Technically should also be a *65535/BASE_SENSITIVITY, but that's close enough to 1 for me.
ForceFeedbackBinding *ffb = &pads[p][s].ffBindings[i];
vibration[0] += (int)((ffb->axes[0].force * (__int64)ps2Vibration[p][s][ffb->motor]) / 255);
@ -413,7 +434,8 @@ public:
QueueWrite();
}
void SetEffect(ForceFeedbackBinding *binding, unsigned char force) {
void SetEffect(ForceFeedbackBinding *binding, unsigned char force)
{
PadBindings pBackup = pads[0][0];
pads[0][0].ffBindings = binding;
pads[0][0].numFFBindings = 1;
@ -421,7 +443,8 @@ public:
pads[0][0] = pBackup;
}
void Deactivate() {
void Deactivate()
{
if (hFile != INVALID_HANDLE_VALUE) {
CancelIo(hFile);
CloseHandle(hFile);
@ -442,24 +465,28 @@ public:
active = 0;
}
~DualShock3Device() {
~DualShock3Device()
{
}
};
void EnumDualShock3s() {
if (!InitLibUsb()) return;
void EnumDualShock3s()
{
if (!InitLibUsb())
return;
HidDeviceInfo *foundDevs = 0;
int numDevs = FindHids(&foundDevs, VID, PID);
if (!numDevs) return;
if (!numDevs)
return;
int index = 0;
for (int i=0; i<numDevs; i++) {
for (int i = 0; i < numDevs; i++) {
if (foundDevs[i].caps.FeatureReportByteLength == 49 &&
foundDevs[i].caps.InputReportByteLength == 49 &&
foundDevs[i].caps.OutputReportByteLength == 49) {
wchar_t temp[100];
wsprintfW(temp, L"DualShock 3 #%i", index+1);
wsprintfW(temp, L"DualShock 3 #%i", index + 1);
dm->AddDevice(new DualShock3Device(index, temp, foundDevs[i].path));
index++;
}

View File

@ -45,35 +45,39 @@ typedef int64_t __int64;
#include <cstdarg>
template <typename Array>
void wsprintfW(Array& buf, const wchar_t *format, ...) {
void wsprintfW(Array &buf, const wchar_t *format, ...)
{
va_list a;
va_start(a, format);
vswprintf(buf, sizeof(buf)/sizeof(buf[0]), format, a);
vswprintf(buf, sizeof(buf) / sizeof(buf[0]), format, a);
va_end(a);
}
template <typename Array>
void wsprintf(Array& buf, const wchar_t *format, ...) {
void wsprintf(Array &buf, const wchar_t *format, ...)
{
va_list a;
va_start(a, format);
vswprintf(buf, sizeof(buf)/sizeof(buf[0]), format, a);
vswprintf(buf, sizeof(buf) / sizeof(buf[0]), format, a);
va_end(a);
}
static inline int wcsicmp(const wchar_t* w1, const wchar_t* w2) {
static inline int wcsicmp(const wchar_t *w1, const wchar_t *w2)
{
// I didn't find a way to put ignore case ...
return wcscmp(w1, w2);
}
#include <sys/time.h>
static inline unsigned int timeGetTime() {
static inline unsigned int timeGetTime()
{
struct timeval now;
gettimeofday(&now, NULL);
uint64_t ms = (now.tv_usec/1000) + ((uint64_t)now.tv_sec * 1000);
uint64_t ms = (now.tv_usec / 1000) + ((uint64_t)now.tv_sec * 1000);
return (ms & 0xFFFFFFFF); // MS code is u32 ...
}
@ -95,7 +99,7 @@ extern Window GSwin;
#ifdef _MSC_VER
#define EXPORT_C_(type) extern "C" type CALLBACK
#else
#define EXPORT_C_(type) extern "C" __attribute__((stdcall,externally_visible,visibility("default"))) type CALLBACK
#define EXPORT_C_(type) extern "C" __attribute__((stdcall, externally_visible, visibility("default"))) type CALLBACK
#endif
#ifdef _MSC_VER
@ -136,7 +140,8 @@ extern HINSTANCE hInst;
// Needed for config screen
void GetNameAndVersionString(wchar_t *out);
typedef struct {
typedef struct
{
unsigned char controllerType;
unsigned short buttonStatus;
unsigned char rightJoyX, rightJoyY, leftJoyX, leftJoyY;
@ -144,27 +149,51 @@ typedef struct {
unsigned char reserved[91];
} PadDataS;
EXPORT_C_(void) PADupdate(int pad);
EXPORT_C_(u32) PS2EgetLibType(void);
EXPORT_C_(u32) PS2EgetLibVersion2(u32 type);
EXPORT_C_(char*) PSEgetLibName();
EXPORT_C_(char*) PS2EgetLibName(void);
EXPORT_C_(void) PADshutdown();
EXPORT_C_(s32) PADinit(u32 flags);
EXPORT_C_(s32) PADopen(void *pDsp);
EXPORT_C_(void) PADclose();
EXPORT_C_(u8) PADstartPoll(int pad);
EXPORT_C_(u8) PADpoll(u8 value);
EXPORT_C_(u32) PADquery();
EXPORT_C_(void) PADabout();
EXPORT_C_(s32) PADtest();
EXPORT_C_(keyEvent*) PADkeyEvent();
EXPORT_C_(u32) PADreadPort1 (PadDataS* pads);
EXPORT_C_(u32) PADreadPort2 (PadDataS* pads);
EXPORT_C_(u32) PSEgetLibType();
EXPORT_C_(u32) PSEgetLibVersion();
EXPORT_C_(void) PADconfigure();
EXPORT_C_(s32) PADfreeze(int mode, freezeData *data);
EXPORT_C_(s32) PADsetSlot(u8 port, u8 slot);
EXPORT_C_(s32) PADqueryMtap(u8 port);
EXPORT_C_(void) PADsetSettingsDir(const char *dir);
EXPORT_C_(void)
PADupdate(int pad);
EXPORT_C_(u32)
PS2EgetLibType(void);
EXPORT_C_(u32)
PS2EgetLibVersion2(u32 type);
EXPORT_C_(char *)
PSEgetLibName();
EXPORT_C_(char *)
PS2EgetLibName(void);
EXPORT_C_(void)
PADshutdown();
EXPORT_C_(s32)
PADinit(u32 flags);
EXPORT_C_(s32)
PADopen(void *pDsp);
EXPORT_C_(void)
PADclose();
EXPORT_C_(u8)
PADstartPoll(int pad);
EXPORT_C_(u8)
PADpoll(u8 value);
EXPORT_C_(u32)
PADquery();
EXPORT_C_(void)
PADabout();
EXPORT_C_(s32)
PADtest();
EXPORT_C_(keyEvent *)
PADkeyEvent();
EXPORT_C_(u32)
PADreadPort1(PadDataS *pads);
EXPORT_C_(u32)
PADreadPort2(PadDataS *pads);
EXPORT_C_(u32)
PSEgetLibType();
EXPORT_C_(u32)
PSEgetLibVersion();
EXPORT_C_(void)
PADconfigure();
EXPORT_C_(s32)
PADfreeze(int mode, freezeData *data);
EXPORT_C_(s32)
PADsetSlot(u8 port, u8 slot);
EXPORT_C_(s32)
PADqueryMtap(u8 port);
EXPORT_C_(void)
PADsetSettingsDir(const char *dir);

View File

@ -20,7 +20,8 @@
#include <setupapi.h>
#include <hidsdi.h>
int FindHids(HidDeviceInfo **foundDevs, int vid, int pid) {
int FindHids(HidDeviceInfo **foundDevs, int vid, int pid)
{
GUID GUID_DEVINTERFACE_HID;
int numFoundDevs = 0;
*foundDevs = 0;
@ -29,19 +30,22 @@ int FindHids(HidDeviceInfo **foundDevs, int vid, int pid) {
if (hdev != INVALID_HANDLE_VALUE) {
SP_DEVICE_INTERFACE_DATA devInterfaceData;
devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
for (int i=0; SetupDiEnumDeviceInterfaces(hdev, 0, &GUID_DEVINTERFACE_HID, i, &devInterfaceData); i++) {
for (int i = 0; SetupDiEnumDeviceInterfaces(hdev, 0, &GUID_DEVINTERFACE_HID, i, &devInterfaceData); i++) {
DWORD size = 0;
SetupDiGetDeviceInterfaceDetail(hdev, &devInterfaceData, 0, 0, &size, 0);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER || !size) continue;
SP_DEVICE_INTERFACE_DETAIL_DATA *devInterfaceDetails = (SP_DEVICE_INTERFACE_DETAIL_DATA *) malloc(size);
if (!devInterfaceDetails) continue;
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER || !size)
continue;
SP_DEVICE_INTERFACE_DETAIL_DATA *devInterfaceDetails = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(size);
if (!devInterfaceDetails)
continue;
devInterfaceDetails->cbSize = sizeof(*devInterfaceDetails);
SP_DEVINFO_DATA devInfoData;
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiGetDeviceInterfaceDetail(hdev, &devInterfaceData, devInterfaceDetails, size, &size, &devInfoData)) continue;
if (!SetupDiGetDeviceInterfaceDetail(hdev, &devInterfaceData, devInterfaceDetails, size, &size, &devInfoData))
continue;
HANDLE hfile = CreateFile(devInterfaceDetails->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (hfile != INVALID_HANDLE_VALUE) {
@ -54,7 +58,7 @@ int FindHids(HidDeviceInfo **foundDevs, int vid, int pid) {
if (HidD_GetPreparsedData(hfile, &pData)) {
if (HidP_GetCaps(pData, &caps) == HIDP_STATUS_SUCCESS) {
if (numFoundDevs % 32 == 0) {
*foundDevs = (HidDeviceInfo*) realloc(*foundDevs, sizeof(HidDeviceInfo) * (32 + numFoundDevs));
*foundDevs = (HidDeviceInfo *)realloc(*foundDevs, sizeof(HidDeviceInfo) * (32 + numFoundDevs));
}
HidDeviceInfo *dev = &foundDevs[0][numFoundDevs++];
dev->caps = caps;

View File

@ -20,7 +20,8 @@
#include <hidsdi.h>
struct HidDeviceInfo {
struct HidDeviceInfo
{
HIDP_CAPS caps;
wchar_t *path;
unsigned short vid;

View File

@ -21,12 +21,14 @@
InputDeviceManager *dm = 0;
InputDeviceManager::InputDeviceManager() {
InputDeviceManager::InputDeviceManager()
{
memset(this, 0, sizeof(*this));
}
void InputDeviceManager::ClearDevices() {
for (int i=0; i<numDevices; i++) {
void InputDeviceManager::ClearDevices()
{
for (int i = 0; i < numDevices; i++) {
delete devices[i];
}
free(devices);
@ -34,11 +36,13 @@ void InputDeviceManager::ClearDevices() {
numDevices = 0;
}
InputDeviceManager::~InputDeviceManager() {
InputDeviceManager::~InputDeviceManager()
{
ClearDevices();
}
Device::Device(DeviceAPI api, DeviceType d, const wchar_t *displayName, const wchar_t *instanceID, const wchar_t *productID) {
Device::Device(DeviceAPI api, DeviceType d, const wchar_t *displayName, const wchar_t *instanceID, const wchar_t *productID)
{
memset(pads, 0, sizeof(pads));
this->api = api;
type = d;
@ -73,22 +77,25 @@ Device::Device(DeviceAPI api, DeviceType d, const wchar_t *displayName, const wc
numFFAxes = 0;
}
void Device::FreeState() {
if (virtualControlState) free(virtualControlState);
void Device::FreeState()
{
if (virtualControlState)
free(virtualControlState);
virtualControlState = 0;
oldVirtualControlState = 0;
physicalControlState = 0;
}
Device::~Device() {
Device::~Device()
{
Deactivate();
// Generally called by deactivate, but just in case...
FreeState();
int i;
for (int port=0; port<2; port++) {
for (int slot=0; slot<4; slot++) {
for (int port = 0; port < 2; port++) {
for (int slot = 0; slot < 4; slot++) {
free(pads[port][slot].bindings);
for (i=0; i<pads[port][slot].numFFBindings; i++) {
for (i = 0; i < pads[port][slot].numFFBindings; i++) {
free(pads[port][slot].ffBindings[i].axes);
}
free(pads[port][slot].ffBindings);
@ -96,8 +103,9 @@ Device::~Device() {
}
free(virtualControls);
for (i=numPhysicalControls-1; i>=0; i--) {
if (physicalControls[i].name) free(physicalControls[i].name);
for (i = numPhysicalControls - 1; i >= 0; i--) {
if (physicalControls[i].name)
free(physicalControls[i].name);
}
free(physicalControls);
@ -105,13 +113,13 @@ Device::~Device() {
free(instanceID);
free(productID);
if (ffAxes) {
for (i=0; i<numFFAxes; i++) {
for (i = 0; i < numFFAxes; i++) {
free(ffAxes[i].displayName);
}
free(ffAxes);
}
if (ffEffectTypes) {
for (i=0; i<numFFEffectTypes; i++) {
for (i = 0; i < numFFEffectTypes; i++) {
free(ffEffectTypes[i].displayName);
free(ffEffectTypes[i].effectID);
}
@ -119,71 +127,77 @@ Device::~Device() {
}
}
void Device::AddFFEffectType(const wchar_t *displayName, const wchar_t *effectID, EffectType type) {
ffEffectTypes = (ForceFeedbackEffectType*) realloc(ffEffectTypes, sizeof(ForceFeedbackEffectType) * (numFFEffectTypes+1));
void Device::AddFFEffectType(const wchar_t *displayName, const wchar_t *effectID, EffectType type)
{
ffEffectTypes = (ForceFeedbackEffectType *)realloc(ffEffectTypes, sizeof(ForceFeedbackEffectType) * (numFFEffectTypes + 1));
ffEffectTypes[numFFEffectTypes].displayName = wcsdup(displayName);
ffEffectTypes[numFFEffectTypes].effectID = wcsdup(effectID);
ffEffectTypes[numFFEffectTypes].type = type;
numFFEffectTypes++;
}
void Device::AddFFAxis(const wchar_t *displayName, int id) {
ffAxes = (ForceFeedbackAxis*) realloc(ffAxes, sizeof(ForceFeedbackAxis) * (numFFAxes+1));
void Device::AddFFAxis(const wchar_t *displayName, int id)
{
ffAxes = (ForceFeedbackAxis *)realloc(ffAxes, sizeof(ForceFeedbackAxis) * (numFFAxes + 1));
ffAxes[numFFAxes].id = id;
ffAxes[numFFAxes].displayName = wcsdup(displayName);
numFFAxes++;
int bindingsExist = 0;
for (int port=0; port<2; port++) {
for (int slot=0; slot<4; slot++) {
for (int i=0; i<pads[port][slot].numFFBindings; i++) {
ForceFeedbackBinding *b = pads[port][slot].ffBindings+i;
b->axes = (AxisEffectInfo*) realloc(b->axes, sizeof(AxisEffectInfo) * (numFFAxes));
memset(b->axes + (numFFAxes-1), 0, sizeof(AxisEffectInfo));
for (int port = 0; port < 2; port++) {
for (int slot = 0; slot < 4; slot++) {
for (int i = 0; i < pads[port][slot].numFFBindings; i++) {
ForceFeedbackBinding *b = pads[port][slot].ffBindings + i;
b->axes = (AxisEffectInfo *)realloc(b->axes, sizeof(AxisEffectInfo) * (numFFAxes));
memset(b->axes + (numFFAxes - 1), 0, sizeof(AxisEffectInfo));
bindingsExist = 1;
}
}
}
// Generally the case when not loading a binding file.
if (!bindingsExist) {
int i = numFFAxes-1;
int i = numFFAxes - 1;
ForceFeedbackAxis temp = ffAxes[i];
while (i && temp.id < ffAxes[i-1].id) {
ffAxes[i] = ffAxes[i-1];
while (i && temp.id < ffAxes[i - 1].id) {
ffAxes[i] = ffAxes[i - 1];
i--;
}
ffAxes[i] = temp;
}
}
void Device::AllocState() {
void Device::AllocState()
{
FreeState();
virtualControlState = (int*) calloc(numVirtualControls + numVirtualControls + numPhysicalControls, sizeof(int));
virtualControlState = (int *)calloc(numVirtualControls + numVirtualControls + numPhysicalControls, sizeof(int));
oldVirtualControlState = virtualControlState + numVirtualControls;
physicalControlState = oldVirtualControlState + numVirtualControls;
}
void Device::FlipState() {
memcpy(oldVirtualControlState, virtualControlState, sizeof(int)*numVirtualControls);
void Device::FlipState()
{
memcpy(oldVirtualControlState, virtualControlState, sizeof(int) * numVirtualControls);
}
void Device::PostRead() {
void Device::PostRead()
{
FlipState();
}
void Device::CalcVirtualState() {
for (int i=0; i<numPhysicalControls; i++) {
PhysicalControl *c = physicalControls+i;
void Device::CalcVirtualState()
{
for (int i = 0; i < numPhysicalControls; i++) {
PhysicalControl *c = physicalControls + i;
int index = c->baseVirtualControlIndex;
int val = physicalControlState[i];
if (c->type & BUTTON) {
virtualControlState[index] = val;
// DirectInput keyboard events only.
if (this->api == DI && this->type == KEYBOARD) {
if (!(virtualControlState[index]>>15) != !(oldVirtualControlState[index]>>15) && c->vkey) {
if (!(virtualControlState[index] >> 15) != !(oldVirtualControlState[index] >> 15) && c->vkey) {
// Check for alt-F4 to avoid toggling skip mode incorrectly.
if (c->vkey == VK_F4) {
int i;
for (i=0; i<numPhysicalControls; i++) {
for (i = 0; i < numPhysicalControls; i++) {
if (virtualControlState[physicalControls[i].baseVirtualControlIndex] &&
(physicalControls[i].vkey == VK_MENU ||
physicalControls[i].vkey == VK_RMENU ||
@ -191,72 +205,73 @@ void Device::CalcVirtualState() {
break;
}
}
if (i<numPhysicalControls) continue;
if (i < numPhysicalControls)
continue;
}
int event = KEYPRESS;
if (!(virtualControlState[index]>>15)) event = KEYRELEASE;
if (!(virtualControlState[index] >> 15))
event = KEYRELEASE;
QueueKeyEvent(c->vkey, event);
}
}
}
else if (c->type & ABSAXIS) {
virtualControlState[index] = (val + FULLY_DOWN)/2;
} else if (c->type & ABSAXIS) {
virtualControlState[index] = (val + FULLY_DOWN) / 2;
// Positive. Overkill.
virtualControlState[index+1] = (val & ~(val>>31));
virtualControlState[index + 1] = (val & ~(val >> 31));
// Negative
virtualControlState[index+2] = (-val & (val>>31));
}
else if (c->type & RELAXIS) {
virtualControlState[index + 2] = (-val & (val >> 31));
} else if (c->type & RELAXIS) {
int delta = val - oldVirtualControlState[index];
virtualControlState[index] = val;
// Positive
virtualControlState[index+1] = (delta & ~(delta>>31));
virtualControlState[index + 1] = (delta & ~(delta >> 31));
// Negative
virtualControlState[index+2] = (-delta & (delta>>31));
}
else if (c->type & POV) {
virtualControlState[index + 2] = (-delta & (delta >> 31));
} else if (c->type & POV) {
virtualControlState[index] = val;
int iSouth = 0;
int iEast = 0;
if ((unsigned int)val <= 37000) {
double angle = val * (3.141592653589793/18000.0);
double angle = val * (3.141592653589793 / 18000.0);
double East = sin(angle);
double South = -cos(angle);
// Normalize so greatest direction is 1.
// Normalize so greatest direction is 1.
#ifdef __linux__
double mul = FULLY_DOWN / std::max(fabs(South), fabs(East));
#else
double mul = FULLY_DOWN / max(fabs(South), fabs(East));
#endif
iEast = (int) floor(East * mul + 0.5);
iSouth = (int) floor(South * mul + 0.5);
iEast = (int)floor(East * mul + 0.5);
iSouth = (int)floor(South * mul + 0.5);
}
// N
virtualControlState[index+1] = (-iSouth & (iSouth>>31));
virtualControlState[index + 1] = (-iSouth & (iSouth >> 31));
// S
virtualControlState[index+3] = (iSouth & ~(iSouth>>31));
virtualControlState[index + 3] = (iSouth & ~(iSouth >> 31));
// E
virtualControlState[index+2] = (iEast & ~(iEast>>31));
virtualControlState[index + 2] = (iEast & ~(iEast >> 31));
// W
virtualControlState[index+4] = (-iEast & (iEast>>31));
virtualControlState[index + 4] = (-iEast & (iEast >> 31));
}
}
}
VirtualControl *Device::GetVirtualControl(unsigned int uid) {
for (int i=0; i<numVirtualControls; i++) {
VirtualControl *Device::GetVirtualControl(unsigned int uid)
{
for (int i = 0; i < numVirtualControls; i++) {
if (virtualControls[i].uid == uid)
return virtualControls + i;
}
return 0;
}
VirtualControl *Device::AddVirtualControl(unsigned int uid, int physicalControlIndex) {
VirtualControl *Device::AddVirtualControl(unsigned int uid, int physicalControlIndex)
{
// Not really necessary, as always call AllocState when activated, but doesn't hurt.
FreeState();
if (numVirtualControls % 16 == 0) {
virtualControls = (VirtualControl*) realloc(virtualControls, sizeof(VirtualControl)*(numVirtualControls+16));
virtualControls = (VirtualControl *)realloc(virtualControls, sizeof(VirtualControl) * (numVirtualControls + 16));
}
VirtualControl *c = virtualControls + numVirtualControls;
@ -267,31 +282,31 @@ VirtualControl *Device::AddVirtualControl(unsigned int uid, int physicalControlI
return c;
}
PhysicalControl *Device::AddPhysicalControl(ControlType type, unsigned short id, unsigned short vkey, const wchar_t *name) {
PhysicalControl *Device::AddPhysicalControl(ControlType type, unsigned short id, unsigned short vkey, const wchar_t *name)
{
// Not really necessary, as always call AllocState when activated, but doesn't hurt.
FreeState();
if (numPhysicalControls % 16 == 0) {
physicalControls = (PhysicalControl*) realloc(physicalControls, sizeof(PhysicalControl)*(numPhysicalControls+16));
physicalControls = (PhysicalControl *)realloc(physicalControls, sizeof(PhysicalControl) * (numPhysicalControls + 16));
}
PhysicalControl *control = physicalControls + numPhysicalControls;
memset(control, 0, sizeof(PhysicalControl));
control->type = type;
control->id = id;
if (name) control->name = wcsdup(name);
if (name)
control->name = wcsdup(name);
control->baseVirtualControlIndex = numVirtualControls;
unsigned int uid = id | (type<<16);
unsigned int uid = id | (type << 16);
if (type & BUTTON) {
AddVirtualControl(uid, numPhysicalControls);
control->vkey = vkey;
}
else if (type & AXIS) {
} else if (type & AXIS) {
AddVirtualControl(uid | UID_AXIS, numPhysicalControls);
AddVirtualControl(uid | UID_AXIS_POS, numPhysicalControls);
AddVirtualControl(uid | UID_AXIS_NEG, numPhysicalControls);
}
else if (type & POV) {
} else if (type & POV) {
AddVirtualControl(uid | UID_POV, numPhysicalControls);
AddVirtualControl(uid | UID_POV_N, numPhysicalControls);
AddVirtualControl(uid | UID_POV_E, numPhysicalControls);
@ -302,88 +317,91 @@ PhysicalControl *Device::AddPhysicalControl(ControlType type, unsigned short id,
return control;
}
void Device::SetEffects(unsigned char port, unsigned int slot, unsigned char motor, unsigned char force) {
for (int i=0; i<pads[port][slot].numFFBindings; i++) {
ForceFeedbackBinding *binding = pads[port][slot].ffBindings+i;
void Device::SetEffects(unsigned char port, unsigned int slot, unsigned char motor, unsigned char force)
{
for (int i = 0; i < pads[port][slot].numFFBindings; i++) {
ForceFeedbackBinding *binding = pads[port][slot].ffBindings + i;
if (binding->motor == motor) {
SetEffect(binding, force);
}
}
}
wchar_t *GetDefaultControlName(unsigned short id, int type) {
wchar_t *GetDefaultControlName(unsigned short id, int type)
{
static wchar_t name[20];
if (type & BUTTON) {
wsprintfW(name, L"Button %i", id);
}
else if (type & AXIS) {
} else if (type & AXIS) {
wsprintfW(name, L"Axis %i", id);
}
else if (type & POV) {
} else if (type & POV) {
wsprintfW(name, L"POV %i", id);
}
else {
} else {
wcscpy(name, L"Unknown");
}
return name;
}
wchar_t *Device::GetVirtualControlName(VirtualControl *control) {
wchar_t *Device::GetVirtualControlName(VirtualControl *control)
{
static wchar_t temp[100];
wchar_t *baseName = 0;
if (control->physicalControlIndex >= 0) {
baseName = physicalControls[control->physicalControlIndex].name;
if (!baseName) baseName = GetPhysicalControlName(&physicalControls[control->physicalControlIndex]);
if (!baseName)
baseName = GetPhysicalControlName(&physicalControls[control->physicalControlIndex]);
}
unsigned int uid = control->uid;
if (!baseName) {
baseName = GetDefaultControlName(uid & 0xFFFF, (uid >> 16)& 0x1F);
baseName = GetDefaultControlName(uid & 0xFFFF, (uid >> 16) & 0x1F);
}
uid &= 0xFF000000;
int len = (int)wcslen(baseName);
if (len > 99) len = 99;
memcpy(temp, baseName, len*sizeof(wchar_t));
if (len > 99)
len = 99;
memcpy(temp, baseName, len * sizeof(wchar_t));
temp[len] = 0;
if (uid) {
if (len > 95) len = 95;
wchar_t *out = temp+len;
if (len > 95)
len = 95;
wchar_t *out = temp + len;
if (uid == UID_AXIS_POS) {
wcscpy(out, L" +");
}
else if (uid == UID_AXIS_NEG) {
} else if (uid == UID_AXIS_NEG) {
wcscpy(out, L" -");
}
else if (uid == UID_POV_N) {
} else if (uid == UID_POV_N) {
wcscpy(out, L" N");
}
else if (uid == UID_POV_E) {
} else if (uid == UID_POV_E) {
wcscpy(out, L" E");
}
else if (uid == UID_POV_S) {
} else if (uid == UID_POV_S) {
wcscpy(out, L" S");
}
else if (uid == UID_POV_W) {
} else if (uid == UID_POV_W) {
wcscpy(out, L" W");
}
}
return temp;
}
wchar_t *Device::GetPhysicalControlName(PhysicalControl *control) {
if (control->name) return control->name;
wchar_t *Device::GetPhysicalControlName(PhysicalControl *control)
{
if (control->name)
return control->name;
return GetDefaultControlName(control->id, control->type);
}
void InputDeviceManager::AddDevice(Device *d) {
devices = (Device**) realloc(devices, sizeof(Device*) * (numDevices+1));
void InputDeviceManager::AddDevice(Device *d)
{
devices = (Device **)realloc(devices, sizeof(Device *) * (numDevices + 1));
devices[numDevices++] = d;
}
void InputDeviceManager::Update(InitInfo *info) {
for (int i=0; i<numDevices; i++) {
void InputDeviceManager::Update(InitInfo *info)
{
for (int i = 0; i < numDevices; i++) {
if (devices[i]->enabled) {
if (!devices[i]->active) {
if (!devices[i]->Activate(info) || !devices[i]->Update()) continue;
if (!devices[i]->Activate(info) || !devices[i]->Update())
continue;
devices[i]->CalcVirtualState();
devices[i]->PostRead();
}
@ -393,49 +411,53 @@ void InputDeviceManager::Update(InitInfo *info) {
}
}
void InputDeviceManager::PostRead() {
for (int i=0; i<numDevices; i++) {
void InputDeviceManager::PostRead()
{
for (int i = 0; i < numDevices; i++) {
if (devices[i]->active)
devices[i]->PostRead();
}
}
Device *InputDeviceManager::GetActiveDevice(InitInfo *info, unsigned int *uid, int *index, int *value) {
Device *InputDeviceManager::GetActiveDevice(InitInfo *info, unsigned int *uid, int *index, int *value)
{
int i, j;
Update(info);
int bestDiff = FULLY_DOWN/2;
int bestDiff = FULLY_DOWN / 2;
Device *bestDevice = 0;
for (i=0; i<numDevices; i++) {
for (i = 0; i < numDevices; i++) {
if (devices[i]->active) {
for (j=0; j<devices[i]->numVirtualControls; j++) {
if (devices[i]->virtualControlState[j] == devices[i]->oldVirtualControlState[j]) continue;
if (devices[i]->virtualControls[j].uid & UID_POV) continue;
for (j = 0; j < devices[i]->numVirtualControls; j++) {
if (devices[i]->virtualControlState[j] == devices[i]->oldVirtualControlState[j])
continue;
if (devices[i]->virtualControls[j].uid & UID_POV)
continue;
// Fix for releasing button used to click on bind button
if (!((devices[i]->virtualControls[j].uid>>16) & (POV|RELAXIS|ABSAXIS))) {
if (!((devices[i]->virtualControls[j].uid >> 16) & (POV | RELAXIS | ABSAXIS))) {
if (abs(devices[i]->oldVirtualControlState[j]) > abs(devices[i]->virtualControlState[j])) {
devices[i]->oldVirtualControlState[j] = 0;
}
}
int diff = abs(devices[i]->virtualControlState[j] - devices[i]->oldVirtualControlState[j]);
// Make it require a bit more work to bind relative axes.
if (((devices[i]->virtualControls[j].uid>>16) & 0xFF) == RELAXIS) {
diff = diff/4+1;
if (((devices[i]->virtualControls[j].uid >> 16) & 0xFF) == RELAXIS) {
diff = diff / 4 + 1;
}
// Less pressure needed to bind DS3/SCP buttons.
if ((devices[i]->api == DS3 || devices[i]->api == XINPUT) && (((devices[i]->virtualControls[j].uid>>16) & 0xFF) & BUTTON)) {
if ((devices[i]->api == DS3 || devices[i]->api == XINPUT) && (((devices[i]->virtualControls[j].uid >> 16) & 0xFF) & BUTTON)) {
diff *= 4;
}
if (diff > bestDiff) {
if (devices[i]->virtualControls[j].uid & UID_AXIS) {
if ((((devices[i]->virtualControls[j].uid>>16)&0xFF) != ABSAXIS)) continue;
if ((((devices[i]->virtualControls[j].uid >> 16) & 0xFF) != ABSAXIS))
continue;
// Very picky when binding entire axes. Prefer binding half-axes.
if (!((devices[i]->oldVirtualControlState[j] < FULLY_DOWN/32 && devices[i]->virtualControlState[j] > FULLY_DOWN/8) ||
(devices[i]->oldVirtualControlState[j] > 31*FULLY_DOWN/32 && devices[i]->virtualControlState[j] < 7*FULLY_DOWN/8))) {
if (!((devices[i]->oldVirtualControlState[j] < FULLY_DOWN / 32 && devices[i]->virtualControlState[j] > FULLY_DOWN / 8) ||
(devices[i]->oldVirtualControlState[j] > 31 * FULLY_DOWN / 32 && devices[i]->virtualControlState[j] < 7 * FULLY_DOWN / 8))) {
continue;
}
}
else if ((((devices[i]->virtualControls[j].uid>>16)&0xFF) == ABSAXIS)) {
if (devices[i]->oldVirtualControlState[j] > 15*FULLY_DOWN/16)
} else if ((((devices[i]->virtualControls[j].uid >> 16) & 0xFF) == ABSAXIS)) {
if (devices[i]->oldVirtualControlState[j] > 15 * FULLY_DOWN / 16)
continue;
}
bestDiff = diff;
@ -443,10 +465,9 @@ Device *InputDeviceManager::GetActiveDevice(InitInfo *info, unsigned int *uid, i
*index = j;
bestDevice = devices[i];
if (value) {
if ((devices[i]->virtualControls[j].uid>>16)& RELAXIS) {
if ((devices[i]->virtualControls[j].uid >> 16) & RELAXIS) {
*value = devices[i]->virtualControlState[j] - devices[i]->oldVirtualControlState[j];
}
else {
} else {
*value = devices[i]->virtualControlState[j];
}
}
@ -459,35 +480,41 @@ Device *InputDeviceManager::GetActiveDevice(InitInfo *info, unsigned int *uid, i
return bestDevice;
}
void InputDeviceManager::ReleaseInput() {
for (int i=0; i<numDevices; i++) {
if (devices[i]->active) devices[i]->Deactivate();
void InputDeviceManager::ReleaseInput()
{
for (int i = 0; i < numDevices; i++) {
if (devices[i]->active)
devices[i]->Deactivate();
}
}
void InputDeviceManager::EnableDevices(DeviceType type, DeviceAPI api) {
for (int i=0; i<numDevices; i++) {
void InputDeviceManager::EnableDevices(DeviceType type, DeviceAPI api)
{
for (int i = 0; i < numDevices; i++) {
if (devices[i]->api == api && devices[i]->type == type) {
EnableDevice(i);
}
}
}
void InputDeviceManager::DisableAllDevices() {
for (int i=0; i<numDevices; i++) {
void InputDeviceManager::DisableAllDevices()
{
for (int i = 0; i < numDevices; i++) {
DisableDevice(i);
}
}
void InputDeviceManager::DisableDevice(int index) {
void InputDeviceManager::DisableDevice(int index)
{
devices[index]->enabled = 0;
if (devices[index]->active) {
devices[index]->Deactivate();
}
}
ForceFeedbackEffectType *Device::GetForcefeedbackEffect(wchar_t *id) {
for (int i=0; i<numFFEffectTypes; i++) {
ForceFeedbackEffectType *Device::GetForcefeedbackEffect(wchar_t *id)
{
for (int i = 0; i < numFFEffectTypes; i++) {
if (!wcsicmp(id, ffEffectTypes[i].effectID)) {
return &ffEffectTypes[i];
}
@ -495,26 +522,29 @@ ForceFeedbackEffectType *Device::GetForcefeedbackEffect(wchar_t *id) {
return 0;
}
ForceFeedbackAxis *Device::GetForceFeedbackAxis(int id) {
for (int i=0; i<numFFAxes; i++) {
if (ffAxes[i].id == id) return &ffAxes[i];
ForceFeedbackAxis *Device::GetForceFeedbackAxis(int id)
{
for (int i = 0; i < numFFAxes; i++) {
if (ffAxes[i].id == id)
return &ffAxes[i];
}
return 0;
}
void InputDeviceManager::CopyBindings(int numOldDevices, Device **oldDevices) {
int *oldMatches = (int*) malloc(sizeof(int) * numOldDevices);
int *matches = (int*) malloc(sizeof(int) * numDevices);
void InputDeviceManager::CopyBindings(int numOldDevices, Device **oldDevices)
{
int *oldMatches = (int *)malloc(sizeof(int) * numOldDevices);
int *matches = (int *)malloc(sizeof(int) * numDevices);
int i, j, port, slot;
Device *old, *dev;
for (i=0; i<numDevices; i++) {
for (i = 0; i < numDevices; i++) {
matches[i] = -1;
}
for (i=0; i<numOldDevices; i++) {
for (i = 0; i < numOldDevices; i++) {
oldMatches[i] = -2;
old = oldDevices[i];
for (port=0; port<2; port++) {
for (slot=0; slot<4; slot++) {
for (port = 0; port < 2; port++) {
for (slot = 0; slot < 4; slot++) {
if (old->pads[port][slot].numBindings + old->pads[port][slot].numFFBindings) {
// Means that there are bindings.
oldMatches[i] = -1;
@ -523,10 +553,11 @@ void InputDeviceManager::CopyBindings(int numOldDevices, Device **oldDevices) {
}
}
// Loops through ids looking for match, from most specific to most general.
for (int id=0; id<3; id++) {
for (i=0; i<numOldDevices; i++) {
if (oldMatches[i] >= 0) continue;
for (j=0; j<numDevices; j++) {
for (int id = 0; id < 3; id++) {
for (i = 0; i < numOldDevices; i++) {
if (oldMatches[i] >= 0)
continue;
for (j = 0; j < numDevices; j++) {
if (matches[j] >= 0) {
continue;
}
@ -544,37 +575,37 @@ void InputDeviceManager::CopyBindings(int numOldDevices, Device **oldDevices) {
}
}
for (i=0; i<numOldDevices; i++) {
if (oldMatches[i] == -2) continue;
for (i = 0; i < numOldDevices; i++) {
if (oldMatches[i] == -2)
continue;
old = oldDevices[i];
if (oldMatches[i] < 0) {
dev = new Device(old->api, old->type, old->displayName, old->instanceID, old->productID);
dev->attached = 0;
AddDevice(dev);
for (j=0; j<old->numVirtualControls; j++) {
VirtualControl *c = old->virtualControls+j;
for (j = 0; j < old->numVirtualControls; j++) {
VirtualControl *c = old->virtualControls + j;
dev->AddVirtualControl(c->uid, -1);
}
for (j=0; j<old->numFFEffectTypes; j++) {
ForceFeedbackEffectType * effect = old->ffEffectTypes + j;
for (j = 0; j < old->numFFEffectTypes; j++) {
ForceFeedbackEffectType *effect = old->ffEffectTypes + j;
dev->AddFFEffectType(effect->displayName, effect->effectID, effect->type);
}
for (j=0; j<old->numFFAxes; j++) {
ForceFeedbackAxis * axis = old->ffAxes + j;
for (j = 0; j < old->numFFAxes; j++) {
ForceFeedbackAxis *axis = old->ffAxes + j;
dev->AddFFAxis(axis->displayName, axis->id);
}
// Just steal the old bindings directly when there's no matching device.
// Indices will be the same.
memcpy(dev->pads, old->pads, sizeof(old->pads));
memset(old->pads, 0, sizeof(old->pads));
}
else {
} else {
dev = devices[oldMatches[i]];
for (port=0; port<2; port++) {
for (slot=0; slot<4; slot++) {
for (port = 0; port < 2; port++) {
for (slot = 0; slot < 4; slot++) {
if (old->pads[port][slot].numBindings) {
dev->pads[port][slot].bindings = (Binding*) malloc(old->pads[port][slot].numBindings * sizeof(Binding));
for (int j=0; j<old->pads[port][slot].numBindings; j++) {
dev->pads[port][slot].bindings = (Binding *)malloc(old->pads[port][slot].numBindings * sizeof(Binding));
for (int j = 0; j < old->pads[port][slot].numBindings; j++) {
Binding *bo = old->pads[port][slot].bindings + j;
Binding *bn = dev->pads[port][slot].bindings + dev->pads[port][slot].numBindings;
VirtualControl *cn = dev->GetVirtualControl(old->virtualControls[bo->controlIndex].uid);
@ -586,16 +617,16 @@ void InputDeviceManager::CopyBindings(int numOldDevices, Device **oldDevices) {
}
}
if (old->pads[port][slot].numFFBindings) {
dev->pads[port][slot].ffBindings = (ForceFeedbackBinding*) malloc(old->pads[port][slot].numFFBindings * sizeof(ForceFeedbackBinding));
for (int j=0; j<old->pads[port][slot].numFFBindings; j++) {
dev->pads[port][slot].ffBindings = (ForceFeedbackBinding *)malloc(old->pads[port][slot].numFFBindings * sizeof(ForceFeedbackBinding));
for (int j = 0; j < old->pads[port][slot].numFFBindings; j++) {
ForceFeedbackBinding *bo = old->pads[port][slot].ffBindings + j;
ForceFeedbackBinding *bn = dev->pads[port][slot].ffBindings + dev->pads[port][slot].numFFBindings;
ForceFeedbackEffectType *en = dev->GetForcefeedbackEffect(old->ffEffectTypes[bo->effectIndex].effectID);
if (en) {
*bn = *bo;
bn->effectIndex = en - dev->ffEffectTypes;
bn->axes = (AxisEffectInfo*)calloc(dev->numFFAxes, sizeof(AxisEffectInfo));
for (int k=0; k<old->numFFAxes; k++) {
bn->axes = (AxisEffectInfo *)calloc(dev->numFFAxes, sizeof(AxisEffectInfo));
for (int k = 0; k < old->numFFAxes; k++) {
ForceFeedbackAxis *newAxis = dev->GetForceFeedbackAxis(old->ffAxes[k].id);
if (newAxis) {
bn->axes[newAxis - dev->ffAxes] = bo->axes[k];
@ -613,12 +644,12 @@ void InputDeviceManager::CopyBindings(int numOldDevices, Device **oldDevices) {
free(matches);
}
void InputDeviceManager::SetEffect(unsigned char port, unsigned int slot, unsigned char motor, unsigned char force) {
for (int i=0; i<numDevices; i++) {
void InputDeviceManager::SetEffect(unsigned char port, unsigned int slot, unsigned char motor, unsigned char force)
{
for (int i = 0; i < numDevices; i++) {
Device *dev = devices[i];
if (dev->enabled && dev->numFFEffectTypes) {
dev->SetEffects(port, slot, motor, force);
}
}
}

View File

@ -23,10 +23,10 @@
// Fully down means that value corresponds to a button being fully down (255).
// a value of 128 or more corresponds to that button being pressed, for binary
// values.
#define BASE_SENSITIVITY (1<<16)
#define FULLY_DOWN (1<<16)
#define BASE_SENSITIVITY (1 << 16)
#define FULLY_DOWN (1 << 16)
#define DEFAULT_DEADZONE (BASE_SENSITIVITY * 201/1000)
#define DEFAULT_DEADZONE (BASE_SENSITIVITY * 201 / 1000)
/* Idea is for this file and the associated cpp file to be Windows independent.
* Still more effort than it's worth to port to Linux, however.
@ -65,7 +65,8 @@ enum ControlType {
#define BINARY_BUTTON (PSHBTN | TGLBTN)
#define AXIS 3
struct Binding {
struct Binding
{
int controlIndex;
int command;
int sensitivity;
@ -73,22 +74,23 @@ struct Binding {
unsigned char turbo;
};
#define UID_AXIS (1U<<31)
#define UID_POV (1<<30)
#define UID_AXIS (1U << 31)
#define UID_POV (1 << 30)
#define UID_AXIS_POS (1U<<24)
#define UID_AXIS_NEG (2U<<24)
#define UID_POV_N (3<<24)
#define UID_POV_E (4<<24)
#define UID_POV_S (5<<24)
#define UID_POV_W (6<<24)
#define UID_AXIS_POS (1U << 24)
#define UID_AXIS_NEG (2U << 24)
#define UID_POV_N (3 << 24)
#define UID_POV_E (4 << 24)
#define UID_POV_S (5 << 24)
#define UID_POV_W (6 << 24)
// One of these exists for each bindable object.
// Bindable objects consist of buttons, axis, pov controls,
// and individual axis/pov directions. Not that pov controls
// cannot actually be bound, but when trying to bind as an axis,
// all directions are assigned individually.
struct VirtualControl {
struct VirtualControl
{
// Unique id for control, given device. Based on source control's id,
// source control type, axis/pov flags if it's a pov/axis (Rather than
// a button or a pov/axis control's individual button), and an index,
@ -103,7 +105,8 @@ struct VirtualControl {
// updates their state, standard function then populates
// the VirtualControls and queues the keyboard messages, if
// needed.
struct PhysicalControl {
struct PhysicalControl
{
// index of the first virtual control corresponding to this.
// Buttons have 1 virtual control, axes 3, and povs 5, all
// in a row.
@ -152,11 +155,13 @@ enum EffectType {
// Order matches ForceFeedbackAxis order. force of 0 means to
// ignore that axis completely. Force of 1 or -1 means to initialize
// the axis with minimum force (Possibly 0 force), if applicable.
struct AxisEffectInfo {
struct AxisEffectInfo
{
int force;
};
struct ForceFeedbackBinding {
struct ForceFeedbackBinding
{
AxisEffectInfo *axes;
int effectIndex;
unsigned char motor;
@ -164,7 +169,8 @@ struct ForceFeedbackBinding {
// Bindings listed by effect, so I don't have to bother with
// indexing effects.
struct ForceFeedbackEffectType {
struct ForceFeedbackEffectType
{
wchar_t *displayName;
// Because I'm lazy, can only have ASCII characters and no spaces.
wchar_t *effectID;
@ -173,7 +179,8 @@ struct ForceFeedbackEffectType {
};
struct ForceFeedbackAxis {
struct ForceFeedbackAxis
{
wchar_t *displayName;
int id;
};
@ -184,7 +191,8 @@ struct ForceFeedbackAxis {
// one set of generic devices. Then I enumerate all devices. Then I merge
// them, moving settings from the generic devices to the enumerated ones.
struct PadBindings {
struct PadBindings
{
Binding *bindings;
int numBindings;
ForceFeedbackBinding *ffBindings;
@ -193,7 +201,8 @@ struct PadBindings {
class WndProcEater;
struct InitInfo {
struct InitInfo
{
// 1 when binding key to ignore.
int bindingIgnore;
// 1 when binding.
@ -205,7 +214,7 @@ struct InitInfo {
// For config screen, need to eat button's message handling.
//HWND hWndButton;
WndProcEater* hWndProc;
WndProcEater *hWndProc;
#else
// Linux equivalent to HWND
Display *GSdsp;
@ -216,7 +225,8 @@ struct InitInfo {
// Mostly self-contained, but bindings are modified by config.cpp, to make
// updating the ListView simpler.
class Device {
class Device
{
public:
DeviceAPI api;
DeviceType type;
@ -228,13 +238,15 @@ public:
#ifdef _MSC_VER
// Not all devices need to subclass the windproc, but most do so might as well
// put it here... --air
WndProcEater* hWndProc;
WndProcEater *hWndProc;
#endif
union {
union
{
// Allows for one loop to compare all 3 in order.
wchar_t *IDs[3];
struct {
struct
{
// Same as DisplayName, when not given. Absolutely must be unique.
// Used for loading/saving controls. If matches, all other strings
// are ignored, so must be unique.
@ -298,17 +310,20 @@ public:
void CalcVirtualState();
virtual int Activate(InitInfo *args) {
virtual int Activate(InitInfo *args)
{
return 0;
}
inline virtual void Deactivate() {
inline virtual void Deactivate()
{
FreeState();
active = 0;
}
// Default update proc. All that's needed for post-based APIs.
inline virtual int Update() {
inline virtual int Update()
{
return active;
}
@ -328,7 +343,8 @@ public:
virtual void PostRead();
};
class InputDeviceManager {
class InputDeviceManager
{
public:
Device **devices;
int numDevices;
@ -362,7 +378,8 @@ public:
void ReleaseInput();
void DisableDevice(int index);
inline void EnableDevice(int i) {
inline void EnableDevice(int i)
{
devices[i]->enabled = 1;
}

View File

@ -34,7 +34,8 @@ static u8 lastQueuedEvent = 0;
static u8 nextQueuedEvent = 0;
static keyEvent queuedEvents[EVENT_QUEUE_LEN];
void QueueKeyEvent(int key, int event) {
void QueueKeyEvent(int key, int event)
{
#ifdef _MSC_VER
if (!csInitialized) {
csInitialized = 1;
@ -70,8 +71,10 @@ void QueueKeyEvent(int key, int event) {
#endif
}
int GetQueuedKeyEvent(keyEvent *event) {
if (lastQueuedEvent == nextQueuedEvent) return 0;
int GetQueuedKeyEvent(keyEvent *event)
{
if (lastQueuedEvent == nextQueuedEvent)
return 0;
#ifdef _MSC_VER
EnterCriticalSection(&cSection);
@ -86,7 +89,8 @@ int GetQueuedKeyEvent(keyEvent *event) {
return 1;
}
void ClearKeyQueue() {
void ClearKeyQueue()
{
lastQueuedEvent = nextQueuedEvent;
#ifdef _MSC_VER
if (csInitialized) {

View File

@ -26,7 +26,7 @@ int GetQueuedKeyEvent(keyEvent *event);
void ClearKeyQueue();
#ifdef __linux__
void R_QueueKeyEvent(const keyEvent& event);
void R_QueueKeyEvent(const keyEvent &event);
int R_GetQueuedKeyEvent(keyEvent *event);
void R_ClearKeyQueue();
#endif

File diff suppressed because it is too large Load Diff

View File

@ -73,61 +73,66 @@ remove 0x10F0 to compute the cmd value
#endif
struct GeneralSettingsBool {
struct GeneralSettingsBool
{
const wchar_t *name;
unsigned int ControlId;
u8 defaultValue;
};
// XXX: I try to remove only gui stuff
void DeleteBinding(int port, int slot, Device *dev, Binding *b) {
void DeleteBinding(int port, int slot, Device *dev, Binding *b)
{
fprintf(stderr, "delete binding %d:%d\n", port, slot);
Binding *bindings = dev->pads[port][slot].bindings;
int i = b - bindings;
memmove(bindings+i, bindings+i+1, sizeof(Binding) * (dev->pads[port][slot].numBindings - i - 1));
memmove(bindings + i, bindings + i + 1, sizeof(Binding) * (dev->pads[port][slot].numBindings - i - 1));
dev->pads[port][slot].numBindings--;
}
void DeleteBinding(int port, int slot, Device *dev, ForceFeedbackBinding *b) {
void DeleteBinding(int port, int slot, Device *dev, ForceFeedbackBinding *b)
{
ForceFeedbackBinding *bindings = dev->pads[port][slot].ffBindings;
int i = b - bindings;
memmove(bindings+i, bindings+i+1, sizeof(Binding) * (dev->pads[port][slot].numFFBindings - i - 1));
memmove(bindings + i, bindings + i + 1, sizeof(Binding) * (dev->pads[port][slot].numFFBindings - i - 1));
dev->pads[port][slot].numFFBindings--;
}
int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int slot, int command, int sensitivity, int turbo, int deadZone) {
int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int slot, int command, int sensitivity, int turbo, int deadZone)
{
// Checks needed because I use this directly when loading bindings.
if (port > 1 || slot>3) {
if (port > 1 || slot > 3) {
return -1;
}
if (!sensitivity) sensitivity = BASE_SENSITIVITY;
if ((uid>>16) & (PSHBTN|TGLBTN)) {
if (!sensitivity)
sensitivity = BASE_SENSITIVITY;
if ((uid >> 16) & (PSHBTN | TGLBTN)) {
deadZone = 0;
}
else if (!deadZone) {
if ((uid>>16) & PRESSURE_BTN) {
} else if (!deadZone) {
if ((uid >> 16) & PRESSURE_BTN) {
deadZone = 1;
}
else {
} else {
deadZone = DEFAULT_DEADZONE;
}
}
// Relative axes can have negative sensitivity.
else if (((uid>>16) & 0xFF) == RELAXIS) {
else if (((uid >> 16) & 0xFF) == RELAXIS) {
sensitivity = abs(sensitivity);
}
VirtualControl *c = dev->GetVirtualControl(uid);
if (!c) return -1;
if (!c)
return -1;
// Add before deleting. Means I won't scroll up one line when scrolled down to bottom.
int controlIndex = c - dev->virtualControls;
int index = 0;
PadBindings *p = dev->pads[port]+slot;
p->bindings = (Binding*) realloc(p->bindings, (p->numBindings+1) * sizeof(Binding));
PadBindings *p = dev->pads[port] + slot;
p->bindings = (Binding *)realloc(p->bindings, (p->numBindings + 1) * sizeof(Binding));
for (index = p->numBindings; index > 0; index--) {
if (p->bindings[index-1].controlIndex < controlIndex) break;
p->bindings[index] = p->bindings[index-1];
if (p->bindings[index - 1].controlIndex < controlIndex)
break;
p->bindings[index] = p->bindings[index - 1];
}
Binding *b = p->bindings+index;
Binding *b = p->bindings + index;
p->numBindings++;
b->command = command;
b->controlIndex = controlIndex;
@ -141,7 +146,7 @@ int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int s
index = 0;
while (index < p->numBindings) {
if (index == newBindingIndex) {
index ++;
index++;
continue;
}
b = p->bindings + index;
@ -149,10 +154,9 @@ int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int s
if (config.multipleBinding) {
if (b->controlIndex == controlIndex && b->command == command)
nuke = 1;
}
else {
} else {
int uid2 = dev->virtualControls[b->controlIndex].uid;
if (b->controlIndex == controlIndex || (!((uid2^uid) & 0xFFFFFF) && ((uid|uid2) & (UID_POV | UID_AXIS))))
if (b->controlIndex == controlIndex || (!((uid2 ^ uid) & 0xFFFFFF) && ((uid | uid2) & (UID_POV | UID_AXIS))))
nuke = 1;
}
if (!nuke) {
@ -166,14 +170,15 @@ int BindCommand(Device *dev, unsigned int uid, unsigned int port, unsigned int s
DeleteBinding(port, slot, dev, b);
}
if (!config.multipleBinding) {
for (int port2=0; port2<2; port2++) {
for (int slot2=0; slot2<4; slot2++) {
if (port2==(int)port && slot2 == (int)slot) continue;
PadBindings *p = dev->pads[port2]+slot2;
for (int i=0; i < p->numBindings; i++) {
Binding *b = p->bindings+i;
for (int port2 = 0; port2 < 2; port2++) {
for (int slot2 = 0; slot2 < 4; slot2++) {
if (port2 == (int)port && slot2 == (int)slot)
continue;
PadBindings *p = dev->pads[port2] + slot2;
for (int i = 0; i < p->numBindings; i++) {
Binding *b = p->bindings + i;
int uid2 = dev->virtualControls[b->controlIndex].uid;
if (b->controlIndex == controlIndex || (!((uid2^uid) & 0xFFFFFF) && ((uid|uid2) & (UID_POV | UID_AXIS)))) {
if (b->controlIndex == controlIndex || (!((uid2 ^ uid) & 0xFFFFFF) && ((uid | uid2) & (UID_POV | UID_AXIS)))) {
DeleteBinding(port2, slot2, dev, b);
i--;
}
@ -210,15 +215,16 @@ const GeneralSettingsBool BoolOptionsInfo[] = {
{L"Turbo Key Hack", 0 /*IDC_TURBO_KEY_HACK*/, 0},
};
void CALLBACK PADsetSettingsDir( const char *dir )
void CALLBACK PADsetSettingsDir(const char *dir)
{
CfgHelper::SetSettingsDir(dir);
}
int SaveSettings(wchar_t *file=0) {
int SaveSettings(wchar_t *file = 0)
{
CfgHelper cfg;
for (size_t i=0; i<sizeof(BoolOptionsInfo)/sizeof(BoolOptionsInfo[0]); i++) {
for (size_t i = 0; i < sizeof(BoolOptionsInfo) / sizeof(BoolOptionsInfo[0]); i++) {
cfg.WriteBool(L"General Settings", BoolOptionsInfo[i].name, config.bools[i]);
}
cfg.WriteInt(L"General Settings", L"Close Hacks", config.closeHacks);
@ -226,8 +232,8 @@ int SaveSettings(wchar_t *file=0) {
cfg.WriteInt(L"General Settings", L"Keyboard Mode", config.keyboardApi);
cfg.WriteInt(L"General Settings", L"Mouse Mode", config.mouseApi);
for (int port=0; port<2; port++) {
for (int slot=0; slot<4; slot++) {
for (int port = 0; port < 2; port++) {
for (int slot = 0; slot < 4; slot++) {
wchar_t temp[50];
wsprintf(temp, L"Pad %i %i", port, slot);
cfg.WriteInt(temp, L"Mode", config.padConfigs[port][slot].type);
@ -238,7 +244,7 @@ int SaveSettings(wchar_t *file=0) {
if (!dm)
return 0;
for (int i=0; i<dm->numDevices; i++) {
for (int i = 0; i < dm->numDevices; i++) {
wchar_t id[50];
wchar_t temp[50], temp2[1000];
wsprintfW(id, L"Device %i", i);
@ -246,9 +252,11 @@ int SaveSettings(wchar_t *file=0) {
wchar_t *name = dev->displayName;
while (name[0] == '[') {
wchar_t *name2 = wcschr(name, ']');
if (!name2) break;
name = name2+1;
while (iswspace(name[0])) name++;
if (!name2)
break;
name = name2 + 1;
while (iswspace(name[0]))
name++;
}
cfg.WriteStr(id, L"Display Name", name);
@ -260,22 +268,22 @@ int SaveSettings(wchar_t *file=0) {
cfg.WriteInt(id, L"Type", dev->type);
int ffBindingCount = 0;
int bindingCount = 0;
for (int port=0; port<2; port++) {
for (int slot=0; slot<4; slot++) {
for (int j=0; j<dev->pads[port][slot].numBindings; j++) {
Binding *b = dev->pads[port][slot].bindings+j;
for (int port = 0; port < 2; port++) {
for (int slot = 0; slot < 4; slot++) {
for (int j = 0; j < dev->pads[port][slot].numBindings; j++) {
Binding *b = dev->pads[port][slot].bindings + j;
VirtualControl *c = &dev->virtualControls[b->controlIndex];
wsprintfW(temp, L"Binding %i", bindingCount++);
wsprintfW(temp2, L"0x%08X, %i, %i, %i, %i, %i, %i", c->uid, port, b->command, b->sensitivity, b->turbo, slot, b->deadZone);
cfg.WriteStr(id, temp, temp2);
}
for (int j=0; j<dev->pads[port][slot].numFFBindings; j++) {
ForceFeedbackBinding *b = dev->pads[port][slot].ffBindings+j;
for (int j = 0; j < dev->pads[port][slot].numFFBindings; j++) {
ForceFeedbackBinding *b = dev->pads[port][slot].ffBindings + j;
ForceFeedbackEffectType *eff = &dev->ffEffectTypes[b->effectIndex];
wsprintfW(temp, L"FF Binding %i", ffBindingCount++);
wsprintfW(temp2, L"%s %i, %i, %i", eff->effectID, port, b->motor, slot);
for (int k=0; k<dev->numFFAxes; k++) {
for (int k = 0; k < dev->numFFAxes; k++) {
ForceFeedbackAxis *axis = dev->ffAxes + k;
AxisEffectInfo *info = b->axes + k;
//wsprintfW(wcschr(temp2,0), L", %i, %i", axis->id, info->force);
@ -291,8 +299,10 @@ int SaveSettings(wchar_t *file=0) {
return 0;
}
int LoadSettings(int force, wchar_t *file) {
if (dm && !force) return 0;
int LoadSettings(int force, wchar_t *file)
{
if (dm && !force)
return 0;
// Could just do ClearDevices() instead, but if I ever add any extra stuff,
// this will still work.
@ -301,28 +311,30 @@ int LoadSettings(int force, wchar_t *file) {
CfgHelper cfg;
for (size_t i=0; i<sizeof(BoolOptionsInfo)/sizeof(BoolOptionsInfo[0]); i++) {
for (size_t i = 0; i < sizeof(BoolOptionsInfo) / sizeof(BoolOptionsInfo[0]); i++) {
config.bools[i] = cfg.ReadBool(L"General Settings", BoolOptionsInfo[i].name, BoolOptionsInfo[i].defaultValue);
}
config.closeHacks = (u8)cfg.ReadInt(L"General Settings", L"Close Hacks");
if (config.closeHacks&1) config.closeHacks &= ~2;
if (config.closeHacks & 1)
config.closeHacks &= ~2;
config.keyboardApi = (DeviceAPI)cfg.ReadInt(L"General Settings", L"Keyboard Mode", LNX_KEYBOARD);
if (!config.keyboardApi) config.keyboardApi = LNX_KEYBOARD;
config.mouseApi = (DeviceAPI) cfg.ReadInt(L"General Settings", L"Mouse Mode");
if (!config.keyboardApi)
config.keyboardApi = LNX_KEYBOARD;
config.mouseApi = (DeviceAPI)cfg.ReadInt(L"General Settings", L"Mouse Mode");
for (int port=0; port<2; port++) {
for (int slot=0; slot<4; slot++) {
for (int port = 0; port < 2; port++) {
for (int slot = 0; slot < 4; slot++) {
wchar_t temp[50];
wsprintf(temp, L"Pad %i %i", port, slot);
config.padConfigs[port][slot].type = (PadType) cfg.ReadInt(temp, L"Mode", Dualshock2Pad);
config.padConfigs[port][slot].type = (PadType)cfg.ReadInt(temp, L"Mode", Dualshock2Pad);
config.padConfigs[port][slot].autoAnalog = cfg.ReadBool(temp, L"Auto Analog");
}
}
int i=0;
int i = 0;
int multipleBinding = config.multipleBinding;
// Disabling multiple binding only prevents new multiple bindings.
config.multipleBinding = 1;
@ -332,7 +344,8 @@ int LoadSettings(int force, wchar_t *file) {
wsprintfW(id, L"Device %i", i++);
if (!cfg.ReadStr(id, L"Display Name", temp2) || !temp2[0] ||
!cfg.ReadStr(id, L"Instance ID", temp3) || !temp3[0]) {
if (i >= 100) break;
if (i >= 100)
break;
continue;
}
wchar_t *id2 = 0;
@ -341,7 +354,8 @@ int LoadSettings(int force, wchar_t *file) {
int api = cfg.ReadInt(id, L"API");
int type = cfg.ReadInt(id, L"Type");
if (!api || !type) continue;
if (!api || !type)
continue;
Device *dev = new Device((DeviceAPI)api, (DeviceType)type, temp2, temp3, id2);
dev->attached = 0;
@ -352,7 +366,8 @@ int LoadSettings(int force, wchar_t *file) {
wsprintfW(temp, L"Binding %i", j++);
if (!cfg.ReadStr(id, temp, temp2)) {
if (j >= 100) {
if (!last) break;
if (!last)
break;
last = 0;
}
continue;
@ -370,7 +385,8 @@ int LoadSettings(int force, wchar_t *file) {
int len = sscanf(string, " %u , %i , %i , %i , %i , %i , %i", &uid, &port, &command, &sensitivity, &turbo, &slot, &deadZone);
if (len >= 5 && type) {
VirtualControl *c = dev->GetVirtualControl(uid);
if (!c) c = dev->AddVirtualControl(uid, -1);
if (!c)
c = dev->AddVirtualControl(uid, -1);
if (c) {
BindCommand(dev, uid, port, slot, command, sensitivity, turbo, deadZone);
}
@ -381,7 +397,8 @@ int LoadSettings(int force, wchar_t *file) {
wsprintfW(temp, L"FF Binding %i", j++);
if (!cfg.ReadStr(id, temp, temp2)) {
if (j >= 10) {
if (!last) break;
if (!last)
break;
last = 0;
}
continue;
@ -399,8 +416,9 @@ int LoadSettings(int force, wchar_t *file) {
// wcstok not in ntdll. More effore than its worth to shave off
// whitespace without it.
if (sscanf(string, " %s %i , %i , %i", effect, &port, &motor, &slot) == 4) {
char *s = strchr(strchr(strchr(string, ',')+1, ',')+1, ',');
if (!s) continue;
char *s = strchr(strchr(strchr(string, ',') + 1, ',') + 1, ',');
if (!s)
continue;
s++;
w = 0;
while (effect[w]) {
@ -448,14 +466,16 @@ int LoadSettings(int force, wchar_t *file) {
return 0;
}
void UnloadConfigs() {
void UnloadConfigs()
{
if (dm) {
delete dm;
dm = 0;
}
}
void RefreshEnabledDevices(int updateDeviceList) {
void RefreshEnabledDevices(int updateDeviceList)
{
// Clears all device state.
static int lastXInputState = -1;
if (updateDeviceList || lastXInputState != config.gameApis.xInput) {
@ -463,12 +483,12 @@ void RefreshEnabledDevices(int updateDeviceList) {
lastXInputState = config.gameApis.xInput;
}
for (int i=0; i<dm->numDevices; i++) {
for (int i = 0; i < dm->numDevices; i++) {
Device *dev = dm->devices[i];
// XXX windows magic?
if (!dev->attached && dev->displayName[0] != '[') {
wchar_t *newName = (wchar_t*) malloc(sizeof(wchar_t) * (wcslen(dev->displayName) + 12));
wchar_t *newName = (wchar_t *)malloc(sizeof(wchar_t) * (wcslen(dev->displayName) + 12));
wsprintfW(newName, L"[Detached] %s", dev->displayName);
free(dev->displayName);
dev->displayName = newName;
@ -499,7 +519,8 @@ void RefreshEnabledDevices(int updateDeviceList) {
}
}
void Configure() {
void Configure()
{
// Can end up here without PADinit() being called first.
LoadSettings();
// Can also end up here after running emulator a bit, and possibly

View File

@ -22,7 +22,7 @@
wxString CfgHelper::m_path = L"inis/LilyPad.ini";
void CfgHelper::SetSettingsDir(const char* dir)
void CfgHelper::SetSettingsDir(const char *dir)
{
m_path = wxString::FromAscii(dir) + L"/LilyPad.ini";
}
@ -37,37 +37,37 @@ CfgHelper::~CfgHelper()
delete m_config;
}
void CfgHelper::setIni(const wchar_t* Section)
void CfgHelper::setIni(const wchar_t *Section)
{
m_config->SetPath(wxsFormat(L"/%s", Section));
}
void CfgHelper::WriteBool(const wchar_t* Section, const wchar_t* Name, bool Value)
void CfgHelper::WriteBool(const wchar_t *Section, const wchar_t *Name, bool Value)
{
setIni(Section);
m_config->Write(Name, Value);
}
void CfgHelper::WriteInt(const wchar_t* Section, const wchar_t* Name, int Value)
void CfgHelper::WriteInt(const wchar_t *Section, const wchar_t *Name, int Value)
{
setIni(Section);
m_config->Write(Name, Value);
}
void CfgHelper::WriteFloat(const wchar_t* Section, const wchar_t* Name, float Value)
void CfgHelper::WriteFloat(const wchar_t *Section, const wchar_t *Name, float Value)
{
setIni(Section);
m_config->Write(Name, (double)Value);
}
void CfgHelper::WriteStr(const wchar_t* Section, const wchar_t* Name, const wxString& Data)
void CfgHelper::WriteStr(const wchar_t *Section, const wchar_t *Name, const wxString &Data)
{
setIni(Section);
m_config->Write(Name, Data);
}
bool CfgHelper::ReadBool(const wchar_t *Section,const wchar_t* Name, bool Default)
bool CfgHelper::ReadBool(const wchar_t *Section, const wchar_t *Name, bool Default)
{
bool ret;
@ -77,7 +77,7 @@ bool CfgHelper::ReadBool(const wchar_t *Section,const wchar_t* Name, bool Defaul
return ret;
}
int CfgHelper::ReadInt(const wchar_t* Section, const wchar_t* Name,int Default)
int CfgHelper::ReadInt(const wchar_t *Section, const wchar_t *Name, int Default)
{
int ret;
@ -87,7 +87,7 @@ int CfgHelper::ReadInt(const wchar_t* Section, const wchar_t* Name,int Default)
return ret;
}
float CfgHelper::ReadFloat(const wchar_t* Section, const wchar_t* Name, float Default)
float CfgHelper::ReadFloat(const wchar_t *Section, const wchar_t *Name, float Default)
{
double ret;
@ -97,14 +97,14 @@ float CfgHelper::ReadFloat(const wchar_t* Section, const wchar_t* Name, float De
return (float)ret;
}
int CfgHelper::ReadStr(const wchar_t* Section, const wchar_t* Name, wchar_t* Data, const wchar_t* Default)
int CfgHelper::ReadStr(const wchar_t *Section, const wchar_t *Name, wchar_t *Data, const wchar_t *Default)
{
setIni(Section);
wcscpy(Data, m_config->Read(Name, Default).wc_str());
return wcslen(Data);
}
int CfgHelper::ReadStr(const wchar_t* Section, const wchar_t* Name, wxString& Data, const wchar_t* Default)
int CfgHelper::ReadStr(const wchar_t *Section, const wchar_t *Name, wxString &Data, const wchar_t *Default)
{
setIni(Section);
Data = m_config->Read(Name, Default);

View File

@ -20,29 +20,29 @@
#include "Global.h"
#include <wx/fileconf.h>
extern void CfgSetSettingsDir(const char* dir);
extern void CfgSetSettingsDir(const char *dir);
class CfgHelper {
wxFileConfig* m_config;
class CfgHelper
{
wxFileConfig *m_config;
static wxString m_path;
void setIni(const wchar_t* Section);
void setIni(const wchar_t *Section);
public:
public:
CfgHelper();
~CfgHelper();
void WriteBool(const wchar_t* Section, const wchar_t* Name, bool Value);
void WriteInt(const wchar_t* Section, const wchar_t* Name, int Value);
void WriteFloat(const wchar_t* Section, const wchar_t* Name, float Value);
void WriteStr(const wchar_t* Section, const wchar_t* Name, const wxString& Data);
void WriteBool(const wchar_t *Section, const wchar_t *Name, bool Value);
void WriteInt(const wchar_t *Section, const wchar_t *Name, int Value);
void WriteFloat(const wchar_t *Section, const wchar_t *Name, float Value);
void WriteStr(const wchar_t *Section, const wchar_t *Name, const wxString &Data);
bool ReadBool(const wchar_t *Section,const wchar_t* Name, bool Default = false);
int ReadStr(const wchar_t* Section, const wchar_t* Name, wxString& Data, const wchar_t* Default = 0);
int ReadStr(const wchar_t* Section, const wchar_t* Name, wchar_t* Data, const wchar_t* Default = 0);
int ReadInt(const wchar_t* Section, const wchar_t* Name,int Default = 0);
float ReadFloat(const wchar_t* Section, const wchar_t* Name, float Default = 0.0f);
static void SetSettingsDir(const char* dir);
bool ReadBool(const wchar_t *Section, const wchar_t *Name, bool Default = false);
int ReadStr(const wchar_t *Section, const wchar_t *Name, wxString &Data, const wchar_t *Default = 0);
int ReadStr(const wchar_t *Section, const wchar_t *Name, wchar_t *Data, const wchar_t *Default = 0);
int ReadInt(const wchar_t *Section, const wchar_t *Name, int Default = 0);
float ReadFloat(const wchar_t *Section, const wchar_t *Name, float Default = 0.0f);
static void SetSettingsDir(const char *dir);
};

View File

@ -20,7 +20,10 @@
#include "Linux/JoyEvdev.h"
#include "Linux/bitmaskros.h"
JoyEvdev::JoyEvdev(int fd, bool ds3, const wchar_t *id) : Device(LNX_JOY, OTHER, id, id), m_fd(fd) {
JoyEvdev::JoyEvdev(int fd, bool ds3, const wchar_t *id)
: Device(LNX_JOY, OTHER, id, id)
, m_fd(fd)
{
// XXX LNX_JOY => DS3 or ???
m_abs.clear();
@ -91,21 +94,24 @@ JoyEvdev::JoyEvdev(int fd, bool ds3, const wchar_t *id) : Device(LNX_JOY, OTHER,
fprintf(stderr, "New device created. Found axe:%zu, buttons:%zu, m_rel:%zu\n\n", m_abs.size(), m_btn.size(), m_rel.size());
}
JoyEvdev::~JoyEvdev() {
JoyEvdev::~JoyEvdev()
{
close(m_fd);
}
int JoyEvdev::Activate(InitInfo* args) {
int JoyEvdev::Activate(InitInfo *args)
{
AllocState();
uint16_t size = m_abs.size()+m_rel.size()+m_btn.size();
memset(physicalControlState, 0, sizeof(int)*size);
uint16_t size = m_abs.size() + m_rel.size() + m_btn.size();
memset(physicalControlState, 0, sizeof(int) * size);
active = 1;
return 1;
}
int JoyEvdev::Update() {
int JoyEvdev::Update()
{
struct input_event events[32];
int len;
int status = 0;
@ -116,9 +122,8 @@ int JoyEvdev::Update() {
int evt_nb = len / sizeof(input_event);
//fprintf(stderr, "Poll %d events available\n", evt_nb);
for (int i = 0; i < evt_nb; i++) {
switch(events[i].type) {
case EV_ABS:
{
switch (events[i].type) {
case EV_ABS: {
for (size_t idx = 0; idx < m_abs.size(); idx++) {
if (m_abs[idx].code == events[i].code) {
// XXX strict or not ?
@ -131,10 +136,8 @@ int JoyEvdev::Update() {
}
}
}
}
break;
case EV_KEY:
{
} break;
case EV_KEY: {
for (size_t idx = 0; idx < m_btn.size(); idx++) {
if (m_btn[idx] == events[i].code) {
fprintf(stderr, "Event KEY:%d detected with value %d\n", events[i].code, events[i].value);
@ -144,8 +147,7 @@ int JoyEvdev::Update() {
}
}
}
break;
} break;
case EV_REL:
// XXX
break;
@ -153,14 +155,14 @@ int JoyEvdev::Update() {
break;
}
}
}
return status;
}
static std::wstring CorrectJoySupport(int fd) {
static std::wstring CorrectJoySupport(int fd)
{
struct input_id id;
if (ioctl(fd, EVIOCGID, &id) < 0) {
fprintf(stderr, "Invalid IOCTL EVIOCGID\n");
@ -180,7 +182,8 @@ static std::wstring CorrectJoySupport(int fd) {
return std::wstring(s.begin(), s.end());
}
void EnumJoystickEvdev() {
void EnumJoystickEvdev()
{
// Technically it must be done with udev but another lib for
// avoid a loop is too much for me (even if udev is mandatory
// so maybe later)
@ -204,5 +207,4 @@ void EnumJoystickEvdev() {
} else if (fd >= 0)
close(fd);
}
}

View File

@ -23,7 +23,8 @@
#include <fcntl.h>
#include <linux/input.h>
struct abs_info {
struct abs_info
{
uint16_t code;
int32_t min;
int32_t max;
@ -31,46 +32,52 @@ struct abs_info {
int32_t factor;
int32_t translation;
abs_info(int32_t _code, int32_t _min, int32_t _max, ControlType type) : code(_code), min(_min), max(_max) {
abs_info(int32_t _code, int32_t _min, int32_t _max, ControlType type)
: code(_code)
, min(_min)
, max(_max)
{
translation = 0;
// Note: ABSAXIS ranges from -64K to 64K
// Note: PSHBTN ranges from 0 to 64K
if ((min == 0) && (max == 255)) {
if (type == ABSAXIS) {
translation = 128;
factor = FULLY_DOWN/128;
factor = FULLY_DOWN / 128;
} else {
factor = FULLY_DOWN/256;
factor = FULLY_DOWN / 256;
}
} else if ((min == -1) && (max == 1)) {
factor = FULLY_DOWN;
} else if ((min == 0) && (std::abs(max - 127) < 2)) {
translation = 64;
factor = -FULLY_DOWN/64;
factor = -FULLY_DOWN / 64;
} else if ((max == 255) && (std::abs(min - 127) < 2)) {
translation = 64+128;
factor = FULLY_DOWN/64;
translation = 64 + 128;
factor = FULLY_DOWN / 64;
} else {
fprintf(stderr, "Scale not supported\n");
factor = 0;
}
}
int scale(int32_t value) {
int scale(int32_t value)
{
return (value - translation) * factor;
}
};
class JoyEvdev : public Device {
class JoyEvdev : public Device
{
int m_fd;
std::vector<abs_info> m_abs;
std::vector<uint16_t> m_btn;
std::vector<uint16_t> m_rel;
public:
public:
JoyEvdev(int fd, bool ds3, const wchar_t *id);
~JoyEvdev();
int Activate(InitInfo* args);
int Activate(InitInfo *args);
int Update();
};

View File

@ -20,15 +20,16 @@
// actually it is even more but it is enough to distinguish different key
#define MAX_KEYCODE (0xFF)
LinuxKeyboard::LinuxKeyboard() :
Device(LNX_KEYBOARD, KEYBOARD, L"displayName", L"instanceID", L"deviceID")
LinuxKeyboard::LinuxKeyboard()
: Device(LNX_KEYBOARD, KEYBOARD, L"displayName", L"instanceID", L"deviceID")
{
for (int i=0; i<MAX_KEYCODE; i++) {
for (int i = 0; i < MAX_KEYCODE; i++) {
AddPhysicalControl(PSHBTN, i, i);
}
}
int LinuxKeyboard::Activate(InitInfo* args) {
int LinuxKeyboard::Activate(InitInfo *args)
{
// Always active
active = 1;
@ -45,12 +46,13 @@ int LinuxKeyboard::Activate(InitInfo* args) {
}
#endif
// Every button released
memset(physicalControlState, 0, sizeof(int)*MAX_KEYCODE);
memset(physicalControlState, 0, sizeof(int) * MAX_KEYCODE);
return 1;
}
int LinuxKeyboard::Update() {
int LinuxKeyboard::Update()
{
keyEvent event;
int status = 0;
while (R_GetQueuedKeyEvent(&event)) {
@ -73,6 +75,7 @@ int LinuxKeyboard::Update() {
return status; // XXX ????
}
void EnumLnx() {
void EnumLnx()
{
dm->AddDevice(new LinuxKeyboard());
}

View File

@ -19,10 +19,11 @@
#include "InputManager.h"
#include "KeyboardQueue.h"
class LinuxKeyboard : public Device {
public:
class LinuxKeyboard : public Device
{
public:
LinuxKeyboard();
int Activate(InitInfo* args);
int Activate(InitInfo *args);
int Update();
};

View File

@ -32,7 +32,8 @@ static u8 R_lastQueuedEvent = 0;
static u8 R_nextQueuedEvent = 0;
static keyEvent R_queuedEvents[R_EVENT_QUEUE_LEN];
void R_QueueKeyEvent(const keyEvent &evt) {
void R_QueueKeyEvent(const keyEvent &evt)
{
std::lock_guard<std::mutex> lock(core_event);
R_queuedEvents[R_lastQueuedEvent] = evt;
@ -41,8 +42,10 @@ void R_QueueKeyEvent(const keyEvent &evt) {
assert(R_nextQueuedEvent != R_lastQueuedEvent);
}
int R_GetQueuedKeyEvent(keyEvent *event) {
if (R_lastQueuedEvent == R_nextQueuedEvent) return 0;
int R_GetQueuedKeyEvent(keyEvent *event)
{
if (R_lastQueuedEvent == R_nextQueuedEvent)
return 0;
std::lock_guard<std::mutex> lock(core_event);
*event = R_queuedEvents[R_nextQueuedEvent];
@ -50,11 +53,13 @@ int R_GetQueuedKeyEvent(keyEvent *event) {
return 1;
}
void R_ClearKeyQueue() {
void R_ClearKeyQueue()
{
R_lastQueuedEvent = R_nextQueuedEvent;
}
EXPORT_C_(void) PADWriteEvent(keyEvent &evt)
EXPORT_C_(void)
PADWriteEvent(keyEvent &evt)
{
R_QueueKeyEvent(evt);
}

View File

@ -24,17 +24,17 @@
#define nBitsPerUchar (sizeof(unsigned char) * 8)
/* Number of unsigned chars to contain a given number of bits */
#define nUcharsForNBits(nBits) ((((nBits)-1)/nBitsPerUchar)+1)
#define nUcharsForNBits(nBits) ((((nBits)-1) / nBitsPerUchar) + 1)
/* Index=Offset of given bit in 1 unsigned char */
#define bitOffsetInUchar(bit) ((bit)%nBitsPerUchar)
#define bitOffsetInUchar(bit) ((bit) % nBitsPerUchar)
/* Index=Offset of the unsigned char associated to the bit
at the given index=offset */
#define ucharIndexForBit(bit) ((bit)/nBitsPerUchar)
#define ucharIndexForBit(bit) ((bit) / nBitsPerUchar)
/* Value of an unsigned char with bit set at given index=offset */
#define ucharValueForBit(bit) (((unsigned char)(1))<<bitOffsetInUchar(bit))
#define ucharValueForBit(bit) (((unsigned char)(1)) << bitOffsetInUchar(bit))
/* Test the bit with given index=offset in an unsigned char array */
#define testBit(bit, array) ((array[ucharIndexForBit(bit)] >> bitOffsetInUchar(bit)) & 1)

View File

@ -26,7 +26,8 @@
ExtraWndProcResult RawInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *output);
int GetRawKeyboards(HWND hWnd) {
int GetRawKeyboards(HWND hWnd)
{
RAWINPUTDEVICE Rid;
Rid.hwndTarget = hWnd;
@ -36,7 +37,8 @@ int GetRawKeyboards(HWND hWnd) {
return RegisterRawInputDevices(&Rid, 1, sizeof(Rid));
}
void ReleaseRawKeyboards() {
void ReleaseRawKeyboards()
{
RAWINPUTDEVICE Rid;
Rid.hwndTarget = 0;
@ -46,7 +48,8 @@ void ReleaseRawKeyboards() {
RegisterRawInputDevices(&Rid, 1, sizeof(Rid));
}
int GetRawMice(HWND hWnd) {
int GetRawMice(HWND hWnd)
{
RAWINPUTDEVICE Rid;
Rid.hwndTarget = hWnd;
@ -56,7 +59,8 @@ int GetRawMice(HWND hWnd) {
return RegisterRawInputDevices(&Rid, 1, sizeof(Rid));
}
void ReleaseRawMice() {
void ReleaseRawMice()
{
RAWINPUTDEVICE Rid;
Rid.hwndTarget = 0;
@ -72,15 +76,19 @@ static int rawKeyboardActivatedCount = 0;
// Same for mice.
static int rawMouseActivatedCount = 0;
class RawInputKeyboard : public WindowsKeyboard {
class RawInputKeyboard : public WindowsKeyboard
{
public:
HANDLE hDevice;
RawInputKeyboard(HANDLE hDevice, wchar_t *name, wchar_t *instanceID=0) : WindowsKeyboard(RAW, name, instanceID) {
RawInputKeyboard(HANDLE hDevice, wchar_t *name, wchar_t *instanceID = 0)
: WindowsKeyboard(RAW, name, instanceID)
{
this->hDevice = hDevice;
}
int Activate(InitInfo *initInfo) {
int Activate(InitInfo *initInfo)
{
Deactivate();
hWndProc = initInfo->hWndProc;
@ -100,11 +108,12 @@ public:
return 1;
}
void Deactivate() {
void Deactivate()
{
FreeState();
if (active) {
active = 0;
rawKeyboardActivatedCount --;
rawKeyboardActivatedCount--;
if (!rawKeyboardActivatedCount) {
ReleaseRawKeyboards();
if (!rawMouseActivatedCount)
@ -114,15 +123,19 @@ public:
}
};
class RawInputMouse : public WindowsMouse {
class RawInputMouse : public WindowsMouse
{
public:
HANDLE hDevice;
RawInputMouse(HANDLE hDevice, wchar_t *name, wchar_t *instanceID=0, wchar_t *productID=0) : WindowsMouse(RAW, 0, name, instanceID, productID) {
RawInputMouse(HANDLE hDevice, wchar_t *name, wchar_t *instanceID = 0, wchar_t *productID = 0)
: WindowsMouse(RAW, 0, name, instanceID, productID)
{
this->hDevice = hDevice;
}
int Activate(InitInfo *initInfo) {
int Activate(InitInfo *initInfo)
{
Deactivate();
hWndProc = initInfo->hWndProc;
@ -147,11 +160,12 @@ public:
return 1;
}
void Deactivate() {
void Deactivate()
{
FreeState();
if (active) {
active = 0;
rawMouseActivatedCount --;
rawMouseActivatedCount--;
if (!rawMouseActivatedCount) {
ReleaseRawMice();
ReleaseMouseCapture();
@ -163,26 +177,29 @@ public:
}
};
ExtraWndProcResult RawInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *output) {
ExtraWndProcResult RawInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *output)
{
if (uMsg == WM_INPUT) {
if (GET_RAWINPUT_CODE_WPARAM (wParam) == RIM_INPUT) {
if (GET_RAWINPUT_CODE_WPARAM(wParam) == RIM_INPUT) {
RAWINPUT in;
unsigned int size = sizeof(RAWINPUT);
if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, &in, &size, sizeof(RAWINPUTHEADER)) > 0) {
for (int i=0; i<dm->numDevices; i++) {
for (int i = 0; i < dm->numDevices; i++) {
Device *dev = dm->devices[i];
if (dev->api != RAW || !dev->active) continue;
if (dev->api != RAW || !dev->active)
continue;
if (in.header.dwType == RIM_TYPEKEYBOARD && dev->type == KEYBOARD) {
RawInputKeyboard* rik = (RawInputKeyboard*)dev;
if (rik->hDevice != in.header.hDevice) continue;
RawInputKeyboard *rik = (RawInputKeyboard *)dev;
if (rik->hDevice != in.header.hDevice)
continue;
u32 uMsg = in.data.keyboard.Message;
if (!(in.data.keyboard.VKey>>8))
rik->UpdateKey((u8) in.data.keyboard.VKey, (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN));
}
else if (in.header.dwType == RIM_TYPEMOUSE && dev->type == MOUSE) {
RawInputMouse* rim = (RawInputMouse*)dev;
if (rim->hDevice != in.header.hDevice) continue;
if (!(in.data.keyboard.VKey >> 8))
rik->UpdateKey((u8)in.data.keyboard.VKey, (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN));
} else if (in.header.dwType == RIM_TYPEMOUSE && dev->type == MOUSE) {
RawInputMouse *rim = (RawInputMouse *)dev;
if (rim->hDevice != in.header.hDevice)
continue;
if (in.data.mouse.usFlags) {
// Never been set for me, and specs on what most of them
// actually mean is sorely lacking. Also, specs erroneously
@ -202,7 +219,7 @@ ExtraWndProcResult RawInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
buttons >>= 2;
}
if (in.data.mouse.usButtonFlags & RI_MOUSE_WHEEL) {
rim->UpdateAxis(2, ((short)in.data.mouse.usButtonData)/WHEEL_DELTA);
rim->UpdateAxis(2, ((short)in.data.mouse.usButtonData) / WHEEL_DELTA);
}
if (in.data.mouse.lLastX || in.data.mouse.lLastY) {
rim->UpdateAxis(0, in.data.mouse.lLastX);
@ -212,15 +229,14 @@ ExtraWndProcResult RawInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
}
}
}
}
else if (uMsg == WM_ACTIVATE) {
for (int i=0; i<dm->numDevices; i++) {
} else if (uMsg == WM_ACTIVATE) {
for (int i = 0; i < dm->numDevices; i++) {
Device *dev = dm->devices[i];
if (dev->api != RAW || dev->physicalControlState == 0) continue;
if (dev->api != RAW || dev->physicalControlState == 0)
continue;
memset(dev->physicalControlState, 0, sizeof(int) * dev->numPhysicalControls);
}
}
else if (uMsg == WM_SIZE && rawMouseActivatedCount) {
} else if (uMsg == WM_SIZE && rawMouseActivatedCount) {
// Doesn't really matter for raw mice, as I disable legacy stuff, but shouldn't hurt.
WindowsMouse::WindowResized(hWnd);
}
@ -228,23 +244,25 @@ ExtraWndProcResult RawInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
return CONTINUE_BLISSFULLY;
}
void EnumRawInputDevices() {
void EnumRawInputDevices()
{
int count = 0;
if (GetRawInputDeviceList(0, (unsigned int*)&count, sizeof(RAWINPUTDEVICELIST)) != (UINT)-1 && count > 0) {
wchar_t *instanceID = (wchar_t *) malloc(41000*sizeof(wchar_t));
if (GetRawInputDeviceList(0, (unsigned int *)&count, sizeof(RAWINPUTDEVICELIST)) != (UINT)-1 && count > 0) {
wchar_t *instanceID = (wchar_t *)malloc(41000 * sizeof(wchar_t));
wchar_t *keyName = instanceID + 11000;
wchar_t *displayName = keyName + 10000;
wchar_t *productID = displayName + 10000;
RAWINPUTDEVICELIST *list = (RAWINPUTDEVICELIST*) malloc(sizeof(RAWINPUTDEVICELIST) * count);
RAWINPUTDEVICELIST *list = (RAWINPUTDEVICELIST *)malloc(sizeof(RAWINPUTDEVICELIST) * count);
int keyboardCount = 1;
int mouseCount = 1;
count = GetRawInputDeviceList(list, (unsigned int*)&count, sizeof(RAWINPUTDEVICELIST));
count = GetRawInputDeviceList(list, (unsigned int *)&count, sizeof(RAWINPUTDEVICELIST));
// Not necessary, but reminder that count is -1 on failure.
if (count > 0) {
for (int i=0; i<count; i++) {
if (list[i].dwType != RIM_TYPEKEYBOARD && list[i].dwType != RIM_TYPEMOUSE) continue;
for (int i = 0; i < count; i++) {
if (list[i].dwType != RIM_TYPEKEYBOARD && list[i].dwType != RIM_TYPEMOUSE)
continue;
UINT bufferLen = 10000;
int nameLen = GetRawInputDeviceInfo(list[i].hDevice, RIDI_DEVICENAME, instanceID, &bufferLen);
@ -256,28 +274,33 @@ void EnumRawInputDevices() {
// and reformat it to point to registry entry containing device description.
wcscpy(productID, instanceID);
wchar_t *temp = 0;
for (int j=0; j<3; j++) {
for (int j = 0; j < 3; j++) {
wchar_t *s = wcschr(productID, '#');
if (!s) break;
if (!s)
break;
*s = '\\';
if (j==2) {
if (j == 2) {
*s = 0;
}
if (j==1) temp = s;
if (j == 1)
temp = s;
}
wsprintfW(keyName, L"SYSTEM\\CurrentControlSet\\Enum%s", productID+3);
if (temp) *temp = 0;
wsprintfW(keyName, L"SYSTEM\\CurrentControlSet\\Enum%s", productID + 3);
if (temp)
*temp = 0;
int haveDescription = 0;
HKEY hKey;
if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, keyName, 0, KEY_QUERY_VALUE, &hKey)) {
DWORD type;
DWORD len = 10000 * sizeof(wchar_t);
if (ERROR_SUCCESS == RegQueryValueExW(hKey, L"DeviceDesc", 0, &type, (BYTE*)displayName, &len) &&
if (ERROR_SUCCESS == RegQueryValueExW(hKey, L"DeviceDesc", 0, &type, (BYTE *)displayName, &len) &&
len && type == REG_SZ) {
wchar_t *temp2 = wcsrchr(displayName, ';');
if (!temp2) temp2 = displayName;
else temp2++;
if (!temp2)
temp2 = displayName;
else
temp2++;
// Could do without this, but more effort than it's worth.
wcscpy(keyName, temp2);
haveDescription = 1;
@ -285,13 +308,16 @@ void EnumRawInputDevices() {
RegCloseKey(hKey);
}
if (list[i].dwType == RIM_TYPEKEYBOARD) {
if (!haveDescription) wsprintfW(displayName, L"Raw Keyboard %i", keyboardCount++);
else wsprintfW(displayName, L"Raw KB: %s", keyName);
if (!haveDescription)
wsprintfW(displayName, L"Raw Keyboard %i", keyboardCount++);
else
wsprintfW(displayName, L"Raw KB: %s", keyName);
dm->AddDevice(new RawInputKeyboard(list[i].hDevice, displayName, instanceID));
}
else if (list[i].dwType == RIM_TYPEMOUSE) {
if (!haveDescription) wsprintfW(displayName, L"Raw Mouse %i", mouseCount++);
else wsprintfW(displayName, L"Raw MS: %s", keyName);
} else if (list[i].dwType == RIM_TYPEMOUSE) {
if (!haveDescription)
wsprintfW(displayName, L"Raw Mouse %i", mouseCount++);
else
wsprintfW(displayName, L"Raw MS: %s", keyName);
dm->AddDevice(new RawInputMouse(list[i].hDevice, displayName, instanceID, productID));
}
}

View File

@ -18,68 +18,91 @@
#include "Global.h"
#include "VKey.h"
wchar_t *GetVKStringW(unsigned char vk) {
wchar_t *GetVKStringW(unsigned char vk)
{
int flag;
static wchar_t t[20];
switch(vk) {
case 0x0C: return L"Clear";
case 0x13: return L"Pause";
switch (vk) {
case 0x0C:
return L"Clear";
case 0x13:
return L"Pause";
case 0x21:// return "Page Up";
case 0x22:// return "Page Down";
case 0x23:// return "End";
case 0x24:// return "Home";
case 0x25:// return "Left";
case 0x26:// return "Up";
case 0x27:// return "Right";
case 0x28:// return "Down";
case 0x2D:// return "Insert";
case 0x2E:// return "Delete";
case 0x5B:// return "Left Windows";
case 0x5C:// return "Right Windows";
case 0x5D:// return "Application";
case 0x6F:// return "Num /";
flag = 1<<24;
case 0x21: // return "Page Up";
case 0x22: // return "Page Down";
case 0x23: // return "End";
case 0x24: // return "Home";
case 0x25: // return "Left";
case 0x26: // return "Up";
case 0x27: // return "Right";
case 0x28: // return "Down";
case 0x2D: // return "Insert";
case 0x2E: // return "Delete";
case 0x5B: // return "Left Windows";
case 0x5C: // return "Right Windows";
case 0x5D: // return "Application";
case 0x6F: // return "Num /";
flag = 1 << 24;
break;
case 0x29: return L"Select";
case 0x2A: return L"Print";
case 0x2B: return L"Execute";
case 0x2C: return L"Prnt Scrn";
case 0x2F: return L"Help";
case 0x29:
return L"Select";
case 0x2A:
return L"Print";
case 0x2B:
return L"Execute";
case 0x2C:
return L"Prnt Scrn";
case 0x2F:
return L"Help";
case 0x6C: return L"|";
case 0x90: return L"Num Lock";
case 0x6C:
return L"|";
case 0x90:
return L"Num Lock";
case 0xA0: return L"Left Shift";
case 0xA1: return L"Right Shift";
case 0xA2: return L"Left Ctrl";
case 0xA3: return L"Right Ctrl";
case 0xA4: return L"Left Alt";
case 0xA5: return L"Right Alt";
case 0xA0:
return L"Left Shift";
case 0xA1:
return L"Right Shift";
case 0xA2:
return L"Left Ctrl";
case 0xA3:
return L"Right Ctrl";
case 0xA4:
return L"Left Alt";
case 0xA5:
return L"Right Alt";
case 0xA6: return L"Back";
case 0xA7: return L"Forward";
case 0xA8: return L"Refresh";
case 0xA9: return L"Stop";
case 0xAA: return L"Search";
case 0xAB: return L"Favorites";
case 0xAC: return L"Browser";
case 0xA6:
return L"Back";
case 0xA7:
return L"Forward";
case 0xA8:
return L"Refresh";
case 0xA9:
return L"Stop";
case 0xAA:
return L"Search";
case 0xAB:
return L"Favorites";
case 0xAC:
return L"Browser";
case 0xFA: return L"Play";
case 0xFB: return L"Zoom";
case 0xFA:
return L"Play";
case 0xFB:
return L"Zoom";
default:
flag = 0;
break;
}
int res = MapVirtualKey(vk, MAPVK_VK_TO_VSC);
if (res && GetKeyNameText((res<<16) | flag, t, 20)) {
if (res && GetKeyNameText((res << 16) | flag, t, 20)) {
// don't trust windows
t[19] = 0;
}
else {
} else {
wsprintfW(t, L"Key %i", vk);
}
return t;
}

View File

@ -21,30 +21,35 @@
#include "WindowsKeyboard.h"
#include "KeyboardQueue.h"
WindowsKeyboard::WindowsKeyboard(DeviceAPI api, wchar_t *displayName, wchar_t *instanceID, wchar_t *deviceID) :
Device(api, KEYBOARD, displayName, instanceID, deviceID) {
for (int i=0; i<256; i++) {
WindowsKeyboard::WindowsKeyboard(DeviceAPI api, wchar_t *displayName, wchar_t *instanceID, wchar_t *deviceID)
: Device(api, KEYBOARD, displayName, instanceID, deviceID)
{
for (int i = 0; i < 256; i++) {
AddPhysicalControl(PSHBTN, i, i);
}
}
wchar_t *WindowsKeyboard::GetPhysicalControlName(PhysicalControl *control) {
wchar_t *WindowsKeyboard::GetPhysicalControlName(PhysicalControl *control)
{
int id = control->id;
if (control->type == PSHBTN && id >= 0 && id < 256) {
wchar_t *w = GetVKStringW(id);
if (w) return w;
if (w)
return w;
}
return Device::GetPhysicalControlName(control);
}
void WindowsKeyboard::UpdateKey(int vkey, int state) {
void WindowsKeyboard::UpdateKey(int vkey, int state)
{
if (vkey > 7 && vkey < 256) {
int newState = state * FULLY_DOWN;
if (newState != physicalControlState[vkey]) {
// Check for alt-F4 to avoid toggling skip mode incorrectly.
if (vkey != VK_F4 || !(physicalControlState[VK_MENU] || physicalControlState[VK_RMENU] || physicalControlState[VK_LMENU])) {
int event = KEYPRESS;
if (!newState) event = KEYRELEASE;
if (!newState)
event = KEYRELEASE;
QueueKeyEvent(vkey, event);
}
}
@ -52,11 +57,12 @@ void WindowsKeyboard::UpdateKey(int vkey, int state) {
}
}
void WindowsKeyboard::InitState() {
void WindowsKeyboard::InitState()
{
AllocState();
for (int vkey=5; vkey<256; vkey++) {
int value = (unsigned short)(((short)GetAsyncKeyState(vkey))>>15);
value += value&1;
for (int vkey = 5; vkey < 256; vkey++) {
int value = (unsigned short)(((short)GetAsyncKeyState(vkey)) >> 15);
value += value & 1;
if (vkey == VK_CONTROL || vkey == VK_MENU || vkey == VK_SHIFT) {
value = 0;
}

View File

@ -16,9 +16,10 @@
*/
// Shared functionality for WM and RAW keyboards.
class WindowsKeyboard : public Device {
class WindowsKeyboard : public Device
{
public:
WindowsKeyboard(DeviceAPI api, wchar_t *displayName, wchar_t *instanceID=0, wchar_t *deviceID=0);
WindowsKeyboard(DeviceAPI api, wchar_t *displayName, wchar_t *instanceID = 0, wchar_t *deviceID = 0);
wchar_t *GetPhysicalControlName(PhysicalControl *control);
void UpdateKey(int vkey, int state);
// Calls AllocState() and initializes to current keyboard state using

View File

@ -32,16 +32,20 @@ class WindowsMessagingMouse;
static WindowsMessagingKeyboard *wmk = 0;
static WindowsMessagingMouse *wmm = 0;
class WindowsMessagingKeyboard : public WindowsKeyboard {
class WindowsMessagingKeyboard : public WindowsKeyboard
{
public:
WindowsMessagingKeyboard() : WindowsKeyboard(WM, L"WM Keyboard") {
WindowsMessagingKeyboard()
: WindowsKeyboard(WM, L"WM Keyboard")
{
}
int Activate(InitInfo *initInfo) {
int Activate(InitInfo *initInfo)
{
// Redundant. Should match the next line.
// Deactivate();
if (wmk) wmk->Deactivate();
if (wmk)
wmk->Deactivate();
hWndProc = initInfo->hWndProc;
@ -55,7 +59,8 @@ public:
return 1;
}
void Deactivate() {
void Deactivate()
{
if (active) {
if (!wmm)
hWndProc->ReleaseExtraProc(WindowsMessagingWndProc);
@ -66,21 +71,26 @@ public:
}
void CheckKey(int vkey) {
UpdateKey(vkey, 1&(((unsigned short)GetAsyncKeyState(vkey))>>15));
void CheckKey(int vkey)
{
UpdateKey(vkey, 1 & (((unsigned short)GetAsyncKeyState(vkey)) >> 15));
}
};
class WindowsMessagingMouse : public WindowsMouse {
class WindowsMessagingMouse : public WindowsMouse
{
public:
WindowsMessagingMouse() : WindowsMouse(WM, 1, L"WM Mouse") {
WindowsMessagingMouse()
: WindowsMouse(WM, 1, L"WM Mouse")
{
}
int Activate(InitInfo *initInfo) {
int Activate(InitInfo *initInfo)
{
// Redundant. Should match the next line.
// Deactivate();
if (wmm) wmm->Deactivate();
if (wmm)
wmm->Deactivate();
hWndProc = initInfo->hWndProc;
if (!wmk)
@ -96,7 +106,8 @@ public:
return 1;
}
void Deactivate() {
void Deactivate()
{
if (active) {
if (!wmk)
hWndProc->ReleaseExtraProc(WindowsMessagingWndProc);
@ -108,30 +119,27 @@ public:
}
};
ExtraWndProcResult WindowsMessagingWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *output) {
ExtraWndProcResult WindowsMessagingWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *output)
{
if (wmk) {
if (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN || uMsg == WM_KEYUP || uMsg == WM_SYSKEYUP) {
if (wParam == VK_SHIFT) {
wmk->CheckKey(VK_RSHIFT);
wmk->CheckKey(VK_LSHIFT);
}
else if (wParam == VK_CONTROL) {
} else if (wParam == VK_CONTROL) {
wmk->CheckKey(VK_RCONTROL);
wmk->CheckKey(VK_LCONTROL);
}
else if (wParam == VK_MENU) {
} else if (wParam == VK_MENU) {
wmk->CheckKey(VK_RMENU);
wmk->CheckKey(VK_LMENU);
}
else
} else
wmk->UpdateKey(wParam, (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN));
return NO_WND_PROC;
}
// Needed to prevent default handling of keys in some situations.
else if (uMsg == WM_CHAR || uMsg == WM_UNICHAR) {
return NO_WND_PROC;
}
else if (uMsg == WM_ACTIVATE) {
} else if (uMsg == WM_ACTIVATE) {
// Not really needed, but doesn't hurt.
memset(wmk->physicalControlState, 0, sizeof(int) * wmk->numPhysicalControls);
}
@ -148,32 +156,25 @@ ExtraWndProcResult WindowsMessagingWndProc(HWND hWnd, UINT uMsg, WPARAM wParam,
SetCursorPos(wmm->center.x, wmm->center.y);
}
return NO_WND_PROC;
}
else if (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP) {
} else if (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP) {
wmm->UpdateButton(0, uMsg == WM_LBUTTONDOWN);
return NO_WND_PROC;
}
else if (uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONUP) {
} else if (uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONUP) {
wmm->UpdateButton(1, uMsg == WM_RBUTTONDOWN);
return NO_WND_PROC;
}
else if (uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONUP) {
} else if (uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONUP) {
wmm->UpdateButton(2, uMsg == WM_MBUTTONDOWN);
return NO_WND_PROC;
}
else if (uMsg == WM_XBUTTONDOWN || uMsg == WM_XBUTTONUP) {
wmm->UpdateButton(3+((wParam>>16) == XBUTTON2), uMsg == WM_XBUTTONDOWN);
} else if (uMsg == WM_XBUTTONDOWN || uMsg == WM_XBUTTONUP) {
wmm->UpdateButton(3 + ((wParam >> 16) == XBUTTON2), uMsg == WM_XBUTTONDOWN);
return NO_WND_PROC;
}
else if (uMsg == WM_MOUSEWHEEL) {
wmm->UpdateAxis(2, ((int)wParam>>16)/WHEEL_DELTA);
} else if (uMsg == WM_MOUSEWHEEL) {
wmm->UpdateAxis(2, ((int)wParam >> 16) / WHEEL_DELTA);
return NO_WND_PROC;
}
else if (uMsg == WM_MOUSEHWHEEL) {
wmm->UpdateAxis(3, ((int)wParam>>16)/WHEEL_DELTA);
} else if (uMsg == WM_MOUSEHWHEEL) {
wmm->UpdateAxis(3, ((int)wParam >> 16) / WHEEL_DELTA);
return NO_WND_PROC;
}
else if (uMsg == WM_SIZE && wmm->active) {
} else if (uMsg == WM_SIZE && wmm->active) {
WindowsMouse::WindowResized(hWnd);
}
// Taken care of elsewhere. When binding, killing focus means stop reading input.
@ -185,7 +186,8 @@ ExtraWndProcResult WindowsMessagingWndProc(HWND hWnd, UINT uMsg, WPARAM wParam,
return CONTINUE_BLISSFULLY;
}
void EnumWindowsMessagingDevices() {
void EnumWindowsMessagingDevices()
{
dm->AddDevice(new WindowsMessagingKeyboard());
dm->AddDevice(new WindowsMessagingMouse());
}

View File

@ -23,19 +23,21 @@
POINT WindowsMouse::origCursorPos;
POINT WindowsMouse::center;
WindowsMouse::WindowsMouse(DeviceAPI api, int hWheel, wchar_t *displayName, wchar_t *instanceID, wchar_t *deviceID) :
Device(api, MOUSE, displayName, instanceID, deviceID) {
WindowsMouse::WindowsMouse(DeviceAPI api, int hWheel, wchar_t *displayName, wchar_t *instanceID, wchar_t *deviceID)
: Device(api, MOUSE, displayName, instanceID, deviceID)
{
int i;
for (i=0; i<5; i++) {
for (i = 0; i < 5; i++) {
AddPhysicalControl(PSHBTN, i, i);
}
for (i=0; i<3+hWheel; i++) {
AddPhysicalControl(RELAXIS, i+5, i+5);
for (i = 0; i < 3 + hWheel; i++) {
AddPhysicalControl(RELAXIS, i + 5, i + 5);
}
}
wchar_t *WindowsMouse::GetPhysicalControlName(PhysicalControl *control) {
wchar_t *WindowsMouse::GetPhysicalControlName(PhysicalControl *control)
{
wchar_t *names[9] = {
L"L Button",
L"R Button",
@ -45,33 +47,39 @@ wchar_t *WindowsMouse::GetPhysicalControlName(PhysicalControl *control) {
L"X Axis",
L"Y Axis",
L"Y Wheel",
L"X Wheel"
};
if (control->id < 9) return names[control->id];
L"X Wheel"};
if (control->id < 9)
return names[control->id];
return Device::GetPhysicalControlName(control);
}
void WindowsMouse::UpdateButton(unsigned int button, int state) {
if (button > 4) return;
void WindowsMouse::UpdateButton(unsigned int button, int state)
{
if (button > 4)
return;
physicalControlState[button] = (state << 16);
}
void WindowsMouse::UpdateAxis(unsigned int axis, int delta) {
if (axis > 3) return;
void WindowsMouse::UpdateAxis(unsigned int axis, int delta)
{
if (axis > 3)
return;
// 1 mouse pixel = 1/8th way down.
physicalControlState[5+axis] += (delta<<(16 - 3*(axis < 2)));
physicalControlState[5 + axis] += (delta << (16 - 3 * (axis < 2)));
}
void WindowsMouse::WindowResized(HWND hWnd) {
void WindowsMouse::WindowResized(HWND hWnd)
{
RECT r;
GetWindowRect(hWnd, &r);
ClipCursor(&r);
center.x = (r.left + r.right)/2;
center.y = (r.top + r.bottom)/2;
center.x = (r.left + r.right) / 2;
center.y = (r.top + r.bottom) / 2;
SetCursorPos(center.x, center.y);
}
void WindowsMouse::GetMouseCapture(HWND hWnd) {
void WindowsMouse::GetMouseCapture(HWND hWnd)
{
SetCapture(hWnd);
ShowCursor(0);
@ -80,12 +88,13 @@ void WindowsMouse::GetMouseCapture(HWND hWnd) {
RECT r;
GetWindowRect(hWnd, &r);
ClipCursor(&r);
center.x = (r.left + r.right)/2;
center.y = (r.top + r.bottom)/2;
center.x = (r.left + r.right) / 2;
center.y = (r.top + r.bottom) / 2;
SetCursorPos(center.x, center.y);
}
void WindowsMouse::ReleaseMouseCapture() {
void WindowsMouse::ReleaseMouseCapture()
{
ClipCursor(0);
ReleaseCapture();
ShowCursor(1);

View File

@ -16,7 +16,8 @@
*/
// Shared functionality for WM and RAW keyboards.
class WindowsMouse : public Device {
class WindowsMouse : public Device
{
public:
// Used by GetMouseCapture()/ReleaseMouseCapture()
// Static because can have multiple raw mice active at once,
@ -30,7 +31,7 @@ public:
// hWheel variable lets me display no horizontal wheel for raw input, just to make it clear
// that it's not supported.
WindowsMouse(DeviceAPI api, int hWheel, wchar_t *displayName, wchar_t *instanceID=0, wchar_t *deviceID=0);
WindowsMouse(DeviceAPI api, int hWheel, wchar_t *displayName, wchar_t *instanceID = 0, wchar_t *deviceID = 0);
wchar_t *GetPhysicalControlName(PhysicalControl *control);
// State is 0 for up, 1 for down.
void UpdateButton(unsigned int button, int state);

View File

@ -37,13 +37,15 @@ WndProcEater::~WndProcEater() throw()
}
}
void WndProcEater::ReleaseExtraProc(ExtraWndProc proc) {
void WndProcEater::ReleaseExtraProc(ExtraWndProc proc)
{
// Probably isn't needed, but just in case...
if (hMutex) WaitForSingleObject(hMutex, 100);
if (hMutex)
WaitForSingleObject(hMutex, 100);
//printf( "(Lilypad) Regurgitating! -> 0x%x\n", proc );
for (int i=0; i<numExtraProcs; i++) {
for (int i = 0; i < numExtraProcs; i++) {
if (extraProcs[i].proc == proc) {
extraProcs[i] = extraProcs[--numExtraProcs];
break;
@ -57,8 +59,10 @@ void WndProcEater::ReleaseExtraProc(ExtraWndProc proc) {
}
}
void WndProcEater::Release() {
while (numExtraProcs) ReleaseExtraProc(extraProcs[0].proc);
void WndProcEater::Release()
{
while (numExtraProcs)
ReleaseExtraProc(extraProcs[0].proc);
if (hWndEaten && IsWindow(hWndEaten)) {
RemoveProp(hWndEaten, L"LilyHaxxor");
SetWindowLongPtr(hWndEaten, GWLP_WNDPROC, (LONG_PTR)eatenWndProc);
@ -69,8 +73,8 @@ void WndProcEater::Release() {
LRESULT WndProcEater::_OverrideWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if( hWnd != hWndEaten )
fprintf( stderr, "Totally mismatched window handles on OverrideWndProc!\n" );
if (hWnd != hWndEaten)
fprintf(stderr, "Totally mismatched window handles on OverrideWndProc!\n");
ExtraWndProcResult res = CONTINUE_BLISSFULLY;
LRESULT out = 0;
@ -79,7 +83,7 @@ LRESULT WndProcEater::_OverrideWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
return DLGC_WANTALLKEYS | CallWindowProc(eatenWndProc, hWnd, uMsg, wParam, lParam);
}
for (int i=0; i<numExtraProcs; i++) {
for (int i = 0; i < numExtraProcs; i++) {
// Note: Second bit of deviceUpdateQueued is only set when I receive a device change
// notification, which is handled in the GS thread in one of the extraProcs, so this
// is all I need to prevent bad things from happening while updating devices. No mutex needed.
@ -90,8 +94,8 @@ LRESULT WndProcEater::_OverrideWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
if (res2 == CONTINUE_BLISSFULLY_AND_RELEASE_PROC) {
ReleaseExtraProc(extraProcs[i].proc);
i--;
}
else if (res2 > res) res = res2;
} else if (res2 > res)
res = res2;
}
}
@ -109,38 +113,42 @@ LRESULT WndProcEater::_OverrideWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
static LRESULT CALLBACK OverrideWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WndProcEater* obj = (WndProcEater*)GetProp(hWnd, L"LilyHaxxor");
WndProcEater *obj = (WndProcEater *)GetProp(hWnd, L"LilyHaxxor");
return (obj == NULL) ?
DefWindowProc(hWnd, uMsg, wParam, lParam) :
obj->_OverrideWndProc( hWnd, uMsg, wParam, lParam );
obj->_OverrideWndProc(hWnd, uMsg, wParam, lParam);
}
bool WndProcEater::SetWndHandle(HWND hWnd)
{
if(hWnd == hWndEaten) return true;
if (hWnd == hWndEaten)
return true;
//printf( "(Lilypad) (Re)-Setting window handle! -> this=0x%08x, hWnd=0x%08x\n", this, hWnd );
Release();
SetProp(hWnd, L"LilyHaxxor", (HANDLE)this);
SetProp(hWnd, L"LilyHaxxor", (HANDLE) this);
eatenWndProc = (WNDPROC) SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)OverrideWndProc);
eatenWndProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)OverrideWndProc);
hWndEaten = (eatenWndProc) ? hWnd : 0;
return !!hWndEaten;
}
void WndProcEater::Eat(ExtraWndProc proc, DWORD flags) {
void WndProcEater::Eat(ExtraWndProc proc, DWORD flags)
{
// check if Subclassing failed to init during SetWndHandle
if (!hWndEaten) return;
if (!hWndEaten)
return;
// Probably isn't needed, but just in case...
if (hMutex) WaitForSingleObject(hMutex, 100);
if (hMutex)
WaitForSingleObject(hMutex, 100);
//printf( "(Lilypad) EatingWndProc! -> 0x%x\n", proc );
extraProcs = (ExtraWndProcInfo*) realloc(extraProcs, sizeof(ExtraWndProcInfo)*(numExtraProcs+1));
extraProcs = (ExtraWndProcInfo *)realloc(extraProcs, sizeof(ExtraWndProcInfo) * (numExtraProcs + 1));
extraProcs[numExtraProcs].proc = proc;
extraProcs[numExtraProcs].flags = flags;
numExtraProcs++;

View File

@ -29,7 +29,8 @@ enum ExtraWndProcResult {
typedef ExtraWndProcResult (*ExtraWndProc)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *out);
struct ExtraWndProcInfo {
struct ExtraWndProcInfo
{
ExtraWndProc proc;
DWORD flags;
};
@ -39,7 +40,7 @@ class WndProcEater
public:
HWND hWndEaten;
WNDPROC eatenWndProc;
ExtraWndProcInfo* extraProcs;
ExtraWndProcInfo *extraProcs;
int numExtraProcs;
HANDLE hMutex;

View File

@ -61,9 +61,9 @@ typedef struct
// This way, I don't require that XInput junk be installed.
typedef void(CALLBACK *_XInputEnable)(BOOL enable);
typedef DWORD(CALLBACK *_XInputGetStateEx)(DWORD dwUserIndex, XINPUT_STATE* pState);
typedef DWORD(CALLBACK *_XInputGetExtended)(DWORD dwUserIndex, SCP_EXTN* pPressure);
typedef DWORD(CALLBACK *_XInputSetState)(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration);
typedef DWORD(CALLBACK *_XInputGetStateEx)(DWORD dwUserIndex, XINPUT_STATE *pState);
typedef DWORD(CALLBACK *_XInputGetExtended)(DWORD dwUserIndex, SCP_EXTN *pPressure);
typedef DWORD(CALLBACK *_XInputSetState)(DWORD dwUserIndex, XINPUT_VIBRATION *pVibration);
_XInputEnable pXInputEnable = 0;
_XInputGetStateEx pXInputGetStateEx = 0;
@ -73,32 +73,37 @@ _XInputSetState pXInputSetState = 0;
static int xInputActiveCount = 0;
// Completely unncessary, really.
__forceinline int ShortToAxis(int v) {
__forceinline int ShortToAxis(int v)
{
// If positive and at least 1 << 14, increment.
v += (!((v>>15)&1)) & ((v>>14)&1);
v += (!((v >> 15) & 1)) & ((v >> 14) & 1);
// Just double.
return v * 2;
}
class XInputDevice : public Device {
class XInputDevice : public Device
{
// Cached last vibration values by pad and motor.
// Need this, as only one value is changed at a time.
int ps2Vibration[2][4][2];
// Minor optimization - cache last set vibration values
// When there's no change, no need to do anything.
XINPUT_VIBRATION xInputVibration;
public:
int index;
XInputDevice(int index, wchar_t *displayName) : Device(XINPUT, OTHER, displayName) {
XInputDevice(int index, wchar_t *displayName)
: Device(XINPUT, OTHER, displayName)
{
memset(ps2Vibration, 0, sizeof(ps2Vibration));
memset(&xInputVibration, 0, sizeof(xInputVibration));
this->index = index;
int i;
for (i=0; i<17; i++) { // Skip empty bit
for (i = 0; i < 17; i++) { // Skip empty bit
AddPhysicalControl(PRESSURE_BTN, i + (i > 10), 0);
}
for (; i<21; i++) {
for (; i < 21; i++) {
AddPhysicalControl(ABSAXIS, i + 2, 0);
}
AddFFAxis(L"Slow Motor", 0);
@ -106,7 +111,8 @@ public:
AddFFEffectType(L"Constant Effect", L"Constant", EFFECT_CONSTANT);
}
wchar_t *GetPhysicalControlName(PhysicalControl *c) {
wchar_t *GetPhysicalControlName(PhysicalControl *c)
{
const static wchar_t *names[] = {
L"D-pad Up",
L"D-pad Down",
@ -130,15 +136,17 @@ public:
L"Right Thumb X",
L"Right Thumb Y",
};
unsigned int i = (unsigned int) (c - physicalControls);
unsigned int i = (unsigned int)(c - physicalControls);
if (i < 21) {
return (wchar_t*)names[i];
return (wchar_t *)names[i];
}
return Device::GetPhysicalControlName(c);
}
int Activate(InitInfo *initInfo) {
if (active) Deactivate();
int Activate(InitInfo *initInfo)
{
if (active)
Deactivate();
if (!xInputActiveCount) {
pXInputEnable(1);
}
@ -148,8 +156,10 @@ public:
return 1;
}
int Update() {
if (!active) return 0;
int Update()
{
if (!active)
return 0;
XINPUT_STATE state;
if (ERROR_SUCCESS != pXInputGetStateEx(index, &state)) {
Deactivate();
@ -193,12 +203,13 @@ public:
return 1;
}
void SetEffects(unsigned char port, unsigned int slot, unsigned char motor, unsigned char force) {
void SetEffects(unsigned char port, unsigned int slot, unsigned char motor, unsigned char force)
{
ps2Vibration[port][slot][motor] = force;
int newVibration[2] = {0,0};
for (int p=0; p<2; p++) {
for (int s=0; s<4; s++) {
for (int i=0; i<pads[p][s].numFFBindings; i++) {
int newVibration[2] = {0, 0};
for (int p = 0; p < 2; p++) {
for (int s = 0; s < 4; s++) {
for (int i = 0; i < pads[p][s].numFFBindings; i++) {
// Technically should also be a *65535/BASE_SENSITIVITY, but that's close enough to 1 for me.
ForceFeedbackBinding *ffb = &pads[p][s].ffBindings[i];
newVibration[0] += (int)((ffb->axes[0].force * (__int64)ps2Vibration[p][s][ffb->motor]) / 255);
@ -222,7 +233,8 @@ public:
}
}
void SetEffect(ForceFeedbackBinding *binding, unsigned char force) {
void SetEffect(ForceFeedbackBinding *binding, unsigned char force)
{
PadBindings pBackup = pads[0][0];
pads[0][0].ffBindings = binding;
pads[0][0].numFFBindings = 1;
@ -230,7 +242,8 @@ public:
pads[0][0] = pBackup;
}
void Deactivate() {
void Deactivate()
{
memset(&xInputVibration, 0, sizeof(xInputVibration));
memset(ps2Vibration, 0, sizeof(ps2Vibration));
pXInputSetState(index, &xInputVibration);
@ -244,16 +257,19 @@ public:
}
}
~XInputDevice() {
~XInputDevice()
{
}
};
void EnumXInputDevices() {
void EnumXInputDevices()
{
wchar_t temp[30];
if (!pXInputSetState) {
// Also used as flag to indicute XInput not installed, so
// don't repeatedly try to load it.
if (pXInputEnable) return;
if (pXInputEnable)
return;
// Prefer XInput 1.3 since SCP only has an XInput 1.3 wrapper right now.
// Also use LoadLibrary and not LoadLibraryEx for XInput 1.3, since some
@ -265,11 +281,11 @@ void EnumXInputDevices() {
}
if (hMod) {
if ((pXInputEnable = (_XInputEnable) GetProcAddress(hMod, "XInputEnable")) &&
((pXInputGetStateEx = (_XInputGetStateEx) GetProcAddress(hMod, (LPCSTR)100)) || // Try Ex version first
(pXInputGetStateEx = (_XInputGetStateEx) GetProcAddress(hMod, "XInputGetState")))) {
if ((pXInputEnable = (_XInputEnable)GetProcAddress(hMod, "XInputEnable")) &&
((pXInputGetStateEx = (_XInputGetStateEx)GetProcAddress(hMod, (LPCSTR)100)) || // Try Ex version first
(pXInputGetStateEx = (_XInputGetStateEx)GetProcAddress(hMod, "XInputGetState")))) {
pXInputGetExtended = (_XInputGetExtended)GetProcAddress(hMod, "XInputGetExtended");
pXInputSetState = (_XInputSetState) GetProcAddress(hMod, "XInputSetState");
pXInputSetState = (_XInputSetState)GetProcAddress(hMod, "XInputSetState");
}
}
if (!pXInputSetState) {
@ -284,4 +300,3 @@ void EnumXInputDevices() {
}
pXInputEnable(0);
}

View File

@ -97,20 +97,23 @@
/* All standard descriptors have these 2 fields in common */
struct usb_descriptor_header {
struct usb_descriptor_header
{
unsigned char bLength;
unsigned char bDescriptorType;
};
/* String descriptor */
struct usb_string_descriptor {
struct usb_string_descriptor
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned short wData[1];
};
/* HID descriptor */
struct usb_hid_descriptor {
struct usb_hid_descriptor
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned short bcdHID;
@ -120,7 +123,8 @@ struct usb_hid_descriptor {
/* Endpoint descriptor */
#define USB_MAXENDPOINTS 32
struct usb_endpoint_descriptor {
struct usb_endpoint_descriptor
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned char bEndpointAddress;
@ -145,7 +149,8 @@ struct usb_endpoint_descriptor {
/* Interface descriptor */
#define USB_MAXINTERFACES 32
struct usb_interface_descriptor {
struct usb_interface_descriptor
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned char bInterfaceNumber;
@ -164,7 +169,8 @@ struct usb_interface_descriptor {
#define USB_MAXALTSETTING 128 /* Hard limit */
struct usb_interface {
struct usb_interface
{
struct usb_interface_descriptor *altsetting;
int num_altsetting;
@ -172,7 +178,8 @@ struct usb_interface {
/* Configuration descriptor information.. */
#define USB_MAXCONFIG 8
struct usb_config_descriptor {
struct usb_config_descriptor
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned short wTotalLength;
@ -189,7 +196,8 @@ struct usb_config_descriptor {
};
/* Device descriptor */
struct usb_device_descriptor {
struct usb_device_descriptor
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned short bcdUSB;
@ -206,7 +214,8 @@ struct usb_device_descriptor {
unsigned char bNumConfigurations;
};
struct usb_ctrl_setup {
struct usb_ctrl_setup
{
unsigned char bRequestType;
unsigned char bRequest;
unsigned short wValue;
@ -261,7 +270,8 @@ struct usb_ctrl_setup {
/* struct usb_device; */
/* struct usb_bus; */
struct usb_device {
struct usb_device
{
struct usb_device *next, *prev;
char filename[LIBUSB_PATH_MAX];
@ -279,7 +289,8 @@ struct usb_device {
struct usb_device **children;
};
struct usb_bus {
struct usb_bus
{
struct usb_bus *next, *prev;
char dirname[LIBUSB_PATH_MAX];
@ -291,14 +302,17 @@ struct usb_bus {
};
/* Version information, Windows specific */
struct usb_version {
struct {
struct usb_version
{
struct
{
int major;
int minor;
int micro;
int nano;
} dll;
struct {
struct
{
int major;
int minor;
int micro;
@ -324,92 +338,92 @@ typedef struct usb_dev_handle usb_dev_handle;
extern "C" {
#endif
/* Function prototypes */
/* Function prototypes */
/* usb.c */
usb_dev_handle *usb_open(struct usb_device *dev);
int usb_close(usb_dev_handle *dev);
int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf,
/* usb.c */
usb_dev_handle *usb_open(struct usb_device *dev);
int usb_close(usb_dev_handle *dev);
int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf,
size_t buflen);
int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf,
int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf,
size_t buflen);
/* descriptors.c */
int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep,
/* descriptors.c */
int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep,
unsigned char type, unsigned char index,
void *buf, int size);
int usb_get_descriptor(usb_dev_handle *udev, unsigned char type,
int usb_get_descriptor(usb_dev_handle *udev, unsigned char type,
unsigned char index, void *buf, int size);
/* <arch>.c */
int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size,
/* <arch>.c */
int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size,
int timeout);
int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size,
int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size,
int timeout);
int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size,
int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size,
int timeout);
int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size,
int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size,
int timeout);
int usb_control_msg(usb_dev_handle *dev, int requesttype, int request,
int usb_control_msg(usb_dev_handle *dev, int requesttype, int request,
int value, int index, char *bytes, int size,
int timeout);
int usb_set_configuration(usb_dev_handle *dev, int configuration);
int usb_claim_interface(usb_dev_handle *dev, int interface);
int usb_release_interface(usb_dev_handle *dev, int interface);
int usb_set_altinterface(usb_dev_handle *dev, int alternate);
int usb_resetep(usb_dev_handle *dev, unsigned int ep);
int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
int usb_reset(usb_dev_handle *dev);
int usb_set_configuration(usb_dev_handle *dev, int configuration);
int usb_claim_interface(usb_dev_handle *dev, int interface);
int usb_release_interface(usb_dev_handle *dev, int interface);
int usb_set_altinterface(usb_dev_handle *dev, int alternate);
int usb_resetep(usb_dev_handle *dev, unsigned int ep);
int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
int usb_reset(usb_dev_handle *dev);
char *usb_strerror(void);
char *usb_strerror(void);
void usb_init(void);
void usb_set_debug(int level);
int usb_find_busses(void);
int usb_find_devices(void);
struct usb_device *usb_device(usb_dev_handle *dev);
struct usb_bus *usb_get_busses(void);
void usb_init(void);
void usb_set_debug(int level);
int usb_find_busses(void);
int usb_find_devices(void);
struct usb_device *usb_device(usb_dev_handle *dev);
struct usb_bus *usb_get_busses(void);
/* Windows specific functions */
/* Windows specific functions */
#define LIBUSB_HAS_INSTALL_SERVICE_NP 1
int usb_install_service_np(void);
void CALLBACK usb_install_service_np_rundll(HWND wnd, HINSTANCE instance,
#define LIBUSB_HAS_INSTALL_SERVICE_NP 1
int usb_install_service_np(void);
void CALLBACK usb_install_service_np_rundll(HWND wnd, HINSTANCE instance,
LPSTR cmd_line, int cmd_show);
#define LIBUSB_HAS_UNINSTALL_SERVICE_NP 1
int usb_uninstall_service_np(void);
void CALLBACK usb_uninstall_service_np_rundll(HWND wnd, HINSTANCE instance,
#define LIBUSB_HAS_UNINSTALL_SERVICE_NP 1
int usb_uninstall_service_np(void);
void CALLBACK usb_uninstall_service_np_rundll(HWND wnd, HINSTANCE instance,
LPSTR cmd_line, int cmd_show);
#define LIBUSB_HAS_INSTALL_DRIVER_NP 1
int usb_install_driver_np(const char *inf_file);
void CALLBACK usb_install_driver_np_rundll(HWND wnd, HINSTANCE instance,
#define LIBUSB_HAS_INSTALL_DRIVER_NP 1
int usb_install_driver_np(const char *inf_file);
void CALLBACK usb_install_driver_np_rundll(HWND wnd, HINSTANCE instance,
LPSTR cmd_line, int cmd_show);
#define LIBUSB_HAS_TOUCH_INF_FILE_NP 1
int usb_touch_inf_file_np(const char *inf_file);
void CALLBACK usb_touch_inf_file_np_rundll(HWND wnd, HINSTANCE instance,
#define LIBUSB_HAS_TOUCH_INF_FILE_NP 1
int usb_touch_inf_file_np(const char *inf_file);
void CALLBACK usb_touch_inf_file_np_rundll(HWND wnd, HINSTANCE instance,
LPSTR cmd_line, int cmd_show);
#define LIBUSB_HAS_INSTALL_NEEDS_RESTART_NP 1
int usb_install_needs_restart_np(void);
#define LIBUSB_HAS_INSTALL_NEEDS_RESTART_NP 1
int usb_install_needs_restart_np(void);
const struct usb_version *usb_get_version(void);
const struct usb_version *usb_get_version(void);
int usb_isochronous_setup_async(usb_dev_handle *dev, void **context,
int usb_isochronous_setup_async(usb_dev_handle *dev, void **context,
unsigned char ep, int pktsize);
int usb_bulk_setup_async(usb_dev_handle *dev, void **context,
int usb_bulk_setup_async(usb_dev_handle *dev, void **context,
unsigned char ep);
int usb_interrupt_setup_async(usb_dev_handle *dev, void **context,
int usb_interrupt_setup_async(usb_dev_handle *dev, void **context,
unsigned char ep);
int usb_submit_async(void *context, char *bytes, int size);
int usb_reap_async(void *context, int timeout);
int usb_reap_async_nocancel(void *context, int timeout);
int usb_cancel_async(void *context);
int usb_free_async(void **context);
int usb_submit_async(void *context, char *bytes, int size);
int usb_reap_async(void *context, int timeout);
int usb_reap_async_nocancel(void *context, int timeout);
int usb_cancel_async(void *context);
int usb_free_async(void **context);
#ifdef __cplusplus
@ -418,4 +432,3 @@ extern "C" {
#endif
#endif /* __USB_H__ */

View File

@ -18,7 +18,7 @@
#include <gdk/gdkx.h>
#include "PadLinux.h"
Display* GSdsp;
Display *GSdsp;
int autoRepeatMode;
void _PadUpdate(int pad)
@ -31,7 +31,7 @@ void _PadUpdate(int pad)
XNextEvent(GSdsp, &evt);
switch (evt.type) {
case KeyPress:
key = XLookupKeysym((XKeyEvent*)&evt, 0);
key = XLookupKeysym((XKeyEvent *)&evt, 0);
// Add code to check if it's one of the keys we configured here on a real pda plugin..
@ -40,7 +40,7 @@ void _PadUpdate(int pad)
break;
case KeyRelease:
key = XLookupKeysym((XKeyEvent*)&evt, 0);
key = XLookupKeysym((XKeyEvent *)&evt, 0);
// Add code to check if it's one of the keys we configured here on a real pda plugin..
@ -59,12 +59,12 @@ void _PadUpdate(int pad)
}
}
s32 _PADOpen(void* pDsp)
s32 _PADOpen(void *pDsp)
{
GtkScrolledWindow* win;
GtkScrolledWindow *win;
win = *(GtkScrolledWindow**)pDsp;
win = *(GtkScrolledWindow **)pDsp;
if (GTK_IS_WIDGET(win)) {
// Since we have a GtkScrolledWindow, for now we'll grab whatever display
@ -73,7 +73,7 @@ s32 _PADOpen(void* pDsp)
// be able to manage... --arcum42
GSdsp = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
} else {
GSdsp = *(Display**)pDsp;
GSdsp = *(Display **)pDsp;
}
XAutoRepeatOff(GSdsp);

View File

@ -23,7 +23,7 @@
#include <X11/Xlib.h>
void _PadUpdate(int pad);
s32 _PADOpen(void* pDsp);
s32 _PADOpen(void *pDsp);
void _PADClose();
#endif

View File

@ -32,7 +32,7 @@ static char libraryName[256];
string s_strIniPath = "inis";
string s_strLogPath = "logs";
FILE* padLog;
FILE *padLog;
Config conf;
keyEvent event;
static keyEvent s_event;
@ -43,7 +43,7 @@ PS2EgetLibType()
return PS2E_LT_PAD;
}
EXPORT_C_(char*)
EXPORT_C_(char *)
PS2EgetLibName()
{
snprintf(libraryName, 255, "Padnull Driver %lld%s", SVN_REV, SVN_MODS ? "m" : "");
@ -56,7 +56,7 @@ PS2EgetLibVersion2(u32 type)
return (version << 16) | (revision << 8) | build;
}
void __Log(const char* fmt, ...)
void __Log(const char *fmt, ...)
{
va_list list;
@ -67,7 +67,7 @@ void __Log(const char* fmt, ...)
va_end(list);
}
void __LogToConsole(const char* fmt, ...)
void __LogToConsole(const char *fmt, ...)
{
va_list list;
@ -82,7 +82,7 @@ void __LogToConsole(const char* fmt, ...)
}
EXPORT_C_(void)
PADsetSettingsDir(const char* dir)
PADsetSettingsDir(const char *dir)
{
s_strIniPath = (dir == NULL) ? "inis" : dir;
}
@ -109,7 +109,7 @@ bool OpenLog()
}
EXPORT_C_(void)
PADsetLogDir(const char* dir)
PADsetLogDir(const char *dir)
{
// Get the path to the log directory.
s_strLogPath = (dir == NULL) ? "logs" : dir;
@ -144,7 +144,7 @@ PADshutdown()
}
EXPORT_C_(s32)
PADopen(void* pDsp)
PADopen(void *pDsp)
{
memset(&event, 0, sizeof(event));
@ -158,7 +158,7 @@ PADclose()
}
// PADkeyEvent is called every vsync (return NULL if no event)
EXPORT_C_(keyEvent*)
EXPORT_C_(keyEvent *)
PADkeyEvent()
{
@ -204,12 +204,12 @@ PADupdate(int pad)
}
EXPORT_C_(void)
PADgsDriverInfo(GSdriverInfo* info)
PADgsDriverInfo(GSdriverInfo *info)
{
}
EXPORT_C_(s32)
PADfreeze(int mode, freezeData* data)
PADfreeze(int mode, freezeData *data)
{
return 0;
}

View File

@ -42,10 +42,10 @@ typedef struct
} Config;
extern Config conf;
extern FILE* padLog;
extern FILE *padLog;
extern keyEvent event;
extern void __Log(char* fmt, ...);
extern void __Log(char *fmt, ...);
extern void SaveConfig();
extern void LoadConfig();

View File

@ -52,9 +52,9 @@ void _PadUpdate(int pad)
{
}
s32 _PADOpen(void* pDsp)
s32 _PADOpen(void *pDsp)
{
GShwnd = (HWND) * (long*)pDsp;
GShwnd = (HWND) * (long *)pDsp;
if (GShwnd != NULL && GSwndProc != NULL) {
// revert

View File

@ -20,7 +20,7 @@
#include <windows.h>
void _PadUpdate(int pad);
s32 _PADOpen(void* pDsp);
s32 _PADOpen(void *pDsp);
void _PADClose();
#endif

View File

@ -36,14 +36,14 @@ const u32 minor = 0; // increase that with each version
#define RELEASE_MS 437L
#ifdef PCSX2_DEBUG
char* libraryName = "SPU2null (Debug)";
char *libraryName = "SPU2null (Debug)";
#else
char* libraryName = "SPU2null ";
char *libraryName = "SPU2null ";
#endif
string s_strIniPath = "inis/";
string s_strLogPath = "logs/";
FILE* spu2Log;
FILE *spu2Log;
Config conf;
ADMA Adma4;
@ -52,9 +52,9 @@ ADMA Adma7;
u32 MemAddr[2];
u32 g_nSpuInit = 0;
u16 interrupt = 0;
s8* spu2regs = NULL;
u16* spu2mem = NULL;
u16* pSpuIrq[2] = {NULL};
s8 *spu2regs = NULL;
u16 *spu2mem = NULL;
u16 *pSpuIrq[2] = {NULL};
u32 dwEndChannel2[2] = {0}; // keeps track of what channels have ended
u32 dwNoiseVal = 1; // global noise generator
@ -89,7 +89,7 @@ PS2EgetLibType()
return PS2E_LT_SPU2;
}
EXPORT_C_(char*)
EXPORT_C_(char *)
PS2EgetLibName()
{
return libraryName;
@ -101,7 +101,7 @@ PS2EgetLibVersion2(u32 type)
return (version << 16) | (revision << 8) | build | (minor << 24);
}
void __Log(char* fmt, ...)
void __Log(char *fmt, ...)
{
va_list list;
@ -114,7 +114,7 @@ void __Log(char* fmt, ...)
}
EXPORT_C_(void)
SPU2setSettingsDir(const char* dir)
SPU2setSettingsDir(const char *dir)
{
s_strIniPath = (dir == NULL) ? "inis/" : dir;
}
@ -142,7 +142,7 @@ bool OpenLog()
}
EXPORT_C_(void)
SPU2setLogDir(const char* dir)
SPU2setLogDir(const char *dir)
{
// Get the path to the log directory.
s_strLogPath = (dir == NULL) ? "logs/" : dir;
@ -160,14 +160,14 @@ SPU2init()
{
OpenLog();
spu2regs = (s8*)malloc(0x10000);
spu2regs = (s8 *)malloc(0x10000);
if (spu2regs == NULL) {
SysMessage("Error allocating Memory\n");
return -1;
}
memset(spu2regs, 0, 0x10000);
spu2mem = (u16*)malloc(0x200000); // 2Mb
spu2mem = (u16 *)malloc(0x200000); // 2Mb
if (spu2mem == NULL) {
SysMessage("Error allocating Memory\n");
return -1;
@ -185,9 +185,9 @@ SPU2init()
// init each channel
for (u32 i = 0; i < ArraySize(voices); ++i) {
voices[i].pLoop = voices[i].pStart = voices[i].pCurr = (u8*)spu2mem;
voices[i].pLoop = voices[i].pStart = voices[i].pCurr = (u8 *)spu2mem;
voices[i].pvoice = (_SPU_VOICE*)((u8*)spu2regs + voices[i].memoffset) + (i % 24);
voices[i].pvoice = (_SPU_VOICE *)((u8 *)spu2regs + voices[i].memoffset) + (i % 24);
voices[i].ADSRX.SustainLevel = 1024; // -> init sustain
}
@ -195,7 +195,7 @@ SPU2init()
}
EXPORT_C_(s32)
SPU2open(void* pDsp)
SPU2open(void *pDsp)
{
LoadConfig();
SPUCycles = SPUWorkerCycles = 0;
@ -286,16 +286,16 @@ void InitADSR() // INIT ADSR
}
}
int MixADSR(VOICE_PROCESSED* pvoice) // MIX ADSR
int MixADSR(VOICE_PROCESSED *pvoice) // MIX ADSR
{
if (pvoice->bStop) // should be stopped:
{
if (pvoice->bIgnoreLoop == 0) {
pvoice->ADSRX.EnvelopeVol = 0;
pvoice->bOn = false;
pvoice->pStart = (u8*)(spu2mem + pvoice->iStartAddr);
pvoice->pLoop = (u8*)(spu2mem + pvoice->iStartAddr);
pvoice->pCurr = (u8*)(spu2mem + pvoice->iStartAddr);
pvoice->pStart = (u8 *)(spu2mem + pvoice->iStartAddr);
pvoice->pLoop = (u8 *)(spu2mem + pvoice->iStartAddr);
pvoice->pCurr = (u8 *)(spu2mem + pvoice->iStartAddr);
pvoice->bStop = true;
pvoice->bIgnoreLoop = false;
return 0;
@ -335,9 +335,9 @@ int MixADSR(VOICE_PROCESSED* pvoice) // MIX ADSR
if (pvoice->ADSRX.EnvelopeVol < 0) {
pvoice->ADSRX.EnvelopeVol = 0;
pvoice->bOn = false;
pvoice->pStart = (u8*)(spu2mem + pvoice->iStartAddr);
pvoice->pLoop = (u8*)(spu2mem + pvoice->iStartAddr);
pvoice->pCurr = (u8*)(spu2mem + pvoice->iStartAddr);
pvoice->pStart = (u8 *)(spu2mem + pvoice->iStartAddr);
pvoice->pLoop = (u8 *)(spu2mem + pvoice->iStartAddr);
pvoice->pCurr = (u8 *)(spu2mem + pvoice->iStartAddr);
pvoice->bStop = true;
pvoice->bIgnoreLoop = false;
//pvoice->bReverb=0;
@ -469,10 +469,10 @@ int MixADSR(VOICE_PROCESSED* pvoice) // MIX ADSR
// simulate SPU2 for 1ms
void SPU2Worker()
{
u8* start;
u8 *start;
int ch, flags;
VOICE_PROCESSED* pChannel = voices;
VOICE_PROCESSED *pChannel = voices;
for (ch = 0; ch < SPU_NUMBER_VOICES; ch++, pChannel++) // loop em all... we will collect 1 ms of sound of each playing channel
{
if (pChannel->bNew) {
@ -497,7 +497,7 @@ void SPU2Worker()
start = pChannel->pCurr; // set up the current pos
// special "stop" sign
if (start == (u8*)-1) //!pChannel->bOn
if (start == (u8 *)-1) //!pChannel->bOn
{
pChannel->bOn = false; // -> turn everything off
pChannel->ADSRX.lVolume = 0;
@ -515,7 +515,7 @@ void SPU2Worker()
// some callback and irq active?
if (pChannel->GetCtrl()->irq) {
// if irq address reached or irq on looping addr, when stop/loop flag is set
u8* pirq = (u8*)pSpuIrq[ch >= 24];
u8 *pirq = (u8 *)pSpuIrq[ch >= 24];
if ((pirq > start - 16 && pirq <= start) || ((flags & 1) && (pirq > pChannel->pLoop - 16 && pirq <= pChannel->pLoop))) {
IRQINFO |= 4 << (int)(ch >= 24);
irqCallbackSPU2();
@ -533,7 +533,7 @@ void SPU2Worker()
//if(!(flags&2)) // 1+2: do loop... otherwise: stop
if (flags != 3 || pChannel->pLoop == NULL) // PETE: if we don't check exactly for 3, loop hang ups will happen (DQ4, for example)
{ // and checking if pLoop is set avoids crashes, yeah
start = (u8*)-1;
start = (u8 *)-1;
pChannel->bStop = true;
pChannel->bIgnoreLoop = false;
} else {
@ -596,7 +596,7 @@ void SPU2Worker()
}
EXPORT_C_(void)
SPU2readDMA4Mem(u16* pMem, int size)
SPU2readDMA4Mem(u16 *pMem, int size)
{
u32 spuaddr = C0_SPUADDR;
int i;
@ -604,7 +604,7 @@ SPU2readDMA4Mem(u16* pMem, int size)
SPU2_LOG("SPU2 readDMA4Mem size %x, addr: %x\n", size, pMem);
for (i = 0; i < size; i++) {
*pMem++ = *(u16*)(spu2mem + spuaddr);
*pMem++ = *(u16 *)(spu2mem + spuaddr);
if ((spu2Rs16(REG_C0_CTRL) & 0x40) && C0_IRQA == spuaddr) {
spu2Ru16(SPDIF_OUT) |= 0x4;
C0_SPUADDR_SET(spuaddr);
@ -628,7 +628,7 @@ SPU2readDMA4Mem(u16* pMem, int size)
}
EXPORT_C_(void)
SPU2readDMA7Mem(u16* pMem, int size)
SPU2readDMA7Mem(u16 *pMem, int size)
{
u32 spuaddr = C1_SPUADDR;
int i;
@ -636,7 +636,7 @@ SPU2readDMA7Mem(u16* pMem, int size)
SPU2_LOG("SPU2 readDMA7Mem size %x, addr: %x\n", size, pMem);
for (i = 0; i < size; i++) {
*pMem++ = *(u16*)(spu2mem + spuaddr);
*pMem++ = *(u16 *)(spu2mem + spuaddr);
if ((spu2Rs16(REG_C1_CTRL) & 0x40) && C1_IRQA == spuaddr) {
spu2Ru16(SPDIF_OUT) |= 0x8;
C1_SPUADDR_SET(spuaddr);
@ -676,9 +676,9 @@ int ADMAS4Write()
spuaddr = C0_SPUADDR;
// SPU2 Deinterleaves the Left and Right Channels
memcpy((s16*)(spu2mem + spuaddr + 0x2000), (s16*)Adma4.MemAddr, 512);
memcpy((s16 *)(spu2mem + spuaddr + 0x2000), (s16 *)Adma4.MemAddr, 512);
Adma4.MemAddr += 256;
memcpy((s16*)(spu2mem + spuaddr + 0x2200), (s16*)Adma4.MemAddr, 512);
memcpy((s16 *)(spu2mem + spuaddr + 0x2200), (s16 *)Adma4.MemAddr, 512);
Adma4.MemAddr += 256;
spuaddr = (spuaddr + 256) & 511;
C0_SPUADDR_SET(spuaddr);
@ -703,9 +703,9 @@ int ADMAS7Write()
spuaddr = C1_SPUADDR;
// SPU2 Deinterleaves the Left and Right Channels
memcpy((s16*)(spu2mem + spuaddr + 0x2400), (s16*)Adma7.MemAddr, 512);
memcpy((s16 *)(spu2mem + spuaddr + 0x2400), (s16 *)Adma7.MemAddr, 512);
Adma7.MemAddr += 256;
memcpy((s16*)(spu2mem + spuaddr + 0x2600), (s16*)Adma7.MemAddr, 512);
memcpy((s16 *)(spu2mem + spuaddr + 0x2600), (s16 *)Adma7.MemAddr, 512);
Adma7.MemAddr += 256;
spuaddr = (spuaddr + 256) & 511;
C1_SPUADDR_SET(spuaddr);
@ -721,7 +721,7 @@ int ADMAS7Write()
}
EXPORT_C_(void)
SPU2writeDMA4Mem(u16* pMem, int size)
SPU2writeDMA4Mem(u16 *pMem, int size)
{
u32 spuaddr;
@ -738,7 +738,7 @@ SPU2writeDMA4Mem(u16* pMem, int size)
}
spuaddr = C0_SPUADDR;
memcpy((u8*)(spu2mem + spuaddr), (u8*)pMem, size << 1);
memcpy((u8 *)(spu2mem + spuaddr), (u8 *)pMem, size << 1);
spuaddr += size;
C0_SPUADDR_SET(spuaddr);
@ -759,7 +759,7 @@ SPU2writeDMA4Mem(u16* pMem, int size)
}
EXPORT_C_(void)
SPU2writeDMA7Mem(u16* pMem, int size)
SPU2writeDMA7Mem(u16 *pMem, int size)
{
u32 spuaddr;
@ -776,7 +776,7 @@ SPU2writeDMA7Mem(u16* pMem, int size)
}
spuaddr = C1_SPUADDR;
memcpy((u8*)(spu2mem + spuaddr), (u8*)pMem, size << 1);
memcpy((u8 *)(spu2mem + spuaddr), (u8 *)pMem, size << 1);
spuaddr += size;
C1_SPUADDR_SET(spuaddr);
@ -878,7 +878,7 @@ SPU2write(u32 mem, u16 value)
else
ch = (r >> 4);
VOICE_PROCESSED* pvoice = &voices[ch];
VOICE_PROCESSED *pvoice = &voices[ch];
switch (r & 0x0f) {
case 0:
@ -930,25 +930,25 @@ SPU2write(u32 mem, u16 value)
ch += ((rx - 0x1c0) / 12);
rx -= (ch % 24) * 12;
VOICE_PROCESSED* pvoice = &voices[ch];
VOICE_PROCESSED *pvoice = &voices[ch];
switch (rx) {
case 0x1C0:
pvoice->iStartAddr = (((u32)value & 0x3f) << 16) | (pvoice->iStartAddr & 0xFFFF);
pvoice->pStart = (u8*)(spu2mem + pvoice->iStartAddr);
pvoice->pStart = (u8 *)(spu2mem + pvoice->iStartAddr);
break;
case 0x1C2:
pvoice->iStartAddr = (pvoice->iStartAddr & 0x3f0000) | (value & 0xFFFF);
pvoice->pStart = (u8*)(spu2mem + pvoice->iStartAddr);
pvoice->pStart = (u8 *)(spu2mem + pvoice->iStartAddr);
break;
case 0x1C4:
pvoice->iLoopAddr = (((u32)value & 0x3f) << 16) | (pvoice->iLoopAddr & 0xFFFF);
pvoice->pLoop = (u8*)(spu2mem + pvoice->iLoopAddr);
pvoice->pLoop = (u8 *)(spu2mem + pvoice->iLoopAddr);
pvoice->bIgnoreLoop = pvoice->iLoopAddr > 0;
break;
case 0x1C6:
pvoice->iLoopAddr = (pvoice->iLoopAddr & 0x3f0000) | (value & 0xFFFF);
pvoice->pLoop = (u8*)(spu2mem + pvoice->iLoopAddr);
pvoice->pLoop = (u8 *)(spu2mem + pvoice->iLoopAddr);
pvoice->bIgnoreLoop = pvoice->iLoopAddr > 0;
break;
case 0x1C8:
@ -1084,7 +1084,7 @@ SPU2read(u32 mem)
else
ch = (r >> 4);
VOICE_PROCESSED* pvoice = &voices[ch];
VOICE_PROCESSED *pvoice = &voices[ch];
switch (r & 0x0f) {
case 10:
@ -1104,21 +1104,21 @@ SPU2read(u32 mem)
ch += ((rx - 0x1c0) / 12);
rx -= (ch % 24) * 12;
VOICE_PROCESSED* pvoice = &voices[ch];
VOICE_PROCESSED *pvoice = &voices[ch];
switch (rx) {
case 0x1C0:
return (u16)(((pvoice->pStart - (u8*)spu2mem) >> 17) & 0x3F);
return (u16)(((pvoice->pStart - (u8 *)spu2mem) >> 17) & 0x3F);
case 0x1C2:
return (u16)(((pvoice->pStart - (u8*)spu2mem) >> 1) & 0xFFFF);
return (u16)(((pvoice->pStart - (u8 *)spu2mem) >> 1) & 0xFFFF);
case 0x1C4:
return (u16)(((pvoice->pLoop - (u8*)spu2mem) >> 17) & 0x3F);
return (u16)(((pvoice->pLoop - (u8 *)spu2mem) >> 17) & 0x3F);
case 0x1C6:
return (u16)(((pvoice->pLoop - (u8*)spu2mem) >> 1) & 0xFFFF);
return (u16)(((pvoice->pLoop - (u8 *)spu2mem) >> 1) & 0xFFFF);
case 0x1C8:
return (u16)(((pvoice->pCurr - (u8*)spu2mem) >> 17) & 0x3F);
return (u16)(((pvoice->pCurr - (u8 *)spu2mem) >> 17) & 0x3F);
case 0x1CA:
return (u16)(((pvoice->pCurr - (u8*)spu2mem) >> 1) & 0xFFFF);
return (u16)(((pvoice->pCurr - (u8 *)spu2mem) >> 1) & 0xFFFF);
}
}
@ -1184,9 +1184,9 @@ SPU2irqCallback(void (*SPU2callback)(), void (*DMA4callback)(), void (*DMA7callb
}
// VOICE_PROCESSED definitions
SPU_CONTROL_* VOICE_PROCESSED::GetCtrl()
SPU_CONTROL_ *VOICE_PROCESSED::GetCtrl()
{
return ((SPU_CONTROL_*)(spu2regs + memoffset + REG_C0_CTRL));
return ((SPU_CONTROL_ *)(spu2regs + memoffset + REG_C0_CTRL));
}
void VOICE_PROCESSED::SetVolume(int iProcessRight)
@ -1260,19 +1260,19 @@ typedef struct
} SPU2freezeData;
EXPORT_C_(s32)
SPU2freeze(int mode, freezeData* data)
SPU2freeze(int mode, freezeData *data)
{
SPU2freezeData* spud;
SPU2freezeData *spud;
if (mode == FREEZE_LOAD) {
spud = (SPU2freezeData*)data->data;
spud = (SPU2freezeData *)data->data;
if (spud->version == 0x11223344) {
memcpy(spu2regs, spud->spu2regs, 0x10000);
} else {
printf("SPU2null wrong format\n");
}
} else if (mode == FREEZE_SAVE) {
spud = (SPU2freezeData*)data->data;
spud = (SPU2freezeData *)data->data;
spud->version = 0x11223344;
memcpy(spud->spu2regs, spu2regs, 0x10000);
} else if (mode == FREEZE_SIZE) {

View File

@ -41,14 +41,14 @@ extern "C" {
#define EXPORT_C_(type) extern "C" __attribute__((stdcall, externally_visible, visibility("default"))) type
#endif
extern FILE* spu2Log;
extern FILE *spu2Log;
#define SPU2_LOG __Log //debug mode
extern const u8 version;
extern const u8 revision;
extern const u8 build;
extern const u32 minor;
extern char* libraryName;
extern char *libraryName;
typedef struct
{
@ -57,10 +57,10 @@ typedef struct
extern Config conf;
void __Log(char* fmt, ...);
void __Log(char *fmt, ...);
void SaveConfig();
void LoadConfig();
void SysMessage(char* fmt, ...);
void SysMessage(char *fmt, ...);
////////////////////
// SPU2 Registers //
@ -134,8 +134,8 @@ void SysMessage(char* fmt, ...);
#define SPDIF_MODE 0x07C6
#define SPDIF_MEDIA 0x07C8
#define spu2Rs16(mem) (*(s16*)&spu2regs[(mem)&0xffff])
#define spu2Ru16(mem) (*(u16*)&spu2regs[(mem)&0xffff])
#define spu2Rs16(mem) (*(s16 *)&spu2regs[(mem)&0xffff])
#define spu2Ru16(mem) (*(u16 *)&spu2regs[(mem)&0xffff])
//#define spu2Rs32(mem) (*(s32*)&spu2regs[(mem) & 0xffff])
//#define spu2Ru32(mem) (*(u32*)&spu2regs[(mem) & 0xffff])
@ -236,7 +236,7 @@ struct ADSRInfoEx
#define NSSIZE 48 // ~ 1 ms of data
#define NSFRAMES 16 // gather at least NSFRAMES of NSSIZE before submitting
#define NSPACKETS 4
#define SPU_VOICE_STATE_SIZE (sizeof(VOICE_PROCESSED) - 4 * sizeof(void*))
#define SPU_VOICE_STATE_SIZE (sizeof(VOICE_PROCESSED) - 4 * sizeof(void *))
struct VOICE_PROCESSED
{
@ -254,7 +254,7 @@ struct VOICE_PROCESSED
void FModChangeFrequency(int ns);
void Stop();
SPU_CONTROL_* GetCtrl();
SPU_CONTROL_ *GetCtrl();
// start save state
@ -276,15 +276,15 @@ struct VOICE_PROCESSED
///////////////////
// Sound Buffers //
///////////////////
u8* pStart; // start and end addresses
u8 *pStart; // start and end addresses
u8 *pLoop, *pCurr;
_SPU_VOICE* pvoice;
_SPU_VOICE *pvoice;
};
struct ADMA
{
u16* MemAddr;
u16 *MemAddr;
s32 IntPointer;
s32 Index;
s32 AmountLeft;

View File

@ -21,8 +21,8 @@ extern HINSTANCE hInst;
void SaveConfig()
{
Config* Conf1 = &conf;
char* szTemp;
Config *Conf1 = &conf;
char *szTemp;
char szIniFile[256], szValue[256];
GetModuleFileName(GetModuleHandle((LPCSTR)hInst), szIniFile, 256);
@ -37,11 +37,11 @@ void SaveConfig()
void LoadConfig()
{
FILE* fp;
FILE *fp;
Config* Conf1 = &conf;
char* szTemp;
Config *Conf1 = &conf;
char *szTemp;
char szIniFile[256], szValue[256];
GetModuleFileName(GetModuleHandle((LPCSTR)hInst), szIniFile, 256);

View File

@ -22,7 +22,7 @@
HINSTANCE hInst;
void SysMessage(char* fmt, ...)
void SysMessage(char *fmt, ...)
{
va_list list;
char tmp[512];

View File

@ -44,7 +44,7 @@ void LogInit()
}
EXPORT_C_(void)
USBsetLogDir(const char* dir)
USBsetLogDir(const char *dir)
{
// Get the path to the log directory.
s_strLogPath = (dir == NULL) ? "logs" : dir;
@ -60,7 +60,7 @@ PS2EgetLibType()
return PS2E_LT_USB;
}
EXPORT_C_(char*)
EXPORT_C_(char *)
PS2EgetLibName()
{
snprintf(libraryName, 255, "USBnull Driver %lld%s", SVN_REV, SVN_MODS ? "m" : "");
@ -82,7 +82,7 @@ USBinit()
USBLog.WriteLn("Initializing USBnull");
// Initialize memory structures here.
usbregs = (s8*)calloc(0x10000, 1);
usbregs = (s8 *)calloc(0x10000, 1);
if (usbregs == NULL) {
USBLog.Message("Error allocating memory");
@ -104,7 +104,7 @@ USBshutdown()
}
EXPORT_C_(s32)
USBopen(void* pDsp)
USBopen(void *pDsp)
{
USBLog.WriteLn("Opening USBnull.");
@ -245,14 +245,14 @@ USBirqHandler(void)
}
EXPORT_C_(void)
USBsetRAM(void* mem)
USBsetRAM(void *mem)
{
ram = (s8*)mem;
ram = (s8 *)mem;
USBLog.WriteLn("*Setting ram.");
}
EXPORT_C_(void)
USBsetSettingsDir(const char* dir)
USBsetSettingsDir(const char *dir)
{
// Get the path to the ini directory.
s_strIniPath = (dir == NULL) ? "inis" : dir;
@ -261,7 +261,7 @@ USBsetSettingsDir(const char* dir)
// extended funcs
EXPORT_C_(s32)
USBfreeze(int mode, freezeData* data)
USBfreeze(int mode, freezeData *data)
{
// This should store or retrieve any information, for if emulation
// gets suspended, or for savestates.

View File

@ -36,11 +36,11 @@ static const s64 PSXCLK = 36864000; /* 36.864 Mhz */
extern s8 *usbregs, *ram;
#define usbRs8(mem) usbregs[(mem)&0xffff]
#define usbRs16(mem) (*(s16*)&usbregs[(mem)&0xffff])
#define usbRs32(mem) (*(s32*)&usbregs[(mem)&0xffff])
#define usbRu8(mem) (*(u8*)&usbregs[(mem)&0xffff])
#define usbRu16(mem) (*(u16*)&usbregs[(mem)&0xffff])
#define usbRu32(mem) (*(u32*)&usbregs[(mem)&0xffff])
#define usbRs16(mem) (*(s16 *)&usbregs[(mem)&0xffff])
#define usbRs32(mem) (*(s32 *)&usbregs[(mem)&0xffff])
#define usbRu8(mem) (*(u8 *)&usbregs[(mem)&0xffff])
#define usbRu16(mem) (*(u16 *)&usbregs[(mem)&0xffff])
#define usbRu32(mem) (*(u32 *)&usbregs[(mem)&0xffff])
extern void SaveConfig();
extern void LoadConfig();

View File

@ -21,8 +21,8 @@ extern HINSTANCE hInst;
void SaveConfig()
{
Config* Conf1 = &conf;
char* szTemp;
Config *Conf1 = &conf;
char *szTemp;
char szIniFile[256], szValue[256];
GetModuleFileName(GetModuleHandle((LPCSTR)hInst), szIniFile, 256);
@ -37,11 +37,11 @@ void SaveConfig()
void LoadConfig()
{
FILE* fp;
FILE *fp;
Config* Conf1 = &conf;
char* szTemp;
Config *Conf1 = &conf;
char *szTemp;
char szIniFile[256], szValue[256];
GetModuleFileName(GetModuleHandle((LPCSTR)hInst), szIniFile, 256);

View File

@ -22,7 +22,7 @@
HINSTANCE hInst;
void SysMessage(char* fmt, ...)
void SysMessage(char *fmt, ...)
{
va_list list;
char tmp[512];

View File

@ -18,7 +18,7 @@
void SaveConfig();
void LoadConfig();
void SysMessage(char* fmt, ...);
void SysMessage(char *fmt, ...);
//#define is_checked(main_widget, widget_name) (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name))))
//#define set_checked(main_widget,widget_name, state) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name)), state)

View File

@ -61,7 +61,7 @@ void LogInit()
}
EXPORT_C_(void)
DEV9setLogDir(const char* dir)
DEV9setLogDir(const char *dir)
{
// Get the path to the log directory.
s_strLogPath = (dir == NULL) ? "logs" : dir;
@ -77,7 +77,7 @@ PS2EgetLibType()
return PS2E_LT_DEV9;
}
EXPORT_C_(char*)
EXPORT_C_(char *)
PS2EgetLibName()
{
snprintf(libraryName, 255, "DEV9null Driver %lld%s", SVN_REV, SVN_MODS ? "m" : "");
@ -111,7 +111,7 @@ DEV9shutdown()
}
EXPORT_C_(s32)
DEV9open(void* pDsp)
DEV9open(void *pDsp)
{
Dev9Log.WriteLn("Opening Dev9null.");
// Get anything ready we need to. Opening and creating hard
@ -237,7 +237,7 @@ DEV9write32(u32 addr, u32 value)
//#ifdef ENABLE_NEW_IOPDMA_DEV9
EXPORT_C_(s32)
DEV9dmaRead(s32 channel, u32* data, u32 bytesLeft, u32* bytesProcessed)
DEV9dmaRead(s32 channel, u32 *data, u32 bytesLeft, u32 *bytesProcessed)
{
// You'll want to put your own DMA8 reading code here.
// Time to interact with your fake (or real) hardware.
@ -247,7 +247,7 @@ DEV9dmaRead(s32 channel, u32* data, u32 bytesLeft, u32* bytesProcessed)
}
EXPORT_C_(s32)
DEV9dmaWrite(s32 channel, u32* data, u32 bytesLeft, u32* bytesProcessed)
DEV9dmaWrite(s32 channel, u32 *data, u32 bytesLeft, u32 *bytesProcessed)
{
// See above.
Dev9Log.WriteLn("Writing DMA8 Mem.");
@ -262,7 +262,7 @@ DEV9dmaInterrupt(s32 channel)
}
//#else
EXPORT_C_(void)
DEV9readDMA8Mem(u32* pMem, int size)
DEV9readDMA8Mem(u32 *pMem, int size)
{
// You'll want to put your own DMA8 reading code here.
// Time to interact with your fake (or real) hardware.
@ -270,7 +270,7 @@ DEV9readDMA8Mem(u32* pMem, int size)
}
EXPORT_C_(void)
DEV9writeDMA8Mem(u32* pMem, int size)
DEV9writeDMA8Mem(u32 *pMem, int size)
{
// See above.
Dev9Log.WriteLn("Writing DMA8 Mem.");
@ -299,7 +299,7 @@ DEV9irqHandler(void)
}
EXPORT_C_(void)
DEV9setSettingsDir(const char* dir)
DEV9setSettingsDir(const char *dir)
{
// Grab the ini directory.
s_strIniPath = (dir == NULL) ? "inis" : dir;
@ -314,7 +314,7 @@ DEV9test()
}
EXPORT_C_(s32)
DEV9freeze(int mode, freezeData* data)
DEV9freeze(int mode, freezeData *data)
{
// This should store or retrieve any information, for if emulation
// gets suspended, or for savestates.

View File

@ -44,11 +44,11 @@ extern void (*DEV9irq)(int);
extern __aligned16 s8 dev9regs[0x10000];
#define dev9Rs8(mem) dev9regs[(mem)&0xffff]
#define dev9Rs16(mem) (*(s16*)&dev9regs[(mem)&0xffff])
#define dev9Rs32(mem) (*(s32*)&dev9regs[(mem)&0xffff])
#define dev9Ru8(mem) (*(u8*)&dev9regs[(mem)&0xffff])
#define dev9Ru16(mem) (*(u16*)&dev9regs[(mem)&0xffff])
#define dev9Ru32(mem) (*(u32*)&dev9regs[(mem)&0xffff])
#define dev9Rs16(mem) (*(s16 *)&dev9regs[(mem)&0xffff])
#define dev9Rs32(mem) (*(s32 *)&dev9regs[(mem)&0xffff])
#define dev9Ru8(mem) (*(u8 *)&dev9regs[(mem)&0xffff])
#define dev9Ru16(mem) (*(u16 *)&dev9regs[(mem)&0xffff])
#define dev9Ru32(mem) (*(u32 *)&dev9regs[(mem)&0xffff])
extern void setLoggingState();

View File

@ -3,7 +3,7 @@
#include "SDL/joystick.h"
#endif
vector<GamePad*> s_vgamePad;
vector<GamePad *> s_vgamePad;
bool GamePadIdWithinBounds(int GamePadId)
{
return ((GamePadId >= 0) && (GamePadId < (int)s_vgamePad.size()));
@ -17,7 +17,7 @@ bool GamePadIdWithinBounds(int GamePadId)
/**
* Find every interesting devices and create right structure for them(depend on backend)
**/
void GamePad::EnumerateGamePads(vector<GamePad*>& vgamePad)
void GamePad::EnumerateGamePads(vector<GamePad *> &vgamePad)
{
#ifdef SDL_BUILD
JoystickInfo::EnumerateJoysticks(vgamePad);
@ -38,7 +38,7 @@ void GamePad::DoRumble(int type, int pad)
{
u32 id = conf->get_joyid(pad);
if (GamePadIdWithinBounds(id)) {
GamePad* gamePad = s_vgamePad[id];
GamePad *gamePad = s_vgamePad[id];
if (gamePad)
gamePad->Rumble(type, pad);
}
@ -53,5 +53,3 @@ void GamePad::UpdateGamePadState()
SDL_JoystickUpdate(); // No need to make yet another function call for that
#endif
}

View File

@ -12,9 +12,16 @@
class GamePad
{
public:
GamePad() : devname(""), _id(-1), numbuttons(0), numaxes(0), numhats(0),
deadzone(1500), pad(-1) {
public:
GamePad()
: devname("")
, _id(-1)
, numbuttons(0)
, numaxes(0)
, numhats(0)
, deadzone(1500)
, pad(-1)
{
vbuttonstate.clear();
vaxisstate.clear();
vhatstate.clear();
@ -25,13 +32,13 @@ class GamePad
return;
}
GamePad(const GamePad&); // copy constructor
GamePad& operator=(const GamePad&); // assignment
GamePad(const GamePad &); // copy constructor
GamePad &operator=(const GamePad &); // assignment
/**
* Find every interesting devices and create right structure for them(depend on backend)
**/
static void EnumerateGamePads(vector<GamePad*>& vgamePad);
static void EnumerateGamePads(vector<GamePad *> &vgamePad);
static void UpdateReleaseState();
/**
* Update state of every attached devices
@ -42,22 +49,22 @@ class GamePad
* Causes devices to rumble
* Rumble will differ according to type which is either 0(small motor) or 1(big motor)
**/
virtual void Rumble(int type,int pad){return;}
virtual void Rumble(int type, int pad) { return; }
/**
* Safely dispatch to the Rumble method above
**/
static void DoRumble(int type, int pad);
virtual bool Init(int id){return false;} // opens a handle and gets information
virtual bool Init(int id) { return false; } // opens a handle and gets information
/**
* Used for GUI checkbox to give feedback to the user
**/
virtual bool TestForce(float strength = 0.6){return false;}
virtual bool TestForce(float strength = 0.6) { return false; }
virtual bool PollButtons(u32 &pkey){return false;}
virtual bool PollAxes(u32 &pkey){return false;}
virtual bool PollHats(u32 &pkey){return false;}
virtual bool PollButtons(u32 &pkey) { return false; }
virtual bool PollAxes(u32 &pkey) { return false; }
virtual bool PollHats(u32 &pkey) { return false; }
virtual int GetHat(int key_to_axis)
{
@ -69,7 +76,7 @@ class GamePad
return 0;
}
const string& GetName()
const string &GetName()
{
return devname;
}
@ -133,9 +140,9 @@ class GamePad
vhatstate[i] = value;
}
virtual int GetAxisFromKey(int pad, int index){return 0;}
// These fields need to be inherited by child classes
protected:
virtual int GetAxisFromKey(int pad, int index) { return 0; }
// These fields need to be inherited by child classes
protected:
string devname; // pretty device name
int _id;
int numbuttons, numaxes, numhats;
@ -144,5 +151,5 @@ class GamePad
vector<int> vbuttonstate, vaxisstate, vhatstate;
};
extern vector<GamePad*> s_vgamePad;
extern vector<GamePad *> s_vgamePad;
extern bool GamePadIdWithinBounds(int joyid);

View File

@ -70,7 +70,7 @@ void KeyStatus::press(u32 pad, u32 index, s32 value)
// Normal mode : expect value 0 -> 80 -> FF
// Reverse mode: expect value FF -> 7F -> 0
u8 force = (value / 256);
if (analog_is_reversed(pad,index))
if (analog_is_reversed(pad, index))
analog_set(pad, index, m_analog_released_val - force);
else
analog_set(pad, index, m_analog_released_val + force);
@ -96,34 +96,41 @@ u16 KeyStatus::get(u32 pad)
void KeyStatus::analog_set(u32 pad, u32 index, u8 value)
{
PADAnalog* m_internal_analog_ref;
PADAnalog *m_internal_analog_ref;
if (m_state_acces[pad])
m_internal_analog_ref = &m_internal_analog_kbd[pad];
else
m_internal_analog_ref = &m_internal_analog_joy[pad];
switch (index)
{
switch (index) {
case PAD_R_LEFT:
case PAD_R_RIGHT: m_internal_analog_ref->rx = value; break;
case PAD_R_RIGHT:
m_internal_analog_ref->rx = value;
break;
case PAD_R_DOWN:
case PAD_R_UP: m_internal_analog_ref->ry = value; break;
case PAD_R_UP:
m_internal_analog_ref->ry = value;
break;
case PAD_L_LEFT:
case PAD_L_RIGHT: m_internal_analog_ref->lx = value; break;
case PAD_L_RIGHT:
m_internal_analog_ref->lx = value;
break;
case PAD_L_DOWN:
case PAD_L_UP: m_internal_analog_ref->ly = value; break;
case PAD_L_UP:
m_internal_analog_ref->ly = value;
break;
default: break;
default:
break;
}
}
bool KeyStatus::analog_is_reversed(u32 pad, u32 index)
{
switch (index)
{
switch (index) {
case PAD_L_RIGHT:
case PAD_L_LEFT:
return (conf->pad_options[pad].reverse_lx);
@ -140,27 +147,32 @@ bool KeyStatus::analog_is_reversed(u32 pad, u32 index)
case PAD_R_UP:
return (conf->pad_options[pad].reverse_ry);
default: return false;
default:
return false;
}
}
u8 KeyStatus::get(u32 pad, u32 index)
{
switch (index)
{
switch (index) {
case PAD_R_LEFT:
case PAD_R_RIGHT: return m_analog[pad].rx;
case PAD_R_RIGHT:
return m_analog[pad].rx;
case PAD_R_DOWN:
case PAD_R_UP: return m_analog[pad].ry;
case PAD_R_UP:
return m_analog[pad].ry;
case PAD_L_LEFT:
case PAD_L_RIGHT: return m_analog[pad].lx;
case PAD_L_RIGHT:
return m_analog[pad].lx;
case PAD_L_DOWN:
case PAD_L_UP: return m_analog[pad].ly;
case PAD_L_UP:
return m_analog[pad].ly;
default: return m_button_pressure[pad][index];
default:
return m_button_pressure[pad][index];
}
}

View File

@ -34,7 +34,7 @@ typedef struct
class KeyStatus
{
private:
private:
const u8 m_analog_released_val;
u16 m_button[GAMEPAD_NUMBER];
@ -54,8 +54,12 @@ class KeyStatus
bool analog_is_reversed(u32 pad, u32 index);
u8 analog_merge(u8 kbd, u8 joy);
public:
KeyStatus() : m_analog_released_val(0x7F) { Init(); }
public:
KeyStatus()
: m_analog_released_val(0x7F)
{
Init();
}
void Init();
void keyboard_state_acces(u32 pad) { m_state_acces[pad] = true; }
@ -71,6 +75,6 @@ class KeyStatus
void commit_status(u32 pad);
};
extern KeyStatus* key_status;
extern KeyStatus *key_status;
#endif

View File

@ -20,7 +20,8 @@
#include "GamepadConfiguration.h"
// Construtor of GamepadConfiguration
GamepadConfiguration::GamepadConfiguration(int pad, wxWindow *parent) : wxDialog(
GamepadConfiguration::GamepadConfiguration(int pad, wxWindow *parent)
: wxDialog(
parent, // Parent
wxID_ANY, // ID
_T("Gamepad configuration"), // Title
@ -30,8 +31,7 @@ GamepadConfiguration::GamepadConfiguration(int pad, wxWindow *parent) : wxDialog
wxSYSTEM_MENU |
wxCAPTION |
wxCLOSE_BOX |
wxCLIP_CHILDREN
)
wxCLIP_CHILDREN)
{
m_pad_id = pad;
@ -105,7 +105,7 @@ GamepadConfiguration::GamepadConfiguration(int pad, wxWindow *parent) : wxDialog
wxID_ANY, // ID
_T("&OK"), // Label
wxPoint(250, 160), // Position
wxSize(60,25) // Size
wxSize(60, 25) // Size
);
m_bt_cancel = new wxButton(
@ -113,7 +113,7 @@ GamepadConfiguration::GamepadConfiguration(int pad, wxWindow *parent) : wxDialog
wxID_ANY, // ID
_T("&Cancel"), // Label
wxPoint(320, 160), // Position
wxSize(60,25) // Size
wxSize(60, 25) // Size
);
Bind(wxEVT_BUTTON, &GamepadConfiguration::OnButtonClicked, this);
@ -137,23 +137,19 @@ void GamepadConfiguration::InitGamepadConfiguration()
* if the pad id is 1, you need at least 2 gamepad connected,
* Prevent to use a none initialized value on s_vgamePad (core dump)
*/
if(s_vgamePad.size() >= m_pad_id+1)
{
if (s_vgamePad.size() >= m_pad_id + 1) {
/*
* Determine if the device can use rumble
* Use TestForce with a very low strength (can't be felt)
* May be better to create a new function in order to check only that
*/
if(!s_vgamePad[m_pad_id]->TestForce(0.001f))
{
if (!s_vgamePad[m_pad_id]->TestForce(0.001f)) {
wxMessageBox(L"Rumble is not available for your device.");
m_cb_rumble->Disable(); // disable the rumble checkbox
m_sl_rumble_intensity->Disable(); // disable the rumble intensity slider
}
}
else
{
} else {
wxMessageBox(L"No gamepad detected.");
m_sl_joystick_sensibility->Disable(); // disable the joystick sensibility slider
m_cb_rumble->Disable(); // disable the rumble checkbox
@ -171,14 +167,11 @@ void GamepadConfiguration::InitGamepadConfiguration()
void GamepadConfiguration::OnButtonClicked(wxCommandEvent &event)
{
// Affichage d'un message à chaque clic sur le bouton
wxButton* bt_tmp = (wxButton*)event.GetEventObject(); // get the button object
wxButton *bt_tmp = (wxButton *)event.GetEventObject(); // get the button object
int bt_id = bt_tmp->GetId(); // get the real ID
if(bt_id == m_bt_ok->GetId()) // If the button ID is equals to the Ok button ID
{
if (bt_id == m_bt_ok->GetId()) { // If the button ID is equals to the Ok button ID
Close(); // Close the window
}
else if(bt_id == m_bt_cancel->GetId()) // If the button ID is equals to the cancel button ID
{
} else if (bt_id == m_bt_cancel->GetId()) { // If the button ID is equals to the cancel button ID
reset(); // reinitialize the value of each parameters
Close(); // Close the window
}
@ -191,10 +184,9 @@ void GamepadConfiguration::OnButtonClicked(wxCommandEvent &event)
*/
void GamepadConfiguration::OnSliderReleased(wxCommandEvent &event)
{
wxSlider* sl_tmp = (wxSlider*)event.GetEventObject(); // get the slider object
wxSlider *sl_tmp = (wxSlider *)event.GetEventObject(); // get the slider object
int sl_id = sl_tmp->GetId(); // slider id
if(sl_id == m_sl_rumble_intensity->GetId()) // if this is the rumble intensity slider
{
if (sl_id == m_sl_rumble_intensity->GetId()) { // if this is the rumble intensity slider
u32 intensity = m_sl_rumble_intensity->GetValue(); // get the new value
conf->set_ff_intensity(intensity); // and set the force feedback intensity value with it
// get the rumble intensity
@ -210,10 +202,8 @@ void GamepadConfiguration::OnSliderReleased(wxCommandEvent &event)
* 0x7FFF : maximum intensity
* 1 : maximum value of the intensity for the sdl rumble test
*/
s_vgamePad[m_pad_id]->TestForce(strength/0x7FFF);
}
else if(sl_id == m_sl_joystick_sensibility->GetId())
{
s_vgamePad[m_pad_id]->TestForce(strength / 0x7FFF);
} else if (sl_id == m_sl_joystick_sensibility->GetId()) {
u32 sensibility = m_sl_joystick_sensibility->GetValue(); // get the new value
conf->set_sensibility(sensibility); // and set the joystick sensibility
}
@ -222,30 +212,22 @@ void GamepadConfiguration::OnSliderReleased(wxCommandEvent &event)
/**
* Checkbox event, called when the value of the checkbox change
*/
void GamepadConfiguration::OnCheckboxChange(wxCommandEvent& event)
void GamepadConfiguration::OnCheckboxChange(wxCommandEvent &event)
{
wxCheckBox* cb_tmp = (wxCheckBox*) event.GetEventObject(); // get the slider object
wxCheckBox *cb_tmp = (wxCheckBox *)event.GetEventObject(); // get the slider object
int cb_id = cb_tmp->GetId();
if(cb_id == m_cb_rumble->GetId())
{
conf->pad_options[m_pad_id].forcefeedback = (m_cb_rumble->GetValue())?(u32)1:(u32)0;
if(m_cb_rumble->GetValue())
{
if (cb_id == m_cb_rumble->GetId()) {
conf->pad_options[m_pad_id].forcefeedback = (m_cb_rumble->GetValue()) ? (u32)1 : (u32)0;
if (m_cb_rumble->GetValue()) {
s_vgamePad[m_pad_id]->TestForce();
m_sl_rumble_intensity->Enable();
}
else
{
} else {
m_sl_rumble_intensity->Disable();
}
}
else if(cb_id == m_cb_hack_sixaxis_usb->GetId())
{
conf->pad_options[m_pad_id].sixaxis_usb = (m_cb_hack_sixaxis_usb->GetValue())?(u32)1:(u32)0;
}
else if(cb_id == m_cb_hack_sixaxis_pressure->GetId())
{
conf->pad_options[m_pad_id].sixaxis_pressure = (m_cb_hack_sixaxis_pressure->GetValue())?(u32)1:(u32)0;
} else if (cb_id == m_cb_hack_sixaxis_usb->GetId()) {
conf->pad_options[m_pad_id].sixaxis_usb = (m_cb_hack_sixaxis_usb->GetValue()) ? (u32)1 : (u32)0;
} else if (cb_id == m_cb_hack_sixaxis_pressure->GetId()) {
conf->pad_options[m_pad_id].sixaxis_pressure = (m_cb_hack_sixaxis_pressure->GetValue()) ? (u32)1 : (u32)0;
}
}
@ -283,7 +265,7 @@ void GamepadConfiguration::repopulate()
m_init_joystick_sensibility = tmp;
// enable rumble intensity slider if the checkbox is checked
if(m_cb_rumble->GetValue())
if (m_cb_rumble->GetValue())
m_sl_rumble_intensity->Enable();
else // disable otherwise
m_sl_rumble_intensity->Disable();

View File

@ -34,7 +34,7 @@
class GamepadConfiguration : public wxDialog
{
wxPanel* m_pan_gamepad_config;
wxPanel *m_pan_gamepad_config;
wxCheckBox *m_cb_rumble, *m_cb_hack_sixaxis_usb, *m_cb_hack_sixaxis_pressure;
wxSlider *m_sl_rumble_intensity, *m_sl_joystick_sensibility;
wxButton *m_bt_ok, *m_bt_cancel;
@ -48,12 +48,12 @@ class GamepadConfiguration : public wxDialog
void repopulate();
void reset();
// Events
void OnButtonClicked(wxCommandEvent&);
void OnSliderReleased(wxCommandEvent&);
void OnCheckboxChange(wxCommandEvent&);
void OnButtonClicked(wxCommandEvent &);
void OnSliderReleased(wxCommandEvent &);
void OnCheckboxChange(wxCommandEvent &);
public:
GamepadConfiguration(int, wxWindow*);
GamepadConfiguration(int, wxWindow *);
void InitGamepadConfiguration();
};

View File

@ -20,7 +20,8 @@
#include "JoystickConfiguration.h"
// Construtor of JoystickConfiguration
JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *parent) : wxDialog(
JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *parent)
: wxDialog(
parent, // Parent
wxID_ANY, // ID
_T("Gamepad configuration"), // Title
@ -30,8 +31,7 @@ JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *paren
wxSYSTEM_MENU |
wxCAPTION |
wxCLOSE_BOX |
wxCLIP_CHILDREN
)
wxCLIP_CHILDREN)
{
m_pad_id = pad;
@ -43,8 +43,7 @@ JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *paren
wxSize(300, 200) // Size
);
if(m_isForLeftJoystick)
{
if (m_isForLeftJoystick) {
m_cb_reverse_Lx = new wxCheckBox(
m_pan_joystick_config, // Parent
wxID_ANY, // ID
@ -65,9 +64,7 @@ JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *paren
_T("Use mouse for left analog joystick"), // Label
wxPoint(20, 60) // Position
);
}
else
{
} else {
m_cb_reverse_Rx = new wxCheckBox(
m_pan_joystick_config, // Parent
wxID_ANY, // ID
@ -95,7 +92,7 @@ JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *paren
wxID_ANY, // ID
_T("&OK"), // Label
wxPoint(250, 130), // Position
wxSize(60,25) // Size
wxSize(60, 25) // Size
);
m_bt_cancel = new wxButton(
@ -103,7 +100,7 @@ JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *paren
wxID_ANY, // ID
_T("&Cancel"), // Label
wxPoint(320, 130), // Position
wxSize(60,25) // Size
wxSize(60, 25) // Size
);
Bind(wxEVT_BUTTON, &JoystickConfiguration::OnButtonClicked, this);
@ -123,17 +120,13 @@ void JoystickConfiguration::InitJoystickConfiguration()
* if the pad id is 1, you need at least 2 gamepad connected,
* Prevent to use a none initialized value on s_vgamePad (core dump)
*/
if(s_vgamePad.size() < m_pad_id+1)
{
if (s_vgamePad.size() < m_pad_id + 1) {
wxMessageBox(L"No gamepad detected.");
// disable all checkbox
if(m_isForLeftJoystick)
{
if (m_isForLeftJoystick) {
m_cb_reverse_Lx->Disable();
m_cb_reverse_Ly->Disable();
}
else
{
} else {
m_cb_reverse_Rx->Disable();
m_cb_reverse_Ry->Disable();
}
@ -150,14 +143,11 @@ void JoystickConfiguration::InitJoystickConfiguration()
void JoystickConfiguration::OnButtonClicked(wxCommandEvent &event)
{
// Affichage d'un message à chaque clic sur le bouton
wxButton* bt_tmp = (wxButton*)event.GetEventObject(); // get the button object
wxButton *bt_tmp = (wxButton *)event.GetEventObject(); // get the button object
int bt_id = bt_tmp->GetId(); // get the real ID
if(bt_id == m_bt_ok->GetId()) // If the button ID is equals to the Ok button ID
{
if (bt_id == m_bt_ok->GetId()) { // If the button ID is equals to the Ok button ID
Close(); // Close the window
}
else if(bt_id == m_bt_cancel->GetId()) // If the button ID is equals to the cancel button ID
{
} else if (bt_id == m_bt_cancel->GetId()) { // If the button ID is equals to the cancel button ID
reset(); // reinitialize the value of each parameters
Close(); // Close the window
}
@ -166,43 +156,30 @@ void JoystickConfiguration::OnButtonClicked(wxCommandEvent &event)
/**
* Checkbox event, called when the value of the checkbox change
*/
void JoystickConfiguration::OnCheckboxChange(wxCommandEvent& event)
void JoystickConfiguration::OnCheckboxChange(wxCommandEvent &event)
{
wxCheckBox* cb_tmp = (wxCheckBox*) event.GetEventObject(); // get the slider object
wxCheckBox *cb_tmp = (wxCheckBox *)event.GetEventObject(); // get the slider object
int cb_id = cb_tmp->GetId();
bool val;
if(m_isForLeftJoystick)
{
if(cb_id == m_cb_reverse_Ly->GetId())
{
if (m_isForLeftJoystick) {
if (cb_id == m_cb_reverse_Ly->GetId()) {
val = m_cb_reverse_Ly->GetValue();
conf->pad_options[m_pad_id].reverse_ly = val;
}
else if(cb_id == m_cb_reverse_Lx->GetId())
{
} else if (cb_id == m_cb_reverse_Lx->GetId()) {
val = m_cb_reverse_Lx->GetValue();
conf->pad_options[m_pad_id].reverse_lx = val;
}
else if(cb_id == m_cb_mouse_Ljoy->GetId())
{
} else if (cb_id == m_cb_mouse_Ljoy->GetId()) {
val = m_cb_mouse_Ljoy->GetValue();
conf->pad_options[m_pad_id].mouse_l = val;
}
}
else
{
if(cb_id == m_cb_reverse_Ry->GetId())
{
} else {
if (cb_id == m_cb_reverse_Ry->GetId()) {
val = m_cb_reverse_Ry->GetValue();
conf->pad_options[m_pad_id].reverse_ry = val;
}
else if(cb_id == m_cb_reverse_Rx->GetId())
{
} else if (cb_id == m_cb_reverse_Rx->GetId()) {
val = m_cb_reverse_Rx->GetValue();
conf->pad_options[m_pad_id].reverse_rx = val;
}
else if(cb_id == m_cb_mouse_Rjoy->GetId())
{
} else if (cb_id == m_cb_mouse_Rjoy->GetId()) {
val = m_cb_mouse_Rjoy->GetValue();
conf->pad_options[m_pad_id].mouse_r = val;
}
@ -216,14 +193,11 @@ void JoystickConfiguration::OnCheckboxChange(wxCommandEvent& event)
// Reset checkbox and slider values
void JoystickConfiguration::reset()
{
if(m_isForLeftJoystick)
{
if (m_isForLeftJoystick) {
m_cb_reverse_Lx->SetValue(m_init_reverse_Lx);
m_cb_reverse_Ly->SetValue(m_init_reverse_Ly);
m_cb_mouse_Ljoy->SetValue(m_init_mouse_Ljoy);
}
else
{
} else {
m_cb_reverse_Rx->SetValue(m_init_reverse_Rx);
m_cb_reverse_Ry->SetValue(m_init_reverse_Ry);
m_cb_mouse_Rjoy->SetValue(m_init_mouse_Rjoy);
@ -234,8 +208,7 @@ void JoystickConfiguration::reset()
void JoystickConfiguration::repopulate()
{
bool val;
if(m_isForLeftJoystick)
{
if (m_isForLeftJoystick) {
val = conf->pad_options[m_pad_id].reverse_lx;
m_init_reverse_Lx = val;
m_cb_reverse_Lx->SetValue(val);
@ -247,9 +220,7 @@ void JoystickConfiguration::repopulate()
val = conf->pad_options[m_pad_id].mouse_l;
m_init_mouse_Ljoy = val;
m_cb_mouse_Ljoy->SetValue(val);
}
else
{
} else {
val = conf->pad_options[m_pad_id].reverse_rx;
m_init_reverse_Rx = val;
m_cb_reverse_Rx->SetValue(val);

View File

@ -34,7 +34,7 @@
class JoystickConfiguration : public wxDialog
{
wxPanel* m_pan_joystick_config;
wxPanel *m_pan_joystick_config;
wxCheckBox *m_cb_reverse_Lx, *m_cb_reverse_Ly, *m_cb_reverse_Rx, *m_cb_reverse_Ry,
*m_cb_mouse_Ljoy, // Use mouse for left joystick
*m_cb_mouse_Rjoy; // Use mouse for right joystick
@ -49,11 +49,11 @@ class JoystickConfiguration : public wxDialog
void repopulate();
void reset();
// Events
void OnButtonClicked(wxCommandEvent&);
void OnCheckboxChange(wxCommandEvent&);
void OnButtonClicked(wxCommandEvent &);
void OnCheckboxChange(wxCommandEvent &);
public:
JoystickConfiguration(int, bool, wxWindow*);
JoystickConfiguration(int, bool, wxWindow *);
void InitJoystickConfiguration();
};

View File

@ -20,7 +20,8 @@
#include "dialog.h"
// Construtor of Dialog
Dialog::Dialog() : wxDialog( NULL, // Parent
Dialog::Dialog()
: wxDialog(NULL, // Parent
wxID_ANY, // ID
_T("OnePad configuration"), // Title
wxDefaultPosition, // Position
@ -29,8 +30,7 @@ Dialog::Dialog() : wxDialog( NULL, // Parent
wxSYSTEM_MENU |
wxCAPTION |
wxCLOSE_BOX |
wxCLIP_CHILDREN
)
wxCLIP_CHILDREN)
{
/*
@ -236,15 +236,13 @@ Dialog::Dialog() : wxDialog( NULL, // Parent
// create a new Notebook
m_tab_gamepad = new wxNotebook(this, wxID_ANY);
for(int i=0; i<GAMEPAD_NUMBER; ++i)
{
for (int i = 0; i < GAMEPAD_NUMBER; ++i) {
// Tabs panels
m_pan_tabs[i] = new opPanel(
m_tab_gamepad,
wxID_ANY,
wxDefaultPosition,
wxSize(DEFAULT_WIDTH, DEFAULT_HEIGHT)
);
wxSize(DEFAULT_WIDTH, DEFAULT_HEIGHT));
// Add new page
// Define label
std::stringstream sstm;
@ -256,12 +254,11 @@ Dialog::Dialog() : wxDialog( NULL, // Parent
wxString(sstm.str().c_str(), wxConvUTF8) // Title
);
for(int j=0; j<BUTTONS_LENGHT; ++j)
{
for (int j = 0; j < BUTTONS_LENGHT; ++j) {
// Gamepad buttons
m_bt_gamepad[i][j] = new wxButton(
m_pan_tabs[i], // Parent
wxID_HIGHEST+j+1, // ID
wxID_HIGHEST + j + 1, // ID
_T("Undefined"), // Label
wxPoint(padding[j][2], padding[j][3]), // Position
wxSize(padding[j][0], padding[j][1]) // Size
@ -286,10 +283,8 @@ Dialog::Dialog() : wxDialog( NULL, // Parent
Bind(wxEVT_TIMER, &Dialog::JoystickEvent, this);
m_time_update_gui.Start(UPDATE_TIME, wxTIMER_CONTINUOUS);
for(int i=0; i<GAMEPAD_NUMBER; ++i)
{
for(int j=0; j<NB_IMG; ++j)
{
for (int i = 0; i < GAMEPAD_NUMBER; ++i) {
for (int j = 0; j < NB_IMG; ++j) {
m_pressed[i][j] = false;
}
}
@ -309,43 +304,32 @@ void Dialog::InitDialog()
void Dialog::OnButtonClicked(wxCommandEvent &event)
{
// Affichage d'un message à chaque clic sur le bouton
wxButton* bt_tmp = (wxButton*)event.GetEventObject(); // get the button object
int bt_id = bt_tmp->GetId()-wxID_HIGHEST-1; // get the real ID
wxButton *bt_tmp = (wxButton *)event.GetEventObject(); // get the button object
int bt_id = bt_tmp->GetId() - wxID_HIGHEST - 1; // get the real ID
int gamepad_id = m_tab_gamepad->GetSelection(); // get the tab ID (equivalent to the gamepad id)
if(bt_id >= 0 && bt_id <= PAD_R_LEFT) // if the button ID is a gamepad button
{
if (bt_id >= 0 && bt_id <= PAD_R_LEFT) { // if the button ID is a gamepad button
bt_tmp->Disable(); // switch the button state to "Disable"
config_key(gamepad_id, bt_id);
bt_tmp->Enable(); // switch the button state to "Enable"
}
else if(bt_id == Gamepad_config) // If the button ID is equals to the Gamepad_config button ID
{
} else if (bt_id == Gamepad_config) { // If the button ID is equals to the Gamepad_config button ID
GamepadConfiguration gamepad_config(gamepad_id, this);
gamepad_config.InitGamepadConfiguration();
gamepad_config.ShowModal();
}
else if(bt_id == JoyL_config) // If the button ID is equals to the JoyL_config button ID
{
} else if (bt_id == JoyL_config) { // If the button ID is equals to the JoyL_config button ID
JoystickConfiguration joystick_config(gamepad_id, true, this);
joystick_config.InitJoystickConfiguration();
joystick_config.ShowModal();
}
else if(bt_id == JoyR_config) // If the button ID is equals to the JoyR_config button ID
{
} else if (bt_id == JoyR_config) { // If the button ID is equals to the JoyR_config button ID
JoystickConfiguration joystick_config(gamepad_id, false, this);
joystick_config.InitJoystickConfiguration();
joystick_config.ShowModal();
}
else if(bt_id == Set_all) // If the button ID is equals to the Set_all button ID
{
for(int i=0; i<MAX_KEYS; ++i)
{
} else if (bt_id == Set_all) { // If the button ID is equals to the Set_all button ID
for (int i = 0; i < MAX_KEYS; ++i) {
bt_tmp = m_bt_gamepad[gamepad_id][i];
switch(i)
{
switch (i) {
case PAD_L_UP: // Left joystick (Up) ↑
m_pan_tabs[gamepad_id]->ShowImg(img_l_arrow_up);
break;
@ -377,8 +361,7 @@ void Dialog::OnButtonClicked(wxCommandEvent &event)
m_pan_tabs[gamepad_id]->Refresh();
m_pan_tabs[gamepad_id]->Update();
config_key(gamepad_id, i);
switch(i)
{
switch (i) {
case PAD_L_UP: // Left joystick (Up) ↑
m_pan_tabs[gamepad_id]->HideImg(img_l_arrow_up);
break;
@ -411,82 +394,62 @@ void Dialog::OnButtonClicked(wxCommandEvent &event)
m_pan_tabs[gamepad_id]->Update();
usleep(500000); // give enough time to the user to release the button
}
}
else if(bt_id == Ok) // If the button ID is equals to the Ok button ID
{
} else if (bt_id == Ok) { // If the button ID is equals to the Ok button ID
SaveConfig(); // Save the configuration
Close(); // Close the window
}
else if(bt_id == Apply) // If the button ID is equals to the Apply button ID
{
} else if (bt_id == Apply) { // If the button ID is equals to the Apply button ID
SaveConfig(); // Save the configuration
}
else if(bt_id == Cancel) // If the button ID is equals to the cancel button ID
{
} else if (bt_id == Cancel) { // If the button ID is equals to the cancel button ID
Close(); // Close the window
}
}
void Dialog::JoystickEvent(wxTimerEvent& event)
void Dialog::JoystickEvent(wxTimerEvent &event)
{
#ifdef SDL_BUILD
u32 key;
int map;
std::map<u32,int>::iterator it;
std::map<u32,int>::iterator it2;
std::map<u32, int>::iterator it;
std::map<u32, int>::iterator it2;
SDL_JoystickEventState(SDL_ENABLE);
SDL_Event events;
while(SDL_PollEvent(&events))
{
switch(events.type)
{
while (SDL_PollEvent(&events)) {
switch (events.type) {
case SDL_KEYDOWN:
case SDL_KEYUP:
break;
case SDL_JOYAXISMOTION:
if(events.jaxis.which < GAMEPAD_NUMBER)
{
key = axis_to_key(false, (events.jaxis.value<0), events.jaxis.axis);
it=m_map_images[events.jaxis.which].find(key);
if(it != m_map_images[events.jaxis.which].end())
{
if (events.jaxis.which < GAMEPAD_NUMBER) {
key = axis_to_key(false, (events.jaxis.value < 0), events.jaxis.axis);
it = m_map_images[events.jaxis.which].find(key);
if (it != m_map_images[events.jaxis.which].end()) {
map = m_map_images[events.jaxis.which][key];
if(events.jaxis.value == 0)
{
if(map >= PAD_L_UP && map <= PAD_L_LEFT)
if (events.jaxis.value == 0) {
if (map >= PAD_L_UP && map <= PAD_L_LEFT)
m_pan_tabs[events.jaxis.which]->HideImg(img_left_cursor);
else if(map >= PAD_R_UP && map <= PAD_R_LEFT)
else if (map >= PAD_R_UP && map <= PAD_R_LEFT)
m_pan_tabs[events.jaxis.which]->HideImg(img_right_cursor);
else if(map < PAD_L_UP)
else if (map < PAD_L_UP)
m_pan_tabs[events.jaxis.which]->HideImg(map);
}
else
{
if(map >= PAD_L_UP && map <= PAD_L_LEFT)
{
} else {
if (map >= PAD_L_UP && map <= PAD_L_LEFT) {
m_pan_tabs[events.jaxis.which]->MoveJoystick(events.jaxis.axis, events.jaxis.value);
m_pan_tabs[events.jaxis.which]->ShowImg(img_left_cursor);
}
else if(map >= PAD_R_UP && map <= PAD_R_LEFT)
{
} else if (map >= PAD_R_UP && map <= PAD_R_LEFT) {
m_pan_tabs[events.jaxis.which]->MoveJoystick(events.jaxis.axis, events.jaxis.value);
m_pan_tabs[events.jaxis.which]->ShowImg(img_right_cursor);
}
else if(map < PAD_L_UP) // if this is not a joystick
{
} else if (map < PAD_L_UP) { // if this is not a joystick
m_pan_tabs[events.jaxis.which]->ShowImg(map);
}
}
break;
}
// Hack Dualshock 4 (L2, R2)
key = axis_to_key(false, (events.jaxis.value>0), events.jaxis.axis);
it2=m_map_images[events.jaxis.which].find(key);
if(it2 != m_map_images[events.jaxis.which].end())
{
key = axis_to_key(false, (events.jaxis.value > 0), events.jaxis.axis);
it2 = m_map_images[events.jaxis.which].find(key);
if (it2 != m_map_images[events.jaxis.which].end()) {
map = m_map_images[events.jaxis.which][key];
if(map < PAD_L_UP) // if this is not a joystick
{
if (map < PAD_L_UP) { // if this is not a joystick
m_pan_tabs[events.jaxis.which]->HideImg(map);
}
break;
@ -494,63 +457,53 @@ void Dialog::JoystickEvent(wxTimerEvent& event)
}
break;
case SDL_JOYBUTTONDOWN:
if(events.jbutton.which < GAMEPAD_NUMBER)
{
if (events.jbutton.which < GAMEPAD_NUMBER) {
key = button_to_key(events.jbutton.button);
it=m_map_images[events.jbutton.which].find(key);
if(it != m_map_images[events.jbutton.which].end())
{
it = m_map_images[events.jbutton.which].find(key);
if (it != m_map_images[events.jbutton.which].end()) {
map = m_map_images[events.jbutton.which][key];
m_pan_tabs[events.jbutton.which]->ShowImg(map);
}
}
break;
case SDL_JOYBUTTONUP:
if(events.jbutton.which < GAMEPAD_NUMBER)
{
if (events.jbutton.which < GAMEPAD_NUMBER) {
key = button_to_key(events.jbutton.button);
it=m_map_images[events.jbutton.which].find(key);
if(it != m_map_images[events.jbutton.which].end())
{
it = m_map_images[events.jbutton.which].find(key);
if (it != m_map_images[events.jbutton.which].end()) {
map = m_map_images[events.jbutton.which][key];
m_pan_tabs[events.jbutton.which]->HideImg(map);
}
}
break;
case SDL_JOYHATMOTION:
if(events.jhat.which < GAMEPAD_NUMBER)
{
switch(events.jhat.value)
{
if (events.jhat.which < GAMEPAD_NUMBER) {
switch (events.jhat.value) {
case SDL_HAT_UP:
key = hat_to_key(events.jhat.value, events.jhat.hat);
it=m_map_images[events.jhat.which].find(key);
if(it != m_map_images[events.jhat.which].end())
{
it = m_map_images[events.jhat.which].find(key);
if (it != m_map_images[events.jhat.which].end()) {
m_pan_tabs[events.jhat.which]->ShowImg(img_dp_up);
}
break;
case SDL_HAT_DOWN:
key = hat_to_key(events.jhat.value, events.jhat.hat);
it=m_map_images[events.jhat.which].find(key);
if(it != m_map_images[events.jhat.which].end())
{
it = m_map_images[events.jhat.which].find(key);
if (it != m_map_images[events.jhat.which].end()) {
m_pan_tabs[events.jhat.which]->ShowImg(img_dp_bottom);
}
break;
case SDL_HAT_RIGHT:
key = hat_to_key(events.jhat.value, events.jhat.hat);
it=m_map_images[events.jhat.which].find(key);
if(it != m_map_images[events.jhat.which].end())
{
it = m_map_images[events.jhat.which].find(key);
if (it != m_map_images[events.jhat.which].end()) {
m_pan_tabs[events.jhat.which]->ShowImg(img_dp_right);
}
break;
case SDL_HAT_LEFT:
key = hat_to_key(events.jhat.value, events.jhat.hat);
it=m_map_images[events.jhat.which].find(key);
if(it != m_map_images[events.jhat.which].end())
{
it = m_map_images[events.jhat.which].find(key);
if (it != m_map_images[events.jhat.which].end()) {
m_pan_tabs[events.jhat.which]->ShowImg(img_dp_left);
}
break;
@ -580,45 +533,34 @@ void Dialog::config_key(int pad, int key)
// I don't have any guarantee that not-yet-pressed state is egual to released state
GamePad::UpdateReleaseState();
while (!captured)
{
vector<GamePad*>::iterator itjoy;
if (PollX11KeyboardMouseEvent(key_pressed))
{
while (!captured) {
vector<GamePad *>::iterator itjoy;
if (PollX11KeyboardMouseEvent(key_pressed)) {
// special case for keyboard/mouse to handle multiple keys
// Note: key_pressed == 0 when ESC is hit to abort the capture
if (key_pressed > 0)
{
if (key_pressed > 0) {
clear_key(pad, key);
set_keyboad_key(pad, key_pressed, key);
m_simulatedKeys[pad][key] = key_pressed;
m_map_images[pad][key_pressed] = key;
}
captured = true;
}
else
{
} else {
GamePad::UpdateGamePadState();
itjoy = s_vgamePad.begin();
while ((itjoy != s_vgamePad.end()) && (!captured))
{
if ((*itjoy)->PollButtons(key_pressed))
{
while ((itjoy != s_vgamePad.end()) && (!captured)) {
if ((*itjoy)->PollButtons(key_pressed)) {
clear_key(pad, key);
set_key(pad, key, key_pressed);
m_map_images[pad][key_pressed] = key;
captured = true;
}
else if((*itjoy)->PollAxes(key_pressed))
{
} else if ((*itjoy)->PollAxes(key_pressed)) {
clear_key(pad, key);
set_key(pad, key, key_pressed);
m_map_images[pad][key_pressed] = key;
captured = true;
}
else if((*itjoy)->PollHats(key_pressed))
{
} else if ((*itjoy)->PollHats(key_pressed)) {
clear_key(pad, key);
set_key(pad, key, key_pressed);
m_map_images[pad][key_pressed] = key;
@ -629,8 +571,7 @@ void Dialog::config_key(int pad, int key)
}
}
m_bt_gamepad[pad][key]->SetLabel(
KeyName(pad, key, m_simulatedKeys[pad][key]).c_str()
);
KeyName(pad, key, m_simulatedKeys[pad][key]).c_str());
}
void Dialog::clear_key(int pad, int key)
@ -640,17 +581,16 @@ void Dialog::clear_key(int pad, int key)
m_simulatedKeys[pad][key] = 0;
// erase gamepad entry (keysim map)
std::map<u32,u32>::iterator it1;
it1=conf->keysym_map[pad].find(keysim);
if(it1 != conf->keysym_map[pad].end())
std::map<u32, u32>::iterator it1;
it1 = conf->keysym_map[pad].find(keysim);
if (it1 != conf->keysym_map[pad].end())
conf->keysym_map[pad].erase(it1);
// erase gamepad entry (image map)
int val = get_key(pad, key);
std::map<u32,int>::iterator it2;
it2=m_map_images[pad].find(val);
if(it2 != m_map_images[pad].end())
{
std::map<u32, int>::iterator it2;
it2 = m_map_images[pad].find(val);
if (it2 != m_map_images[pad].end()) {
m_map_images[pad].erase(it2);
}
@ -664,31 +604,25 @@ void Dialog::clear_key(int pad, int key)
// Set button values
void Dialog::repopulate()
{
for(int gamepad_id=0; gamepad_id<GAMEPAD_NUMBER; ++gamepad_id)
{
for (int key = 0; key < MAX_KEYS; key++)
{
if (get_key(gamepad_id, key) != 0)
{
for (int gamepad_id = 0; gamepad_id < GAMEPAD_NUMBER; ++gamepad_id) {
for (int key = 0; key < MAX_KEYS; key++) {
if (get_key(gamepad_id, key) != 0) {
m_bt_gamepad[gamepad_id][key]->SetLabel(
KeyName(gamepad_id, key).c_str()
);
KeyName(gamepad_id, key).c_str());
m_map_images[gamepad_id][get_key(gamepad_id, key)] = key;
}
}
// keyboard/mouse key
map<u32,u32>::iterator it;
map<u32, u32>::iterator it;
for (it = conf->keysym_map[gamepad_id].begin();
it != conf->keysym_map[gamepad_id].end(); ++it)
{
it != conf->keysym_map[gamepad_id].end(); ++it) {
int keysym = it->first;
int key = it->second;
m_bt_gamepad[gamepad_id][key]->SetLabel(
KeyName(gamepad_id, key, keysym).c_str()
);
KeyName(gamepad_id, key, keysym).c_str());
m_simulatedKeys[gamepad_id][key] = keysym;
m_map_images[gamepad_id][keysym] = key;

View File

@ -48,7 +48,7 @@
// see onepad.h for more details about gamepad button id
enum gui_buttons {
Analog = PAD_R_LEFT+1, // Analog button (not yet supported ?)
Analog = PAD_R_LEFT + 1, // Analog button (not yet supported ?)
JoyL_config, // Left Joystick Configuration
JoyR_config, // Right Joystick Configuration
Gamepad_config, // Gamepad Configuration
@ -66,11 +66,11 @@ enum gui_buttons {
class Dialog : public wxDialog
{
// Panels
opPanel* m_pan_tabs[GAMEPAD_NUMBER]; // Gamepad Tabs box
opPanel *m_pan_tabs[GAMEPAD_NUMBER]; // Gamepad Tabs box
// Notebooks
wxNotebook* m_tab_gamepad; // Joysticks Tabs
wxNotebook *m_tab_gamepad; // Joysticks Tabs
// Buttons
wxButton* m_bt_gamepad[GAMEPAD_NUMBER][BUTTONS_LENGHT]; // Joystick button use to modify the button mapping
wxButton *m_bt_gamepad[GAMEPAD_NUMBER][BUTTONS_LENGHT]; // Joystick button use to modify the button mapping
// Contain all simulated key
u32 m_simulatedKeys[GAMEPAD_NUMBER][MAX_KEYS];
// Timer
@ -78,7 +78,7 @@ class Dialog : public wxDialog
// Check if the gui must display feddback image
bool m_pressed[GAMEPAD_NUMBER][NB_IMG];
// Map the key pressed with the feedback image id
std::map<u32,int> m_map_images[GAMEPAD_NUMBER];
std::map<u32, int> m_map_images[GAMEPAD_NUMBER];
// methods
void config_key(int, int);
@ -86,8 +86,8 @@ class Dialog : public wxDialog
void repopulate();
// Events
void OnButtonClicked(wxCommandEvent&);
void JoystickEvent(wxTimerEvent&);
void OnButtonClicked(wxCommandEvent &);
void JoystickEvent(wxTimerEvent &);
public:
Dialog();

View File

@ -37,41 +37,43 @@ string KeyName(int pad, int key, int keysym)
if (keysym < 10) {
// mouse
switch (keysym) {
case 1: sprintf(&tmp[0], "Mouse Left"); break;
case 2: sprintf(&tmp[0], "Mouse Middle"); break;
case 3: sprintf(&tmp[0], "Mouse Right"); break;
case 1:
sprintf(&tmp[0], "Mouse Left");
break;
case 2:
sprintf(&tmp[0], "Mouse Middle");
break;
case 3:
sprintf(&tmp[0], "Mouse Right");
break;
default: // Use only number for extra button
sprintf(&tmp[0], "Mouse %d", keysym);
}
} else {
// keyboard
char* pstr = XKeysymToString(keysym);
if (pstr != NULL) tmp = pstr;
char *pstr = XKeysymToString(keysym);
if (pstr != NULL)
tmp = pstr;
}
} else {
// joystick
KeyType k = type_of_joykey(pad, key);
switch (k)
{
case PAD_JOYBUTTONS:
{
switch (k) {
case PAD_JOYBUTTONS: {
int button = key_to_button(pad, key);
sprintf(&tmp[0], "JBut %d", button);
break;
}
case PAD_AXIS:
{
if (key_to_axis_type(pad,key))
case PAD_AXIS: {
if (key_to_axis_type(pad, key))
sprintf(&tmp[0], "JAxis %d Full", key_to_axis(pad, key));
else
sprintf(&tmp[0], "JAxis %d Half%s", key_to_axis(pad, key), key_to_axis_sign(pad, key) ? "-" : "+");
break;
}
case PAD_HAT:
{
case PAD_HAT: {
int axis = key_to_axis(pad, key);
switch(key_to_hat_dir(pad, key))
{
switch (key_to_hat_dir(pad, key)) {
case HAT_UP:
sprintf(&tmp[0], "JPOVU-%d", axis);
break;
@ -90,7 +92,8 @@ string KeyName(int pad, int key, int keysym)
}
break;
}
default: break;
default:
break;
}
}
@ -121,8 +124,7 @@ void SaveConfig()
const std::string iniFile(s_strIniPath + "OnePAD.ini");
f = fopen(iniFile.c_str(), "w");
if (f == NULL)
{
if (f == NULL) {
printf("OnePAD: failed to save ini %s\n", iniFile.c_str());
return;
}
@ -133,16 +135,14 @@ void SaveConfig()
fprintf(f, "joy_pad_map = %d\n", conf->joyid_map);
fprintf(f, "ff_intensity = %d\n", conf->get_ff_intensity());
for (int pad = 0; pad < GAMEPAD_NUMBER; pad++)
{
for (int key = 0; key < MAX_KEYS; key++)
{
fprintf(f, "[%d][%d] = 0x%x\n", pad, key, get_key(pad,key));
for (int pad = 0; pad < GAMEPAD_NUMBER; pad++) {
for (int key = 0; key < MAX_KEYS; key++) {
fprintf(f, "[%d][%d] = 0x%x\n", pad, key, get_key(pad, key));
}
}
map<u32,u32>::iterator it;
for (int pad = 0; pad < GAMEPAD_NUMBER ; pad++)
map<u32, u32>::iterator it;
for (int pad = 0; pad < GAMEPAD_NUMBER; pad++)
for (it = conf->keysym_map[pad].begin(); it != conf->keysym_map[pad].end(); ++it)
fprintf(f, "PAD %d:KEYSYM 0x%x = %d\n", pad, it->first, it->second);
@ -162,49 +162,54 @@ void LoadConfig()
const std::string iniFile(s_strIniPath + "OnePAD.ini");
f = fopen(iniFile.c_str(), "r");
if (f == NULL)
{
if (f == NULL) {
printf("OnePAD: failed to load ini %s\n", iniFile.c_str());
SaveConfig(); //save and return
return;
}
u32 value;
if (fscanf(f, "log = %u\n", &value) == 0) goto error;
if (fscanf(f, "log = %u\n", &value) == 0)
goto error;
conf->log = value;
if (fscanf(f, "options = %u\n", &value) == 0) goto error;
if (fscanf(f, "options = %u\n", &value) == 0)
goto error;
conf->packed_options = value;
if (fscanf(f, "mouse_sensibility = %u\n", &value) == 0) goto error;
if (fscanf(f, "mouse_sensibility = %u\n", &value) == 0)
goto error;
conf->set_sensibility(value);
if (fscanf(f, "joy_pad_map = %u\n", &value) == 0) goto error;
if (fscanf(f, "joy_pad_map = %u\n", &value) == 0)
goto error;
conf->joyid_map = value;
if (fscanf(f, "ff_intensity = %u\n", &value) == 0) goto error;
if (fscanf(f, "ff_intensity = %u\n", &value) == 0)
goto error;
conf->set_ff_intensity(value);
for (int pad = 0; pad < GAMEPAD_NUMBER; pad++)
{
for (int key = 0; key < MAX_KEYS; key++)
{
for (int pad = 0; pad < GAMEPAD_NUMBER; pad++) {
for (int key = 0; key < MAX_KEYS; key++) {
sprintf(str, "[%d][%d] = 0x%%x\n", pad, key);
u32 temp = 0;
if (fscanf(f, str, &temp) == 0) temp = 0;
if (fscanf(f, str, &temp) == 0)
temp = 0;
set_key(pad, key, temp);
if (temp && pad == 0) have_user_setting = true;
if (temp && pad == 0)
have_user_setting = true;
}
}
u32 pad;
u32 keysym;
u32 index;
while( fscanf(f, "PAD %u:KEYSYM 0x%x = %u\n", &pad, &keysym, &index) != EOF ) {
while (fscanf(f, "PAD %u:KEYSYM 0x%x = %u\n", &pad, &keysym, &index) != EOF) {
set_keyboad_key(pad & 1, keysym, index);
if(pad == 0) have_user_setting = true;
if (pad == 0)
have_user_setting = true;
}
if (!have_user_setting) DefaultKeyboardValues();
if (!have_user_setting)
DefaultKeyboardValues();
error:
fclose(f);
}

Some files were not shown because too many files have changed in this diff Show More