/// Load a songfrom disk bool Song::Load(const char* filename, void (*progressCallback)(int, const char *)) { FILE* pfile = fopen(filename, "rb"); // check if file open failed if(NULL == pfile) { printf("Failed to open song file %s!\n", filename); return false; } // init progress display progressCallback(0, "Loading song..."); fread(&name, SONG_NAME_LEN * sizeof(char), 1, pfile); fread(&vol, sizeof(char), 1, pfile); fread(&BPM, sizeof(char), 1, pfile); fread(&pitch, sizeof(char), 1, pfile); currentPatternIndex = freadInt(pfile); songPos = freadInt(pfile); progressCallback(10, "Loading song..."); // read song list (sequence) int songListLength = freadInt(pfile); if (songListLength > PATTERNS_PER_SONG) { //DoMessage(sdlRenderer, bigFont, "Song Load Warning", "Song sequence length too long,\npossibly from later version.\n \nSong may be truncated.", false); SDL_ShowSimpleMessageBox(0, "Song Load Warning", "Song sequence length too long,\npossibly from later version.\n \nSong may be truncated.", NULL); fread(&songList[0], PATTERNS_PER_SONG * sizeof(char), 1, pfile); // skip over extra fseek(pfile, songListLength - PATTERNS_PER_SONG, SEEK_CUR); } else { fread(&songList[0], songListLength * sizeof(char), 1, pfile); } progressCallback(30, "Loading song..."); // read patterns int numPatterns = freadInt(pfile); if (numPatterns > MAX_PATTERN) { //DoMessage(sdlRenderer, bigFont, "Song Load Warning", "Too many patterns,\npossibly from later version.\n \nSome patterns may not be loaded.", false); SDL_ShowSimpleMessageBox(0, "Song Load Warning", "Too many patterns,\npossibly from later version.\n \nSome patterns may not be loaded.", NULL); for (int i = 0; i < MAX_PATTERN; i++) patterns[i].Read(pfile); // skip over extra DrumPattern tempPat; for (int i = 0; i < (numPatterns - MAX_PATTERN); i++) tempPat.Read(pfile); } else { for (int i = 0; i < numPatterns; i++) patterns[i].Read(pfile); } progressCallback(60, "Loading song..."); // read patterns int numTracks = freadInt(pfile); if (numTracks > NUM_TRACKS) { //DoMessage(sdlRenderer, bigFont, "Song Load Warning", "Too many tracks!\nSome tracks may not be loaded.", false); SDL_ShowSimpleMessageBox(0, "Song Load Warning", "Too many tracks!\nSome tracks may not be loaded.", NULL); for (int i = 0; i < NUM_TRACKS; i++) trackMixInfo[i].Read(pfile); // skip over extra TrackMixInfo tempTrackInfo; for (int i = 0; i < (numTracks - NUM_TRACKS); i++) tempTrackInfo.Read(pfile); } else { for (int i = 0; i < numTracks; i++) trackMixInfo[i].Read(pfile); } progressCallback(100, "Loading song..."); fclose(pfile); return true; }
UINT32 freadUINT32(FILE* file) { return (UINT32)freadInt(file, 4); }
UINT64 freadUINT64(FILE* file) { return freadInt(file, 8); }
UINT16 freadUINT16(FILE* file) { return (UINT16)freadInt(file, 2); }