Jump to content

File_ReadBuffer --- (over) jump to a specific sector?


Recommended Posts

Posted

hei.

I have a "huge" Array:         u8 SongSQ[8][1024]

it should be greater like [8][4096] ... it is used as Song-Step-Sequencer... but this would run out of RAM... (its a big ProjecT)

so i thought loading in 1024 Parts from a SD,  after each 1024 Steps, i make a "SONG_Extend++"

and there is my "solution":

// Read Data from file
MUTEX_SDCARD_TAKE;
		// Read Data from file
		FILE_ReadOpen	( &midifile_fi, path_song);   
				FILE_ReadBuffer( (u8 *)file_type,	4); //"SIGL"     = 4 Positons
				FILE_ReadBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );	// The Frist 1024 Steps of a Song
				if(SONG_Extend >= 1) {	FILE_ReadBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );	}		// if there is no other way...
				if(SONG_Extend >= 2) {	FILE_ReadBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );	}		// of adressing different sections on SD-Card ?
				if(SONG_Extend >= 3) {	FILE_ReadBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );	}		// this way: it will load and overwrite until we come to the right section
		FILE_ReadClose	( &midifile_fi );
MUTEX_SDCARD_GIVE;

ok this is a workaround, it reads each 1024-block over and over until it is blocked... In Lack of Knowledge to Jump to a Bufferposition - without loading into RAM - which i dont have (no place for a Dummy[8][1024]

 

but the workaround doesnt work because when i      Write the File:

// Write Data into file
FILE_WriteOpen	( path_tm,       8);   
				FILE_WriteBuffer( (u8 *)file_type,	4); //"SIGL"     = 4 Positons
				FILE_WriteBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );
				if(SONG_Extend >= 1) {	FILE_WriteBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );	}		// this overwrites...other solution?
				if(SONG_Extend >= 2) {	FILE_WriteBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );	}
				if(SONG_Extend >= 3) {	FILE_WriteBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );	}
		FILE_WriteClose	();
MUTEX_SDCARD_GIVE;

it will overwrite  already written 1024er-Blocks

 

So the only solution is - what i see to jump to a specif sector aka

SONG_Extend=0;        ReadSector = 0  (or 4 when overjump the file_type section)

SONG_Extend=1;        sizeof(SongSQ) = ReadSector = 1024*8 = 8192

SONG_Extend=2;        sizeof(SongSQ)+ sizeof(SongSQ) = ReadSector = 16384

SONG_Extend=3;       sizeof(SongSQ) + sizeof(SongSQ) + sizeof(SongSQ) = ReadSector = 24576;

but where and how to write the sectors to read

 

can someone explain:

FILE_WriteBuffer( (u8 *)&SongSQ,	sizeof(SongSQ) );

where i write the Adress off Buffer and in which format ?

file.c says:

/////////////////////////////////////////////////////////////////////////////
//! Writes into a file with caching mechanism (actual write at end of sector)
//! File has to be closed via FILE_WriteClose() after the last byte has been written
/////////////////////////////////////////////////////////////////////////////
s32 FILE_WriteBuffer(u8 *buffer, u32 len)
{
  UINT successcount;
  if( (file_dfs_errno=f_write(&file_write, buffer, len, &successcount)) != FR_OK ) {
}

so first Argument is the DATA to write, and the second the length...  so it is not possible to overjump since it writes one after a nother? correct?

Other Possibilitys? make 4 Files on Disk for each 1024 Steps. hopefully not.

thx

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...