/**************************************************************************** * 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(); } } }