Hallo Leute
Ich schreibe gerade an einer Klasse zum auslesen von WAVE-Dateien,
allerdings habe ich schon nach wenigen Zeilen Probleme die ich nicht
alleine bewältigen kann
Kurz was zur Struktur: Waves sind in Datenabschnitte gegliedert, bestehend aus
einer 4-Byte id (bei mir chunkname), einer Längenangabe des Abschnittes (wieder 4 Byte, bei mir length)
und den eigentlichen Daten die enthalten sind.
Die angehängte Klasse wird in ein Programm eingebunden, dann ein TWaveParser-Objekt
erstellt und "OpenWAV" ausgeführt. Dadurch werden die Datenabschnitte in das Array "AttachedChunks"
geladen und das Programm wird anschliessend beendet. Bis zum Beenden klappt das ganze fast
einwandfrei (noch ein Problem beim auslesen des content, ist aber ne andere Sache),
wenn ich das Programm beende kommt allerdings eine EAccessViolation. Die Debug-DCUs
schleudern mich in die "System"-
Unit zu Zeile 16410
Zitat:
{ Decrement ref count. Nothing to do if not zero now. }
LOCK
DEC dword ptr [ECX-8]
in der Prozedur
Zitat:
procedure _DynArrayClear;
daher weiss ich dass es was mit den dyn. Arrays zu tun hat. Habe schon versucht
die Länge der Arrays vor dem Beenden auf 0 zu setzen, hat aber keine Änderung
herbeigeführt...
Delphi-Quellcode:
unit WaveParser;
interface
uses
SysUtils, Classes, StrUtils, Windows, Dialogs;
type
TWaveChunk=
Record
chunkname:
Array[0..3]
of Char;
length: DWORD;
content:
Array of Char;
end;
TWaveParser=
class (TObject)
public
procedure OpenWAV(Filename:
String);
private
procedure ReadChunks();
end;
var
FileStream: TFileStream;
AttachedChunks:
Array of TWaveChunk;
implementation
procedure TWaveParser.ReadChunks();
//Chunks auslesen und in das Array "AttachedChunks" schreiben
begin
SetLength(AttachedChunks, 0);
while FileStream.Position < WavFile.Size
do
begin
SetLength(AttachedChunks, length(AttachedChunks)+1);
FileStream.
Read(AttachedChunks[length(AttachedChunks)-1].chunkname, 4);
FileStream.
Read(AttachedChunks[length(AttachedChunks)-1].length, 4);
SetLength(AttachedChunks[length(AttachedChunks)-1].content, AttachedChunks[length(AttachedChunks)-1].length);
FileStream.
Read(AttachedChunks[length(AttachedChunks)-1].content, length(AttachedChunks[length(AttachedChunks)-1].content));
end;
end;
procedure TWaveParser.OpenWAV(Filename:
String);
//Eine Wave-Datei öffnen
begin
if FileExists(Filename)
then
begin
FileStream:=TFileStream.Create(Filename, fmOpenRead);
ReadChunks;
FileStream.Free;
end;
end;
end.
Ich hoffe irgendjemand kann mir da ein wenig unter die Arme greifen, war bis jetzt eigentlich
ein begeisterter Benutzer von dynamischen Arrays