/**************************************************************************** * SettingsPrompts * USB Loader GX 2009 * * Backgroundmusic ***************************************************************************/ #include #include "gui_bgm.h" #include "menu.h" GuiBGM::GuiBGM(const u8 *s, int l, int v) : GuiSound(s, l, v) { loop = 0; loopMode = ONCE; currentPath = NULL; currentPlaying = 0; //shouldn't be needed but //fixes some kind of weird bug in ogg system GuiSound::Load(s, l, v); } GuiBGM::~GuiBGM() { if (currentPath) delete[] currentPath; ClearList(); } ; void GuiBGM::SetLoop(bool l) { } void GuiBGM::SetLoop(int l) { loop = false; loopMode = ONCE; if (l == LOOP) { loop = true; } else loopMode = l; } bool GuiBGM::Load(const char *path) { if (!path) { LoadStandard(); return false; } if (strcmp(path, "") == 0) { LoadStandard(); return false; } if (!GuiSound::Load(path)) { LoadStandard(); return false; } return ParsePath(path); } bool GuiBGM::LoadStandard() { ClearList(); if (currentPath) { delete[] currentPath; currentPath = NULL; } strcpy(Settings.ogg_path, ""); bool ret = GuiSound::Load(bg_music_ogg, bg_music_ogg_size, true); if (ret) Play(); return ret; } bool GuiBGM::ParsePath(const char * folderpath) { ClearList(); if (currentPath) delete[] currentPath; currentPath = new char[strlen(folderpath) + 1]; sprintf(currentPath, "%s", folderpath); char * isdirpath = strrchr(folderpath, '.'); if (isdirpath) { char * pathptr = strrchr(currentPath, '/'); if (pathptr) { pathptr++; pathptr[0] = 0; } } char * LoadedFilename = strrchr(folderpath, '/') + 1; char filename[1024]; struct stat st; DIR_ITER * dir = diropen(currentPath); if (dir == NULL) { LoadStandard(); return false; } u32 counter = 0; while (dirnext(dir, filename, &st) == 0) { char * fileext = strrchr(filename, '.'); if (fileext) { if (strcasecmp(fileext, ".mp3") == 0 || strcasecmp(fileext, ".ogg") == 0 || strcasecmp(fileext, ".wav") == 0) { AddEntrie(filename); if (strcmp(LoadedFilename, filename) == 0) currentPlaying = counter; counter++; } } } dirclose(dir); snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s", folderpath); return true; } void GuiBGM::AddEntrie(const char * filename) { if (!filename) return; char * NewEntrie = new char[strlen(filename) + 1]; sprintf(NewEntrie, "%s", filename); PlayList.push_back(NewEntrie); } void GuiBGM::ClearList() { for (u32 i = 0; i < PlayList.size(); i++) { if (PlayList.at(i) != NULL) { delete[] PlayList.at(i); PlayList.at(i) = NULL; } } PlayList.clear(); } bool GuiBGM::PlayNext() { if (!currentPath) return false; currentPlaying++; if (currentPlaying >= (int) PlayList.size()) currentPlaying = 0; snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s%s", currentPath, PlayList.at(currentPlaying)); if (!GuiSound::Load(Settings.ogg_path)) return false; Play(); return true; } bool GuiBGM::PlayPrevious() { if (!currentPath) return false; currentPlaying--; if (currentPlaying < 0) currentPlaying = PlayList.size() - 1; snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s%s", currentPath, PlayList.at(currentPlaying)); if (!GuiSound::Load(Settings.ogg_path)) return false; Play(); return true; } bool GuiBGM::PlayRandom() { if (!currentPath) return false; srand(time(NULL)); currentPlaying = rand() % PlayList.size(); //just in case if (currentPlaying < 0) currentPlaying = PlayList.size() - 1; else if (currentPlaying >= (int) PlayList.size()) currentPlaying = 0; snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s%s", currentPath, PlayList.at(currentPlaying)); if (!GuiSound::Load(Settings.ogg_path)) return false; Play(); return true; } void GuiBGM::UpdateState() { if (!IsPlaying()) { if (loopMode == DIR_LOOP) { PlayNext(); } else if (loopMode == RANDOM_BGM) { PlayRandom(); } } }