eXec.plMAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA
MAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA

niedziela, 17. października, 2021, 21:26

Amiga forum / C/C++ / Problem z alokacją pamięci CHIP pod OS4.0

Czytasz wątek: Problem z alokacją pamięci CHIP pod OS4.0

hextreme
Nieaktywny użytkownik starego forum

Problem z alokacją pamięci CHIP pod OS4.0 wysłany: 2010-04-11 17:28

Mam mały problem. Otóż w poniższym kodzie (pochodzi on ze źródeł programu DiamPlay mojego autorstwa) funkcja alokacji sampli w pamięci CHIP w zupełnie losowy sposób, choć rzadko, zwraca brak dostępnej wystarczającej ilości tej pamięci. Zaznaczam, że dostępna jest praktycznie cała pamięć CHIP czyli około 2MB, a największy utwór który próbowałem wgrać ma ok. 200kB czystych danych dźwiękowych. Czy ktoś mógłby powiedzieć dlaczego tak się dzieje? Potrzebuję alokować te sample w pamięci CHIP ponieważ ma to chodzić na Amidze 1200.

Podejrzewam, że może to być błąd w samym OS4.0 ponieważ jest dostępna praktycznie cała pamięć CHIP, a program zwraca losowo błąd braku pamięci nawet dla niewielkich utworów Protrackera. W poniższej funkcji zawarłem kod debugowania, który wypisuje na ekranie ile pamięci jest alokowane (samplesize).

Pozdrawiam i z góry dziękuję za pomoc.




struct ptmod *Load_PTModule(char *name, char **samples, struct pattern **patterns, int *error)
{
struct ptmod *mymod;
BPTR f;
int samplesize, i, numpatterns;

*error = 0;

printf("Opening %s.\n", name);
if (f = Open(name, MODE_OLDFILE))
{
printf("Allocating ptmod structure.\n");
if (mymod = AllocMem(sizeof(struct ptmod), MEMF_PUBLIC | MEMF_CLEAR))
{
Read(f, mymod, sizeof(struct ptmod));
if (!(mymod->song.letters[0] == 'M' && mymod->song.letters[1] == '.' && mymod->song.letters[2] == 'K' && mymod->song.letters[3] == '.'))
{
*error = ERROR_NO_MOD_FORMAT;
Close(f);
FreeMem(mymod, sizeof(struct ptmod));
return(NULL);
}
numpatterns = 0;
for (i = 0; i < 128; i++)
if (mymod->song.song[i] > numpatterns)
numpatterns = mymod->song.song[i];
numpatterns++;
printf("Allocating %d patterns.\n", numpatterns);
if (*patterns = AllocMem(sizeof(struct pattern) * numpatterns, MEMF_PUBLIC|MEMF_CLEAR))
{
Read(f, *patterns, sizeof(struct pattern) * numpatterns);
samplesize = 0;
for (i = 0; i < 31; i++)
samplesize += mymod->sample[i].len << 1;
printf("Allocating samples (%d).\n", samplesize);
if (*samples = AllocMem(samplesize, MEMF_CHIP | MEMF_CLEAR))
{
Read(f, *samples, samplesize);
Close(f);
*error = 0;
return(mymod);
}
else
{
printf("Failed!\n");
*error = ERROR_NO_MEM;
}
FreeMem(*patterns, sizeof(struct pattern) * numpatterns);
}
else
{
printf("Failed!\n");
*error = ERROR_NO_MEM;
}
FreeMem(mymod, sizeof(struct ptmod));
}
else
{
printf("Failed!\n");
*error = ERROR_NO_MEM;
}
Close(f);
}
else
*error = ERROR_NO_FILE;
return(NULL);
}



Odpowiedz

hextreme
Nieaktywny użytkownik starego forum

Re:Problem z alokacją pamięci CHIP pod OS4.0 wysłany: 2010-04-13 18:28

Problem najprawdopodobniej rozwiązany Chodziło o niewłaściwe wywoływanie par AllocMem() i FreeMem() gdy utwory typu MED i MOD były grane na zmianę. Także był to błąd w programie.

Odpowiedz

AmigaOS.pl