ArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArray
Statistics: Posted by martignasse — 13 May 2009, 11:05
Statistics: Posted by senso — 13 May 2009, 09:07
seems you've got confirmation from senso in the other thread that the process function is called every BLOC samples. I prefer that the info come from senso, as he is the one who know all that stuff, i'm like you, discovering the beast (not senso...Usine"process" is called syncronicall with the block size?
ie. if the block size is 128, audio process is called every 128 samples?
Or, if the sample rate is 44100 and "process" is called 800/sec, the audio array is around 55 samples?(but, normally, it can't be less than the block size)
yep, the SDK itself is in C++, but the brunch of functions to communicate with usine (at the end of the UserDefinitions.h) use C signature. Anyway, not very relevant, should be pretty tired when i wrote that, sorrysorry, I don't understand: this SDK is C++, right? What do you mean with SDK interface?
Statistics: Posted by martignasse — 12 May 2009, 20:29
"process" is called syncronicall with the block size?3/ Process <- called each Usine cycle (800/second) while your module is alive
??? sorry, I don't understand: this SDK is C++, right? What do you mean with SDK interface?(don't miss the SDK interface is C, not C++)
that's true....What prevent you to split that in two param ? like a 'base freq' one who is a value of the wanted reference frequence and a 'mod' one who is a signal of the modulation wanted around the 'base freq' value.
Statistics: Posted by Gizzeta — 08 May 2009, 23:54
Good question, i dont know the exact order, but i'm sure of that :Can you explain me the exact order in wich the finctions are called by Usine? (I guess: "Create", then "getModuleInfo", then "initModule"....)
Yep, static variables are created in the static memory, shared by all functions (don't miss the SDK interface is C, not C++)So a variable declared as static is shared by all instances? (I'm sorry, I'm a c++ beginner...)
the simple way is to declare it in your module definition (the include file), and initialise it in the InitModule function if you need some infos stored in pMasterInfoAnd if I want a variable, private to the module, that keep the value between more functions calls, I have to declare it in the "create" function? And it can be a normal (not pointer) variable?
CODE:
class MuModule : public TUserModule{...private:intiMyVariable;...};CODE:
...//-----------------------------------------------------------------------------// initialisationvoid InitModule (void* pModule, TMasterInfo* pMasterInfo, TModuleInfo* pModuleInfo) {// conveinient pointer MyModule* pMyModule = ((MyModule*)pModule);// remember, it's up to us to initialise the pMasterInfo poimnter herited from TUserModulepMyModule->pMasterInfo = pMasterInfo;// initialisation of other variablepMyModule->iMyVariable = pMasterInfo->pTimeInfo->sampleRate; // or whatever, you got the idea}...well, it's here your design is not very clear, i think, you have two signification for the same param, it's not clean.It's a pDataFader. Because I want that it could be possible to control the module frequency by a data value and by a signal value (for frequency modulation, eg: at every sample the frequency value can variate).
So, if the incoming data is a single value (len == 1), it's a normal data frequency control. In this case I calculate (pFreqIn*samplesOverSR) just once for "process" call.
If the incoming data is an array whose lenght is the same as Block Size, it's a frequency modulation and (pFreqIn*samplesOverSR) has to be calculated once for sample.
Finally, if there's no cable connected, I want the module to out a 0.f signal (silence).
but Usine provide different params for differents kind of signal, like said above. seems like your design push you to make extra work here.I detect what kind of message (data or signal) is coming in, by the size if the 'pCycle->pFreqIn'.
not automaticly, for your case, it's once again the design who push you to make like that. In your Process function, there is some mix between the detection of the param (data or signal) and the audio treatment, it make the code trickyDo you think it's better to create a function on purpose?
Statistics: Posted by martignasse — 08 May 2009, 17:38
that's what I want. lSize/SR is always the same, for all the module duration. I calculate it only at creation, to economize CPU.'samplesOverSR' is never updated with the '(float)*(pCycle->lSize) / (float)pCycle->pMasterInfo->pTimeInfo->sampleRate' result.
I thik this was my problem...More than that, as 'samplesOverSR' is declared static, only one instance of it is shared by all instances of your modules.
It's a pDataFader. Because I want that it could be possible to control the module frequency by a data value and by a signal value (for frequency modulation, eg: at every sample the frequency value can variate).What kind of datatype is your 'pFreqIn' param ?
..hem...I don't understend...I detect what kind of message (data or signal) is coming in, by the size if the 'pCycle->pFreqIn'.'pCycle->pFreqIn->len' is initially used to store the size of the DATA array of 'pCycle->pFreqIn', but you use it also to detect if you make data or audio treatment.
Do you think it's better to create a function on purpose?- avoid duplication of same code,
In term of CPU economy what is more expensive: a class/structure member calls or a variable more?- reduce the use of class/structure member call for reading info in 'for' loop, make variable for it before the loop, for exampleit make code more readable and optimized, if your BlockSize is 512, you save 512 class/structure member calls.CODE:
int iAudioOutLen = pCycle->pAudioOut->len = pCycle->pMasterInfo->BlocSize;int i ;...for (i = 0; i < iAudioOutLen ) { ...}
Statistics: Posted by Gizzeta — 08 May 2009, 14:44
CODE:
static float samplesOverSR = (float)*(pCycle->lSize) / (float)pCycle->pMasterInfo->pTimeInfo->sampleRate;CODE:
pCycle->pAudioOut->DATA[i] = *(pCycle->buffer + (int)*(pCycle->index)); *(pCycle->index) += *(pCycle->coefFreq); if(*(pCycle->index) >= *(pCycle->lSize)) *(pCycle->index) -= *(pCycle->lSize);CODE:
int iAudioOutLen = pCycle->pAudioOut->len = pCycle->pMasterInfo->BlocSize;int i ;...for (i = 0; i < iAudioOutLen ) { ...}Statistics: Posted by martignasse — 08 May 2009, 11:27
Statistics: Posted by Gizzeta — 08 May 2009, 02:13
...maybe you haven't seen my previous post...I have put the whole code...no problem, but remenber to ask someone else to read your codeit save days, no joke !
Statistics: Posted by Gizzeta — 07 May 2009, 22:59
no, there is no need to make complex things like that.lSize is a pointer because I need to access to it in the process function. It's the only way, isn't it?
CODE:
TMyModule* pMyModule = ((TMyModule*)pModule);CODE:
nt local_int_value_of_lSize = pMyModule->lSize;CODE:
pMyModule->lSize = 3;Statistics: Posted by martignasse — 07 May 2009, 21:45
Statistics: Posted by Gizzeta — 07 May 2009, 21:06
CODE:
class TCycle : public TUserModule{public:TEVT* pFreqIn;TEVT* pAudioOut;FILE* pFile;float* buffer, *index, *coefFreq, *freqMinus;int* lSize;};void Process (void* pModule) {//pointer to the moduleTCycle* pCycle = ((TCycle*)pModule);static float samplesOverSR = (float)*(pCycle->lSize) / (float)pCycle->pMasterInfo->pTimeInfo->sampleRate;int i;pCycle->pAudioOut->len = pCycle->pMasterInfo->BlocSize;// data type CONNECTEDif(pCycle->pFreqIn->len == 1){if(pCycle->pFreqIn->value != *(pCycle->freqMinus)){*(pCycle->freqMinus) = pCycle->pFreqIn->value;*(pCycle->coefFreq) = pCycle->pFreqIn->value * samplesOverSR;}for(i = 0; i < pCycle->pMasterInfo->BlocSize; i++){pCycle->pAudioOut->DATA[i] = *(pCycle->buffer + (int)*(pCycle->index));*(pCycle->index) += *(pCycle->coefFreq);if(*(pCycle->index) >= *(pCycle->lSize)) *(pCycle->index) -= *(pCycle->lSize);}}// audio type CONNECTEDelse if(pCycle->pFreqIn->len == pCycle->pMasterInfo->BlocSize){for(i = 0; i < pCycle->pMasterInfo->BlocSize; i++){if(pCycle->pFreqIn->DATA[i] != *(pCycle->freqMinus)){*(pCycle->freqMinus) = pCycle->pFreqIn->DATA[i];*(pCycle->coefFreq) = pCycle->pFreqIn->DATA[i] * samplesOverSR;}pCycle->pAudioOut->DATA[i] = *(pCycle->buffer + (int)(*(pCycle->index)));*(pCycle->index) += *(pCycle->coefFreq);if(*(pCycle->index) >= *(pCycle->lSize)) *(pCycle->index) -= *(pCycle->lSize);}}// NO CABLE CONNECTEDelse{for(i = 0; i < pCycle->pMasterInfo->BlocSize; i++) pCycle->pAudioOut->DATA[i] = 0.f;};pCycle->pFreqIn->len = 0;} void Create(void* &pModule) { pModule = new TCycle(); TCycle* pCycle = ((TCycle*)pModule); size_t result; pCycle->lSize = new int; pCycle->pFile = fopen ( "E:\AUDIO\USINEfiles\Cycle\Sine2048.bin" , "rb" ); assert(pCycle->pFile != NULL); //obtain file size: fseek (pCycle->pFile , 0 , SEEK_END); *(pCycle->lSize) = ftell (pCycle->pFile); *(pCycle->lSize) /= sizeof(float); rewind (pCycle->pFile); // allocate memory to contain the whole file: pCycle->buffer = new float[sizeof(float)*(*(pCycle->lSize))]; // copy the file into the buffer: result = fread (pCycle->buffer,sizeof(float),*pCycle->lSize,pCycle->pFile); //variables declaration and initialization (used only in "process" function)pCycle->index = new float;*(pCycle->index) = 0.f; pCycle->coefFreq = new float;pCycle->freqMinus = new float;*(pCycle->freqMinus) = 0.f; //close fclose (pCycle->pFile);}void Destroy(void* pModule) {TCycle* pCycle = ((TCycle*)pModule);delete pCycle->lSize;delete pCycle->buffer;delete pCycle->index;delete pCycle->coefFreq;delete pCycle->freqMinus;delete pModule;}Statistics: Posted by Gizzeta — 07 May 2009, 20:55
Statistics: Posted by martignasse — 07 May 2009, 19:19
Statistics: Posted by Gizzeta — 07 May 2009, 19:11
CODE:
int* lSize;CODE:
int lSize;CODE:
void Create(void* &pModule) { pModule = new TCycle(); TCycle* pCycle = ((TCycle*)pModule); size_t result; // no more needed // pCycle->lSize = new int; pCycle->pFile = fopen ( "E:\AUDIO\USINEfiles\Cycle\Sine2048.bin" , "rb" ); assert(pCycle->pFile != NULL); //obtain file size: fseek (pCycle->pFile , 0 , SEEK_END); // no more * indirection pCycle->lSize = ftell (pCycle->pFile); pCycle->lSize /= sizeof(float); rewind (pCycle->pFile); // allocate memory to contain the whole file: // especially this line was maybe missinterpreted before, it's better like that pCycle->buffer = new float[sizeof(float) * pCycle->lSize]; // copy the file into the buffer: result = fread (pCycle->buffer, sizeof(float), pCycle->lSize, pCycle->pFile); //close fclose (pCycle->pFile);}CODE:
pCycle->buffer = new float[sizeof(float)**pCycle->lSize];Statistics: Posted by martignasse — 07 May 2009, 17:15
Statistics: Posted by senso — 07 May 2009, 09:01
CODE:
class TCycle : public TUserModule{public:// Declare all parameters events pointers needed, example :TEVT* pFreqIn;TEVT* pAudioOut;TEVT* ARR;FILE* pFile;float* buffer;int* lSize;};CODE:
void Create(void* &pModule) {pModule = new TCycle();TCycle* pCycle = ((TCycle*)pModule);size_t result;pCycle->lSize = new int;pCycle->pFile = fopen ( "E:\AUDIO\USINEfiles\Cycle\Sine2048.bin" , "rb" );assert(pCycle->pFile != NULL);//obtain file size:fseek (pCycle->pFile , 0 , SEEK_END);*pCycle->lSize = ftell (pCycle->pFile);*pCycle->lSize /= sizeof(float);rewind (pCycle->pFile);// allocate memory to contain the whole file:pCycle->buffer = new float[sizeof(float)**pCycle->lSize];// copy the file into the buffer:result = fread (pCycle->buffer,sizeof(float),*pCycle->lSize,pCycle->pFile); //closefclose (pCycle->pFile);}Statistics: Posted by Gizzeta — 07 May 2009, 00:11
Statistics: Posted by senso — 05 May 2009, 18:56
Statistics: Posted by martignasse — 05 May 2009, 18:03
Statistics: Posted by martignasse — 05 May 2009, 17:47
Statistics: Posted by martignasse — 13 May 2009, 11:05
Statistics: Posted by senso — 13 May 2009, 09:07
seems you've got confirmation from senso in the other thread that the process function is called every BLOC samples. I prefer that the info come from senso, as he is the one who know all that stuff, i'm like you, discovering the beast (not senso...Usine"process" is called syncronicall with the block size?
ie. if the block size is 128, audio process is called every 128 samples?
Or, if the sample rate is 44100 and "process" is called 800/sec, the audio array is around 55 samples?(but, normally, it can't be less than the block size)
yep, the SDK itself is in C++, but the brunch of functions to communicate with usine (at the end of the UserDefinitions.h) use C signature. Anyway, not very relevant, should be pretty tired when i wrote that, sorrysorry, I don't understand: this SDK is C++, right? What do you mean with SDK interface?
Statistics: Posted by martignasse — 12 May 2009, 20:29
"process" is called syncronicall with the block size?3/ Process <- called each Usine cycle (800/second) while your module is alive
??? sorry, I don't understand: this SDK is C++, right? What do you mean with SDK interface?(don't miss the SDK interface is C, not C++)
that's true....What prevent you to split that in two param ? like a 'base freq' one who is a value of the wanted reference frequence and a 'mod' one who is a signal of the modulation wanted around the 'base freq' value.
Statistics: Posted by Gizzeta — 08 May 2009, 23:54
Good question, i dont know the exact order, but i'm sure of that :Can you explain me the exact order in wich the finctions are called by Usine? (I guess: "Create", then "getModuleInfo", then "initModule"....)
Yep, static variables are created in the static memory, shared by all functions (don't miss the SDK interface is C, not C++)So a variable declared as static is shared by all instances? (I'm sorry, I'm a c++ beginner...)
the simple way is to declare it in your module definition (the include file), and initialise it in the InitModule function if you need some infos stored in pMasterInfoAnd if I want a variable, private to the module, that keep the value between more functions calls, I have to declare it in the "create" function? And it can be a normal (not pointer) variable?
CODE:
class MuModule : public TUserModule{...private:intiMyVariable;...};CODE:
...//-----------------------------------------------------------------------------// initialisationvoid InitModule (void* pModule, TMasterInfo* pMasterInfo, TModuleInfo* pModuleInfo) {// conveinient pointer MyModule* pMyModule = ((MyModule*)pModule);// remember, it's up to us to initialise the pMasterInfo poimnter herited from TUserModulepMyModule->pMasterInfo = pMasterInfo;// initialisation of other variablepMyModule->iMyVariable = pMasterInfo->pTimeInfo->sampleRate; // or whatever, you got the idea}...well, it's here your design is not very clear, i think, you have two signification for the same param, it's not clean.It's a pDataFader. Because I want that it could be possible to control the module frequency by a data value and by a signal value (for frequency modulation, eg: at every sample the frequency value can variate).
So, if the incoming data is a single value (len == 1), it's a normal data frequency control. In this case I calculate (pFreqIn*samplesOverSR) just once for "process" call.
If the incoming data is an array whose lenght is the same as Block Size, it's a frequency modulation and (pFreqIn*samplesOverSR) has to be calculated once for sample.
Finally, if there's no cable connected, I want the module to out a 0.f signal (silence).
but Usine provide different params for differents kind of signal, like said above. seems like your design push you to make extra work here.I detect what kind of message (data or signal) is coming in, by the size if the 'pCycle->pFreqIn'.
not automaticly, for your case, it's once again the design who push you to make like that. In your Process function, there is some mix between the detection of the param (data or signal) and the audio treatment, it make the code trickyDo you think it's better to create a function on purpose?
Statistics: Posted by martignasse — 08 May 2009, 17:38
that's what I want. lSize/SR is always the same, for all the module duration. I calculate it only at creation, to economize CPU.'samplesOverSR' is never updated with the '(float)*(pCycle->lSize) / (float)pCycle->pMasterInfo->pTimeInfo->sampleRate' result.
I thik this was my problem...More than that, as 'samplesOverSR' is declared static, only one instance of it is shared by all instances of your modules.
It's a pDataFader. Because I want that it could be possible to control the module frequency by a data value and by a signal value (for frequency modulation, eg: at every sample the frequency value can variate).What kind of datatype is your 'pFreqIn' param ?
..hem...I don't understend...I detect what kind of message (data or signal) is coming in, by the size if the 'pCycle->pFreqIn'.'pCycle->pFreqIn->len' is initially used to store the size of the DATA array of 'pCycle->pFreqIn', but you use it also to detect if you make data or audio treatment.
Do you think it's better to create a function on purpose?- avoid duplication of same code,
In term of CPU economy what is more expensive: a class/structure member calls or a variable more?- reduce the use of class/structure member call for reading info in 'for' loop, make variable for it before the loop, for exampleit make code more readable and optimized, if your BlockSize is 512, you save 512 class/structure member calls.CODE:
int iAudioOutLen = pCycle->pAudioOut->len = pCycle->pMasterInfo->BlocSize;int i ;...for (i = 0; i < iAudioOutLen ) { ...}
Statistics: Posted by Gizzeta — 08 May 2009, 14:44
CODE:
static float samplesOverSR = (float)*(pCycle->lSize) / (float)pCycle->pMasterInfo->pTimeInfo->sampleRate;CODE:
pCycle->pAudioOut->DATA[i] = *(pCycle->buffer + (int)*(pCycle->index)); *(pCycle->index) += *(pCycle->coefFreq); if(*(pCycle->index) >= *(pCycle->lSize)) *(pCycle->index) -= *(pCycle->lSize);CODE:
int iAudioOutLen = pCycle->pAudioOut->len = pCycle->pMasterInfo->BlocSize;int i ;...for (i = 0; i < iAudioOutLen ) { ...}Statistics: Posted by martignasse — 08 May 2009, 11:27
Statistics: Posted by Gizzeta — 08 May 2009, 02:13
...maybe you haven't seen my previous post...I have put the whole code...no problem, but remenber to ask someone else to read your codeit save days, no joke !
Statistics: Posted by Gizzeta — 07 May 2009, 22:59
no, there is no need to make complex things like that.lSize is a pointer because I need to access to it in the process function. It's the only way, isn't it?
CODE:
TMyModule* pMyModule = ((TMyModule*)pModule);CODE:
nt local_int_value_of_lSize = pMyModule->lSize;CODE:
pMyModule->lSize = 3;Statistics: Posted by martignasse — 07 May 2009, 21:45
Statistics: Posted by Gizzeta — 07 May 2009, 21:06
CODE:
class TCycle : public TUserModule{public:TEVT* pFreqIn;TEVT* pAudioOut;FILE* pFile;float* buffer, *index, *coefFreq, *freqMinus;int* lSize;};void Process (void* pModule) {//pointer to the moduleTCycle* pCycle = ((TCycle*)pModule);static float samplesOverSR = (float)*(pCycle->lSize) / (float)pCycle->pMasterInfo->pTimeInfo->sampleRate;int i;pCycle->pAudioOut->len = pCycle->pMasterInfo->BlocSize;// data type CONNECTEDif(pCycle->pFreqIn->len == 1){if(pCycle->pFreqIn->value != *(pCycle->freqMinus)){*(pCycle->freqMinus) = pCycle->pFreqIn->value;*(pCycle->coefFreq) = pCycle->pFreqIn->value * samplesOverSR;}for(i = 0; i < pCycle->pMasterInfo->BlocSize; i++){pCycle->pAudioOut->DATA[i] = *(pCycle->buffer + (int)*(pCycle->index));*(pCycle->index) += *(pCycle->coefFreq);if(*(pCycle->index) >= *(pCycle->lSize)) *(pCycle->index) -= *(pCycle->lSize);}}// audio type CONNECTEDelse if(pCycle->pFreqIn->len == pCycle->pMasterInfo->BlocSize){for(i = 0; i < pCycle->pMasterInfo->BlocSize; i++){if(pCycle->pFreqIn->DATA[i] != *(pCycle->freqMinus)){*(pCycle->freqMinus) = pCycle->pFreqIn->DATA[i];*(pCycle->coefFreq) = pCycle->pFreqIn->DATA[i] * samplesOverSR;}pCycle->pAudioOut->DATA[i] = *(pCycle->buffer + (int)(*(pCycle->index)));*(pCycle->index) += *(pCycle->coefFreq);if(*(pCycle->index) >= *(pCycle->lSize)) *(pCycle->index) -= *(pCycle->lSize);}}// NO CABLE CONNECTEDelse{for(i = 0; i < pCycle->pMasterInfo->BlocSize; i++) pCycle->pAudioOut->DATA[i] = 0.f;};pCycle->pFreqIn->len = 0;} void Create(void* &pModule) { pModule = new TCycle(); TCycle* pCycle = ((TCycle*)pModule); size_t result; pCycle->lSize = new int; pCycle->pFile = fopen ( "E:\AUDIO\USINEfiles\Cycle\Sine2048.bin" , "rb" ); assert(pCycle->pFile != NULL); //obtain file size: fseek (pCycle->pFile , 0 , SEEK_END); *(pCycle->lSize) = ftell (pCycle->pFile); *(pCycle->lSize) /= sizeof(float); rewind (pCycle->pFile); // allocate memory to contain the whole file: pCycle->buffer = new float[sizeof(float)*(*(pCycle->lSize))]; // copy the file into the buffer: result = fread (pCycle->buffer,sizeof(float),*pCycle->lSize,pCycle->pFile); //variables declaration and initialization (used only in "process" function)pCycle->index = new float;*(pCycle->index) = 0.f; pCycle->coefFreq = new float;pCycle->freqMinus = new float;*(pCycle->freqMinus) = 0.f; //close fclose (pCycle->pFile);}void Destroy(void* pModule) {TCycle* pCycle = ((TCycle*)pModule);delete pCycle->lSize;delete pCycle->buffer;delete pCycle->index;delete pCycle->coefFreq;delete pCycle->freqMinus;delete pModule;}Statistics: Posted by Gizzeta — 07 May 2009, 20:55
Statistics: Posted by martignasse — 07 May 2009, 19:19
Statistics: Posted by Gizzeta — 07 May 2009, 19:11
CODE:
int* lSize;CODE:
int lSize;CODE:
void Create(void* &pModule) { pModule = new TCycle(); TCycle* pCycle = ((TCycle*)pModule); size_t result; // no more needed // pCycle->lSize = new int; pCycle->pFile = fopen ( "E:\AUDIO\USINEfiles\Cycle\Sine2048.bin" , "rb" ); assert(pCycle->pFile != NULL); //obtain file size: fseek (pCycle->pFile , 0 , SEEK_END); // no more * indirection pCycle->lSize = ftell (pCycle->pFile); pCycle->lSize /= sizeof(float); rewind (pCycle->pFile); // allocate memory to contain the whole file: // especially this line was maybe missinterpreted before, it's better like that pCycle->buffer = new float[sizeof(float) * pCycle->lSize]; // copy the file into the buffer: result = fread (pCycle->buffer, sizeof(float), pCycle->lSize, pCycle->pFile); //close fclose (pCycle->pFile);}CODE:
pCycle->buffer = new float[sizeof(float)**pCycle->lSize];Statistics: Posted by martignasse — 07 May 2009, 17:15
Statistics: Posted by senso — 07 May 2009, 09:01
CODE:
class TCycle : public TUserModule{public:// Declare all parameters events pointers needed, example :TEVT* pFreqIn;TEVT* pAudioOut;TEVT* ARR;FILE* pFile;float* buffer;int* lSize;};CODE:
void Create(void* &pModule) {pModule = new TCycle();TCycle* pCycle = ((TCycle*)pModule);size_t result;pCycle->lSize = new int;pCycle->pFile = fopen ( "E:\AUDIO\USINEfiles\Cycle\Sine2048.bin" , "rb" );assert(pCycle->pFile != NULL);//obtain file size:fseek (pCycle->pFile , 0 , SEEK_END);*pCycle->lSize = ftell (pCycle->pFile);*pCycle->lSize /= sizeof(float);rewind (pCycle->pFile);// allocate memory to contain the whole file:pCycle->buffer = new float[sizeof(float)**pCycle->lSize];// copy the file into the buffer:result = fread (pCycle->buffer,sizeof(float),*pCycle->lSize,pCycle->pFile); //closefclose (pCycle->pFile);}Statistics: Posted by Gizzeta — 07 May 2009, 00:11
Statistics: Posted by senso — 05 May 2009, 18:56
Statistics: Posted by martignasse — 05 May 2009, 18:03
Statistics: Posted by martignasse — 05 May 2009, 17:47