Making things ready for official wiiflow svn ;)

-made wait animation faster
-removed a few unneeded lines in the wait message code
-fixed booting wii games from disc
-fixed possible bug in wii game launching in general
-gecko output again on wii game booting
-converted alot of spaces to tabs, fitting the general wiiflow
coding style
-general cleaning up things
This commit is contained in:
fix94.1 2012-07-25 22:12:17 +00:00
parent 6cb919c7ae
commit a36fab3cdd
39 changed files with 1649 additions and 1680 deletions

View File

@ -14,17 +14,9 @@
#include "gecko.h"
#include "mem2.hpp"
#define STACK_ALIGN(type, name, cnt, alignment) \
u8 _al__##name[((sizeof(type)*(cnt)) + (alignment) + \
(((sizeof(type)*(cnt))%(alignment)) > 0 ? ((alignment) - \
((sizeof(type)*(cnt))%(alignment))) : 0))]; \
type *name = (type*)(((u32)(_al__##name)) + ((alignment) - (( \
(u32)(_al__##name))&((alignment)-1))))
void __Disc_SetLowMem(void);
void __Disc_SetTime(void);
void _unstub_start();
u32 entryPoint;
extern void __exception_closeall();
@ -41,6 +33,8 @@ typedef struct _dolheader
u32 padding[7];
} __attribute__((packed)) dolheader;
u32 entryPoint;
s32 BootChannel(u32 entry, u64 chantitle, u32 ios, u8 vidMode, bool vipatch, bool countryString, u8 patchVidMode, int aspectRatio)
{
gprintf("Loading Channel...\n");

View File

@ -468,13 +468,20 @@ void Nand::__NANDify(char *str)
{
if(c == '&')
{
if(!strncmp(src, "qt;", 3)) c = '"';
else if (!strncmp(src, "st;", 3)) c = '*';
else if (!strncmp(src, "cl;", 3)) c = ':';
else if (!strncmp(src, "lt;", 3)) c = '<';
else if (!strncmp(src, "gt;", 3)) c = '>';
else if (!strncmp(src, "qm;", 3)) c = '?';
else if (!strncmp(src, "vb;", 3)) c = '|';
if(!strncmp(src, "qt;", 3))
c = '"';
else if(!strncmp(src, "st;", 3))
c = '*';
else if(!strncmp(src, "cl;", 3))
c = ':';
else if(!strncmp(src, "lt;", 3))
c = '<';
else if(!strncmp(src, "gt;", 3))
c = '>';
else if(!strncmp(src, "qm;", 3))
c = '?';
else if(!strncmp(src, "vb;", 3))
c = '|';
if (c != '&')
src += 3;
@ -862,9 +869,7 @@ s32 Nand::DoNandDump(const char *source, const char *dest, dump_callback_t i_dum
__DumpNandFile(source, ndest);
}
else
{
__DumpNandFolder(source, dest);
}
return 0;
}

View File

@ -12,8 +12,6 @@
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#define read_le32_unaligned(x) ((x)[0]|((x)[1]<<8)|((x)[2]<<16)|((x)[3]<<24))
#define ERROR(x) do {wbfs_error(x);goto error;}while(0)
#define ALIGN_LBA(x) (((x)+p->hd_sec_sz-1)&(~(p->hd_sec_sz-1)))
@ -37,6 +35,8 @@ static u8 size_to_shift(u32 size)
return ret - 1;
}
#define read_le32_unaligned(x) ((x)[0]|((x)[1]<<8)|((x)[2]<<16)|((x)[3]<<24))
wbfs_t *wbfs_open_hd(rw_sector_callback_t read_hdsector, rw_sector_callback_t write_hdsector, void *callback_data, int hd_sector_size, int num_hd_sector __attribute((unused)), int reset)
{
int i=num_hd_sector,ret;
@ -64,7 +64,6 @@ wbfs_t *wbfs_open_hd(rw_sector_callback_t read_hdsector, rw_sector_callback_t wr
wbfs_iofree(tmp_buffer);
if(reset)// XXX make a empty hd partition..
{
}
return 0;
}

View File

@ -382,6 +382,7 @@ void aes_decrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len)
}
else fraction = 16;
// debug_printf("block %d: fraction = %d\n", blockno, fraction);
memcpy(block, inbuf + blockno * sizeof(block), fraction);
decrypt((char*) block);
u8 *ctext_ptr;
@ -391,6 +392,8 @@ void aes_decrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len)
for (i = 0; i < fraction; i++)
outbuf[blockno * sizeof(block) + i] = ctext_ptr[i] ^ block[i];
// debug_printf("Block %d output: ", blockno);
// hexdump(outbuf + blockno*sizeof(block), 16);
}
}
@ -400,6 +403,8 @@ void aes_encrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len)
u8 block[16];
unsigned int blockno = 0, i;
// debug_printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len);
for (blockno = 0; blockno <= (len / sizeof(block)); blockno++)
{
unsigned int fraction;
@ -411,6 +416,7 @@ void aes_encrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len)
}
else fraction = 16;
// debug_printf("block %d: fraction = %d\n", blockno, fraction);
memcpy(block, inbuf + blockno * sizeof(block), fraction);
for (i = 0; i < fraction; i++)
@ -419,6 +425,8 @@ void aes_encrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len)
encrypt((char*) block);
memcpy(iv, block, sizeof(block));
memcpy(outbuf + blockno * sizeof(block), block, sizeof(block));
// debug_printf("Block %d output: ", blockno);
// hexdump(outbuf + blockno*sizeof(block), 16);
}
}

