Da war ich jetzt so stolz auf mich, hab es geschafft dass in OpenAL ein Wavesound abspielt, alles eigens programmiert ohne große Delphierfahrung und jetzt sowas...
GetMem verursacht eine SIGSEGV die ich mir nicht erklären kann.
Das Programm funktioniert folgendermaßen:
Ich habe eine Klasse, die WAVE-Klasse, die liesst mit einem TFileStream den WAVE-Header.
Danach wird, je nach BitRate (8, 16, 24 (> 32)) ein dynamisches Array mit 16 Einträgen erstellt (nennen wir das mal Datenblock). Aus der Datei werden die 16 Einträge in den Datenblock gelesen, und mit Move in ein dyn. Array kopiert. (Für den fall von einer BitRate von 16bits, wie es üblich ist ist es als ein Array of SmallInt mit xxxxxxx Elementen. Also sehr viele. Normalerweise 2-3Millionen).
Dann geb ich den Speicher des Datenblocksfrei (setlength(DataBlock16,0)).
So und wenn ich danach, ganz unabhängig davon, in einer anderen Klasse (TForm1) mit GetMem speicher allozieren will, gibts einen Fehler.
Bis zu 500bytes kann ich mit GetMem holen, danach schlägt es fehl. Kein EOutOfMemory ( ReturnNilIfGrowHeapFails hab ich auf True gesetzt ), kein gar nichts. Ich mach auch nicht mehr.
Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var
c: ^byte;
begin
getmem(c, 555); //<- Da tritt der Fehler auf
freemem(c);
end;
SIGSEGV. Egal was.
Wenn ich den GetMem VOR dem Laden der WaveDatei benutze geht es.
Es kann nichts mit der Größe der WAVEDatei zu tun haben. Während getMem bei fast allen meiner WAVEs fehlschlägt (zB bei meiner 30mb Wave) funktioniert es wiederum mit einer 50mb Wave. OutOfMemory ist also fast ausgeschlossen.
Ich bin komplett ratlos was das angeht. Ich muss diese Lowlevel Funktionen benutzen damits schnell geht im Programm.. Den Speicher davor zu beanschlagen ist keine Option, das muss danach geschehen.
Hat jemand von euch ne Ahnung was das betrifft, oder ähnliche Erfahrung?
Liegs an mir oder am FPC?
Im Internet hab ich einige Bugbeschreibungen gefunden mit ähnlichem Problem, allerdings immer ohne Antworten oder Lösungsvorschläge...
Gruß,
Jan