mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2024-11-23 19:59:16 +01:00
-reading in cached/custom banners into a 2mb fixed region now to save some memory allocations and gain a bit speed reading them in
This commit is contained in:
parent
b86a95e517
commit
df9534961e
@ -49,19 +49,19 @@ Banner::Banner()
|
||||
{
|
||||
opening = NULL;
|
||||
opening_size = 0;
|
||||
title = 0;
|
||||
allocated = false;
|
||||
imet = NULL;
|
||||
}
|
||||
|
||||
void Banner::SetBanner(u8 *bnr, u32 bnr_size, u64 title, bool custom)
|
||||
void Banner::SetBanner(u8 *bnr, u32 bnr_size, bool custom, bool alloc)
|
||||
{
|
||||
ClearBanner();
|
||||
if(bnr == NULL || bnr_size == 0)
|
||||
return;
|
||||
|
||||
this->title = title;
|
||||
opening = bnr;
|
||||
opening_size = bnr_size;
|
||||
allocated = alloc;
|
||||
imet = (IMET *)opening;
|
||||
if(imet->sig != IMET_SIGNATURE)
|
||||
imet = (IMET *) (opening + IMET_OFFSET);
|
||||
@ -80,19 +80,19 @@ void Banner::SetBanner(u8 *bnr, u32 bnr_size, u64 title, bool custom)
|
||||
if(memcmp(imetmd5, md5, 16) == 0 || custom)
|
||||
this->imet = imet;
|
||||
else
|
||||
gprintf("Invalid md5, banner not valid for title %08x\n", title);
|
||||
gprintf("Invalid md5, banner not valid\n");
|
||||
}
|
||||
else
|
||||
gprintf("Invalid signature found, banner not valid for title %08x\n", title);
|
||||
gprintf("Invalid signature found, banner not valid\n");
|
||||
}
|
||||
|
||||
void Banner::ClearBanner()
|
||||
{
|
||||
if(opening != NULL)
|
||||
if(allocated == true && opening != NULL)
|
||||
free(opening);
|
||||
opening = NULL;
|
||||
opening_size = 0;
|
||||
title = 0;
|
||||
allocated = false;
|
||||
imet = NULL;
|
||||
}
|
||||
|
||||
@ -164,7 +164,7 @@ u8 *Banner::GetFile(const char *name, u32 *size)
|
||||
return file;
|
||||
}
|
||||
|
||||
void Banner::GetBanner(u64 title, char *appname, bool imetOnly)
|
||||
void Banner::GetBanner(char *appname, bool imetOnly)
|
||||
{
|
||||
u8 *buf = NULL;
|
||||
u32 size = 0;
|
||||
@ -179,5 +179,5 @@ void Banner::GetBanner(u64 title, char *appname, bool imetOnly)
|
||||
free(buf);
|
||||
return;
|
||||
}
|
||||
SetBanner(buf, size, title);
|
||||
SetBanner(buf, size, false, true);
|
||||
}
|
||||
|
@ -61,26 +61,23 @@ class Banner
|
||||
{
|
||||
public:
|
||||
Banner();
|
||||
void SetBanner(u8 *bnr, u32 bnr_size, u64 title = 0, bool custom = false);
|
||||
void SetBanner(u8 *bnr, u32 bnr_size, bool custom = false, bool alloc = false);
|
||||
void ClearBanner();
|
||||
|
||||
bool IsValid();
|
||||
|
||||
bool GetName(u8 *name, int language);
|
||||
bool GetName(wchar_t *name, int language);
|
||||
u8 *GetFile(const char *name, u32 *size);
|
||||
|
||||
void GetBanner(u64 title, char *appname, bool imetOnly = false);
|
||||
void GetBanner(char *appname, bool imetOnly = false);
|
||||
u8 *GetBannerFile() { return opening; }
|
||||
u32 GetBannerFileSize() { return opening_size; }
|
||||
protected:
|
||||
u8 *opening;
|
||||
u32 opening_size;
|
||||
u64 title;
|
||||
bool allocated;
|
||||
IMET *imet;
|
||||
|
||||
u16 *GetName(int language);
|
||||
static bool GetChannelNameFromApp(u64 title, wchar_t* name, int language);
|
||||
};
|
||||
extern Banner CurrentBanner;
|
||||
|
||||
|
@ -153,7 +153,7 @@ void Channels::GetBanner(u64 title, bool imetOnly)
|
||||
char app[ISFS_MAXPATH] ATTRIBUTE_ALIGN(32);
|
||||
if(!GetAppNameFromTmd(title, app, &cid))
|
||||
return;
|
||||
CurrentBanner.GetBanner(title, app, imetOnly);
|
||||
CurrentBanner.GetBanner(app, imetOnly);
|
||||
}
|
||||
|
||||
bool Channels::GetChannelNameFromApp(u64 title, wchar_t* name, int language)
|
||||
|
@ -316,3 +316,82 @@ void fsop_deleteFolder(const char *source)
|
||||
gprintf("Deleting directory: %s\n", source);
|
||||
unlink(source);
|
||||
}
|
||||
|
||||
bool fsop_FileExist(const char *fn)
|
||||
{
|
||||
FILE * f;
|
||||
f = fopen(fn, "rb");
|
||||
if(f)
|
||||
{
|
||||
fclose(f);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void fsop_ReadFileLoc(const char *path, const u32 size, void *loc)
|
||||
{
|
||||
FILE *f = fopen(path, "rb");
|
||||
fread(loc, size, 1, f);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
u8 *fsop_ReadFile(const char *path, u32 *size)
|
||||
{
|
||||
*(size) = 0;
|
||||
u32 filesize = 0;
|
||||
u8 *mem = NULL;
|
||||
fsop_GetFileSizeBytes(path, &filesize);
|
||||
if(filesize > 0)
|
||||
{
|
||||
mem = (u8*)MEM2_alloc(filesize);
|
||||
if(mem != NULL)
|
||||
{
|
||||
//gprintf("Reading file: %s\n", path);
|
||||
fsop_ReadFileLoc(path, filesize, mem);
|
||||
*(size) = filesize;
|
||||
}
|
||||
}
|
||||
return mem;
|
||||
}
|
||||
|
||||
bool fsop_WriteFile(const char *path, const void *mem, const u32 size)
|
||||
{
|
||||
if(mem == NULL || size == 0)
|
||||
return false;
|
||||
|
||||
FILE *f = fopen(path, "wb");
|
||||
if(f == NULL)
|
||||
return false;
|
||||
//gprintf("Writing file: %s\n", path);
|
||||
fwrite(mem, size, 1, f);
|
||||
fclose(f);
|
||||
return true;
|
||||
}
|
||||
|
||||
void fsop_deleteFile(const char *source)
|
||||
{
|
||||
if(!fsop_FileExist(source))
|
||||
return;
|
||||
remove(source);
|
||||
}
|
||||
|
||||
bool fsop_FolderExist(const char *path)
|
||||
{
|
||||
DIR *dir;
|
||||
dir = opendir(path);
|
||||
if(dir)
|
||||
{
|
||||
closedir(dir);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void fsop_MakeFolder(const char *path)
|
||||
{
|
||||
if(fsop_FolderExist(path))
|
||||
return;
|
||||
//gprintf("Folder path to create: %s\n", path);
|
||||
mkdir(path, S_IREAD | S_IWRITE);
|
||||
}
|
||||
|
@ -19,80 +19,13 @@ u32 fsop_GetFreeSpaceKb(const char *path);
|
||||
bool fsop_CopyFile(const char *source, const char *target, progress_callback_t spinner, void *spinner_data);
|
||||
bool fsop_CopyFolder(const char *source, const char *target, progress_callback_t spinner, void *spinner_data);
|
||||
void fsop_deleteFolder(const char *source);
|
||||
|
||||
static inline bool fsop_FileExist(const char *fn)
|
||||
{
|
||||
FILE * f;
|
||||
f = fopen(fn, "rb");
|
||||
if(f)
|
||||
{
|
||||
fclose(f);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline u8 *fsop_ReadFile(const char *path, u32 *size)
|
||||
{
|
||||
*(size) = 0;
|
||||
if(!fsop_FileExist(path))
|
||||
return NULL;
|
||||
//gprintf("Reading file: %s\n", path);
|
||||
FILE *f = fopen(path, "rb");
|
||||
fseek(f, 0, SEEK_END);
|
||||
u32 filesize = ftell(f);
|
||||
u8 *mem = (u8*)MEM2_alloc(filesize);
|
||||
if(mem != NULL)
|
||||
{
|
||||
rewind(f);
|
||||
fread(mem, filesize, 1, f);
|
||||
*(size) = filesize;
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
static inline bool fsop_WriteFile(const char *path, const void *mem, const u32 size)
|
||||
{
|
||||
if(mem == NULL || size == 0)
|
||||
return false;
|
||||
|
||||
FILE *f = fopen(path, "wb");
|
||||
if(f == NULL)
|
||||
return false;
|
||||
//gprintf("Writing file: %s\n", path);
|
||||
fwrite(mem, size, 1, f);
|
||||
fclose(f);
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline void fsop_deleteFile(const char *source)
|
||||
{
|
||||
if(!fsop_FileExist(source))
|
||||
return;
|
||||
remove(source);
|
||||
}
|
||||
|
||||
static inline bool fsop_FolderExist(const char *path)
|
||||
{
|
||||
DIR *dir;
|
||||
dir = opendir(path);
|
||||
if(dir)
|
||||
{
|
||||
closedir(dir);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void fsop_MakeFolder(const char *path)
|
||||
{
|
||||
if(fsop_FolderExist(path))
|
||||
return;
|
||||
//gprintf("Folder path to create: %s\n", path);
|
||||
mkdir(path, S_IREAD | S_IWRITE);
|
||||
}
|
||||
bool fsop_FileExist(const char *fn);
|
||||
u8 *fsop_ReadFile(const char *path, u32 *size);
|
||||
void fsop_ReadFileLoc(const char *path, const u32 size, void *loc);
|
||||
bool fsop_WriteFile(const char *path, const void *mem, const u32 size);
|
||||
void fsop_deleteFile(const char *source);
|
||||
bool fsop_FolderExist(const char *path);
|
||||
void fsop_MakeFolder(const char *path);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -251,7 +251,7 @@ static void _extractBnr(const dir_discHdr *hdr)
|
||||
void *bnr = NULL;
|
||||
size = wbfs_extract_file(disc, (char*)"opening.bnr", &bnr);
|
||||
if(size > 0)
|
||||
CurrentBanner.SetBanner((u8*)bnr, size);
|
||||
CurrentBanner.SetBanner((u8*)bnr, size, false, true);
|
||||
WBFS_CloseDisc(disc);
|
||||
}
|
||||
WBFS_Close();
|
||||
@ -1597,6 +1597,9 @@ struct IMD5Header
|
||||
u8 crypto[16];
|
||||
} ATTRIBUTE_PACKED;
|
||||
|
||||
static const u32 BNR_MAX_SIZE = 0x00200000; /* 2MB */
|
||||
static u8 *BNR_LOC = (u8*)0x90000000;
|
||||
|
||||
void CMenu::_gameSoundThread(CMenu *m)
|
||||
{
|
||||
m->m_soundThrdBusy = true;
|
||||
@ -1622,17 +1625,32 @@ void CMenu::_gameSoundThread(CMenu *m)
|
||||
char cached_banner[256];
|
||||
cached_banner[255] = '\0';
|
||||
strncpy(cached_banner, fmt("%s/%s.bnr", m->m_bnrCacheDir.c_str(), GameHdr->id), 255);
|
||||
cached_bnr_file = fsop_ReadFile(cached_banner, &cached_bnr_size);
|
||||
if(cached_bnr_file == NULL)
|
||||
fsop_GetFileSizeBytes(cached_banner, &cached_bnr_size);
|
||||
if(cached_bnr_size > 0 && cached_bnr_size < BNR_MAX_SIZE)
|
||||
{
|
||||
cached_bnr_file = BNR_LOC;
|
||||
fsop_ReadFileLoc(cached_banner, cached_bnr_size, BNR_LOC);
|
||||
}
|
||||
else /* no cached or too big */
|
||||
{
|
||||
char custom_banner[256];
|
||||
custom_banner[255] = '\0';
|
||||
strncpy(custom_banner, fmt("%s/%s.bnr", m->m_customBnrDir.c_str(), GameHdr->id), 255);
|
||||
custom_bnr_file = fsop_ReadFile(custom_banner, &custom_bnr_size);
|
||||
if(custom_bnr_file == NULL)
|
||||
fsop_GetFileSizeBytes(custom_banner, &custom_bnr_size);
|
||||
if(custom_bnr_size > 0 && custom_bnr_size < BNR_MAX_SIZE)
|
||||
{
|
||||
custom_bnr_file = BNR_LOC;
|
||||
fsop_ReadFileLoc(custom_banner, custom_bnr_size, BNR_LOC);
|
||||
}
|
||||
else /* no custom ID6 or too big, try ID3 */
|
||||
{
|
||||
strncpy(custom_banner, fmt("%s/%.3s.bnr", m->m_customBnrDir.c_str(), GameHdr->id), 255);
|
||||
custom_bnr_file = fsop_ReadFile(custom_banner, &custom_bnr_size);
|
||||
fsop_GetFileSizeBytes(custom_banner, &custom_bnr_size);
|
||||
if(custom_bnr_size > 0 && custom_bnr_size < BNR_MAX_SIZE)
|
||||
{
|
||||
custom_bnr_file = BNR_LOC;
|
||||
fsop_ReadFileLoc(custom_banner, custom_bnr_size, BNR_LOC);
|
||||
}
|
||||
}
|
||||
if(custom_bnr_file == NULL && GameHdr->type == TYPE_GC_GAME)
|
||||
{
|
||||
@ -1655,7 +1673,7 @@ void CMenu::_gameSoundThread(CMenu *m)
|
||||
if(cached_bnr_file != NULL)
|
||||
CurrentBanner.SetBanner(cached_bnr_file, cached_bnr_size);
|
||||
else if(custom_bnr_file != NULL)
|
||||
CurrentBanner.SetBanner(custom_bnr_file, custom_bnr_size, 0, true);
|
||||
CurrentBanner.SetBanner(custom_bnr_file, custom_bnr_size, true);
|
||||
else if(GameHdr->type == TYPE_WII_GAME)
|
||||
_extractBnr(GameHdr);
|
||||
else if(GameHdr->type == TYPE_CHANNEL)
|
||||
|
Loading…
Reference in New Issue
Block a user