View File

@ -16,7 +16,6 @@
/* init-globals */
bool geckoinit = false;
bool textVideoInit = false;
bool geckoDisable = false;
bool bufferMessages = true;
bool WriteToSD = false;
@ -108,8 +107,6 @@ void WriteToFile(char* tmp)
//using the gprintf from crediar because it is smaller than mine
void gprintf( const char *format, ... )
{
if(geckoDisable)
return;
char *tmp = NULL;
va_list va;
va_start(va, format);
@ -184,11 +181,6 @@ bool InitGecko()
return false;
}
void GeckoDisable()
{
geckoDisable = true;
}
void AllocSDGeckoBuffer()
{
tmpfilebuffer = (char*)MEM2_alloc(filebuffer + 1 * sizeof(char));

View File

@ -1,5 +1,4 @@
#ifndef _GECKO_H_
#define _GECKO_H_
@ -17,7 +16,6 @@ extern "C" {
bool InitGecko();
void AllocSDGeckoBuffer();
void ClearLogBuffer();
void GeckoDisable();
#ifdef __cplusplus
}

View File

@ -71,7 +71,8 @@ GameTDB::~GameTDB()
bool GameTDB::OpenFile(const char *filepath)
{
if(!filepath) return false;
if(!filepath)
return false;
gprintf("Trying to open '%s'...", filepath);
file = fopen(filepath, "rb");
@ -110,7 +111,8 @@ void GameTDB::CloseFile()
delete [] GameNodeCache;
GameNodeCache = NULL;
if(file) fclose(file);
if(file)
fclose(file);
file = NULL;
}
@ -127,7 +129,8 @@ void GameTDB::Refresh()
bool GameTDB::LoadGameOffsets(const char *path)
{
if(!path) return false;
if(!path)
return false;
string OffsetDBPath = path;
if(strlen(path) > 0 && path[strlen(path)-1] != '/')
@ -144,9 +147,9 @@ bool GameTDB::LoadGameOffsets(const char * path)
return result;
}
unsigned long long ExistingVersion = GetGameTDBVersion();
unsigned long long Version = 0;
unsigned int NodeCount = 0;
u64 ExistingVersion = GetGameTDBVersion();
u64 Version = 0;
u32 NodeCount = 0;
fread(&Version, 1, sizeof(Version), fp);
@ -195,10 +198,11 @@ bool GameTDB::SaveGameOffsets(const char * path)
return false;
FILE *fp = fopen(path, "wb");
if(!fp) return false;
if(!fp)
return false;
unsigned long long ExistingVersion = GetGameTDBVersion();
unsigned int NodeCount = OffsetMap.size();
u64 ExistingVersion = GetGameTDBVersion();
u32 NodeCount = OffsetMap.size();
if(fwrite(&ExistingVersion, 1, sizeof(ExistingVersion), fp) != sizeof(ExistingVersion))
{
@ -223,7 +227,7 @@ bool GameTDB::SaveGameOffsets(const char * path)
return true;
}
unsigned long long GameTDB::GetGameTDBVersion()
u64 GameTDB::GetGameTDBVersion()
{
if(!file)
return 0;
@ -252,7 +256,7 @@ int GameTDB::GetData(char * data, int offset, int size)
char *GameTDB::LoadGameNode(const char *id)
{
unsigned int read = 0;
u32 read = 0;
GameOffsets *offset = this->GetGameOffset(id);
if(!offset)
@ -304,7 +308,7 @@ char * GameTDB::GetGameNode(const char * id)
GameOffsets *GameTDB::GetGameOffset(const char *gameID)
{
for(unsigned int i = 0; i < OffsetMap.size(); ++i)
for(u32 i = 0; i < OffsetMap.size(); ++i)
{
if(strncmp(gameID, OffsetMap[i].gameID, strlen(OffsetMap[i].gameID)) == 0)
return &OffsetMap[i];
@ -373,7 +377,8 @@ char * GameTDB::GetNodeText(char * data, const char * nodestart, const char * no
char *GameTDB::SeekLang(char *text, const char *langcode)
{
if(!text || !langcode) return NULL;
if(!text || !langcode)
return NULL;
char *ptr = text;
while((ptr = strstr(ptr, "<locale lang=")) != NULL)
@ -468,16 +473,12 @@ bool GameTDB::FindTitle(char * data, string & title, string langCode)
{
language = SeekLang(data, "EN");
if(!language)
{
return false;
}
}
char *the_title = GetNodeText(language, "<title>", "</title>");
if(!the_title)
{
return false;
}
char tmp[64];
strncpy(tmp, the_title, sizeof(tmp) - 1);
@ -489,10 +490,12 @@ bool GameTDB::FindTitle(char * data, string & title, string langCode)
bool GameTDB::GetTitle(const char *id, string & title)
{
title = "";
if(!id) return false;
if(!id)
return false;
char *data = GetGameNode(id);
if(!data) return false;
if(!data)
return false;
bool retval = FindTitle(data, title, LangCode);
@ -504,10 +507,12 @@ bool GameTDB::GetTitle(const char * id, string & title)
bool GameTDB::GetSynopsis(const char *id, string & synopsis)
{
synopsis = "";
if(!id) return false;
if(!id)
return false;
char *data = GetGameNode(id);
if(!data) return false;
if(!data)
return false;
char *language = SeekLang(data, LangCode.c_str());
if(!language)
@ -537,10 +542,12 @@ bool GameTDB::GetSynopsis(const char * id, string & synopsis)
bool GameTDB::GetRegion(const char *id, string & region)
{
region = "";
if(!id) return false;
if(!id)
return false;
char *data = GetGameNode(id);
if(!data) return false;
if(!data)
return false;
char *the_region = GetNodeText(data, "<region>", "</region>");
if(!the_region)
@ -559,10 +566,12 @@ bool GameTDB::GetRegion(const char * id, string & region)
bool GameTDB::GetDeveloper(const char *id, string & dev)
{
dev = "";
if(!id) return false;
if(!id)
return false;
char *data = GetGameNode(id);
if(!data) return false;
if(!data)
return false;
char *the_dev = GetNodeText(data, "<developer>", "</developer>");
if(!the_dev)
@ -581,10 +590,12 @@ bool GameTDB::GetDeveloper(const char * id, string & dev)
bool GameTDB::GetPublisher(const char *id, string & pub)
{
pub = "";
if(!id) return false;
if(!id)
return false;
char *data = GetGameNode(id);
if(!data) return false;
if(!data)
return false;
char *the_pub = GetNodeText(data, "<publisher>", "</publisher>");
if(!the_pub)
@ -600,12 +611,14 @@ bool GameTDB::GetPublisher(const char * id, string & pub)
return true;
}
unsigned int GameTDB::GetPublishDate(const char * id)
u32 GameTDB::GetPublishDate(const char *id)
{
if(!id) return 0;
if(!id)
return 0;
char *data = GetGameNode(id);
if(!data) return 0;
if(!data)
return 0;
char *year_string = GetNodeText(data, "<date year=\"", "/>");
if(!year_string)
@ -614,7 +627,7 @@ unsigned int GameTDB::GetPublishDate(const char * id)
return 0;
}
unsigned int year, day, month;
u32 year, day, month;
year = atoi(year_string);
@ -650,10 +663,12 @@ bool GameTDB::GetGenres(const char * id, string & gen)
vector<string> genre;
gen = "";
if(!id) return false;
if(!id)
return false;
char *data = GetGameNode(id);
if(!data) return false;
if(!data)
return false;
char *the_genre = GetNodeText(data, "<genre>", "</genre>");
if(!the_genre)
@ -662,7 +677,7 @@ bool GameTDB::GetGenres(const char * id, string & gen)
return false;
}
unsigned int genre_num = 0;
u32 genre_num = 0;
const char *ptr = the_genre;
while(*ptr != '\0')
@ -673,7 +688,8 @@ bool GameTDB::GetGenres(const char * id, string & gen)
if(*ptr == ',' || *ptr == '/' || *ptr == ';')
{
ptr++;
while(*ptr == ' ') ptr++;
while(*ptr == ' ')
ptr++;
genre_num++;
continue;
}
@ -717,10 +733,12 @@ int GameTDB::GetRating(const char * id)
{
int rating = -1;
if(!id) return rating;
if(!id)
return rating;
char *data = GetGameNode(id);
if(!data) return rating;
if(!data)
return rating;
char *rating_text = GetNodeText(data, "<rating type=\"", "/>");
if(!rating_text)
@ -731,13 +749,10 @@ int GameTDB::GetRating(const char * id)
if(strncmp(rating_text, "CERO", 4) == 0)
rating = GAMETDB_RATING_TYPE_CERO;
else if(strncmp(rating_text, "ESRB", 4) == 0)
rating = GAMETDB_RATING_TYPE_ESRB;
else if(strncmp(rating_text, "PEGI", 4) == 0)
rating = GAMETDB_RATING_TYPE_PEGI;
else if(strncmp(rating_text, "GRB", 4) == 0)
rating = GAMETDB_RATING_TYPE_GRB;
@ -749,10 +764,12 @@ int GameTDB::GetRating(const char * id)
bool GameTDB::GetRatingValue(const char *id, string & rating_value)
{
rating_value = "";
if(!id) return false;
if(!id)
return false;
char *data = GetGameNode(id);
if(!data) return false;
if(!data)
return false;
char *rating_text = GetNodeText(data, "<rating type=\"", "/>");
if(!rating_text)
@ -792,7 +809,7 @@ int GameTDB::GetRatingDescriptors(const char * id, vector<string> & desc_list)
return -1;
}
unsigned int list_num = 0;
u32 list_num = 0;
while(*descriptor_text != '\0')
{
@ -859,7 +876,7 @@ int GameTDB::GetWifiFeatures(const char * id, vector<string> & feat_list)
return -1;
}
unsigned int list_num = 0;
u32 list_num = 0;
while(*feature_text != '\0')
{
@ -877,7 +894,6 @@ int GameTDB::GetWifiFeatures(const char * id, vector<string> & feat_list)
if(list_num >= feat_list.size())
feat_list.resize(list_num+1);
if(feat_list[list_num].size() == 0)
feat_list[list_num].push_back(toupper((int)*feature_text));
else
@ -931,7 +947,7 @@ int GameTDB::GetAccessories(const char * id, vector<Accessory> & acc_list)
return -1;
}
unsigned int list_num = 0;
u32 list_num = 0;
while(ControlsNode && *ControlsNode != '\0')
{
@ -940,7 +956,6 @@ int GameTDB::GetAccessories(const char * id, vector<Accessory> & acc_list)
for(const char *ptr = ControlsNode; *ptr != '"' && *ptr != '\0'; ptr++)
acc_list[list_num].Name.push_back(*ptr);
acc_list[list_num].Name.push_back('\0');
char *requiredField = strstr(ControlsNode, "required=\"");
@ -966,14 +981,12 @@ int GameTDB::GetAccessories(const char * id, vector<Accessory> & acc_list)
return acc_list.size();
}
unsigned int GameTDB::FindCaseColor(char * data)
u32 GameTDB::FindCaseColor(char *data)
{
unsigned int color = -1;
u32 color = -1;
char *ColorNode = GetNodeText(data, "<case color=\"", "\"");
if(!ColorNode)
return color;
if(strlen(ColorNode) == 0)
if(!ColorNode || strlen(ColorNode) == 0)
return color;
char format[8];
@ -982,9 +995,9 @@ unsigned int GameTDB::FindCaseColor(char * data)
return strtoul(format, NULL, 16);
}
unsigned int GameTDB::GetCaseColor(const char * id)
u32 GameTDB::GetCaseColor(const char *id)
{
unsigned int color = -1;
u32 color = -1;
if(!id)
return color;
@ -992,7 +1005,6 @@ unsigned int GameTDB::GetCaseColor(const char * id)
if(!data)
return color;
color = FindCaseColor(data);
if(color != 0xffffffff)

View File

@ -497,10 +497,11 @@ void CVideo::_showWaitMessages(CVideo *m)
vector<STexture>::iterator waitItr = m->m_waitMessages.begin();
gprintf("Going to show a wait message screen, delay: %d, # images: %d\n", waitFrames, m->m_waitMessages.size());
m->_clearScreen();
m->waitMessage(*waitItr);
waitItr += PNGfadeDirection;
m->prepare();
m->setup2DProjection();
GX_SetNumChans(0);
wiiLightSetLevel(0);
wiiLightOn();
@ -523,16 +524,15 @@ void CVideo::_showWaitMessages(CVideo *m)
{
m->waitMessage(*waitItr);
waitItr += PNGfadeDirection;
if(waitItr == m->m_waitMessages.end())
waitItr = m->m_waitMessages.begin();
waitFrames = frames;
}
waitFrames--;
VIDEO_WaitVSync();
waitFrames--;
}
wiiLightOff();
GX_SetNumChans(1);
m->m_showingWaitMessages = false;
gprintf("Stop showing images\n");
}
@ -584,26 +584,23 @@ void CVideo::waitMessage(float delay)
void CVideo::waitMessage(const vector<STexture> &tex, float delay)
{
hideWaitMessage();
if(tex.size() == 0)
{
m_waitMessages = m_defaultWaitMessages;
m_waitMessageDelay = 0.2f;
m_waitMessageDelay = 0.1f;
}
else
{
m_waitMessages = tex;
m_waitMessageDelay = delay;
}
_clearScreen();
if(m_waitMessages.size() == 1)
waitMessage(m_waitMessages[0]);
else if(m_waitMessages.size() > 1)
{
CheckWaitThread();
m_showWaitMessage = true;
unsigned int stack_size = (unsigned int)32768;
u32 stack_size = (u32)32768;
waitThreadStack = smartMem2Alloc(stack_size);
LWP_CreateThread(&waitThread, (void *(*)(void *))CVideo::_showWaitMessages, (void *)this, waitThreadStack.get(), stack_size, LWP_PRIO_IDLE);
}
@ -614,9 +611,6 @@ void CVideo::waitMessage(const STexture &tex)
Mtx modelViewMtx;
GXTexObj texObj;
prepare();
setup2DProjection();
GX_SetNumChans(0);
GX_ClearVtxDesc();
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
@ -648,7 +642,6 @@ void CVideo::waitMessage(const STexture &tex)
GX_TexCoord2f32(0.f, 1.f);
GX_End();
render();
GX_SetNumChans(1);
}
s32 CVideo::TakeScreenshot(const char *path)

View File

@ -64,6 +64,7 @@ public:
bool wide(void) const { return m_wide; }
bool vid_50hz(void) const { return m_50hz; }
u8 getAA(void) const { return m_aa; }
bool showingWaitMessage() { return m_showingWaitMessages; }
void set2DViewport(u32 w, u32 h, int x, int y);
void prepareStencil(void);
void renderStencil(void);

View File

@ -57,11 +57,15 @@ s32 Apploader_Run(entry_point *entry, u8 vidMode, GXRModeObj *vmode, bool vipatc
/* Calculate apploader length */
appldr_len = buffer[5] + buffer[6];
SYS_SetArena1Hi((void *)0x816FFFF0); //Kills the possibility of codedumps with gprintf
/* Read apploader code */
ret = WDVD_Read(appldr, appldr_len, APPLDR_OFFSET + 0x20);
if(ret < 0)
return ret;
DCFlushRange(appldr, appldr_len);
/* Set apploader entry function */
app_entry appldr_entry = (app_entry)buffer[4];

View File

@ -241,7 +241,7 @@ int get_frag_list(u8 *id, char *path, const u32 hdd_sector_size)
frag_concat(fa, fs);
}
frag_list = MEM1_memalign(32, sizeof(FragList));
frag_list = MEM1_alloc(ALIGN32(sizeof(FragList)));
if(frag_list == NULL)
goto out;
@ -307,10 +307,12 @@ int set_frag_list(u8 *id)
DCFlushRange(frag_list, size);
gprintf("Calling WDVD_SetFragList, frag list size %d\n", size);
/* if (size > 400) ghexdump(frag_list, 400);
else ghexdump(frag_list, size); */
int ret = WDVD_SetFragList(wbfsDev, frag_list, size);
MEM1_free(frag_list);
free(frag_list);
frag_list = NULL;
if(ret)

View File

@ -12,7 +12,7 @@
#include <ctype.h>
#include "splits.h"
#include "gecko/gecko.h"
#include "gecko.h"
#define off64_t off_t
#define FMT_llu "%llu"

View File

@ -53,6 +53,8 @@ wbfs_disc_t* WBFS_Ext_OpenDisc(u8 *discid, char *fname)
if (fd == -1) return NULL;
wbfs_disc_t *iso_file = MEM2_alloc(sizeof(wbfs_disc_t));
memset(iso_file, 0, sizeof(wbfs_disc_t));
if (iso_file == NULL)
return NULL;

View File

@ -109,9 +109,8 @@ int load_wip_patches(u8 *dir, u8 *gameid)
while(fgets(line, sizeof(line), fp))
{
if (line[0] == '#') continue;
if(strlen(line) < 26) continue;
if(line[0] == '#' || strlen(line) < 26)
continue;
u32 offset = (u32) strtoul(line, NULL, 16);
u32 srcaddress = (u32) strtoul(line+9, NULL, 16);

View File

@ -37,7 +37,7 @@ int main(int argc, char **argv)
vid.init();
MEM2_init(47); //Should be safe to use
vid.waitMessage(0.2f);
vid.waitMessage(0.1f);
AllocSDGeckoBuffer();
gprintf(" \nWelcome to %s (%s-r%s)!\nThis is the debug output.\n", APP_NAME, APP_VERSION, SVN_REV);

View File

@ -1812,8 +1812,9 @@ void CMenu::_mainLoopCommon(bool withCF, bool blockReboot, bool adjusting)
m_btnMgr.draw();
ScanInput();
if(!m_vid.showingWaitMessage())
m_vid.render();
if(!blockReboot)
{
if(withCF && Sys_Exiting())

View File

@ -1427,7 +1427,6 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
if(currentPartition == 0)
SDHC_Init();
GeckoDisable();
#endif
RunApploader(offset, videoMode, vipatch, countryPatch, patchVidMode, aspectRatio, returnTo);

View File

@ -188,11 +188,12 @@ int CMenu::GetCoverStatusAsync(CMenu *m)
void CMenu::LoadView(void)
{
_showWaitMessage();
_hideMain();
m_curGameId = m_cf.getId();
_hideMain(true);
m_cf.clear();
_showWaitMessage();
_loadList();
_showMain();
_initCF();
@ -418,8 +419,10 @@ int CMenu::main(void)
}
else if(m_btnMgr.selected(m_mainBtnDVD))
{
_showWaitMessage();
_hideMain(true);
m_cf.clear();
_showWaitMessage();
dir_discHdr hdr;
memset(&hdr, 0, sizeof(dir_discHdr));
memcpy(&hdr.id, "dvddvd", 6);

View File

@ -53,30 +53,32 @@ typedef struct
# define UnsignedToFloat(u) (((double)((long)(u - 2147483647L - 1))) + 2147483648.0)
static double ConvertFromIeeeExtended(const unsigned char* bytes)
static double ConvertFromIeeeExtended(const u8* bytes)
{
double f;
int expon;
unsigned long hiMant, loMant;
u64 hiMant, loMant;
expon = ((bytes[0] & 0x7F) << 8) | (bytes[1] & 0xFF);
hiMant = ((unsigned long)(bytes[2] & 0xFF) << 24)
| ((unsigned long)(bytes[3] & 0xFF) << 16)
| ((unsigned long)(bytes[4] & 0xFF) << 8)
| ((unsigned long)(bytes[5] & 0xFF));
loMant = ((unsigned long)(bytes[6] & 0xFF) << 24)
| ((unsigned long)(bytes[7] & 0xFF) << 16)
| ((unsigned long)(bytes[8] & 0xFF) << 8)
| ((unsigned long)(bytes[9] & 0xFF));
if (expon == 0 && hiMant == 0 && loMant == 0) {
hiMant = ((u64)(bytes[2] & 0xFF) << 24)
| ((u64)(bytes[3] & 0xFF) << 16)
| ((u64)(bytes[4] & 0xFF) << 8)
| ((u64)(bytes[5] & 0xFF));
loMant = ((u64)(bytes[6] & 0xFF) << 24)
| ((u64)(bytes[7] & 0xFF) << 16)
| ((u64)(bytes[8] & 0xFF) << 8)
| ((u64)(bytes[9] & 0xFF));
if(expon == 0 && hiMant == 0 && loMant == 0)
f = 0;
}
else {
if (expon == 0x7FFF) {
else
{
if(expon == 0x7FFF)
f = HUGE_VAL;
}
else {
else
{
expon -= 16383;
f = ldexp(UnsignedToFloat(hiMant), expon-=31);
f += ldexp(UnsignedToFloat(loMant), expon-=32);
@ -227,9 +229,7 @@ int AifDecoder::Read(u8 * buffer, int buffer_size, int)
int read = file_fd->read(buffer, buffer_size);
if(read > 0)
{
CurPos += read;
}
return read;
}

View File

@ -112,17 +112,11 @@ int CFile::seek(long int offset, int origin)
int ret = 0;
if(origin == SEEK_SET)
{
Pos = offset;
}
else if(origin == SEEK_CUR)
{
Pos += offset;
}
else if(origin == SEEK_END)
{
Pos = filesize+offset;
}
if(Pos < 0)
{
Pos = 0;
@ -132,14 +126,11 @@ int CFile::seek(long int offset, int origin)
if(file_fd)
ret = fseek(file_fd, Pos, SEEK_SET);
if(mem_file != NULL)
{
if(Pos > (long int) filesize)
if(mem_file != NULL && Pos > (long int)filesize)
{
Pos = filesize;
return -1;
}
}
return ret;
}

View File

@ -54,6 +54,7 @@ WavDecoder::WavDecoder(const u8 * snd, int len)
WavDecoder::~WavDecoder()
{
CloseFile();
}
void WavDecoder::OpenFile()

View File

@ -56,7 +56,8 @@ static inline int GetFirstUnusedVoice()
extern "C" void SoundCallback(s32 voice)
{
SoundDecoder *decoder = SoundHandler::Instance()->Decoder(voice);
if(!decoder) return;
if(!decoder)
return;
if(decoder->IsBufferReady())
{
@ -98,7 +99,8 @@ GuiSound::GuiSound(GuiSound *g)
voice = -1;
Init();
if (g == NULL) return;
if(g == NULL)
return;
if(g->sound != NULL)
{
@ -161,7 +163,8 @@ bool GuiSound::Load(const char * filepath)
FILE * f = fopen(filepath, "rb");
if(!f)
{ gprintf("Failed to load file %s!!\n", filepath);
{
gprintf("Failed to load file %s!!\n", filepath);
return false;
}
@ -173,12 +176,14 @@ bool GuiSound::Load(const char * filepath)
gprintf("Loading %s using voice %d\n", filepath, voice);
SoundDecoder * decoder = SoundHandler::Instance()->Decoder(voice);
if(!decoder)
{ gprintf("No Decoder!!!\n");
{
gprintf("No Decoder!!!\n");
return false;
}
if(!decoder->IsBufferReady())
{ gprintf("Buffer not ready!!n");
{
gprintf("Buffer not ready!!\n");
SoundHandler::Instance()->RemoveDecoder(voice);
return false;
}
@ -194,15 +199,14 @@ bool GuiSound::Load(const u8 * snd, u32 len, bool isallocated)
FreeMemory();
this->voice = voice;
if(!snd) return false;
if(!snd)
return false;
if(!isallocated && *((u32 *) snd) == 'RIFF')
return LoadSoundEffect(snd, len);
if(*((u32 *) snd) == 'IMD5')
{
UncompressSoundbin(snd, len, isallocated);
}
else
{
sound = (u8 *) snd;
@ -214,9 +218,7 @@ bool GuiSound::Load(const u8 * snd, u32 len, bool isallocated)
SoundDecoder * decoder = SoundHandler::Instance()->Decoder(voice);
if(!decoder)
{
return false;
}
if(!decoder->IsBufferReady())
{
@ -274,10 +276,12 @@ void GuiSound::Play(int vol, bool restart)
return;
}
if((IsPlaying() && !restart) || voice < 0 || voice >= 16) return;
if((IsPlaying() && !restart) || voice < 0 || voice >= 16)
return;
SoundDecoder *decoder = SoundHandler::Instance()->Decoder(voice);
if(!decoder) return;
if(!decoder)
return;
ASND_StopVoice(voice);
if(decoder->IsEOF())
@ -309,7 +313,8 @@ void GuiSound::Stop()
ASND_StopVoice(voice);
SoundDecoder *decoder = SoundHandler::Instance()->Decoder(voice);
if(!decoder) return;
if(!decoder)
return;
decoder->ClearBuffer();
Rewind();
@ -362,7 +367,8 @@ void GuiSound::SetLoop(u8 l)
loop = l;
SoundDecoder *decoder = SoundHandler::Instance()->Decoder(voice);
if(!decoder) return;
if(!decoder)
return;
decoder->SetLoop(l == 1);
}
@ -370,7 +376,8 @@ void GuiSound::SetLoop(u8 l)
void GuiSound::Rewind()
{
SoundDecoder *decoder = SoundHandler::Instance()->Decoder(voice);
if(!decoder) return;
if(!decoder)
return;
decoder->Rewind();
}
@ -397,7 +404,8 @@ u8 * uncompressLZ77(const u8 *inBuf, u32 inLength, u32 * size)
buffer = (u8 *)malloc(uncSize);
if (!buffer) return buffer;
if(!buffer)
return buffer;
u8 *bufCur = buffer;
u8 *bufEnd = buffer + uncSize;
@ -439,7 +447,8 @@ void GuiSound::UncompressSoundbin(const u8 * snd, u32 len, bool isallocated)
const u8 * file = snd+32;
length = len-32;
if (length <= 0) return;
if(length <= 0)
return;
if(*((u32 *) file) == 'LZ77')
{

View File

@ -40,7 +40,8 @@
ZipFile::ZipFile(const char *filepath)
{
File = unzOpen(filepath);
if (File) this->LoadList();
if(File)
this->LoadList();
}
ZipFile::~ZipFile()
@ -52,75 +53,27 @@ bool ZipFile::LoadList()
{
return true;
}
/*
bool ZipFile::FindFile(const char *file)
{
if (!File) return false;
char filename[MAXPATHLEN];
int ret = unzGoToFirstFile(File);
if (ret != UNZ_OK) return false;
do
{
if(unzGetCurrentFileInfo(File, &cur_file_info, filename, sizeof(filename), NULL, 0, NULL, 0) != UNZ_OK)
continue;
const char *realfilename = strrchr(filename, '/');
if(!realfilename || strlen(realfilename) == 0)
realfilename = filename;
if(strcasecmp(realfilename, file) == 0)
return true;
}
while(unzGoToNextFile(File) == UNZ_OK);
return false;
}
bool ZipFile::FindFilePart(const char *partfilename, std::string &realname)
{
if (!File) return false;
char filename[MAXPATHLEN];
int ret = unzGoToFirstFile(File);
if (ret != UNZ_OK) return false;
do
{
if(unzGetCurrentFileInfo(File, &cur_file_info, filename, sizeof(filename), NULL, 0, NULL, 0) != UNZ_OK)
continue;
if(strcasestr(filename, partfilename) != 0)
{
realname = filename;
return true;
}
}
while(unzGoToNextFile(File) == UNZ_OK);
return false;
}
*/
bool ZipFile::ExtractAll(const char *dest)
{
if (!File) return false;
if(!File)
return false;
bool Stop = false;
u32 blocksize = 1024 * 50;
u8 *buffer = new u8[blocksize];
if (!buffer) return false;
if(!buffer)
return false;
char writepath[MAXPATHLEN];
char filename[MAXPATHLEN];
memset(filename, 0, sizeof(filename));
int ret = unzGoToFirstFile(File);
if (ret != UNZ_OK) Stop = true;
if(ret != UNZ_OK)
Stop = true;
while(!Stop)
{
@ -152,11 +105,13 @@ bool ZipFile::ExtractAll(const char *dest)
do
{
if (uncompressed_size - done < blocksize) blocksize = uncompressed_size - done;
if(uncompressed_size - done < blocksize)
blocksize = uncompressed_size - done;
ret = unzReadCurrentFile(File, buffer, blocksize);
if (ret == 0) break;
if(ret == 0)
break;
fwrite(buffer, 1, blocksize, pfile);
@ -168,7 +123,8 @@ bool ZipFile::ExtractAll(const char *dest)
unzCloseCurrentFile(File);
}
}
if (unzGoToNextFile(File) != UNZ_OK) Stop = true;
if(unzGoToNextFile(File) != UNZ_OK)
Stop = true;
}
delete[] buffer;