mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2024-12-25 03:11:58 +01:00
-made game list even more efficient and smaller again
-fixed finding gamecube fst extracted games -fixed possible plugin display bug
This commit is contained in:
parent
17b9e10a16
commit
4d4e987286
@ -23,10 +23,12 @@
|
|||||||
#include "fileOps/fileOps.h"
|
#include "fileOps/fileOps.h"
|
||||||
#include "gui/text.hpp"
|
#include "gui/text.hpp"
|
||||||
|
|
||||||
void ListGenerator::Init(string settingsDir, string Language)
|
ListGenerator m_gameList;
|
||||||
|
|
||||||
|
void ListGenerator::Init(const char *settingsDir, const char *Language)
|
||||||
{
|
{
|
||||||
gameTDB_Path = fmt("%s/wiitdb.xml", settingsDir.c_str());
|
gameTDB_Path = fmt("%s/wiitdb.xml", settingsDir);
|
||||||
CustomTitlesPath = fmt("%s/" CTITLES_FILENAME, settingsDir.c_str());
|
CustomTitlesPath = fmt("%s/" CTITLES_FILENAME, settingsDir);
|
||||||
gameTDB_Language = Language;
|
gameTDB_Language = Language;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,8 +53,8 @@ void ListGenerator::CloseConfigs()
|
|||||||
CustomTitles.unload();
|
CustomTitles.unload();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListGenerator::CreateList(u32 Flow, u32 Device, string Path, vector<string> FileTypes,
|
void ListGenerator::CreateList(u32 Flow, u32 Device, const string& Path,
|
||||||
string DBName, bool UpdateCache, u32 Color, u32 Magic)
|
const vector<string>& FileTypes, const string& DBName, bool UpdateCache, u32 Color, u32 Magic)
|
||||||
{
|
{
|
||||||
Cleanup();
|
Cleanup();
|
||||||
if(UpdateCache)
|
if(UpdateCache)
|
||||||
@ -93,63 +95,68 @@ void ListGenerator::CreateList(u32 Flow, u32 Device, string Path, vector<string>
|
|||||||
|
|
||||||
void ListGenerator::Create_Wii_WBFS_List(wbfs_t *handle)
|
void ListGenerator::Create_Wii_WBFS_List(wbfs_t *handle)
|
||||||
{
|
{
|
||||||
discHdr Header;
|
|
||||||
for(u32 i = 0; i < wbfs_count_discs(handle); i++)
|
for(u32 i = 0; i < wbfs_count_discs(handle); i++)
|
||||||
{
|
{
|
||||||
memset((void*)&Header, 0, sizeof(discHdr));
|
memset((void*)&WiiGameHeader, 0, sizeof(discHdr));
|
||||||
s32 ret = wbfs_get_disc_info(handle, i, (u8*)&Header, sizeof(discHdr), NULL);
|
s32 ret = wbfs_get_disc_info(handle, i, (u8*)&WiiGameHeader, sizeof(discHdr), NULL);
|
||||||
if(ret == 0 && Header.magic == WII_MAGIC)
|
if(ret == 0 && WiiGameHeader.magic == WII_MAGIC)
|
||||||
AddISO((const char*)Header.id, (const char*)Header.title, " ", 1, TYPE_WII_GAME);
|
AddISO((const char*)WiiGameHeader.id, (const char*)WiiGameHeader.title,
|
||||||
|
NULL, 1, TYPE_WII_GAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListGenerator::Create_Wii_EXT_List(string Path, vector<string> FileTypes)
|
void ListGenerator::Create_Wii_EXT_List(const string& Path, const vector<string>& FileTypes)
|
||||||
{
|
{
|
||||||
vector<string> FileList;
|
GetFiles(Path.c_str(), FileTypes, InternalList, false);
|
||||||
GetFiles(Path.c_str(), FileTypes, &FileList);
|
for(vector<string>::iterator Name = InternalList.begin(); Name != InternalList.end(); Name++)
|
||||||
discHdr Header;
|
|
||||||
for(vector<string>::iterator Name = FileList.begin(); Name != FileList.end(); Name++)
|
|
||||||
{
|
{
|
||||||
memset((void*)&Header, 0, sizeof(discHdr));
|
memset((void*)&WiiGameHeader, 0, sizeof(discHdr));
|
||||||
FILE *fp = fopen(Name->c_str(), "rb");
|
FILE *fp = fopen(Name->c_str(), "rb");
|
||||||
if(fp)
|
if(fp)
|
||||||
{
|
{
|
||||||
fseek(fp, strcasestr(Name->c_str(), ".wbfs") != NULL ? 512 : 0, SEEK_SET);
|
fseek(fp, strcasestr(Name->c_str(), ".wbfs") != NULL ? 512 : 0, SEEK_SET);
|
||||||
fread((void*)&Header, 1, sizeof(discHdr), fp);
|
fread((void*)&WiiGameHeader, 1, sizeof(discHdr), fp);
|
||||||
if(Header.magic == WII_MAGIC)
|
if(WiiGameHeader.magic == WII_MAGIC)
|
||||||
AddISO((const char*)Header.id, (const char*)Header.title, Name->c_str(), 1, TYPE_WII_GAME);
|
AddISO((const char*)WiiGameHeader.id, (const char*)WiiGameHeader.title,
|
||||||
|
Name->c_str(), 1, TYPE_WII_GAME);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FileList.clear();
|
InternalList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListGenerator::Create_GC_List(string Path, vector<string> FileTypes)
|
void ListGenerator::Create_GC_List(const string& Path, const vector<string>& FileTypes)
|
||||||
{
|
{
|
||||||
vector<string> FileList;
|
GetFiles(Path.c_str(), FileTypes, InternalList, true);
|
||||||
GetFiles(Path.c_str(), FileTypes, &FileList, true);
|
for(vector<string>::iterator Name = InternalList.begin(); Name != InternalList.end(); Name++)
|
||||||
gc_discHdr Header;
|
|
||||||
for(vector<string>::iterator Name = FileList.begin(); Name != FileList.end(); Name++)
|
|
||||||
{
|
{
|
||||||
memset((void*)&Header, 0, sizeof(gc_discHdr));
|
memset((void*)&GCGameHeader, 0, sizeof(gc_discHdr));
|
||||||
FILE *fp = fopen(Name->c_str(), "rb");
|
FILE *fp = fopen(Name->c_str(), "rb");
|
||||||
|
if(!fp && Name->find("root") != string::npos) //fst folder
|
||||||
|
{
|
||||||
|
Name->erase(Name->begin() + Name->find("root"), Name->end());
|
||||||
|
Name->append("sys/boot.bin");
|
||||||
|
gprintf("FST Name: %s\n", Name->c_str());
|
||||||
|
fp = fopen(Name->c_str(), "rb");
|
||||||
|
}
|
||||||
if(fp)
|
if(fp)
|
||||||
{
|
{
|
||||||
fread((void*)&Header, 1, sizeof(gc_discHdr), fp);
|
fread((void*)&GCGameHeader, 1, sizeof(gc_discHdr), fp);
|
||||||
if(Header.magic == GC_MAGIC)
|
if(GCGameHeader.magic == GC_MAGIC)
|
||||||
AddISO((const char*)Header.id, (const char*)Header.title, Name->c_str(), 0, TYPE_GC_GAME);
|
AddISO((const char*)GCGameHeader.id, (const char*)GCGameHeader.title,
|
||||||
|
Name->c_str(), 0, TYPE_GC_GAME);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FileList.clear();
|
InternalList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListGenerator::Create_Plugin_List(string Path, vector<string> FileTypes, u32 Color, u32 Magic)
|
void ListGenerator::Create_Plugin_List(const string& Path, const vector<string>& FileTypes,
|
||||||
|
u32 Color, u32 Magic)
|
||||||
{
|
{
|
||||||
dir_discHdr ListElement;
|
dir_discHdr ListElement;
|
||||||
vector<string> FileList;
|
GetFiles(Path.c_str(), FileTypes, InternalList, false, 30);
|
||||||
GetFiles(Path.c_str(), FileTypes, &FileList, false, 20);
|
for(vector<string>::const_iterator Name = InternalList.begin(); Name != InternalList.end(); ++Name)
|
||||||
for(vector<string>::iterator Name = FileList.begin(); Name != FileList.end(); Name++)
|
|
||||||
{
|
{
|
||||||
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
||||||
ListElement.index = this->size();
|
ListElement.index = this->size();
|
||||||
@ -165,15 +172,14 @@ void ListGenerator::Create_Plugin_List(string Path, vector<string> FileTypes, u3
|
|||||||
ListElement.type = TYPE_PLUGIN;
|
ListElement.type = TYPE_PLUGIN;
|
||||||
this->push_back(ListElement);
|
this->push_back(ListElement);
|
||||||
}
|
}
|
||||||
FileList.clear();
|
InternalList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListGenerator::Create_Homebrew_List(string Path, vector<string> FileTypes)
|
void ListGenerator::Create_Homebrew_List(const string& Path, const vector<string>& FileTypes)
|
||||||
{
|
{
|
||||||
dir_discHdr ListElement;
|
dir_discHdr ListElement;
|
||||||
vector<string> FileList;
|
GetFiles(Path.c_str(), FileTypes, InternalList, false, 4);
|
||||||
GetFiles(Path.c_str(), FileTypes, &FileList, false, 4);
|
for(vector<string>::iterator Name = InternalList.begin(); Name != InternalList.end(); Name++)
|
||||||
for(vector<string>::iterator Name = FileList.begin(); Name != FileList.end(); Name++)
|
|
||||||
{
|
{
|
||||||
if(Name->find("boot.") == string::npos)
|
if(Name->find("boot.") == string::npos)
|
||||||
continue;
|
continue;
|
||||||
@ -204,9 +210,7 @@ void ListGenerator::CreateChannelList()
|
|||||||
Channels ChannelHandle;
|
Channels ChannelHandle;
|
||||||
dir_discHdr ListElement;
|
dir_discHdr ListElement;
|
||||||
ChannelHandle.Init(0, gameTDB_Language, true);
|
ChannelHandle.Init(0, gameTDB_Language, true);
|
||||||
u32 count = ChannelHandle.Count();
|
for(int i = 0; i < ChannelHandle.Count(); i++)
|
||||||
this->reserve(count);
|
|
||||||
for(u32 i = 0; i < count; ++i)
|
|
||||||
{
|
{
|
||||||
Channel *chan = ChannelHandle.GetChannel(i);
|
Channel *chan = ChannelHandle.GetChannel(i);
|
||||||
if(chan->id == NULL)
|
if(chan->id == NULL)
|
||||||
@ -264,8 +268,18 @@ void ListGenerator::AddISO(const char *GameID, const char *GameTitle, const char
|
|||||||
this->push_back(ListElement); //I am a vector! :P
|
this->push_back(ListElement); //I am a vector! :P
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListGenerator::GetFiles(const char *Path, vector<string> FileTypes,
|
bool ListGenerator::IsFileSupported(const char *File, const vector<string>& FileTypes)
|
||||||
vector<string> *FileList, bool gc, u32 max_depth, u32 depth)
|
{
|
||||||
|
for(vector<string>::const_iterator cmp = FileTypes.begin(); cmp != FileTypes.end(); ++cmp)
|
||||||
|
{
|
||||||
|
if(strcasecmp(File, cmp->c_str()) == 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ListGenerator::GetFiles(const char *Path, const vector<string>& FileTypes,
|
||||||
|
vector<string>& FileList, bool CompareFolders, u32 max_depth, u32 depth)
|
||||||
{
|
{
|
||||||
struct dirent *pent = NULL;
|
struct dirent *pent = NULL;
|
||||||
vector<string> SubPaths;
|
vector<string> SubPaths;
|
||||||
@ -279,8 +293,11 @@ void ListGenerator::GetFiles(const char *Path, vector<string> FileTypes,
|
|||||||
string CurrentItem = sfmt("%s/%s", Path, pent->d_name);
|
string CurrentItem = sfmt("%s/%s", Path, pent->d_name);
|
||||||
if(pent->d_type == DT_DIR)
|
if(pent->d_type == DT_DIR)
|
||||||
{
|
{
|
||||||
if(gc && depth == 2 && strcasecmp(pent->d_name, "root") == 0) //fst
|
if(CompareFolders && IsFileSupported(pent->d_name, FileTypes))
|
||||||
FileList->push_back(CurrentItem);
|
{
|
||||||
|
FileList.push_back(CurrentItem);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
else if(depth < max_depth)
|
else if(depth < max_depth)
|
||||||
SubPaths.push_back(CurrentItem); //thanks to libntfs for a complicated way
|
SubPaths.push_back(CurrentItem); //thanks to libntfs for a complicated way
|
||||||
}
|
}
|
||||||
@ -288,18 +305,15 @@ void ListGenerator::GetFiles(const char *Path, vector<string> FileTypes,
|
|||||||
{
|
{
|
||||||
const char *FileName = strstr(pent->d_name, ".");
|
const char *FileName = strstr(pent->d_name, ".");
|
||||||
if(FileName == NULL) FileName = pent->d_name;
|
if(FileName == NULL) FileName = pent->d_name;
|
||||||
for(vector<string>::iterator cmp = FileTypes.begin(); cmp != FileTypes.end(); cmp++)
|
if(IsFileSupported(FileName, FileTypes))
|
||||||
{
|
{
|
||||||
if(strcasecmp(FileName, cmp->c_str()) == 0)
|
FileList.push_back(CurrentItem);
|
||||||
{
|
continue;
|
||||||
FileList->push_back(CurrentItem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir(pdir);
|
closedir(pdir);
|
||||||
for(vector<string>::iterator SubPath = SubPaths.begin(); SubPath != SubPaths.end(); SubPath++)
|
for(vector<string>::iterator SubPath = SubPaths.begin(); SubPath != SubPaths.end(); SubPath++)
|
||||||
GetFiles(SubPath->c_str(), FileTypes, FileList, gc, max_depth, depth + 1);
|
GetFiles(SubPath->c_str(), FileTypes, FileList, CompareFolders, max_depth, depth + 1);
|
||||||
SubPaths.clear();
|
SubPaths.clear();
|
||||||
}
|
}
|
||||||
|
@ -32,20 +32,22 @@ using namespace std;
|
|||||||
class ListGenerator : public vector<dir_discHdr>
|
class ListGenerator : public vector<dir_discHdr>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Init(string settingsDir, string Language);
|
void Init(const char *settingsDir, const char *Language);
|
||||||
void Cleanup();
|
void Cleanup();
|
||||||
void CreateList(u32 Flow, u32 Device, string Path, vector<string> FileTypes,
|
void CreateList(u32 Flow, u32 Device, const string& Path, const vector<string>& FileTypes,
|
||||||
string DBName, bool UpdateCache, u32 Color = 0, u32 Magic = 0);
|
const string& DBName, bool UpdateCache, u32 Color = 0, u32 Magic = 0);
|
||||||
|
void GetFiles(const char *Path, const vector<string>& FileTypes, vector<string>& FileList,
|
||||||
|
bool CompareFolders, u32 max_depth = 2, u32 depth = 1);
|
||||||
private:
|
private:
|
||||||
void Create_Wii_WBFS_List(wbfs_t *handle);
|
void Create_Wii_WBFS_List(wbfs_t *handle);
|
||||||
void Create_Wii_EXT_List(string Path, vector<string> FileTypes);
|
void Create_Wii_EXT_List(const string& Path, const vector<string>& FileTypes);
|
||||||
void Create_GC_List(string Path, vector<string> FileTypes);
|
void Create_GC_List(const string& Path, const vector<string>& FileTypes);
|
||||||
void Create_Plugin_List(string Path, vector<string> FileTypes, u32 Color, u32 Magic);
|
void Create_Plugin_List(const string& Path, const vector<string>& FileTypes,
|
||||||
void Create_Homebrew_List(string Path, vector<string> FileTypes);
|
u32 Color, u32 Magic);
|
||||||
|
void Create_Homebrew_List(const string& Path, const vector<string>& FileTypes);
|
||||||
void CreateChannelList();
|
void CreateChannelList();
|
||||||
void GetFiles(const char *Path, vector<string> FileTypes, vector<string> *FileList,
|
|
||||||
bool gc = false, u32 max_depth = 2, u32 depth = 1);
|
|
||||||
void AddISO(const char *GameID, const char *GameTitle, const char *GamePath, u32 GameColor, u8 Type);
|
void AddISO(const char *GameID, const char *GameTitle, const char *GamePath, u32 GameColor, u8 Type);
|
||||||
|
bool IsFileSupported(const char *File, const vector<string>& FileTypes);
|
||||||
void OpenConfigs();
|
void OpenConfigs();
|
||||||
void CloseConfigs();
|
void CloseConfigs();
|
||||||
string gameTDB_Path;
|
string gameTDB_Path;
|
||||||
@ -53,6 +55,11 @@ private:
|
|||||||
string gameTDB_Language;
|
string gameTDB_Language;
|
||||||
GameTDB gameTDB;
|
GameTDB gameTDB;
|
||||||
Config CustomTitles;
|
Config CustomTitles;
|
||||||
|
vector<string> InternalList;
|
||||||
|
discHdr WiiGameHeader;
|
||||||
|
gc_discHdr GCGameHeader;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern ListGenerator m_gameList;
|
||||||
|
|
||||||
#endif /*_LISTGENERATOR_HPP_*/
|
#endif /*_LISTGENERATOR_HPP_*/
|
||||||
|
@ -419,7 +419,7 @@ void CMenu::init(void)
|
|||||||
}
|
}
|
||||||
m_tempView = false;
|
m_tempView = false;
|
||||||
|
|
||||||
m_gameList.Init(m_settingsDir, m_loc.getString(m_curLanguage, "gametdb_code", "EN"));
|
m_gameList.Init(m_settingsDir.c_str(), m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
|
||||||
|
|
||||||
m_aa = 3;
|
m_aa = 3;
|
||||||
|
|
||||||
@ -2171,8 +2171,9 @@ bool CMenu::_loadChannelList(void)
|
|||||||
{
|
{
|
||||||
string cacheDir(fmt("%s/%s_channels.db", m_cacheDir.c_str(), disable_emu ? "nand" : DeviceName[currentPartition]));
|
string cacheDir(fmt("%s/%s_channels.db", m_cacheDir.c_str(), disable_emu ? "nand" : DeviceName[currentPartition]));
|
||||||
bool updateCache = disable_emu ? true : m_cfg.getBool(_domainFromView(), "update_cache");
|
bool updateCache = disable_emu ? true : m_cfg.getBool(_domainFromView(), "update_cache");
|
||||||
|
vector<string> NullVector;
|
||||||
m_gameList.CreateList(m_current_view, currentPartition, std::string(),
|
m_gameList.CreateList(m_current_view, currentPartition, std::string(),
|
||||||
stringToVector(std::string(), '|'), cacheDir, updateCache);
|
NullVector, cacheDir, updateCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
lastPartition = currentPartition;
|
lastPartition = currentPartition;
|
||||||
@ -2257,7 +2258,8 @@ bool CMenu::_loadDmlList()
|
|||||||
string gameDir(fmt(currentPartition == SD ? DML_DIR : m_DMLgameDir.c_str(), DeviceName[currentPartition]));
|
string gameDir(fmt(currentPartition == SD ? DML_DIR : m_DMLgameDir.c_str(), DeviceName[currentPartition]));
|
||||||
string cacheDir(fmt("%s/%s_gamecube.db", m_cacheDir.c_str(), DeviceName[currentPartition]));
|
string cacheDir(fmt("%s/%s_gamecube.db", m_cacheDir.c_str(), DeviceName[currentPartition]));
|
||||||
bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
|
bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
|
||||||
m_gameList.CreateList(m_current_view, currentPartition, gameDir, stringToVector(".iso", '|'), cacheDir, updateCache);
|
m_gameList.CreateList(m_current_view, currentPartition, gameDir,
|
||||||
|
stringToVector(".iso|root", '|'),cacheDir, updateCache);
|
||||||
|
|
||||||
return m_gameList.size() > 0 ? true : false;
|
return m_gameList.size() > 0 ? true : false;
|
||||||
}
|
}
|
||||||
@ -2269,20 +2271,17 @@ bool CMenu::_loadEmuList()
|
|||||||
return false;
|
return false;
|
||||||
bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
|
bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
|
||||||
|
|
||||||
DIR *pdir;
|
|
||||||
struct dirent *pent;
|
|
||||||
|
|
||||||
vector<dir_discHdr> emuList;
|
vector<dir_discHdr> emuList;
|
||||||
Config m_plugin_cfg;
|
Config m_plugin_cfg;
|
||||||
|
|
||||||
pdir = opendir(m_pluginsDir.c_str());
|
vector<string> INI_List;
|
||||||
while((pent = readdir(pdir)) != NULL)
|
m_gameList.clear();
|
||||||
|
m_gameList.GetFiles(m_pluginsDir.c_str(), stringToVector(".ini", '|'), INI_List, false, 1);
|
||||||
|
for(vector<string>::const_iterator Name = INI_List.begin(); Name != INI_List.end(); ++Name)
|
||||||
{
|
{
|
||||||
if(strcmp(pent->d_name, ".") == 0 || strcmp(pent->d_name, "..") == 0 || strcasecmp(pent->d_name, "scummvm.ini") == 0)
|
if(Name->find("scummvm.ini") != string::npos)
|
||||||
continue;
|
continue;
|
||||||
if(strcasestr(pent->d_name, ".ini") != NULL)
|
m_plugin_cfg.load(Name->c_str());
|
||||||
{
|
|
||||||
m_plugin_cfg.load(fmt("%s/%s", m_pluginsDir.c_str(), pent->d_name));
|
|
||||||
if(m_plugin_cfg.loaded())
|
if(m_plugin_cfg.loaded())
|
||||||
{
|
{
|
||||||
m_plugin.AddPlugin(m_plugin_cfg);
|
m_plugin.AddPlugin(m_plugin_cfg);
|
||||||
@ -2290,11 +2289,11 @@ bool CMenu::_loadEmuList()
|
|||||||
{
|
{
|
||||||
string gameDir(fmt("%s:/%s", DeviceName[currentPartition], m_plugin_cfg.getString(PLUGIN_DOMAIN,"romDir").c_str()));
|
string gameDir(fmt("%s:/%s", DeviceName[currentPartition], m_plugin_cfg.getString(PLUGIN_DOMAIN,"romDir").c_str()));
|
||||||
string cacheDir(fmt("%s/%s_%s.db", m_cacheDir.c_str(), DeviceName[currentPartition], m_plugin_cfg.getString(PLUGIN_DOMAIN,"magic").c_str()));
|
string cacheDir(fmt("%s/%s_%s.db", m_cacheDir.c_str(), DeviceName[currentPartition], m_plugin_cfg.getString(PLUGIN_DOMAIN,"magic").c_str()));
|
||||||
string FileTypes(m_plugin_cfg.getString(PLUGIN_DOMAIN,"fileTypes"));
|
vector<string> FileTypes = stringToVector(m_plugin_cfg.getString(PLUGIN_DOMAIN,"fileTypes"), '|');
|
||||||
u32 CaseColor = strtoul(m_plugin_cfg.getString(PLUGIN_DOMAIN,"coverColor").c_str(), NULL, 16);
|
u32 CaseColor = strtoul(m_plugin_cfg.getString(PLUGIN_DOMAIN,"coverColor").c_str(), NULL, 16);
|
||||||
u32 MagicWord = strtoul(m_plugin_cfg.getString(PLUGIN_DOMAIN,"magic").c_str(), NULL, 16);
|
u32 MagicWord = strtoul(m_plugin_cfg.getString(PLUGIN_DOMAIN,"magic").c_str(), NULL, 16);
|
||||||
m_gameList.CreateList(m_current_view, currentPartition, gameDir,
|
m_gameList.CreateList(m_current_view, currentPartition, gameDir,
|
||||||
stringToVector(FileTypes, '|'), cacheDir, updateCache, CaseColor, MagicWord);
|
FileTypes, cacheDir, updateCache, CaseColor, MagicWord);
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
||||||
emuList.push_back(*tmp_itr);
|
emuList.push_back(*tmp_itr);
|
||||||
}
|
}
|
||||||
@ -2310,11 +2309,12 @@ bool CMenu::_loadEmuList()
|
|||||||
}
|
}
|
||||||
m_plugin_cfg.unload();
|
m_plugin_cfg.unload();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
closedir(pdir);
|
|
||||||
m_gameList.clear();
|
m_gameList.clear();
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = emuList.begin(); tmp_itr != emuList.end(); tmp_itr++)
|
for(vector<dir_discHdr>::iterator tmp_itr = emuList.begin(); tmp_itr != emuList.end(); tmp_itr++)
|
||||||
|
{
|
||||||
|
tmp_itr->index = m_gameList.size();
|
||||||
m_gameList.push_back(*tmp_itr);
|
m_gameList.push_back(*tmp_itr);
|
||||||
|
}
|
||||||
emuList.clear();
|
emuList.clear();
|
||||||
//If we return to the coverflow before wiiflow quit we dont need to reload plugins
|
//If we return to the coverflow before wiiflow quit we dont need to reload plugins
|
||||||
m_plugin.EndAdd();
|
m_plugin.EndAdd();
|
||||||
|
@ -56,7 +56,6 @@ private:
|
|||||||
CButtonsMgr m_btnMgr;
|
CButtonsMgr m_btnMgr;
|
||||||
CCoverFlow m_cf;
|
CCoverFlow m_cf;
|
||||||
CFanart m_fa;
|
CFanart m_fa;
|
||||||
ListGenerator m_gameList;
|
|
||||||
Config m_cfg;
|
Config m_cfg;
|
||||||
Config m_loc;
|
Config m_loc;
|
||||||
Config m_cat;
|
Config m_cat;
|
||||||
|
@ -574,7 +574,8 @@ void CMenu::_game(bool launch)
|
|||||||
ListGenerator SD_List;
|
ListGenerator SD_List;
|
||||||
string gameDir(fmt(DML_DIR, DeviceName[SD]));
|
string gameDir(fmt(DML_DIR, DeviceName[SD]));
|
||||||
string cacheDir(fmt("%s/%s_gamecube.db", m_cacheDir.c_str(), DeviceName[SD]));
|
string cacheDir(fmt("%s/%s_gamecube.db", m_cacheDir.c_str(), DeviceName[SD]));
|
||||||
SD_List.CreateList(COVERFLOW_DML, SD, gameDir, stringToVector(".iso", '|'), cacheDir, false);
|
SD_List.CreateList(COVERFLOW_DML, SD, gameDir,
|
||||||
|
stringToVector(".iso|root", '|'), cacheDir, false);
|
||||||
for(vector<dir_discHdr>::iterator List = SD_List.begin(); List != SD_List.end(); List++)
|
for(vector<dir_discHdr>::iterator List = SD_List.begin(); List != SD_List.end(); List++)
|
||||||
{
|
{
|
||||||
if(strncasecmp(hdr->id, List->id, 6) == 0)
|
if(strncasecmp(hdr->id, List->id, 6) == 0)
|
||||||
@ -758,7 +759,8 @@ void CMenu::directlaunch(const char *GameID)
|
|||||||
DeviceHandle.OpenWBFS(currentPartition);
|
DeviceHandle.OpenWBFS(currentPartition);
|
||||||
string gameDir(fmt(GAMES_DIR, DeviceName[currentPartition]));
|
string gameDir(fmt(GAMES_DIR, DeviceName[currentPartition]));
|
||||||
string cacheDir(fmt("%s/%s_wii.db", m_cacheDir.c_str(), DeviceName[currentPartition]));
|
string cacheDir(fmt("%s/%s_wii.db", m_cacheDir.c_str(), DeviceName[currentPartition]));
|
||||||
m_gameList.CreateList(COVERFLOW_USB, currentPartition, gameDir, stringToVector(".wbfs|.iso", '|'), cacheDir, false);
|
m_gameList.CreateList(COVERFLOW_USB, currentPartition, gameDir,
|
||||||
|
stringToVector(".wbfs|.iso", '|'), cacheDir, false);
|
||||||
WBFS_Close();
|
WBFS_Close();
|
||||||
for(u32 i = 0; i < m_gameList.size(); i++)
|
for(u32 i = 0; i < m_gameList.size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -785,14 +785,14 @@ int CMenu::_NandDumper(void *obj)
|
|||||||
if(m.m_saveExtGameId.empty())
|
if(m.m_saveExtGameId.empty())
|
||||||
{
|
{
|
||||||
m.m_nandexentry = 0;
|
m.m_nandexentry = 0;
|
||||||
saveList.reserve(m.m_gameList.size());
|
saveList.reserve(m_gameList.size());
|
||||||
for(u32 i = 0; i < m.m_gameList.size() && !m.m_thrdStop; ++i)
|
for(u32 i = 0; i < m_gameList.size() && !m.m_thrdStop; ++i)
|
||||||
{
|
{
|
||||||
LWP_MutexLock(m.m_mutex);
|
LWP_MutexLock(m.m_mutex);
|
||||||
m._setDumpMsg(m._t("cfgne18", L"Listing game saves to extract..."), 0.f, 0.f);
|
m._setDumpMsg(m._t("cfgne18", L"Listing game saves to extract..."), 0.f, 0.f);
|
||||||
LWP_MutexUnlock(m.m_mutex);
|
LWP_MutexUnlock(m.m_mutex);
|
||||||
|
|
||||||
string id((const char *)m.m_gameList[i].id, 4);
|
string id((const char *)m_gameList[i].id, 4);
|
||||||
|
|
||||||
if(!missingOnly || !m._checkSave(id, false))
|
if(!missingOnly || !m._checkSave(id, false))
|
||||||
{
|
{
|
||||||
|
@ -14,15 +14,14 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include <dirent.h>
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "MusicPlayer.hpp"
|
#include "MusicPlayer.hpp"
|
||||||
#include "SoundHandler.hpp"
|
#include "SoundHandler.hpp"
|
||||||
#include "fileOps/fileOps.h"
|
#include "list/ListGenerator.hpp"
|
||||||
#include "gui/text.hpp"
|
#include "gui/text.hpp"
|
||||||
#include "gecko/gecko.h"
|
#include "gecko/gecko.h"
|
||||||
|
|
||||||
|
#define MUSIC_DEPTH 10
|
||||||
Musicplayer MusicPlayer;
|
Musicplayer MusicPlayer;
|
||||||
|
|
||||||
void Musicplayer::Cleanup()
|
void Musicplayer::Cleanup()
|
||||||
@ -35,7 +34,7 @@ void Musicplayer::Cleanup()
|
|||||||
FileNames.clear();
|
FileNames.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Musicplayer::Init(Config &cfg, string musicDir, string themeMusicDir)
|
void Musicplayer::Init(Config &cfg, const string& musicDir, const string& themeMusicDir)
|
||||||
{
|
{
|
||||||
Cleanup();
|
Cleanup();
|
||||||
FadeRate = cfg.getInt("GENERAL", "music_fade_rate", 8);
|
FadeRate = cfg.getInt("GENERAL", "music_fade_rate", 8);
|
||||||
@ -44,8 +43,9 @@ void Musicplayer::Init(Config &cfg, string musicDir, string themeMusicDir)
|
|||||||
SetVolume(0);
|
SetVolume(0);
|
||||||
MusicFile.SetVoice(0);
|
MusicFile.SetVoice(0);
|
||||||
|
|
||||||
ScanDirectories(themeMusicDir.c_str());
|
vector<string> Types = stringToVector(".mp3|.ogg", '|');
|
||||||
ScanDirectories(musicDir.c_str());
|
m_gameList.GetFiles(musicDir.c_str(), Types, FileNames, false, MUSIC_DEPTH);
|
||||||
|
m_gameList.GetFiles(themeMusicDir.c_str(), Types, FileNames, false, MUSIC_DEPTH);
|
||||||
if(cfg.getBool("GENERAL", "randomize_music", true) && FileNames.size() > 0)
|
if(cfg.getBool("GENERAL", "randomize_music", true) && FileNames.size() > 0)
|
||||||
{
|
{
|
||||||
srand(unsigned(time(NULL)));
|
srand(unsigned(time(NULL)));
|
||||||
@ -54,23 +54,6 @@ void Musicplayer::Init(Config &cfg, string musicDir, string themeMusicDir)
|
|||||||
CurrentFileName = FileNames.begin();
|
CurrentFileName = FileNames.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Musicplayer::ScanDirectories(const char *directory)
|
|
||||||
{
|
|
||||||
struct dirent *pent = NULL;
|
|
||||||
DIR *pdir = opendir(directory);
|
|
||||||
while((pent = readdir(pdir)) != NULL)
|
|
||||||
{
|
|
||||||
if(strcmp(pent->d_name, ".") == 0 || strcmp(pent->d_name, "..") == 0)
|
|
||||||
continue;
|
|
||||||
string CurrentItem = sfmt("%s/%s", directory, pent->d_name);
|
|
||||||
if(fsop_DirExist(CurrentItem.c_str()))
|
|
||||||
ScanDirectories(CurrentItem.c_str());
|
|
||||||
else if(strcasestr(pent->d_name, ".mp3") != NULL || strcasestr(pent->d_name, ".ogg") != NULL)
|
|
||||||
FileNames.push_back(CurrentItem);
|
|
||||||
}
|
|
||||||
closedir(pdir);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Musicplayer::SetMaxVolume(u8 volume)
|
void Musicplayer::SetMaxVolume(u8 volume)
|
||||||
{
|
{
|
||||||
Volume = volume;
|
Volume = volume;
|
||||||
|
@ -28,7 +28,7 @@ class Musicplayer
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Cleanup();
|
void Cleanup();
|
||||||
void Init(Config &cfg, string musicDir, string themeMusicDir);
|
void Init(Config &cfg, const string& musicDir, const string& themeMusicDir);
|
||||||
void Tick(bool attenuate);
|
void Tick(bool attenuate);
|
||||||
|
|
||||||
void SetVolume(u8 volume);
|
void SetVolume(u8 volume);
|
||||||
@ -49,7 +49,6 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
bool PosFromPrevFile();
|
bool PosFromPrevFile();
|
||||||
void LoadCurrentFile();
|
void LoadCurrentFile();
|
||||||
void ScanDirectories(const char *directory);
|
|
||||||
|
|
||||||
u8 Volume;
|
u8 Volume;
|
||||||
u8 CurrentVolume;
|
u8 CurrentVolume;
|
||||||
|
Loading…
Reference in New Issue
Block a user