Exemplo n.º 1
0
/// 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;	
}
Exemplo n.º 2
0
UINT32 freadUINT32(FILE* file)
{
    return (UINT32)freadInt(file, 4);
}
Exemplo n.º 3
0
UINT64 freadUINT64(FILE* file)
{
    return freadInt(file, 8);
}
Exemplo n.º 4
0
UINT16 freadUINT16(FILE* file)
{
    return (UINT16)freadInt(file, 2);
}